966555de8687b02e65ea5587406075f946ca2b96
[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().getType().isPtr() ) {
93       
94       smfe.addTransition( whereDefined, 
95                           currentProgramPoint,
96                           e );
97     }
98   }
99
100
101   public void writeStateMachines() {
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( "statemachine_"+fn.toString()+var.toString() );
117       }
118     }
119   }
120 }