add constraint check nodes to flat representation
authorbdemsky <bdemsky>
Thu, 31 Aug 2006 00:59:31 +0000 (00:59 +0000)
committerbdemsky <bdemsky>
Thu, 31 Aug 2006 00:59:31 +0000 (00:59 +0000)
Robust/src/IR/Flat/BuildFlat.java
Robust/src/IR/Flat/FKind.java
Robust/src/IR/Flat/FlatCheckNode.java [new file with mode: 0644]
Robust/src/IR/Tree/ConstraintCheck.java
Robust/src/IR/Tree/SemanticCheck.java

index 1b39c02596188e204df987025056c47b2a5cb8db..1828f9ddcf7d86967dc163918f0c0dc33624a3fb 100644 (file)
@@ -735,7 +735,21 @@ public class BuildFlat {
     private NodePair flattenTaskExitNode(TaskExitNode ten) {
        FlatFlagActionNode ffan=new FlatFlagActionNode(true);
        updateFlagActionNode(ffan, ten.getFlagEffects());
-       return new NodePair(ffan, ffan);
+       NodePair fcn=flattenConstraintCheck(ten.getChecks());
+       ffan.addNext(fcn.getBegin());
+       return new NodePair(ffan, fcn.getEnd());
+    }
+
+    private NodePair flattenConstraintCheck(Vector ccs) {
+       FlatNode begin=new FlatNop();
+       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());
+           last.addNext(fcn);
+           last=fcn;
+       }
+       return new NodePair(begin,last);
     }
 
     private NodePair flattenSubBlockNode(SubBlockNode sbn) {
index 304d7eed0788da3eafe3ff8bb840fbf4c181d61f..a348540a51238935832325d41f269a3d4a738b93 100644 (file)
@@ -14,4 +14,5 @@ public class FKind {
     public static final int FlatSetElementNode=11;
     public static final int FlatElementNode=12;
     public static final int FlatFlagActionNode=13;
+    public static final int FlatCheckNode=14;
 }
diff --git a/Robust/src/IR/Flat/FlatCheckNode.java b/Robust/src/IR/Flat/FlatCheckNode.java
new file mode 100644 (file)
index 0000000..146890c
--- /dev/null
@@ -0,0 +1,19 @@
+package IR.Flat;
+
+public class FlatCheckNode extends FlatNode {
+    TempDescriptor td;
+    String spec;
+
+    public FlatCheckNode(TempDescriptor td, String spec) {
+       this.td=td;
+       this.spec=spec;
+    }
+
+    public int kind() {
+        return FKind.FlatCheckNode;
+    }
+    
+    public TempDescriptor [] readsTemps() {
+       return new TempDescriptor[] {td};
+    }
+}
index 6af536081f27c4e95b451843e42e000124d377a2..3560e68ffd9e5f76383034d108a4035ba13938d6 100644 (file)
@@ -5,12 +5,21 @@ import IR.*;
 public class ConstraintCheck {
     String varname;
     String specname;
+    VarDescriptor vd;
 
     public ConstraintCheck(String varname, String specname) {
        this.varname=varname;
        this.specname=specname;
     }
 
+    public void setVar(VarDescriptor vd) {
+       this.vd=vd;
+    }
+
+    public VarDescriptor getVar() {
+       return vd;
+    }
+
     public String getVarName() {
        return varname;
     }
index 04b115b8a15b4a6e014b0901bd83e286cc178310..a4abfbd470638ffd2fa16a2815c14e1986d3bcac 100644 (file)
@@ -78,6 +78,27 @@ public class SemanticCheck {
        checkTypeDescriptor(fd.getType());
     }
 
+    public void checkConstraintCheck(TaskDescriptor td, 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");
+
+       }
+    }
+
     public void checkFlagEffects(TaskDescriptor td, Vector vfe) {
        if (vfe==null)
            return; /* No flag effects to check */
@@ -257,6 +278,7 @@ public class SemanticCheck {
        if (md instanceof MethodDescriptor)
            throw new Error("Illegal taskexit appears in Method: "+md.getSymbol());
        checkFlagEffects((TaskDescriptor)md, ten.getFlagEffects());
+       checkConstraintCheck((TaskDescriptor) md, ten.getChecks());
     }
 
     void checkIfStatementNode(Descriptor md, SymbolTable nametable, IfStatementNode isn) {