1 package Analysis.TaskStateAnalysis;
2 import Analysis.TaskStateAnalysis.*;
8 import java.io.FileWriter;
10 public class TaskAnalysis {
14 Hashtable extern_flags;
15 Queue<TriggerState> q_main;
20 * @param state a flattened State object
23 public TaskAnalysis(State state)
28 /** This function returns the number of external flags, etc */
30 private void getFlagsfromClasses() {
31 flags=new Hashtable();
32 extern_flags = new Hashtable();
34 for(Iterator it_classes=state.getClassSymbolTable().getDescriptorsIterator();it_classes.hasNext();) {
36 ClassDescriptor cd = (ClassDescriptor)it_classes.next();
37 System.out.println(cd.getSymbol());
38 Vector vFlags=new Vector();
39 FlagDescriptor flag[];
43 /* Adding the flags of the super class */
44 if (cd.getSuper()!=null) {
45 ClassDescriptor superdesc=cd.getSuperDesc();
47 for(Iterator it_cflags=superdesc.getFlags();it_cflags.hasNext();) {
48 FlagDescriptor fd = (FlagDescriptor)it_cflags.next();
49 System.out.println(fd.toString());
54 for(Iterator it_cflags=cd.getFlags();it_cflags.hasNext();) {
55 FlagDescriptor fd = (FlagDescriptor)it_cflags.next();
56 System.out.println(fd.toString());
60 if (vFlags.size()!=0) {
61 flag=new FlagDescriptor[vFlags.size()];
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]);
70 for(int i=0;i < vFlags.size() ; i++) {
71 flag[i+ctr]=(FlagDescriptor)vFlags.get(i);
73 extern_flags.put(cd,new Integer(ctr));
80 public void taskAnalysis() throws java.io.IOException {
81 Adj_List=new Hashtable();
83 getFlagsfromClasses();
86 q_main=new LinkedList<TriggerState>();
88 for(Iterator it_classes=(Iterator)flags.keys();it_classes.hasNext();) {
89 ClassDescriptor cd=(ClassDescriptor)it_classes.next();
91 externs=((Integer)extern_flags.get(cd)).intValue();
93 FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
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);
99 if (fd.length == externs) {
100 System.out.println("extern called");
101 boolean onlyExterns=true;
104 && (fd[0].getSymbol().compareTo("initialstate")==0)) {
105 FlagState fstemp=new FlagState(fd, cd);
106 Hashtable Adj_List_temp=new Hashtable();
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);
114 Queue<TriggerState> q_temp=analyseTasks(new TriggerState(cd,fstemp));
117 if ( q_temp != null) {
118 q_main.addAll(q_temp);
124 while (q_main.size() > 0) {
125 // ****debug block********
126 for (Iterator it_qm=q_main.iterator();it_qm.hasNext();)
128 TriggerState ts_qm=(TriggerState)it_qm.next();
129 FlagState fs_qm=ts_qm.getState();
130 System.out.println("/***********contents of main q**********/");
131 System.out.println("FS : "+fs_qm.toString((FlagDescriptor [])flags.get(ts_qm.getClassDescriptor())));
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);
144 Enumeration e=Adj_List.keys();
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);
156 public Queue<TriggerState> analyseTasks(TriggerState ts) throws java.io.IOException {
158 Queue<FlagState> qft;
160 Hashtable Adj_List_temp;
161 Queue<TriggerState> q_retval;
163 ClassDescriptor cd=ts.getClassDescriptor();
165 if (Adj_List.containsKey(cd)) {
167 System.out.println("Inside analyseTasks;\n Checking if adj_list contains the class desc:"+ cd.getSymbol());
170 Adj_List_temp=(Hashtable)Adj_List.get(cd);
172 Adj_List_temp=new Hashtable();
173 Adj_List.put(cd,Adj_List_temp);
177 int externs=((Integer)extern_flags.get(cd)).intValue();
178 FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
180 q = new LinkedList<FlagState>();
181 q_retval=new LinkedList<TriggerState>();
182 q.offer(ts.getState());
186 while (q.size() != 0) {
187 System.out.println("inside while loop in analysetasks \n");
189 FlagState fsworking=q.poll();
192 FlagDescriptor[] ftemp=(FlagDescriptor[])flags.get(cd);
193 System.out.println("Processing state: "+cd.getSymbol()+" " + fsworking.toString(ftemp));
198 for(Iterator it_tasks=state.getTaskSymbolTable().getDescriptorsIterator();it_tasks.hasNext();) {
199 TaskDescriptor td = (TaskDescriptor)it_tasks.next();
200 boolean taskistriggered=false;
202 String taskname=getTaskName(td);
208 System.out.println();
209 System.out.println("Method: AnalyseTasks");
210 System.out.println(taskname);
211 System.out.println();
216 for(int i=0; i < td.numParameters(); i++) {
217 FlagExpressionNode fen=td.getFlag(td.getParameter(i));
218 if (isTaskTrigger(fen,fsworking))
219 taskistriggered = true;
222 if (taskistriggered) {
225 System.out.println("inside taskistriggered");
228 if (wasFlagStateProcessed(Adj_List_temp,fsworking)) {
229 if (! (fd.length == externs))
232 Adj_List_temp.put(fsworking,new Vector());
234 FlatMethod fm = state.getMethodFlat(td);
235 FlatNode fn=fm.methodEntryNode();
237 HashSet tovisit= new HashSet();
238 HashSet visited= new HashSet();
241 while(!tovisit.isEmpty()) {
242 FlatNode fn1 = (FlatNode)tovisit.iterator().next();
245 for(int i = 0; i < fn1.numNext(); i++) {
246 FlatNode nn=fn1.getNext(i);
249 if (((FlatFlagActionNode)nn).getFFANType() == FlatFlagActionNode.PRE) {
250 throw new Error("PRE FlagActions not supported");
251 } else if (((FlatFlagActionNode)nn).getFFANType() == FlatFlagActionNode.NEWOBJECT) {
253 System.out.println("NEWObject");
257 TempDescriptor[] tdArray = ((FlatFlagActionNode)nn).readsTemps();
259 //Under the safe assumption that all the temps in FFAN.NewObject node are of the same type(class)
260 ClassDescriptor cd_new=tdArray[0].getType().getClassDesc();
262 System.out.println("Class: "+cd_new.getSymbol());
264 FlagState fstemp=new FlagState((FlagDescriptor[])flags.get(cd_new), cd_new);
266 for(Iterator it_tfp=((FlatFlagActionNode)nn).getTempFlagPairs();it_tfp.hasNext();) {
267 TempFlagPair tfp=(TempFlagPair)it_tfp.next();
268 if (tfp.getFlag()==null) {
269 System.out.println("test1");
270 q_retval.addAll(createPossibleRuntimeStates(new TriggerState(cd_new,new FlagState((FlagDescriptor[])flags.get(cd_new), cd_new))));
271 // ****debug block********
272 System.out.println("/***********contents of q ret**********/");
273 for (Iterator it_qret=q_retval.iterator();it_qret.hasNext();) {
274 TriggerState ts_qret=(TriggerState)it_qret.next();
275 FlagState fs_qret=ts_qret.getState();
277 System.out.println("FS : "+fs_qret.toString((FlagDescriptor [])flags.get(ts_qret.getClassDescriptor())));
279 System.out.println("/*********************************/");
280 // ****debug block********
282 fstemp.put(tfp.getFlag(),new Boolean(((FlatFlagActionNode)nn).getFlagChange(tfp)));
288 System.out.println("test2");
289 System.out.println("Newobj fsworking "+fsworking.toString((FlagDescriptor [])flags.get(cd_new)));
290 System.out.println("Newobj fstemp "+fstemp.toString((FlagDescriptor [])flags.get(cd_new)));
294 q_retval.offer(new TriggerState(cd_new,fstemp));
296 //make this a function containsExterns()
297 int extrns=((Integer)extern_flags.get(cd_new)).intValue();
299 if ((extrns >0) && (extrns!=((FlagDescriptor[])flags.get(cd_new)).length))
300 q_retval.addAll(createPossibleRuntimeStates(new TriggerState(cd_new,fstemp)));
303 // ****debug block********
304 System.out.println("/***********contents of q ret 1**********/");
305 for (Iterator it_qret=q_retval.iterator();it_qret.hasNext();) {
306 TriggerState ts_qret=(TriggerState)it_qret.next();
307 FlagState fs_qret=ts_qret.getState();
309 System.out.println("FS : "+fs_qret.toString((FlagDescriptor [])flags.get(ts_qret.getClassDescriptor())));
311 System.out.println("/*********************************/");
312 // ****debug block********
315 if (((FlatFlagActionNode)nn).getFFANType() == FlatFlagActionNode.TASKEXIT) {
318 System.out.println("TaskExit");
321 FlagState fstemp=new FlagState(fsworking.getStateTable(), null); //WHAT CLASS IS THIS
323 for(Iterator it_tfp=((FlatFlagActionNode)nn).getTempFlagPairs();it_tfp.hasNext();) {
324 TempFlagPair tfp=(TempFlagPair)it_tfp.next();
325 fstemp.put(tfp.getFlag(),new Boolean(((FlatFlagActionNode)nn).getFlagChange(tfp)));
328 System.out.println();
329 System.out.println(fstemp.toString((FlagDescriptor [])flags.get(cd)));
330 System.out.println();
331 System.out.println("taskexit fsworking "+fsworking.toString((FlagDescriptor [])flags.get(cd)));
332 System.out.println("taskexit fstemp "+fstemp.toString((FlagDescriptor [])flags.get(cd)));
335 if (!edgeexists(Adj_List_temp,fsworking,fstemp,taskname)) {
336 ((Vector)Adj_List_temp.get(fsworking)).add(new Edge(fstemp,taskname));
338 if (!wasFlagStateProcessed(Adj_List_temp,fstemp)) {
346 if (!visited.contains(nn) && !tovisit.contains(nn)) {
354 if (q_retval.size()==0)
360 private boolean isTaskTrigger(FlagExpressionNode fen,FlagState fs) {
361 if (fen instanceof FlagNode)
362 return fs.get(((FlagNode)fen).getFlag());
364 switch (((FlagOpNode)fen).getOp().getOp()) {
365 case Operation.LOGIC_AND:
366 return ((isTaskTrigger(((FlagOpNode)fen).getLeft(),fs)) && (isTaskTrigger(((FlagOpNode)fen).getRight(),fs)));
367 case Operation.LOGIC_OR:
368 return ((isTaskTrigger(((FlagOpNode)fen).getLeft(),fs)) || (isTaskTrigger(((FlagOpNode)fen).getRight(),fs)));
369 case Operation.LOGIC_NOT:
370 return !(isTaskTrigger(((FlagOpNode)fen).getLeft(),fs));
376 private boolean wasFlagStateProcessed(Hashtable Adj_List,FlagState fs) {
377 Enumeration e=Adj_List.keys();
379 while(e.hasMoreElements()) {
380 FlagState fsv = (FlagState)(e.nextElement());
388 private boolean existsInQueue(TriggerState ts) {
389 for(Iterator it_queue=q_main.iterator();it_queue.hasNext();) {
390 TriggerState ts_local=(TriggerState)it_queue.next();
392 if (ts_local.equals(ts))
398 private boolean existsInFSQueue(Queue q,FlagState fs) {
399 for (Iterator it_q=q.iterator();it_q.hasNext();) {
400 if(((FlagState)it_q.next()).isEqual(fs))
406 public void printAdjList(ClassDescriptor cd) {
407 Enumeration e=((Hashtable)Adj_List.get(cd)).keys();
408 while(e.hasMoreElements()) {
409 FlagState fsv = (FlagState)(e.nextElement());
410 System.out.println(fsv.toString((FlagDescriptor [])flags.get(cd)));
414 public void createDOTfile(ClassDescriptor cd) throws java.io.IOException {
415 File dotfile= new File("graph"+cd.getSymbol()+".dot");
417 FileWriter dotwriter=new FileWriter(dotfile,true);
419 dotwriter.write("digraph G{ \n");
420 dotwriter.write("center=true;\norientation=landscape;\n");
422 Enumeration e=((Hashtable)Adj_List.get(cd)).keys();
423 while(e.hasMoreElements()) {
424 FlagState fsv = (FlagState)(e.nextElement());
425 System.out.println(fsv.toString());
426 Hashtable test=(Hashtable)Adj_List.get(cd);
427 Vector edges=(Vector)test.get(fsv);
428 for(int i=0;i < edges.size();i++) {
429 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");
433 dotwriter.write("}\n");
438 private String getTaskName(TaskDescriptor td) {
439 StringTokenizer st = new StringTokenizer(td.toString(),"(");
440 return st.nextToken();
443 private boolean edgeexists(Hashtable Adj_List_local,FlagState v1, FlagState v2,String name) {
444 Vector edges=(Vector)Adj_List_local.get(v1);
447 System.out.println("no edges");
449 for(int i=0;i < edges.size();i++) {
450 FlagState fs=((Edge)edges.get(i)).getState();
451 if (fs.isEqual(v2) && (name.compareTo(((Edge)edges.get(i)).getName())==0))
458 private void processExterns(boolean onlyExterns,ClassDescriptor cd) throws java.io.IOException {
460 Hashtable Adj_List_temp;
461 if (Adj_List.containsKey(cd)) {
462 Adj_List_temp=(Hashtable)Adj_List.get(cd);
464 Adj_List_temp=new Hashtable();
465 Adj_List.put(cd,Adj_List_temp);
470 FlagDescriptor [] fd=(FlagDescriptor [])flags.get(cd);
471 System.out.println("onlyExterns"+fd.length);
472 noOfIterations=1<<fd.length;
473 boolean BoolValTable[]=new boolean[fd.length];
475 for(int i=0; i < fd.length ; i++) {
476 System.out.println(fd[i].getSymbol());
477 BoolValTable[i]=false;
479 Adj_List_temp.put(new FlagState(fd,cd),new Vector());
481 for(int k=1; k<noOfIterations; k++) {
482 for(int j=0; j< fd.length ;j++) {
483 if ((k% (1<<j)) == 0)
484 BoolValTable[j]=(!BoolValTable[j]);
487 FlagState fstemp=new FlagState(fd,cd);
489 for(Enumeration e=fstemp.getStateTable().keys(); e.hasMoreElements() && i < fd.length;i++) {
490 fstemp.put((FlagDescriptor)e.nextElement(),new Boolean(BoolValTable[i]));
492 Adj_List_temp.put(fstemp,new Vector());
495 Enumeration e=Adj_List_temp.keys();
496 while(e.hasMoreElements()) {
497 FlagState fstemp=(FlagState)e.nextElement();
498 Enumeration en=Adj_List_temp.keys();
499 while (en.hasMoreElements()) {
500 FlagState fs=(FlagState)en.nextElement();
504 ((Vector)Adj_List_temp.get(fstemp)).add(new Edge(fs,"Runtime"));
511 private Queue createPossibleRuntimeStates(TriggerState ts) throws java.io.IOException {
512 int noOfIterations, externs;
513 Hashtable Adj_List_temp;
516 System.out.println("Inside CreatePossible runtime states");
518 ClassDescriptor cd = ts.getClassDescriptor();
519 FlagState fs= ts.getState();
520 if (Adj_List.containsKey(cd)) {
521 Adj_List_temp=(Hashtable)Adj_List.get(cd);
523 Adj_List_temp=new Hashtable();
524 Adj_List.put(cd,Adj_List_temp);
527 externs=((Integer)extern_flags.get(cd)).intValue();
529 FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
531 onlyExterns= (fd.length==externs);
533 Queue q_ret=new LinkedList();
536 noOfIterations=1<<fd.length;
537 boolean BoolValTable[]=new boolean[fd.length];
539 for(int i=0; i < fd.length ; i++) {
540 System.out.println(fd[i].getSymbol());
541 BoolValTable[i]=false;
544 if (! wasFlagStateProcessed(Adj_List_temp,fs)) {
545 TriggerState ts_local=new TriggerState(cd,fs);
546 if (!existsInQueue(ts_local)) {
547 q_ret.offer(ts_local);
549 Adj_List_temp.put(fs,new Vector());
552 for(int k=1; k<noOfIterations; k++) {
553 for(int j=0; j< fd.length ;j++) {
555 BoolValTable[j]=(!BoolValTable[j]);
558 FlagState fstemp=new FlagState(fs.getStateTable(),cd);
560 for(Enumeration e=fstemp.getStateTable().keys(); e.hasMoreElements() && i < fd.length;i++) {
561 fstemp.put((FlagDescriptor)e.nextElement(),new Boolean(BoolValTable[i]));
564 if (wasFlagStateProcessed(Adj_List_temp,fstemp)) {
567 TriggerState ts_local=new TriggerState(cd,fstemp);
568 if (!existsInQueue(ts_local)) {
569 q_ret.offer(ts_local);
573 Adj_List_temp.put(fstemp,new Vector());
578 Enumeration e=Adj_List_temp.keys();
579 while(e.hasMoreElements()) {
580 FlagState fstemp=(FlagState)e.nextElement();
581 Enumeration en=Adj_List_temp.keys();
582 while (en.hasMoreElements()) {
583 FlagState fs_local=(FlagState)en.nextElement();
584 if(fstemp == fs_local)
587 ((Vector)Adj_List_temp.get(fstemp)).add(new Edge(fs_local,"Runtime"));
593 System.out.println("inside else part");
594 noOfIterations=1<<externs;
595 boolean BoolValTable[]=new boolean[externs];
596 Hashtable Adj_List_local;
599 Adj_List_local=new Hashtable();
601 for(int i=0; i < externs ; i++) {
602 System.out.println(fd[i].getSymbol());
603 BoolValTable[i]=fs.get(fd[i]);
606 for(int k=1; k<noOfIterations; k++) {
607 for(int j=0; j< fd.length ;j++) {
609 BoolValTable[j]=(!BoolValTable[j]);
612 FlagState fstemp=new FlagState(fs.getStateTable(),cd);
613 FlagDescriptor fdtemp[]=(FlagDescriptor [])flags.get(cd);
615 for(int i=0; i < externs;i++)
617 fstemp.put(fdtemp[i],new Boolean(BoolValTable[i]));
620 q_ret.offer(new TriggerState(cd,fstemp));
628 private Queue createPossibleRuntimeStates(ClassDescriptor cd,FlagState fs) throws java.io.IOException {
629 int noOfIterations, externs;
630 Hashtable Adj_List_temp;
633 System.out.println("Inside CreatePossible runtime states(flagstates)");
635 if (Adj_List.containsKey(cd))
636 Adj_List_temp=(Hashtable)Adj_List.get(cd);
638 Adj_List_temp=new Hashtable();
639 Adj_List.put(cd,Adj_List_temp);
642 externs=((Integer)extern_flags.get(cd)).intValue();
644 FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
646 onlyExterns=fd.length==externs;
650 q_ret=new LinkedList();
653 noOfIterations=1<<fd.length;
654 boolean BoolValTable[]=new boolean[fd.length];
656 for(int i=0; i < fd.length ; i++) {
657 System.out.println(fd[i].getSymbol());
658 BoolValTable[i]=false;
663 System.out.println("inside else part(fs)");
664 noOfIterations=1<<externs;
665 boolean BoolValTable[]=new boolean[externs];
666 Hashtable Adj_List_local;
669 Adj_List_local=new Hashtable();
671 for(int i=0; i < externs ; i++) {
672 System.out.println(fd[i].getSymbol());
673 BoolValTable[i]=fs.get(fd[i]);
676 if (! wasFlagStateProcessed(Adj_List_temp,fs)) {
677 Adj_List_temp.put(fs,new Vector());
679 for(int k=1; k<noOfIterations; k++) {
680 for(int j=0; j< fd.length ;j++) {
682 BoolValTable[j]=(!BoolValTable[j]);
685 FlagState fstemp=new FlagState(fs.getStateTable(),cd);
686 FlagDescriptor fdtemp[]=(FlagDescriptor [])flags.get(cd);
688 for(int i=0; i < externs;i++) {
689 fstemp.put(fdtemp[i],new Boolean(BoolValTable[i]));
693 ((Vector)(Adj_List_temp.get(fs))).add(new Edge(fstemp,"Runtime"));
702 private void processTasksWithPost(ClassDescriptor cd, Hashtable pre) {
705 private ClassDescriptor processFlatNew(FlatNode fn) {
706 if (! (fn.getNext(0).kind() == 13)) {
707 return (((FlatNew)fn).getType().getClassDesc());