/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: FlagAnnotations.java
*
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Electric(tm) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Electric(tm); see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, Mass 02111-1307, USA.
*/
package com.sun.electric.tool.generator.flag;
import java.util.ArrayList;
import java.util.List;
import com.sun.electric.database.hierarchy.Cell;
import com.sun.electric.database.variable.Variable;
public class FlagAnnotations {
/** key of Variable holding FLAG Cell annotations. */
public static final Variable.Key FLAG_ANNOTATION_KEY = Variable.newKey("ATTR_FLAG");
public static final String ATOMIC = "atomic";
public static final String AUTO_GEN = "autoGen";
private String cellThatOwnsMe;
private List<String> annotText = new ArrayList<String>();
private boolean cellHasAnnotations;
private boolean atomic;
private String autoGenClassName;
private void prErr(String s) {
String currAnnot = annotText.get(annotText.size()-1);
System.out.println(" "+s+" cell= "+cellThatOwnsMe+" annotation= "+currAnnot);
}
private void doAnnotation(String note) {
annotText.add(note); // for prErr()
String[] toks = note.split("\\s+");
String ann = toks[0];
if (ann.equals(ATOMIC)) {
atomic = true;
} else if (ann.equals(AUTO_GEN)) {
if (toks.length!=2) {
prErr("Wrong number of arguments to FLAG "+AUTO_GEN+" annotation.");
return;
}
autoGenClassName = toks[1];
} else {
prErr("Unrecognized FLAG annotation");
}
}
// -------------------------- public methods ------------------------------
/** Method to get the FLAG annotations on a Cell. */
public FlagAnnotations(Cell cell) {
Variable flagVar = cell.getVar(FLAG_ANNOTATION_KEY);
if (flagVar==null) return;
Object annotation = flagVar.getObject();
cellThatOwnsMe = cell.libDescribe();
if (annotation instanceof String) {
doAnnotation((String) annotation);
} else if (annotation instanceof String[]) {
String[] ss = (String[]) annotation;
for (int i=0; i<ss.length; i++) doAnnotation(ss[i]);
} else {
prErr(" ignoring bad Flag annotation: ");
}
}
public boolean isAtomic() {return atomic;}
public boolean isAutoGen() {return autoGenClassName!=null;}
public String getAutoGenClassName() {return autoGenClassName;}
public boolean cellHasAnnotations() {return cellHasAnnotations;}
}