a5b346403685b23d71394735aff0f5916badb37c
[IRC.git] / Robust / src / Analysis / TaskStateAnalysis / TaskAnalysis.java
1 package Analysis.TaskStateAnalysis;
2 import Analysis.TaskStateAnalysis.*;
3 import IR.*;
4 import IR.Tree.*;
5 import IR.Flat.*;
6 import java.util.*;
7 import java.io.File;
8 import java.io.FileWriter;
9
10 public class TaskAnalysis {
11     State state;
12     Hashtable Adj_List;
13     Hashtable flags;
14     Hashtable extern_flags;
15     Queue<TriggerState> q_main;
16     
17     /** 
18      * Class Constructor
19      *
20      * @param state a flattened State object
21      * @see State
22      */
23     public TaskAnalysis(State state)
24     {
25         this.state=state;
26     }
27     
28     /** This function returns the number of external flags, etc */
29
30     private void getFlagsfromClasses() {
31         flags=new Hashtable();
32         extern_flags = new Hashtable();
33         
34         for(Iterator it_classes=state.getClassSymbolTable().getDescriptorsIterator();it_classes.hasNext();) {
35                 
36             ClassDescriptor cd = (ClassDescriptor)it_classes.next();
37             System.out.println(cd.getSymbol());
38             Vector vFlags=new Vector();
39             FlagDescriptor flag[];
40             int ctr=0;
41             
42             
43             /* Adding the flags of the super class */
44             if (cd.getSuper()!=null) {
45                 ClassDescriptor superdesc=cd.getSuperDesc();
46                 
47                 for(Iterator it_cflags=superdesc.getFlags();it_cflags.hasNext();) {     
48                     FlagDescriptor fd = (FlagDescriptor)it_cflags.next();
49                     System.out.println(fd.toString());
50                     vFlags.add(fd);
51                 }
52             }
53
54             for(Iterator it_cflags=cd.getFlags();it_cflags.hasNext();) {
55                 FlagDescriptor fd = (FlagDescriptor)it_cflags.next();
56                 System.out.println(fd.toString());
57                 vFlags.add(fd);
58             }
59
60             if (vFlags.size()!=0) {
61                 flag=new FlagDescriptor[vFlags.size()];
62                 
63                 for(int i=0;i < vFlags.size() ; i++) {
64                     if (((FlagDescriptor)vFlags.get(i)).getExternal()) {
65                         flag[ctr]=(FlagDescriptor)vFlags.get(i);
66                         vFlags.remove(flag[ctr]);
67                         ctr++;
68                     }
69                 }
70                 for(int i=0;i < vFlags.size() ; i++) {
71                     flag[i+ctr]=(FlagDescriptor)vFlags.get(i);
72                 }
73                 extern_flags.put(cd,new Integer(ctr));
74                 flags.put(cd,flag);
75                 
76             }
77         }
78     }
79
80     public void taskAnalysis() throws java.io.IOException {
81         Adj_List=new Hashtable();
82         
83         getFlagsfromClasses();
84         
85         int externs;
86         q_main=new LinkedList<TriggerState>();
87         
88         for(Iterator it_classes=(Iterator)flags.keys();it_classes.hasNext();) {
89             ClassDescriptor cd=(ClassDescriptor)it_classes.next();
90             
91             externs=((Integer)extern_flags.get(cd)).intValue();
92             
93             FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
94             //Debug block
95             System.out.println("Inside taskAnalysis;\n Class:"+ cd.getSymbol());
96             System.out.println("No of externs " + externs);
97             System.out.println("No of flags: "+fd.length);
98             //Debug block
99             if (fd.length == externs) {
100                 System.out.println("extern called");
101                 boolean onlyExterns=true;
102             } else {
103                 if ((fd.length == 1) 
104                     && (fd[0].getSymbol().compareTo("initialstate")==0)) {
105                     FlagState fstemp=new FlagState(fd, cd);
106                     Hashtable Adj_List_temp=new Hashtable();
107                     
108                     fstemp.put(fd[0],new Boolean(true));
109                     Vector vtemp=new Vector();
110                     vtemp.add(new Edge(fstemp,"Runtime"));
111                     Adj_List_temp.put(new FlagState(fd,cd),vtemp);
112                     Adj_List.put(cd,Adj_List_temp);
113                     
114                     Queue<TriggerState> q_temp=analyseTasks(new TriggerState(cd,fstemp));
115
116                     
117                     if ( q_temp != null) {
118                         q_main.addAll(q_temp);
119                     }
120
121                 }
122             }
123         }
124         while (q_main.size() > 0) {
125             // ****debug block********
126             
127             System.out.println("/***********contents of main q**********/");
128             for (Iterator it_qm=q_main.iterator();it_qm.hasNext();)
129                 {
130                     TriggerState ts_qm=(TriggerState)it_qm.next();
131                     FlagState fs_qm=ts_qm.getState();
132                     
133                     System.out.println("FS : "+fs_qm.toString((FlagDescriptor [])flags.get(ts_qm.getClassDescriptor())));
134                 }
135             System.out.println("/*********************************/");
136             // ****debug block********
137             Queue<TriggerState> q_temp=analyseTasks(q_main.poll());
138             if ( q_temp != null) {
139                 q_main.addAll(q_temp);
140             }
141         }
142         
143         //Creating DOT files
144         Enumeration e=Adj_List.keys();
145
146         while (e.hasMoreElements()) {
147             System.out.println("creating dot file");
148             ClassDescriptor cdtemp=(ClassDescriptor)e.nextElement();
149             System.out.println((cdtemp.getSymbol()));
150             createDOTfile(cdtemp);
151         }
152         
153     }
154
155
156     public Queue<TriggerState> analyseTasks(TriggerState ts) throws java.io.IOException {
157         Queue<FlagState> q;
158         Queue<FlagState> qft;
159         
160         Hashtable Adj_List_temp;
161         Queue<TriggerState> q_retval;
162         
163         ClassDescriptor cd=ts.getClassDescriptor();
164         
165         if (Adj_List.containsKey(cd)) {
166             //Debug block
167             System.out.println("Inside analyseTasks;\n Checking if adj_list contains the class desc:"+ cd.getSymbol());
168             //Debug block
169             
170             Adj_List_temp=(Hashtable)Adj_List.get(cd);
171         } else {
172             Adj_List_temp=new Hashtable();
173             Adj_List.put(cd,Adj_List_temp);
174         }
175
176
177         int externs=((Integer)extern_flags.get(cd)).intValue();
178         FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
179
180         q = new LinkedList<FlagState>();
181         q_retval=new LinkedList<TriggerState>();
182         q.offer(ts.getState());
183
184         //***Debug Block***
185
186         while (q.size() != 0) {
187             System.out.println("inside while loop in analysetasks \n");
188             
189             FlagState fsworking=q.poll();
190             
191             //***Debug Block***
192             FlagDescriptor[] ftemp=(FlagDescriptor[])flags.get(cd);
193             System.out.println("Processing state: "+cd.getSymbol()+" " + fsworking.toString(ftemp));
194             //***Debug Block***
195
196                     
197             for(Iterator it_tasks=state.getTaskSymbolTable().getDescriptorsIterator();it_tasks.hasNext();) {
198                 TaskDescriptor td = (TaskDescriptor)it_tasks.next();
199                 boolean taskistriggered=false;
200                 int ctr=0;
201                 String taskname=getTaskName(td);
202                 
203                 
204
205                 //***Debug Block***
206                 
207                 System.out.println();
208                 System.out.println("Method: AnalyseTasks");
209                 System.out.println(taskname);
210                 System.out.println();
211                 
212                 //***Debug Block***
213
214                 
215                 for(int i=0; i < td.numParameters(); i++) {
216                     FlagExpressionNode fen=td.getFlag(td.getParameter(i));
217                     if (isTaskTrigger(fen,fsworking))
218                         taskistriggered = true;
219                 }
220
221                 if (taskistriggered) {
222                     //***Debug Block***
223                     //
224                     System.out.println("inside taskistriggered");
225                     
226                     //***Debug Block***
227                     if (wasFlagStateProcessed(Adj_List_temp,fsworking)) {
228                         if (! (fd.length == externs))   
229                             continue;
230                     } else
231                         Adj_List_temp.put(fsworking,new Vector());
232                                         
233                     FlatMethod fm = state.getMethodFlat(td);
234                     FlatNode fn=fm.methodEntryNode();
235                     
236                     HashSet tovisit= new HashSet();
237                     HashSet visited= new HashSet();
238                     
239                     tovisit.add(fn);
240                     while(!tovisit.isEmpty()) {
241                         FlatNode fn1 = (FlatNode)tovisit.iterator().next();
242                         tovisit.remove(fn1);
243                         visited.add(fn1);
244                         for(int i = 0; i < fn1.numNext(); i++) {
245                             FlatNode nn=fn1.getNext(i);
246                             if (nn.kind()==13) {
247                                 //***Debug Block***
248                                 if (((FlatFlagActionNode)nn).getFFANType() == FlatFlagActionNode.PRE) {
249                                     throw new Error("PRE FlagActions not supported");
250                                 } else if (((FlatFlagActionNode)nn).getFFANType() == FlatFlagActionNode.NEWOBJECT) {
251                                     //***Debug Block***
252                                     System.out.println("NEWObject");
253                                     //***Debug Block***
254                                     
255                                     
256                                     TempDescriptor[] tdArray = ((FlatFlagActionNode)nn).readsTemps();
257                                     
258                                     //Under the safe assumption that all the temps in FFAN.NewObject node are of the same type(class)
259                                     ClassDescriptor cd_new=tdArray[0].getType().getClassDesc();
260                                     
261                                     System.out.println("Class: "+cd_new.getSymbol());   
262                                     
263                                     FlagState fstemp=new FlagState((FlagDescriptor[])flags.get(cd_new), cd_new);
264                                     
265                                     for(Iterator it_tfp=((FlatFlagActionNode)nn).getTempFlagPairs();it_tfp.hasNext();) {
266                                         TempFlagPair tfp=(TempFlagPair)it_tfp.next();
267                                         if (tfp.getFlag()==null) {
268                                             System.out.println("test1");
269                                             q_retval.addAll(createPossibleRuntimeStates(new TriggerState(cd_new,new FlagState((FlagDescriptor[])flags.get(cd_new), cd_new))));
270                                             // ****debug block********
271                                             System.out.println("/***********contents of q ret**********/");
272                                             for (Iterator it_qret=q_retval.iterator();it_qret.hasNext();) {
273                                                 TriggerState ts_qret=(TriggerState)it_qret.next();
274                                                 FlagState fs_qret=ts_qret.getState();
275                                                 
276                                                 System.out.println("FS : "+fs_qret.toString((FlagDescriptor [])flags.get(ts_qret.getClassDescriptor())));
277                                             }
278                                             System.out.println("/*********************************/");
279                                             // ****debug block********
280                                         } else
281                                             fstemp.put(tfp.getFlag(),new Boolean(((FlatFlagActionNode)nn).getFlagChange(tfp)));
282                                         
283                                         
284                                     }
285                                     
286                                     //***Debug Block***
287                                     System.out.println("test2");
288                                     System.out.println("Newobj fsworking "+fsworking.toString((FlagDescriptor [])flags.get(cd_new)));
289                                     System.out.println("Newobj fstemp "+fstemp.toString((FlagDescriptor [])flags.get(cd_new))); 
290                                     
291                                     //***Debug Block***
292                                     
293                                     q_retval.offer(new TriggerState(cd_new,fstemp));
294                                     
295                                     //make this a function containsExterns()
296                                     int extrns=((Integer)extern_flags.get(cd_new)).intValue();
297                                     
298                                     if ((extrns >0) && (extrns!=((FlagDescriptor[])flags.get(cd_new)).length))
299                                         q_retval.addAll(createPossibleRuntimeStates(new TriggerState(cd_new,fstemp)));
300                                     
301                                     fstemp=null;
302                                     // ****debug block********
303                                     System.out.println("/***********contents of q ret 1**********/");
304                                     for (Iterator it_qret=q_retval.iterator();it_qret.hasNext();) {
305                                         TriggerState ts_qret=(TriggerState)it_qret.next();
306                                         FlagState fs_qret=ts_qret.getState();
307                                         
308                                         System.out.println("FS : "+fs_qret.toString((FlagDescriptor [])flags.get(ts_qret.getClassDescriptor())));
309                                     }
310                                     System.out.println("/*********************************/");
311                                     // ****debug block********
312                                                                         
313                                 }
314                                 if (((FlatFlagActionNode)nn).getFFANType() == FlatFlagActionNode.TASKEXIT) {
315                                     //***Debug Block***
316                                     //
317                                     System.out.println("TaskExit");
318                                     //***Debug Block***
319                                     
320                                     FlagState fstemp=new FlagState(fsworking.getStateTable(), null); //WHAT CLASS IS THIS
321                                     
322                                     for(Iterator it_tfp=((FlatFlagActionNode)nn).getTempFlagPairs();it_tfp.hasNext();) {
323                                         TempFlagPair tfp=(TempFlagPair)it_tfp.next();
324                                         fstemp.put(tfp.getFlag(),new Boolean(((FlatFlagActionNode)nn).getFlagChange(tfp)));
325                                     }
326                                     //***Debug Block***
327                                     System.out.println();
328                                     System.out.println(fstemp.toString((FlagDescriptor [])flags.get(cd)));
329                                     System.out.println();
330                                     System.out.println("taskexit fsworking "+fsworking.toString((FlagDescriptor [])flags.get(cd)));
331                                     System.out.println("taskexit fstemp "+fstemp.toString((FlagDescriptor [])flags.get(cd))); 
332                                     
333                                     //***Debug Block***
334                                     if (!edgeexists(Adj_List_temp,fsworking,fstemp,taskname)) {
335                                         ((Vector)Adj_List_temp.get(fsworking)).add(new Edge(fstemp,taskname));
336                                     }
337                                     if (!wasFlagStateProcessed(Adj_List_temp,fstemp)) {
338                                         q.offer(fstemp);
339                                     }
340                                     fstemp=null;
341                                     
342                                 }
343                             }
344                             
345                             if (!visited.contains(nn) && !tovisit.contains(nn)) {
346                                 tovisit.add(nn);
347                             }
348                         }
349                     }
350                 }
351             }
352         }
353         if (q_retval.size()==0)
354             return null;
355         else
356             return q_retval;
357     }
358
359     private boolean isTaskTrigger(FlagExpressionNode fen,FlagState fs) {
360         if (fen instanceof FlagNode)
361             return fs.get(((FlagNode)fen).getFlag());
362         else
363             switch (((FlagOpNode)fen).getOp().getOp()) {
364             case Operation.LOGIC_AND:
365                 return ((isTaskTrigger(((FlagOpNode)fen).getLeft(),fs)) && (isTaskTrigger(((FlagOpNode)fen).getRight(),fs)));
366             case Operation.LOGIC_OR:
367                 return ((isTaskTrigger(((FlagOpNode)fen).getLeft(),fs)) || (isTaskTrigger(((FlagOpNode)fen).getRight(),fs)));
368             case Operation.LOGIC_NOT:
369                 return !(isTaskTrigger(((FlagOpNode)fen).getLeft(),fs));
370             default:
371                 return false;
372             }
373     }
374
375     private boolean wasFlagStateProcessed(Hashtable Adj_List,FlagState fs) {
376         Enumeration e=Adj_List.keys();
377         
378         while(e.hasMoreElements()) {
379             FlagState fsv = (FlagState)(e.nextElement());
380
381             if (fsv.isEqual(fs))
382                 return true;
383         }
384         return false;
385     }
386
387     private boolean existsInQueue(TriggerState ts) {
388         throw new Error("Use hashcode/contains of set method to find...no linear search allowed");
389     }
390
391     private boolean existsInFSQueue(Queue q,FlagState fs) {
392         throw new Error("Use hashcode/contains of set method to find...no linear search allowed");
393     }
394
395     public void printAdjList(ClassDescriptor cd) {
396         Enumeration e=((Hashtable)Adj_List.get(cd)).keys();
397         while(e.hasMoreElements()) {
398             FlagState fsv = (FlagState)(e.nextElement());
399             System.out.println(fsv.toString((FlagDescriptor [])flags.get(cd)));
400         }
401     }
402
403     public void createDOTfile(ClassDescriptor cd) throws java.io.IOException {
404         File dotfile= new File("graph"+cd.getSymbol()+".dot");
405
406         FileWriter dotwriter=new FileWriter(dotfile,true);
407
408         dotwriter.write("digraph G{ \n");
409         dotwriter.write("center=true;\norientation=landscape;\n");
410
411         Enumeration e=((Hashtable)Adj_List.get(cd)).keys();
412         while(e.hasMoreElements()) {
413             FlagState fsv = (FlagState)(e.nextElement());
414             System.out.println(fsv.toString());
415             Hashtable test=(Hashtable)Adj_List.get(cd);
416             Vector edges=(Vector)test.get(fsv);
417             for(int i=0;i < edges.size();i++) {
418                 dotwriter.write(fsv.toString((FlagDescriptor [])flags.get(cd))+" -> "+((Edge)edges.get(i)).getState().toString((FlagDescriptor [])flags.get(cd))+"[label=\""+((Edge)edges.get(i)).getName()+"\"];\n");
419             }
420
421         }
422         dotwriter.write("}\n");
423         dotwriter.flush();
424         dotwriter.close();
425     }
426
427     private String getTaskName(TaskDescriptor td) {
428         StringTokenizer st = new StringTokenizer(td.toString(),"(");
429         return st.nextToken();
430     }
431
432     private boolean edgeexists(Hashtable Adj_List_local,FlagState v1, FlagState v2,String name) {
433         Vector edges=(Vector)Adj_List_local.get(v1);
434         
435         if (edges == null) {
436             System.out.println("no edges");
437         } else {
438             for(int i=0;i < edges.size();i++) {
439                 FlagState fs=((Edge)edges.get(i)).getState();
440                 if (fs.isEqual(v2) && (name.compareTo(((Edge)edges.get(i)).getName())==0))
441                     return true;
442             }
443         }
444         return false;
445     }
446
447     private void processExterns(boolean onlyExterns,ClassDescriptor cd) throws java.io.IOException {
448         int noOfIterations;
449         Hashtable Adj_List_temp;
450         if (Adj_List.containsKey(cd)) {
451             Adj_List_temp=(Hashtable)Adj_List.get(cd);
452         } else {
453             Adj_List_temp=new Hashtable();
454             Adj_List.put(cd,Adj_List_temp);
455         }
456
457
458         if (onlyExterns) {
459             FlagDescriptor [] fd=(FlagDescriptor [])flags.get(cd);
460             System.out.println("onlyExterns"+fd.length);
461             noOfIterations=1<<fd.length;
462             boolean BoolValTable[]=new boolean[fd.length];
463             
464             for(int i=0; i < fd.length ; i++) {
465                 System.out.println(fd[i].getSymbol());
466                 BoolValTable[i]=false;
467             }
468             Adj_List_temp.put(new FlagState(fd,cd),new Vector());
469
470             for(int k=1; k<noOfIterations; k++) {
471                 for(int j=0; j< fd.length ;j++) {
472                     if ((k% (1<<j)) == 0)
473                         BoolValTable[j]=(!BoolValTable[j]);
474                 }
475
476                 FlagState fstemp=new FlagState(fd,cd);
477                 int i=0;
478                 for(Enumeration e=fstemp.getStateTable().keys(); e.hasMoreElements() && i < fd.length;i++) {
479                     fstemp.put((FlagDescriptor)e.nextElement(),new Boolean(BoolValTable[i]));
480                 }
481                 Adj_List_temp.put(fstemp,new Vector());
482             }
483
484             Enumeration e=Adj_List_temp.keys();
485             while(e.hasMoreElements()) {
486                 FlagState fstemp=(FlagState)e.nextElement();
487                 Enumeration en=Adj_List_temp.keys();
488                 while (en.hasMoreElements()) {
489                     FlagState fs=(FlagState)en.nextElement();
490                     if(fstemp == fs) {
491                         continue;
492                     } else {
493                         ((Vector)Adj_List_temp.get(fstemp)).add(new Edge(fs,"Runtime"));
494                     }
495                 }
496             }
497         }
498     } 
499
500     private Queue createPossibleRuntimeStates(TriggerState ts) throws java.io.IOException {
501         int noOfIterations, externs;
502         Hashtable Adj_List_temp;
503         boolean onlyExterns;
504         
505         System.out.println("Inside CreatePossible runtime states");
506         
507         ClassDescriptor cd = ts.getClassDescriptor();
508         FlagState fs= ts.getState();
509         if (Adj_List.containsKey(cd)) {
510             Adj_List_temp=(Hashtable)Adj_List.get(cd);
511         } else {
512             Adj_List_temp=new Hashtable();
513             Adj_List.put(cd,Adj_List_temp);
514         }
515
516         externs=((Integer)extern_flags.get(cd)).intValue();
517
518         FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
519
520         onlyExterns= (fd.length==externs);
521
522         Queue  q_ret=new LinkedList();
523
524         if (onlyExterns) {
525             noOfIterations=1<<fd.length;
526             boolean BoolValTable[]=new boolean[fd.length];
527
528             for(int i=0; i < fd.length ; i++) {
529                 System.out.println(fd[i].getSymbol());
530                 BoolValTable[i]=false;
531             }
532
533             if (! wasFlagStateProcessed(Adj_List_temp,fs)) {
534                 TriggerState ts_local=new TriggerState(cd,fs);
535                 if (!existsInQueue(ts_local)) {
536                     q_ret.offer(ts_local);
537                 }
538                 Adj_List_temp.put(fs,new Vector());
539             }
540
541             for(int k=1; k<noOfIterations; k++) {
542                 for(int j=0; j< fd.length ;j++) {
543                     if ((k% (1<<j))==0)
544                         BoolValTable[j]=(!BoolValTable[j]);
545                 }
546
547                 FlagState fstemp=new FlagState(fs.getStateTable(),cd);
548                 int i=0;
549                 for(Enumeration e=fstemp.getStateTable().keys(); e.hasMoreElements() && i < fd.length;i++) {
550                     fstemp.put((FlagDescriptor)e.nextElement(),new Boolean(BoolValTable[i]));
551                 }
552                 
553                 if (wasFlagStateProcessed(Adj_List_temp,fstemp)) {
554                     continue;
555                 } else {
556                     TriggerState ts_local=new TriggerState(cd,fstemp);
557                     if (!existsInQueue(ts_local)) {
558                         q_ret.offer(ts_local);
559                     }
560
561                                         
562                     Adj_List_temp.put(fstemp,new Vector());
563                 }
564
565             }
566             
567             Enumeration e=Adj_List_temp.keys();
568             while(e.hasMoreElements()) {
569                 FlagState fstemp=(FlagState)e.nextElement();
570                 Enumeration en=Adj_List_temp.keys();
571                 while (en.hasMoreElements()) {
572                     FlagState fs_local=(FlagState)en.nextElement();
573                     if(fstemp == fs_local)
574                         continue;
575                     else 
576                         ((Vector)Adj_List_temp.get(fstemp)).add(new Edge(fs_local,"Runtime"));
577                 }
578             }
579
580             return q_ret;
581         } else {
582             System.out.println("inside else part");
583             noOfIterations=1<<externs;
584             boolean BoolValTable[]=new boolean[externs];
585             Hashtable Adj_List_local;
586             
587             
588             Adj_List_local=new Hashtable();
589             
590             for(int i=0; i < externs ; i++) {
591                 System.out.println(fd[i].getSymbol());
592                 BoolValTable[i]=fs.get(fd[i]);
593             }
594
595             for(int k=1; k<noOfIterations; k++) {
596                 for(int j=0; j< fd.length ;j++) {
597                     if ((k% (1<<j))==0)
598                         BoolValTable[j]=(!BoolValTable[j]);
599                 }
600                 
601                 FlagState fstemp=new FlagState(fs.getStateTable(),cd);
602                 FlagDescriptor fdtemp[]=(FlagDescriptor [])flags.get(cd);
603                 
604                 for(int i=0; i < externs;i++)
605                     {
606                         fstemp.put(fdtemp[i],new Boolean(BoolValTable[i]));
607                     }
608                 
609                 q_ret.offer(new TriggerState(cd,fstemp));
610             }
611
612             return q_ret;
613             
614         }
615     }
616
617     private Queue createPossibleRuntimeStates(ClassDescriptor cd,FlagState fs) throws java.io.IOException {
618         int noOfIterations, externs;
619         Hashtable Adj_List_temp;
620         boolean onlyExterns;
621         
622         System.out.println("Inside CreatePossible runtime states(flagstates)");
623
624         if (Adj_List.containsKey(cd))
625             Adj_List_temp=(Hashtable)Adj_List.get(cd);
626         else {
627             Adj_List_temp=new Hashtable();
628             Adj_List.put(cd,Adj_List_temp);
629         }
630
631         externs=((Integer)extern_flags.get(cd)).intValue();
632
633         FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
634
635         onlyExterns=fd.length==externs;
636         
637         Queue  q_ret;
638
639         q_ret=new LinkedList();
640         
641         if (onlyExterns) {
642             noOfIterations=1<<fd.length;
643             boolean BoolValTable[]=new boolean[fd.length];
644
645             for(int i=0; i < fd.length ; i++) {
646                 System.out.println(fd[i].getSymbol());
647                 BoolValTable[i]=false;
648             }
649             
650             return q_ret;
651         } else {
652             System.out.println("inside else part(fs)");
653             noOfIterations=1<<externs;
654             boolean BoolValTable[]=new boolean[externs];
655             Hashtable Adj_List_local;
656             
657             
658             Adj_List_local=new Hashtable();
659             
660             for(int i=0; i < externs ; i++) {
661                 System.out.println(fd[i].getSymbol());
662                 BoolValTable[i]=fs.get(fd[i]);
663             }
664
665             if (! wasFlagStateProcessed(Adj_List_temp,fs)) {
666                 Adj_List_temp.put(fs,new Vector());
667             }
668             for(int k=1; k<noOfIterations; k++) {
669                 for(int j=0; j< fd.length ;j++) {
670                     if ((k% (1<<j))==0)
671                         BoolValTable[j]=(!BoolValTable[j]);
672                 }
673                 
674                 FlagState fstemp=new FlagState(fs.getStateTable(),cd);
675                 FlagDescriptor fdtemp[]=(FlagDescriptor [])flags.get(cd);
676                 
677                 for(int i=0; i < externs;i++) {
678                     fstemp.put(fdtemp[i],new Boolean(BoolValTable[i]));
679                 }
680                 
681                 q_ret.offer(fstemp);
682                 ((Vector)(Adj_List_temp.get(fs))).add(new Edge(fstemp,"Runtime"));
683                 
684             }
685             return q_ret;
686             
687         }
688     }
689
690
691     private void processTasksWithPost(ClassDescriptor cd, Hashtable pre) {
692     }
693
694     private ClassDescriptor processFlatNew(FlatNode fn) {
695         if (! (fn.getNext(0).kind() == 13)) {
696             return (((FlatNew)fn).getType().getClassDesc());
697         }
698         return null;
699     }
700
701 }