9360226bef54a8c23c81990155d359435f0797c8
[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 
29     Hashtable< FlatNode, Hashtable<TempDescriptor, StateMachineForEffects> >
30     fn2var2smfe;
31   
32   // remember all the FlatNode/TempDescriptor pairs that have a state machines
33   // for easy retrieval of all machines
34   protected Set<Pair> allMachineNamePairs;
35
36
37   public BuildStateMachines() {
38     fn2var2smfe = new
39       Hashtable< FlatNode, Hashtable<TempDescriptor, StateMachineForEffects> >();
40
41     allMachineNamePairs = new HashSet<Pair>();
42   }
43
44
45   public StateMachineForEffects getStateMachine( FlatNode       fn,
46                                                  TempDescriptor var ) {
47
48     Hashtable<TempDescriptor, StateMachineForEffects> var2smfe = fn2var2smfe.get( fn );
49     if( var2smfe == null ) {
50       var2smfe = new Hashtable<TempDescriptor, StateMachineForEffects>();
51       fn2var2smfe.put( fn, var2smfe );
52     }
53     
54     StateMachineForEffects smfe = var2smfe.get( var );
55     if( smfe == null ) {
56       smfe = new StateMachineForEffects( fn );
57       var2smfe.put( var, smfe );
58
59       allMachineNamePairs.add( new Pair( fn, var ) );
60     }
61
62     return smfe;
63   }
64
65
66   public Set<Pair> getAllMachineNames() {
67     return allMachineNamePairs;
68   }
69
70
71   public void addToStateMachine( Taint t, 
72                                  Effect e, 
73                                  FlatNode currentProgramPoint ) {
74     
75     FlatNode taskOrStallSite;
76     if( t.isStallSiteTaint() ) {
77       taskOrStallSite = t.getStallSite();
78     } else {
79       taskOrStallSite = t.getSESE();
80     }
81
82     TempDescriptor var = t.getVar();
83
84     StateMachineForEffects smfe = getStateMachine( taskOrStallSite, var );
85
86     FlatNode whereDefined = t.getWhereDefined();
87
88     smfe.addEffect( whereDefined, e );
89
90     // reads of pointers make a transition
91     if( e.getType() == Effect.read &&
92         ((e.getField()!=null && e.getField().getType().isPtr())
93          ||(e.getField()==null && e.getAffectedAllocSite().getFlatNew().getType().dereference().isPtr()))) {
94       
95       smfe.addTransition( whereDefined, 
96                           currentProgramPoint,
97                           e );
98     }
99   }
100
101
102   public void writeStateMachines() {
103
104     Iterator<FlatNode> fnItr = fn2var2smfe.keySet().iterator();
105     while( fnItr.hasNext() ) {
106       FlatNode fn = fnItr.next();
107       
108       Hashtable<TempDescriptor, StateMachineForEffects> 
109         var2smfe = fn2var2smfe.get( fn );
110         
111       Iterator<TempDescriptor> varItr = var2smfe.keySet().iterator();
112       while( varItr.hasNext() ) {
113         TempDescriptor var = varItr.next();
114
115         StateMachineForEffects smfe = var2smfe.get( var );
116
117         smfe.writeAsDOT( "statemachine_"+fn.toString()+var.toString() );
118       }
119     }
120   }
121
122
123   //TODO JIM! Give me the REAALL number here. 
124   public int getTotalNumOfWeakGroups() {
125     // TODO Auto-generated method stub
126     return 1;
127   }
128 }