Adding code to generate repair algorithms. Its not complete yet...
[repair.git] / Repair / RepairCompiler / MCC / IR / Repair.java
1 package MCC.IR;
2
3 import MCC.State;
4 import java.util.*;
5
6 public class Repair {
7
8
9     public static Vector getrulelist(Descriptor d) {
10
11         Vector dispatchrules = new Vector();
12         Vector rules = State.currentState.vRules;        
13         
14         for (int i = 0; i < rules.size(); i++) {
15             Rule rule = (Rule) rules.elementAt(i);
16             Set requiredsymbols = rule.getRequiredDescriptors();
17             
18             // #TBD#: in general this is wrong because these descriptors may contain descriptors
19             // bound in "in?" expressions which need to be dealt with in a topologically sorted
20             // fashion...
21
22             if (rule.getRequiredDescriptors().contains(d)) {
23                 dispatchrules.addElement(rule);
24             }
25         }
26         return dispatchrules;
27     }
28     
29
30     public static void generate_dispatch(CodeWriter cr, RelationDescriptor rd, String leftvar, String rightvar) {
31
32         cr.outputline("// RELATION DISPATCH ");        
33
34         Vector dispatchrules = getrulelist(rd);
35         
36         if (dispatchrules.size() == 0) {
37             cr.outputline("// nothing to dispatch");
38             return;
39         }
40        
41         for(int i = 0; i < dispatchrules.size(); i++) {
42             Rule rule = (Rule) dispatchrules.elementAt(i);
43             if (rule.getGuardExpr().getRequiredDescriptors().contains(rd)) {
44                 /* Guard depends on this relation, so we recomput everything */
45                 cr.outputline("WORKLIST->add("+rule.getNum()+",-1,0,0);");
46             } else {
47                 for (int j=0;j<rule.numQuantifiers();j++) {
48                     Quantifier q=rule.getQuantifier(j);
49                     if (q.getRequiredDescriptors().contains(rd)) {
50                         /* Generate add */
51                         cr.outputline("WORKLIST->add("+rule.getNum()+","+j+","+leftvar+","+rightvar+");");
52                     }
53                 }
54             }
55         }
56     }
57
58
59     public static void generate_dispatch(CodeWriter cr, SetDescriptor sd, String setvar) {
60                
61         cr.outputline("// SET DISPATCH ");        
62  
63         Vector dispatchrules = getrulelist(sd);
64
65         if (dispatchrules.size() == 0) {
66             cr.outputline("// nothing to dispatch");
67             return;
68         }
69
70         for(int i = 0; i < dispatchrules.size(); i++) {
71             Rule rule = (Rule) dispatchrules.elementAt(i);
72             if (SetDescriptor.expand(rule.getGuardExpr().getRequiredDescriptors()).contains(sd)) {
73                 /* Guard depends on this relation, so we recomput everything */
74                 cr.outputline("WORKLIST->add("+rule.getNum()+",-1,0,0);");
75             } else {
76                 for (int j=0;j<rule.numQuantifiers();j++) {
77                     Quantifier q=rule.getQuantifier(j);
78                     if (SetDescriptor.expand(q.getRequiredDescriptors()).contains(sd)) {
79                         /* Generate add */
80                         cr.outputline("WORKLIST->add("+rule.getNum()+","+j+","+setvar+",0);");
81                     }
82                 }
83             }
84         }
85     }
86 }