Fix tabbing.... Please fix your editors so they do tabbing correctly!!! (Spaces...
[IRC.git] / Robust / src / Analysis / Disjoint / BuildStateMachines.java
1 package Analysis.Disjoint;
2
3 import java.util.*;
4 import java.io.*;
5
6 import IR.*;
7 import IR.Flat.*;
8 import Analysis.OoOJava.*;
9 import Util.*;
10
11
12 //////////////////////////////////////////////
13 //
14 //  BuildStateMachines builds a state machine
15 //  for every task/stall site and variable pair
16 //
17 //  StateMachineForEffects describes an intial
18 //  state and the effect transtions a DFJ
19 //  traverser should make from the current state
20 //  when searching for possible runtime conflicts.
21 //
22 //////////////////////////////////////////////
23
24 public class BuildStateMachines {
25
26   // map a task or stall site (both a FlatNode) to a variable
27   // and then finally to a state machine
28   protected Hashtable< FlatNode, Hashtable<TempDescriptor, StateMachineForEffects>> fn2var2smfe;
29
30   // remember all the FlatNode/TempDescriptor pairs that have a state machines
31   // for easy retrieval of all machines
32   protected Set<Pair<FlatNode, TempDescriptor>> allMachineNamePairs;
33
34
35   public BuildStateMachines() {
36     fn2var2smfe = new Hashtable< FlatNode, Hashtable<TempDescriptor, StateMachineForEffects> >();
37     allMachineNamePairs = new HashSet<Pair<FlatNode, TempDescriptor>>();
38   }
39
40   public StateMachineForEffects getStateMachine(Pair<FlatNode, TempDescriptor> fnpair) {
41     return getStateMachine(fnpair.getFirst(), fnpair.getSecond());
42   }
43
44   public StateMachineForEffects getStateMachine(FlatNode fn, TempDescriptor var) {
45     Hashtable<TempDescriptor, StateMachineForEffects> var2smfe = fn2var2smfe.get(fn);
46     if( var2smfe == null ) {
47       var2smfe = new Hashtable<TempDescriptor, StateMachineForEffects>();
48       fn2var2smfe.put(fn, var2smfe);
49     }
50
51     StateMachineForEffects smfe = var2smfe.get(var);
52     if( smfe == null ) {
53       smfe = new StateMachineForEffects(fn);
54       var2smfe.put(var, smfe);
55       allMachineNamePairs.add(new Pair<FlatNode, TempDescriptor>(fn, var) );
56     }
57
58     return smfe;
59   }
60
61
62   public Set<Pair<FlatNode, TempDescriptor>> getAllMachineNames() {
63     return allMachineNamePairs;
64   }
65
66
67   public void addToStateMachine(Taint t,
68                                 Effect e,
69                                 FlatNode currentProgramPoint) {
70     FlatNode taskOrStallSite;
71     if( t.isStallSiteTaint() ) {
72       taskOrStallSite = t.getStallSite();
73     } else {
74       taskOrStallSite = t.getSESE();
75     }
76
77     TempDescriptor var = t.getVar();
78
79     StateMachineForEffects smfe = getStateMachine(taskOrStallSite, var);
80
81     FlatNode whereDefined = t.getWhereDefined();
82
83     smfe.addEffect(whereDefined, e);
84
85     // reads of pointers make a transition
86     if( e.getType() == Effect.read &&
87         ((e.getField()!=null && e.getField().getType().isPtr())
88          ||(e.getField()==null && e.getAffectedAllocSite().getFlatNew().getType().dereference().isPtr()))) {
89
90       smfe.addTransition(whereDefined,
91                          currentProgramPoint,
92                          e);
93     }
94   }
95
96
97   public void writeStateMachines() {
98     writeStateMachines("");
99   }
100
101   public void writeStateMachines(String prefix) {
102
103     Iterator<FlatNode> fnItr = fn2var2smfe.keySet().iterator();
104     while( fnItr.hasNext() ) {
105       FlatNode fn = fnItr.next();
106
107       Hashtable<TempDescriptor, StateMachineForEffects>
108       var2smfe = fn2var2smfe.get(fn);
109
110       Iterator<TempDescriptor> varItr = var2smfe.keySet().iterator();
111       while( varItr.hasNext() ) {
112         TempDescriptor var = varItr.next();
113
114         StateMachineForEffects smfe = var2smfe.get(var);
115
116         smfe.writeAsDOT(prefix+"statemachine_"+fn.toString()+var.toString() );
117       }
118     }
119   }
120   //TODO JIM! Give me the REAALL number here.
121   public int getTotalNumOfWeakGroups() {
122     // TODO Auto-generated method stub
123     return 1;
124   }
125 }