case FKind.FlatNop:
output.println("/* nop */");
return;
+ case FKind.FlatCheckNode:
+ generateFlatCheckNode(fm, (FlatCheckNode) fn, output);
+ return;
case FKind.FlatFlagActionNode:
generateFlatFlagActionNode(fm, (FlatFlagActionNode) fn, output);
return;
}
+ private void generateFlatCheckNode(FlatMethod fm, FlatCheckNode fcn, PrintWriter output) {
+ output.print(fcn.getSpec()+"(");
+ TempDescriptor[] temps=fcn.getTemps();
+ for(int i=0;i<temps.length;i++) {
+ if (i!=0)
+ output.print(", ");
+ output.print(generateTemp(fm, temps[i]));
+ }
+ output.println(");");
+ }
+
private void generateFlatCall(FlatMethod fm, FlatCall fc, PrintWriter output) {
MethodDescriptor md=fc.getMethod();
ParamsObject objectparams=(ParamsObject) paramstable.get(md);
private NodePair flattenConstraintCheck(Vector ccs) {
FlatNode begin=new FlatNop();
+ if (ccs==null)
+ return new NodePair(begin,begin);
FlatNode last=begin;
for(int i=0;i<ccs.size();i++) {
ConstraintCheck cc=(ConstraintCheck) ccs.get(i);
- FlatCheckNode fcn=new FlatCheckNode(getTempforVar(cc.getVar()), cc.getSpec());
+ /* Flatten the arguments */
+ TempDescriptor[] temps=new TempDescriptor[cc.numArgs()];
+ for(int j=0;j<cc.numArgs();j++) {
+ ExpressionNode en=cc.getArg(j);
+ TempDescriptor td=TempDescriptor.tempFactory("arg",en.getType());
+ temps[j]=td;
+ NodePair np=flattenExpressionNode(en, td);
+ last.addNext(np.getBegin());
+ last=np.getEnd();
+ }
+
+ FlatCheckNode fcn=new FlatCheckNode(cc.getSpec(), temps);
last.addNext(fcn);
last=fcn;
}
package IR.Flat;
public class FlatCheckNode extends FlatNode {
- TempDescriptor td;
+ TempDescriptor [] temps;
String spec;
- public FlatCheckNode(TempDescriptor td, String spec) {
- this.td=td;
+ public FlatCheckNode(String spec, TempDescriptor[] temps) {
this.spec=spec;
+ this.temps=temps;
}
public int kind() {
return FKind.FlatCheckNode;
}
+
+ public String getSpec() {
+ return spec;
+ }
+
+ public TempDescriptor [] getTemps() {
+ return temps;
+ }
public TempDescriptor [] readsTemps() {
- return new TempDescriptor[] {td};
+ return temps;
}
}
public ConstraintCheck parseConstraintCheck(ParseNode pn) {
if (isNode(pn,"cons_check")) {
- String varname=pn.getChild("name").getTerminal();
- String specname=pn.getChild("spec").getTerminal();
- ConstraintCheck cc=new ConstraintCheck(varname, specname);
+ String specname=pn.getChild("name").getChild("identifier").getTerminal();
+ Vector args=parseArgumentList(pn);
+ ConstraintCheck cc=new ConstraintCheck(specname);
+ for(int i=0;i<args.size();i++) {
+ cc.addArgument((ExpressionNode)args.get(i));
+ }
return cc;
} else throw new Error();
}
package IR.Tree;
import IR.*;
+import java.util.Vector;
public class ConstraintCheck {
- String varname;
String specname;
- VarDescriptor vd;
+ Vector args;
- public ConstraintCheck(String varname, String specname) {
- this.varname=varname;
+ public ConstraintCheck(String specname) {
this.specname=specname;
+ args=new Vector();
}
- public void setVar(VarDescriptor vd) {
- this.vd=vd;
+ public void addArgument(ExpressionNode en) {
+ args.add(en);
}
- public VarDescriptor getVar() {
- return vd;
+ public String getSpec() {
+ return specname;
}
- public String getVarName() {
- return varname;
+ public int numArgs() {
+ return args.size();
}
- public String getSpec() {
- return specname;
+ public ExpressionNode getArg(int i) {
+ return (ExpressionNode) args.get(i);
}
public String printNode(int indent) {
- return "assert "+varname+" "+specname;
+ String str="assert("+specname+"(";
+ for(int i=0;i<numArgs();i++) {
+ if (i>0)
+ str+=",";
+ str+=getArg(i).printNode(0);
+ }
+ return str+")";
}
}
checkTypeDescriptor(fd.getType());
}
- public void checkConstraintCheck(TaskDescriptor td, Vector ccs) {
+ public void checkConstraintCheck(TaskDescriptor td, SymbolTable nametable, Vector ccs) {
if (ccs==null)
return; /* No constraint checks to check */
for(int i=0;i<ccs.size();i++) {
ConstraintCheck cc=(ConstraintCheck) ccs.get(i);
- String varname=cc.getVarName();
-
- //Make sure the variable is declared as a parameter to the task
- VarDescriptor vd=(VarDescriptor)td.getParameterTable().get(varname);
- if (vd==null)
- throw new Error("Parameter "+varname+" in Constraint Check not declared");
- cc.setVar(vd);
-
- //Make sure it correspods to a class
- TypeDescriptor type_d=vd.getType();
- if (!type_d.isClass())
- throw new Error("Cannot have non-object argument for flag_effect");
-
+
+ for(int j=0;j<cc.numArgs();j++) {
+ ExpressionNode en=cc.getArg(j);
+ checkExpressionNode(td,nametable,en,null);
+ }
}
}
if (md instanceof MethodDescriptor)
throw new Error("Illegal taskexit appears in Method: "+md.getSymbol());
checkFlagEffects((TaskDescriptor)md, ten.getFlagEffects());
- checkConstraintCheck((TaskDescriptor) md, ten.getChecks());
+ checkConstraintCheck((TaskDescriptor) md, nametable, ten.getChecks());
}
void checkIfStatementNode(Descriptor md, SymbolTable nametable, IfStatementNode isn) {
RESULT=ccs;
:};
-cons_check ::= IDENTIFIER:id LBRACE IDENTIFIER:spec RBRACE {:
+cons_check ::= IDENTIFIER:name LPAREN argument_list_opt:args RPAREN {:
ParseNode pn=new ParseNode("cons_check");
- pn.addChild("name").addChild(id);
- pn.addChild("spec").addChild(spec);
+ pn.addChild("name").addChild("identifier").addChild(name);
+ pn.addChild(args);
RESULT=pn;
:};