* files.
*
* @author le01, 6.035 Staff (<tt>6.035-staff@mit.edu</tt>)
- * @version <tt>$Id: CLI.java,v 1.7 2004/05/18 16:46:47 bdemsky Exp $</tt>
+ * @version <tt>$Id: CLI.java,v 1.8 2004/05/31 14:19:10 bdemsky Exp $</tt>
*/
public class CLI {
/**
Compiler.REPAIR=false;
} else if (args[i].equals("-debug")) {
Compiler.GENERATEDEBUGHOOKS=true;
+ } else if (args[i].equals("-instrument")) {
+ Compiler.GENERATEINSTRUMENT=true;
} else if (args[i].equals("-aggressivesearch")) {
Compiler.AGGRESSIVESEARCH=true;
} else if (args[i].equals("-prunequantifiernodes")) {
public static boolean PRUNEQUANTIFIERS=false;
public static boolean GENERATEDEBUGHOOKS=false;
public static boolean GENERATEDEBUGPRINT=false;
+ public static boolean GENERATEINSTRUMENT=false;
public static void main(String[] args) {
State state = null;
return expr;
}
+ public boolean isInvariant(Set vars) {
+ return false;
+ }
+
+ public Set findInvariants(Set vars) {
+ return expr.findInvariants(vars);
+ }
+
public void findmatch(Descriptor d, Set s) {
expr.findmatch(d,s);
}
sa.getErrorReporter().report(null, "Expression type '" + td.getSymbol() + "' is not a parent of the cast type '" + type.getSymbol() + "'");
return null;
}
-
this.td = type;
return type;
}
-
}
-
-
-
-
-
-
-
-
public void pushSymbolTable(SymbolTable st);
public SymbolTable popSymbolTable();
public SymbolTable getSymbolTable();
-
+ public InvariantValue getInvariantValue();
+ public void setInvariantValue(InvariantValue iv);
}
this.index = index;
}
+ public boolean isInvariant(Set vars) {
+ if (!left.isInvariant(vars))
+ return false;
+ if (intindex!=null)
+ return intindex.isInvariant(vars);
+ else
+ return true;
+ }
+
+ public Set findInvariants(Set vars) {
+ if (isInvariant(vars)) {
+ Set s=new HashSet();
+ s.add(this);
+ return s;
+ } else {
+ Set ls=left.findInvariants(vars);
+ if (intindex!=null) {
+ ls.addAll(intindex.findInvariants(vars));
+ Expr indexbound=((ArrayDescriptor)this.fd).getIndexBound();
+ ls.addAll(indexbound.findInvariants(vars));
+ if ((!(intindex instanceof IntegerLiteralExpr))||
+ ((IntegerLiteralExpr) intindex).getValue() != 0) {
+ FieldDescriptor fd=this.fd;
+ if (fd instanceof ArrayDescriptor)
+ fd=((ArrayDescriptor)fd).getField();
+ Expr basesize = fd.getBaseSizeExpr();
+ ls.addAll(basesize.findInvariants(vars));
+ }
+ }
+ return ls;
+ }
+ }
+
+
public boolean isSafe() {
if (!left.isSafe())
return false;
public void generate(CodeWriter writer, VarDescriptor dest) {
VarDescriptor leftd = VarDescriptor.makeNew("left");
+ if (writer.getInvariantValue()!=null&&
+ writer.getInvariantValue().isInvariant(this)) {
+ writer.outputline("maybe="+writer.getInvariantValue().getMaybe(this).getSafeSymbol()+";");
+ writer.outputline(getType().getGenerateType().getSafeSymbol()+
+ " "+dest.getSafeSymbol()+"="+writer.getInvariantValue().getValue(this).getSafeSymbol()+";");
+ return;
+ }
+
writer.output("// " + leftd.getSafeSymbol() + " <-- ");
left.prettyPrint(writer);
writer.outputline("");
public Expr getUpper() {
return null;
}
+ public boolean isInvariant(Set vars) {
+ return false;
+ }
+ public Set findInvariants(Set vars) {
+ return new HashSet();
+ }
}
nr.inclusion=new SetInclusion(((SetInclusion)r.inclusion).elementexpr,sd1);
nr.st=r.st;
nr.setnogenerate();
+ nr.num=r.num;
newrules.add(nr);
state.implicitrule.put(nr,r);
+ if (!state.implicitruleinv.containsKey(r))
+ state.implicitruleinv.put(r,new HashSet());
+ ((Set)state.implicitruleinv.get(r)).add(nr);
}
}
}
td = ReservedTypeDescriptor.INT;
return td;
}
-
}
return new HashSet();
}
+ public boolean isInvariant(Set vars) {
+ return true;
+ }
+
+ public Set findInvariants(Set vars) {
+ return new HashSet(); /* We won't lift literals...gcc can do this */
+ }
}
boolean dependency=false;
for(int i=0;i<drule.size();i++) {
RuleConjunction rconj=drule.get(i);
- for(int j=0;j<rconj.size();j++){
+ for(int j=0;j<rconj.size();j++) {
DNFExpr dexpr=rconj.get(j);
Expr e=dexpr.getExpr();
- if (e.usesDescriptor(d)) {
+ Set descset=e.getRequiredDescriptors();
+ descset=SetDescriptor.expand(descset);
+ if (descset.contains(d)) {
boolean negated=dexpr.getNegation();
if (negated)
return NEGDEPENDENCY;
} else return llower;
}
+
public boolean isSafe() {
if (right==null)
return left.isSafe();
return left.isSafe()&&right.isSafe();
}
+ public boolean isInvariant(Set vars) {
+ return left.isInvariant(vars)&&((right==null)||right.isInvariant(vars));
+ }
+
+ public Set findInvariants(Set vars) {
+ if (isInt(this)) {
+ /* Don't hoist ints */
+ return new HashSet();
+ } else if (isInvariant(vars)) {
+ Set s=new HashSet();
+ s.add(this);
+ return s;
+ } else {
+ Set ls=left.findInvariants(vars);
+ if (right!=null)
+ ls.addAll(right.findInvariants(vars));
+ return ls;
+ }
+ }
+
public Set getfunctions() {
Set leftfunctions=left.getfunctions();
Set rightfunctions=null;
public void generate(CodeWriter writer, VarDescriptor dest) {
VarDescriptor ld = VarDescriptor.makeNew("leftop");
- left.generate(writer, ld);
+ if (writer.getInvariantValue()!=null&&
+ writer.getInvariantValue().isInvariant(this)) {
+ writer.outputline("maybe="+writer.getInvariantValue().getMaybe(this).getSafeSymbol()+";");
+ writer.outputline("int "+dest.getSafeSymbol()+"="+writer.getInvariantValue().getValue(this).getSafeSymbol()+";");
+ return;
+ }
+
+ left.generate(writer, ld);
VarDescriptor rd = null;
VarDescriptor lm=VarDescriptor.makeNew("lm");
VarDescriptor rm=VarDescriptor.makeNew("rm");
writer.outputline("int "+rm.getSafeSymbol()+"=maybe;");
writer.outputline("maybe = (!" + ld.getSafeSymbol() + " && " + rm.getSafeSymbol() + ") || (!" + rd.getSafeSymbol() +
" && " + lm.getSafeSymbol() + ") || (" + lm.getSafeSymbol() + " && " + rm.getSafeSymbol() + ");");
- writer.outputline("int "+dest.getSafeSymbol() + " = " + ld.getSafeSymbol() + " || " + rd.getSafeSymbol() +
- ";");
+ writer.outputline("int "+dest.getSafeSymbol() + " = " + ld.getSafeSymbol() + " || " + rd.getSafeSymbol() + ";");
} else if (opcode != Opcode.NOT) { /* two operands */
assert rd != null;
writer.outputline("int " + dest.getSafeSymbol() + " = " +
boolean ok = true;
- // #ATTN#: if we want node.next != literal(0) to represent a null check than we need to allow ptr arithmetic
- // either that or we use a isvalid clause to check for null
-
- /*
- if (lt != ReservedTypeDescriptor.INT) {
- sa.getErrorReporter().report(null, "Left hand side of expression is of type '" + lt.getSymbol() + "' but must be type 'int'");
- ok = false;
- }
-
- if (right != null) {
- if (rt != ReservedTypeDescriptor.INT) {
- sa.getErrorReporter().report(null, "Right hand side of expression is of type '" + rt.getSymbol() + "' but must be type 'int'");
- ok = false;
- }
- }
- */
-
if (!ok) {
return null;
}
}
craux.startblock();
craux.outputline("int maybe=0;");
+ if (Compiler.GENERATEINSTRUMENT)
+ craux.outputline("updatecount++;");
+
final SymbolTable st = un.getRule().getSymbolTable();
CodeWriter cr = new StandardCodeWriter(outputaux) {
public SymbolTable getSymbolTable() { return st; }
craux.outputline(methodcall);
craux.startblock();
craux.outputline("int maybe=0;");
+ if (Compiler.GENERATEINSTRUMENT)
+ craux.outputline("updatecount++;");
final SymbolTable st2 = un.getRule().getSymbolTable();
CodeWriter cr2 = new StandardCodeWriter(outputaux) {
public SymbolTable getSymbolTable() { return st2; }
craux.outputline(methodcall);
craux.startblock();
craux.outputline("int maybe=0;");
+ if (Compiler.GENERATEINSTRUMENT)
+ craux.outputline("updatecount++;");
final SymbolTable st2 = un.getRule().getSymbolTable();
CodeWriter cr2 = new StandardCodeWriter(outputaux) {
public SymbolTable getSymbolTable() { return st2; }
worklist=VarDescriptor.makeNew("worklist");
goodflag=VarDescriptor.makeNew("goodflag");
repairtable=VarDescriptor.makeNew("repairtable");
+
+ if (Compiler.GENERATEINSTRUMENT) {
+ craux.outputline("int updatecount;");
+ craux.outputline("int rebuildcount;");
+ craux.outputline("int abstractcount;");
+ }
+
crhead.outputline("void doanalysis();");
craux.outputline("void "+name +"_state::doanalysis()");
craux.startblock();
+ if (Compiler.GENERATEINSTRUMENT) {
+ craux.outputline("updatecount=0;");
+ craux.outputline("rebuildcount=0;");
+ craux.outputline("abstractcount=0;");
+ }
craux.outputline("int highmark;");
craux.outputline("initializestack(&highmark);");
craux.outputline("typeobject *typeobject1=gettypeobject();");
craux.startblock();
craux.outputline(name+ " * "+newmodel.getSafeSymbol()+"=new "+name+"();");
craux.outputline(worklist.getSafeSymbol()+"->reset();");
+ if (Compiler.GENERATEINSTRUMENT)
+ craux.outputline("rebuildcount++;");
}
private void generate_teardown() {
CodeWriter cr = new StandardCodeWriter(outputaux);
cr.endblock();
+ if (Compiler.GENERATEINSTRUMENT) {
+ cr.outputline("printf(\"updatecount=%d\\n\",updatecount);");
+ cr.outputline("printf(\"rebuildcount=%d\\n\",rebuildcount);");
+ cr.outputline("printf(\"abstractcount=%d\\n\",abstractcount);");
+ }
+
}
private void generate_print() {
Iterator iterator_rs = ruleset.iterator();
while (iterator_rs.hasNext()) {
Rule rule = (Rule) iterator_rs.next();
+ if (rule.getnogenerate())
+ continue;
{
final SymbolTable st = rule.getSymbolTable();
CodeWriter cr = new StandardCodeWriter(outputaux) {
public SymbolTable getSymbolTable() { return st; }
};
+ InvariantValue ivalue=new InvariantValue();
+ cr.setInvariantValue(ivalue);
+
cr.outputline("// build " +escape(rule.toString()));
cr.startblock();
cr.outputline("int maybe=0;");
- ListIterator quantifiers = rule.quantifiers();
+
+ Expr ruleexpr=rule.getGuardExpr();
+ HashSet invariantvars=new HashSet();
+ Set invariants=ruleexpr.findInvariants(invariantvars);
+
+ if ((ruleexpr instanceof BooleanLiteralExpr)&&
+ ((BooleanLiteralExpr)ruleexpr).getValue()) {
+ if (rule.getInclusion() instanceof SetInclusion) {
+ invariants.addAll(((SetInclusion)rule.getInclusion()).getExpr().findInvariants(invariantvars));
+ } else if (rule.getInclusion() instanceof RelationInclusion) {
+ invariants.addAll(((RelationInclusion)rule.getInclusion()).getLeftExpr().findInvariants(invariantvars));
+ invariants.addAll(((RelationInclusion)rule.getInclusion()).getRightExpr().findInvariants(invariantvars));
+ }
+ }
+ ListIterator quantifiers = rule.quantifiers();
+ while (quantifiers.hasNext()) {
+ Quantifier quantifier = (Quantifier) quantifiers.next();
+ if (quantifier instanceof ForQuantifier) {
+ ForQuantifier fq=(ForQuantifier)quantifier;
+ invariants.addAll(fq.lower.findInvariants(invariantvars));
+ invariants.addAll(fq.upper.findInvariants(invariantvars));
+ }
+ }
+
+ for(Iterator invit=invariants.iterator();invit.hasNext();) {
+ Expr invexpr=(Expr)invit.next();
+ VarDescriptor tmpvd=VarDescriptor.makeNew("tmpvar");
+ VarDescriptor maybevd=VarDescriptor.makeNew("maybevar");
+ invexpr.generate(cr,tmpvd);
+ cr.outputline("int "+maybevd.getSafeSymbol()+"=maybe;");
+ cr.outputline("maybe=0;");
+ ivalue.assignPair(invexpr,tmpvd,maybevd);
+ }
+
+ quantifiers = rule.quantifiers();
while (quantifiers.hasNext()) {
Quantifier quantifier = (Quantifier) quantifiers.next();
quantifier.generate_open(cr);
else
cr.outputline("if (maybe||!"+predvalue.getSafeSymbol()+")");
cr.startblock();
+ if (Compiler.GENERATEINSTRUMENT)
+ cr.outputline("abstractcount++;");
if (p instanceof InclusionPredicate)
generateinclusionrepair(conj,dpred, cr);
else if (p instanceof ExprPredicate) {
public void generate_dispatch(CodeWriter cr, SetDescriptor sd, String setvar) {
-
- cr.outputline("// SET DISPATCH ");
+ cr.outputline("// SET DISPATCH ");
if (Compiler.REPAIR) {
cr.outputline("if ("+oldmodel.getSafeSymbol()+"&&");
cr.outputline("!"+oldmodel.getSafeSymbol() +"->"+sd.getJustSafeSymbol()+"_hash->contains("+setvar+"))");
cr.startblock(); {
/* Adding new item */
- /* Perform safety checks */
+ /* See if there is an outstanding update in the repairtable */
cr.outputline("if ("+repairtable.getSafeSymbol()+"&&");
cr.outputline(repairtable.getSafeSymbol()+"->containsset("+sd.getNum()+","+currentrule.getNum()+","+setvar+"))");
cr.startblock(); {
}
cr.endblock();
/* Build standard compensation actions */
- if (need_compensation(currentrule)) {
- UpdateNode un=find_compensation(currentrule);
- String name=(String)updatenames.get(un);
- usedupdates.add(un); /* Mark as used */
+ Vector ruleset=new Vector();
+ ruleset.add(currentrule);
+ if (state.implicitruleinv.containsKey(currentrule))
+ ruleset.addAll((Set)state.implicitruleinv.get(currentrule));
+ for(int i=0;i<ruleset.size();i++) {
+ Rule itrule=(Rule)ruleset.get(i);
- String methodcall=name+"(this,"+oldmodel.getSafeSymbol()+","+
- repairtable.getSafeSymbol();
- for(int i=0;i<currentrule.numQuantifiers();i++) {
- Quantifier q=currentrule.getQuantifier(i);
- if (q instanceof SetQuantifier) {
- SetQuantifier sq=(SetQuantifier) q;
- methodcall+=","+sq.getVar().getSafeSymbol();
- } else if (q instanceof RelationQuantifier) {
- RelationQuantifier rq=(RelationQuantifier) q;
- methodcall+=","+rq.x.getSafeSymbol();
- methodcall+=","+rq.y.getSafeSymbol();
- } else if (q instanceof ForQuantifier) {
- ForQuantifier fq=(ForQuantifier) q;
- methodcall+=","+fq.getVar().getSafeSymbol();
+ if (need_compensation(itrule)) {
+ UpdateNode un=find_compensation(itrule);
+ String name=(String)updatenames.get(un);
+ usedupdates.add(un); /* Mark as used */
+
+ String methodcall=name+"(this,"+oldmodel.getSafeSymbol()+","+
+ repairtable.getSafeSymbol();
+ for(int j=0;j<currentrule.numQuantifiers();j++) {
+ Quantifier q=currentrule.getQuantifier(j);
+ if (q instanceof SetQuantifier) {
+ SetQuantifier sq=(SetQuantifier) q;
+ methodcall+=","+sq.getVar().getSafeSymbol();
+ } else if (q instanceof RelationQuantifier) {
+ RelationQuantifier rq=(RelationQuantifier) q;
+ methodcall+=","+rq.x.getSafeSymbol();
+ methodcall+=","+rq.y.getSafeSymbol();
+ } else if (q instanceof ForQuantifier) {
+ ForQuantifier fq=(ForQuantifier) q;
+ methodcall+=","+fq.getVar().getSafeSymbol();
+ }
}
+ methodcall+=");";
+ if (currentrule!=itrule) {
+ SetDescriptor sdrule=((SetInclusion)itrule.getInclusion()).getSet();
+ cr.outputline("if ("+oldmodel.getSafeSymbol()+"&&");
+ cr.outputline("!"+oldmodel.getSafeSymbol() +"->"+sdrule.getJustSafeSymbol()+"_hash->contains("+setvar+"))");
+ cr.startblock();
+ }
+ cr.outputline(methodcall);
+ cr.outputline("delete "+newmodel.getSafeSymbol()+";");
+ cr.outputline("goto rebuild;");
+ cr.endblock();
}
- methodcall+=");";
- cr.outputline(methodcall);
- cr.outputline("delete "+newmodel.getSafeSymbol()+";");
- cr.outputline("goto rebuild;");
+ if (currentrule==itrule)
+ cr.endblock();
}
}
- cr.endblock();
}
String addeditem = (VarDescriptor.makeNew("addeditem")).getSafeSymbol();
cr.endblock();
return;
}
+ /* Add item to worklist if new */
cr.outputline("if ("+addeditem+")");
cr.startblock();
for(int i = 0; i < dispatchrules.size(); i++) {
int indent = 0;
java.io.PrintWriter output;
Stack symboltables = new Stack();
+ InvariantValue ivalue;
public StandardCodeWriter(java.io.PrintWriter output) { this.output = output; }
}
return (SymbolTable) symboltables.peek();
}
-
+
+ public InvariantValue getInvariantValue() {
+ return ivalue;
+ }
+
+ public void setInvariantValue(InvariantValue iv) {
+ ivalue=iv;
+ }
}
public Enumeration getFieldKeys() {
return fields.keys();
}
-
- public Expr getSizeExpr() {
+ public Expr getSizeExpr() {
return getOffsetExpr(null);
}
+ Expr sizeexpr=null;
+ Hashtable oexpr=new Hashtable();
+
public Expr getOffsetExpr(FieldDescriptor field) {
+ if (field==null) {
+ if (sizeexpr==null) {
+ sizeexpr=internalgetOffsetExpr(field);
+ }
+ return sizeexpr;
+ } else if (oexpr.containsKey(field)) {
+ return (Expr)oexpr.get(field);
+ } else {
+ Expr tmp=internalgetOffsetExpr(field);
+ oexpr.put(field,tmp);
+ return tmp;
+ }
+ }
+
+
+ private Expr internalgetOffsetExpr(FieldDescriptor field) {
/* Fix sizeof calculations */
if ((field==null)&&(subtype!=null))
return subtype.getSizeExpr();
return vd.isGlobal();
}
- public void generate(CodeWriter writer, VarDescriptor dest) {
+ public boolean isInvariant(Set vars) {
+ return vd.isGlobal()||vars.contains(vd);
+ }
+
+ public Set findInvariants(Set vars) {
+ if (isInvariant(vars)) {
+ Set s=new HashSet();
+ s.add(this);
+ return s;
+ } else
+ return new HashSet();
+ }
+
+ public void generate(CodeWriter writer, VarDescriptor dest) {
// #TBD#: bit of a hack, really should have been type checked properly
assert vd != null;
assert vd.getType() != null;
this.td = vd.getType();
+ if (writer.getInvariantValue()!=null&&
+ writer.getInvariantValue().isInvariant(this)) {
+ writer.outputline("maybe="+writer.getInvariantValue().getMaybe(this).getSafeSymbol()+";");
+ writer.outputline(vd.getType().getGenerateType().getSafeSymbol()+
+ " "+dest.getSafeSymbol()+"="+writer.getInvariantValue().getValue(this).getSafeSymbol()+";");
+ return;
+ }
writer.outputline(vd.getType().getGenerateType().getSafeSymbol() + " " + dest.getSafeSymbol() +
" = (" + vd.getType().getGenerateType().getSafeSymbol() + ") " + vd.getSafeSymbol() + "; //varexpr");
int SimpleHash::add(int key, int data) {
- unsigned int hashkey = (unsigned int)key % size;
-
- struct SimpleNode **ptr = &bucket[hashkey];
-
- /* check that this key/object pair isn't already here */
- // TBD can be optimized for set v. relation */
- while (*ptr) {
- if ((*ptr)->key == key && (*ptr)->data == data) {
- return 0;
- }
- ptr = &((*ptr)->next);
- }
- if (tailindex==ARRAYSIZE) {
- listtail->nextarray=(struct ArraySimple *) calloc(sizeof(struct ArraySimple),1);
- tailindex=0;
- listtail=listtail->nextarray;
+ /* Rehash code */
+ if (numelements>=size) {
+ int newsize=2*size+1;
+ struct SimpleNode ** newbucket = (struct SimpleNode **) calloc(sizeof(struct SimpleNode *)*newsize,1);
+ for(int i=size-1;i>=0;i--) {
+ for(struct SimpleNode *ptr=bucket[i];ptr!=NULL;) {
+ struct SimpleNode * nextptr=ptr->next;
+ unsigned int newhashkey=(unsigned int)ptr->key % newsize;
+ ptr->next=newbucket[newhashkey];
+ newbucket[newhashkey]=ptr;
+ ptr=nextptr;
+ }
}
-
- *ptr = &listtail->nodes[tailindex++];
- (*ptr)->key=key;
- (*ptr)->data=data;
- (*ptr)->inuse=1;
+ size=newsize;
+ free(bucket);
+ bucket=newbucket;
+ }
- numelements++;
-
- for (int i = 0; i < numparents; i++) {
- parents[i]->add(key, data);
- }
+ unsigned int hashkey = (unsigned int)key % size;
+ struct SimpleNode **ptr = &bucket[hashkey];
+
+ /* check that this key/object pair isn't already here */
+ /* TBD can be optimized for set v. relation */
- return 1;
+ while (*ptr) {
+ if ((*ptr)->key == key && (*ptr)->data == data) {
+ return 0;
+ }
+ ptr = &((*ptr)->next);
+ }
+ if (tailindex==ARRAYSIZE) {
+ listtail->nextarray=(struct ArraySimple *) calloc(sizeof(struct ArraySimple),1);
+ tailindex=0;
+ listtail=listtail->nextarray;
+ }
+
+ *ptr = &listtail->nodes[tailindex++];
+ (*ptr)->key=key;
+ (*ptr)->data=data;
+ (*ptr)->inuse=1;
+
+ numelements++;
+
+ for (int i = 0; i < numparents; i++) {
+ parents[i]->add(key, data);
+ }
+ return 1;
}
bool SimpleHash::contains(int key) {
#!/bin/bash
-g++ -g -c SimpleHash.cc
-g++ -g -c tmap.cc
-g++ -g -c instrument.cc
-gcc -g -c libredblack/redblack.c
-gcc -g -c stack.c
-g++ -g -c size.cc
+FLAG='-O9'
+g++ $FLAG -c SimpleHash.cc
+g++ $FLAG -c tmap.cc
+g++ $FLAG -c instrument.cc
+gcc $FLAG -c libredblack/redblack.c
+gcc $FLAG -c stack.c
+g++ $FLAG -c size.cc
time += selfcheck2(ptr);
- printf("\ncompiled: %u us\n", (time/50));
+ printf("\ncompiled: %u us\n", (time));
break;
}
case '8': {
{
struct block * ptr=chmountdisk("disk");
+ int t=selfcheck2(ptr);
+ printf("\ncompiled: %u us\n", (t));
chunmountdisk(ptr);
}
struct block * ptr=mountdisk("disk");
}
unmountdisk(ptr);
}
-
+ break;
case '9': {
for(int i=0;i<MAXFILES;i++)
files[i].used=false;
public Hashtable rulenodes;
public Hashtable constraintnodes;
public Hashtable implicitrule;
+ public Hashtable implicitruleinv;
State() {
vConstraints = null;
vRules = null;
ptConstraints = null;
ptSpace = null;
implicitrule=new Hashtable();
+ implicitruleinv=new Hashtable();
}
void printall() {