variable analysis added
[IRC.git] / Robust / src / Analysis / MLP / VarSrcTokTable.java
1 package Analysis.MLP;\r
2 \r
3 import IR.*;\r
4 import IR.Flat.*;\r
5 import java.util.*;\r
6 import java.io.*;\r
7 \r
8 public class VarSrcTokTable {\r
9   \r
10   // the true set represents the set of (sese, variable, age)\r
11   // triples that are truly in the table\r
12   private HashSet<VariableSourceToken> trueSet;\r
13 \r
14   // these hashtables provide an efficient retreival from the\r
15   // true set.  Note that a particular triple from the quick\r
16   // look up must be checked against the true set--remove ops\r
17   // can cause the hashtables to be inconsistent to each other\r
18   private Hashtable< TempDescriptor,    Set<VariableSourceToken> >  var2vst;\r
19   private Hashtable< FlatSESEEnterNode, Set<VariableSourceToken> > sese2vst;\r
20   private Hashtable< SVKey,             Set<VariableSourceToken> >   sv2vst;\r
21 \r
22   // maximum age from aging operation\r
23   private Integer MAX_AGE = new Integer( 2 );\r
24 \r
25 \r
26   public VarSrcTokTable() {\r
27     trueSet = new HashSet<VariableSourceToken>();\r
28 \r
29     sese2vst = new Hashtable< FlatSESEEnterNode, Set<VariableSourceToken> >();\r
30     var2vst  = new Hashtable< TempDescriptor,    Set<VariableSourceToken> >();\r
31     sv2vst   = new Hashtable< SVKey,             Set<VariableSourceToken> >();\r
32   }\r
33 \r
34   \r
35   public VarSrcTokTable( VarSrcTokTable in ) {\r
36     trueSet = (HashSet<VariableSourceToken>) in.trueSet.clone();\r
37 \r
38     Iterator itr; Set s;\r
39 \r
40     sese2vst = new Hashtable< FlatSESEEnterNode, Set<VariableSourceToken> >();\r
41     itr = sese2vst.entrySet().iterator();\r
42     while( itr.hasNext() ) {\r
43       Map.Entry                    me   = (Map.Entry)                    itr.next();\r
44       FlatSESEEnterNode            sese = (FlatSESEEnterNode)            me.getKey();\r
45       HashSet<VariableSourceToken> s1   = (HashSet<VariableSourceToken>) me.getValue();      \r
46       assert s1 != null;\r
47       sese2vst.put( sese, \r
48                     (HashSet<VariableSourceToken>) (s1.clone()) );\r
49     }\r
50 \r
51     var2vst = new Hashtable< TempDescriptor, Set<VariableSourceToken> >();\r
52     itr = var2vst.entrySet().iterator();\r
53     while( itr.hasNext() ) {\r
54       Map.Entry                    me  = (Map.Entry)                    itr.next();\r
55       TempDescriptor               var = (TempDescriptor)               me.getKey();\r
56       HashSet<VariableSourceToken> s1  = (HashSet<VariableSourceToken>) me.getValue();      \r
57       assert s1 != null;\r
58       var2vst.put( var, \r
59                    (HashSet<VariableSourceToken>) (s1.clone()) );\r
60     }\r
61 \r
62     sv2vst = new Hashtable< SVKey, Set<VariableSourceToken> >();\r
63     itr = sv2vst.entrySet().iterator();\r
64     while( itr.hasNext() ) {\r
65       Map.Entry                    me  = (Map.Entry)                    itr.next();\r
66       SVKey                        key = (SVKey)                        me.getKey();\r
67       HashSet<VariableSourceToken> s1  = (HashSet<VariableSourceToken>) me.getValue();      \r
68       assert s1 != null;\r
69       sv2vst.put( key, \r
70                   (HashSet<VariableSourceToken>) (s1.clone()) );\r
71     }\r
72   }\r
73 \r
74 \r
75   public void add( VariableSourceToken vst ) {\r
76     trueSet.add( vst );\r
77 \r
78     Set<VariableSourceToken> s;\r
79 \r
80     s = sese2vst.get( vst.getSESE() );\r
81     if( s == null ) {\r
82       s = new HashSet<VariableSourceToken>();\r
83     }\r
84     s.add( vst );\r
85     sese2vst.put( vst.getSESE(), s );\r
86 \r
87     s = var2vst.get( vst.getVarLive() );\r
88     if( s == null ) {\r
89       s = new HashSet<VariableSourceToken>();\r
90     }\r
91     s.add( vst );\r
92     var2vst.put( vst.getVarLive(), s );\r
93 \r
94     SVKey key = new SVKey( vst.getSESE(), vst.getVarLive() );\r
95     s = sv2vst.get( key );\r
96     if( s == null ) {\r
97       s = new HashSet<VariableSourceToken>();\r
98     }\r
99     s.add( vst );\r
100     sv2vst.put( key, s );\r
101   }\r
102 \r
103   public void addAll( Set<VariableSourceToken> s ) {\r
104     Iterator<VariableSourceToken> itr = s.iterator();\r
105     while( itr.hasNext() ) {\r
106       add( itr.next() );\r
107     }\r
108   }\r
109 \r
110 \r
111   public Set<VariableSourceToken> get() {\r
112     return trueSet;\r
113   }\r
114 \r
115   public Set<VariableSourceToken> get( FlatSESEEnterNode sese ) {\r
116     Set<VariableSourceToken> s = sese2vst.get( sese );\r
117     if( s == null ) {\r
118       s = new HashSet<VariableSourceToken>();      \r
119       sese2vst.put( sese, s );\r
120     }\r
121     s.retainAll( trueSet );\r
122     return s;\r
123   }\r
124 \r
125   public Set<VariableSourceToken> get( TempDescriptor var ) {\r
126     Set<VariableSourceToken> s = var2vst.get( var );\r
127     if( s == null ) {\r
128       s = new HashSet<VariableSourceToken>();\r
129       var2vst.put( var, s );\r
130     }\r
131     s.retainAll( trueSet );\r
132     return s;\r
133   }\r
134 \r
135   public Set<VariableSourceToken> get( SVKey key ) {\r
136     Set<VariableSourceToken> s = sv2vst.get( key );\r
137     if( s == null ) {\r
138       s = new HashSet<VariableSourceToken>();\r
139       sv2vst.put( key, s );\r
140     }\r
141     s.retainAll( trueSet );\r
142     return s;\r
143   }\r
144 \r
145 \r
146   public void merge( VarSrcTokTable table ) {\r
147 \r
148     if( table == null ) {\r
149       return;\r
150     }\r
151 \r
152     trueSet.addAll( table.trueSet );\r
153 \r
154     Iterator itr; \r
155     Set s;\r
156 \r
157     itr = sese2vst.entrySet().iterator();\r
158     while( itr.hasNext() ) {\r
159       Map.Entry                me   = (Map.Entry)                itr.next();\r
160       FlatSESEEnterNode        sese = (FlatSESEEnterNode)        me.getKey();\r
161       Set<VariableSourceToken> s1   = (Set<VariableSourceToken>) me.getValue();\r
162       Set<VariableSourceToken> s2   = table.sese2vst.get( sese );\r
163       \r
164       assert s1 != null;\r
165 \r
166       if( s2 != null ) {\r
167         s1.addAll( s2 );\r
168       }           \r
169     }\r
170     s = table.sese2vst.entrySet();\r
171     s.removeAll( sese2vst.entrySet() );\r
172     sese2vst.putAll( table.sese2vst );\r
173 \r
174     itr = var2vst.entrySet().iterator();\r
175     while( itr.hasNext() ) {\r
176       Map.Entry                me  = (Map.Entry)                itr.next();\r
177       TempDescriptor           var = (TempDescriptor)           me.getKey();\r
178       Set<VariableSourceToken> s1  = (Set<VariableSourceToken>) me.getValue();\r
179       Set<VariableSourceToken> s2  = table.var2vst.get( var );\r
180       \r
181       assert s1 != null;\r
182 \r
183       if( s2 != null ) {\r
184         s1.addAll( s2 );\r
185       }           \r
186     }\r
187     s = table.var2vst.entrySet();\r
188     s.removeAll( var2vst.entrySet() );\r
189     var2vst.putAll( table.var2vst );\r
190 \r
191     itr = sv2vst.entrySet().iterator();\r
192     while( itr.hasNext() ) {\r
193       Map.Entry                me  = (Map.Entry)                itr.next();\r
194       SVKey                    key = (SVKey)                    me.getKey();\r
195       Set<VariableSourceToken> s1  = (Set<VariableSourceToken>) me.getValue();\r
196       Set<VariableSourceToken> s2  = table.sv2vst.get( key );\r
197       \r
198       assert s1 != null;\r
199 \r
200       if( s2 != null ) {\r
201         s1.addAll( s2 );\r
202       }           \r
203     }\r
204     s = table.sv2vst.entrySet();\r
205     s.removeAll( sv2vst.entrySet() );\r
206     sv2vst.putAll( table.sv2vst );\r
207   }\r
208 \r
209 \r
210   public void remove( FlatSESEEnterNode sese ) {\r
211     Set<VariableSourceToken> s = sese2vst.get( sese );\r
212     if( s == null ) {\r
213       return;\r
214     }\r
215     \r
216     trueSet.removeAll( s );        \r
217     sese2vst.remove( sese );\r
218   }\r
219 \r
220   public void remove( TempDescriptor var ) {\r
221     Set<VariableSourceToken> s = var2vst.get( var );\r
222     if( s == null ) {\r
223       return;\r
224     }\r
225     \r
226     trueSet.removeAll( s );        \r
227     var2vst.remove( var );\r
228   }\r
229 \r
230   public void remove( FlatSESEEnterNode sese,\r
231                       TempDescriptor    var  ) {\r
232 \r
233     SVKey key = new SVKey( sese, var );\r
234     Set<VariableSourceToken> s = sv2vst.get( key );\r
235     if( s == null ) {\r
236       return;\r
237     }\r
238     \r
239     trueSet.removeAll( s );\r
240     sv2vst.remove( key );\r
241   }\r
242 \r
243   public void remove( VariableSourceToken vst ) {\r
244     trueSet.remove( vst );\r
245   }\r
246 \r
247 \r
248   // return a new table based on this one and\r
249   // age tokens with respect to SESE curr, where\r
250   // any child becomes curr with age 0, and any\r
251   // curr tokens increase age by 1\r
252   public VarSrcTokTable age( FlatSESEEnterNode curr ) {\r
253 \r
254     VarSrcTokTable out = new VarSrcTokTable();\r
255 \r
256     Iterator<VariableSourceToken> itr = trueSet.iterator();\r
257     while( itr.hasNext() ) {\r
258       VariableSourceToken vst = itr.next();\r
259       if( vst.getSESE().equals( curr ) ) {\r
260         Integer newAge = vst.getAge()+1;\r
261         if( newAge > MAX_AGE ) {\r
262           newAge = MAX_AGE;\r
263         }\r
264         out.add( new VariableSourceToken( vst.getVarLive(), \r
265                                           curr,                                           \r
266                                           newAge,\r
267                                           vst.getVarSrc() \r
268                                           )\r
269                  );\r
270       } \r
271     }\r
272 \r
273     return out;\r
274   }\r
275 \r
276   \r
277   // for the given SESE, remove tokens for the same live\r
278   // variable if it comes from a child SESE\r
279   public VarSrcTokTable removeChildToks( FlatSESEEnterNode curr ) {\r
280 \r
281     // create a table to modify as a copy of this\r
282     VarSrcTokTable out = new VarSrcTokTable( this );\r
283 \r
284     // iterate over this table, modify out table\r
285     Iterator<VariableSourceToken> itr = get( curr ).iterator();\r
286     while( itr.hasNext() ) {\r
287       VariableSourceToken vst = itr.next();\r
288 \r
289       Iterator<VariableSourceToken> itr2 = get( vst.getVarLive() ).iterator();\r
290       while( itr2.hasNext() ) {\r
291         VariableSourceToken vst2 = itr2.next();\r
292 \r
293         if( curr.getChildren().contains( vst2.getSESE() ) ) {\r
294           out.remove( vst2 );\r
295         }       \r
296       }\r
297     }\r
298 \r
299     return out;    \r
300   }   \r
301 \r
302 \r
303   public boolean equals( Object o ) {\r
304     if( o == null ) {\r
305       return false;\r
306     }\r
307 \r
308     if( !(o instanceof VarSrcTokTable) ) {\r
309       return false;\r
310     }\r
311 \r
312     VarSrcTokTable table = (VarSrcTokTable) o;\r
313     return trueSet.equals( table.trueSet );\r
314   }\r
315 \r
316   public int hashCode() {\r
317     return trueSet.hashCode();\r
318   }\r
319 \r
320   public Iterator<VariableSourceToken> iterator() {\r
321     return trueSet.iterator();\r
322   }\r
323 \r
324   public String toString() {\r
325     return "trueSet ="+trueSet.toString()+"\n"+\r
326            "sese2vst="+sese2vst.toString()+"\n"+\r
327            "var2vst ="+var2vst.toString()+"\n"+\r
328            "sv2vst  ="+sv2vst.toString();\r
329   }\r
330 }\r