da7ef437447785960cb86f5ce882d1905d6ffb16
[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 }