*Fixed the big graph
[IRC.git] / Robust / src / Analysis / TaskStateAnalysis / TaskGraph.java
index fbdcfcdd931d69a8510843a7fb0f7042c2282e46..6daabf5799bc51ba90b4c78347df67482aa0f1ee 100644 (file)
@@ -3,6 +3,7 @@ import java.util.*;
 import IR.State;
 import IR.SymbolTable;
 import IR.ClassDescriptor;
+import IR.TaskDescriptor;
 import java.io.File;
 import java.io.FileWriter;
 import java.io.FileOutputStream;
@@ -11,22 +12,30 @@ public class TaskGraph {
     TaskAnalysis taskanalysis;
     State state;
     Hashtable cdtonodes;
+    Hashtable nodes;
+    Hashtable<TaskNode,TaskNode> alltasknodes;
+    
+    //Colors
+    String colors[]={"red","blue","green","brown","orange","pink","black","grey","olivedrab","yellow"};
 
     public TaskGraph(State state, TaskAnalysis taskanalysis) {
        this.state=state;
        this.taskanalysis=taskanalysis;
        this.cdtonodes=new Hashtable();
+       this.alltasknodes=new Hashtable<TaskNode,TaskNode>();
 
        for(Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();classit.hasNext();) {
            ClassDescriptor cd=(ClassDescriptor) classit.next();
-           produceTaskNodes(cd);
+           if (cd.hasFlags())
+               produceTaskNodes(cd);
        }
+       produceAllTaskNodes();
     }
     
     
     public void createDOTfiles() {
-       for(Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();classit.hasNext();) {
-           ClassDescriptor cd=(ClassDescriptor) classit.next();
+       for(Iterator it_classes=(Iterator)cdtonodes.keys();it_classes.hasNext();) {
+           ClassDescriptor cd=(ClassDescriptor) it_classes.next();
            Set tasknodes=getTaskNodes(cd);
            if (tasknodes!=null) {
                try {
@@ -63,34 +72,156 @@ public class TaskGraph {
        Set fsnodes=taskanalysis.getFlagStates(cd);
        if (fsnodes==null)
            return;
-
+           
        Hashtable<TaskNode,TaskNode> tasknodes=new Hashtable<TaskNode,TaskNode>();
        cdtonodes.put(cd, tasknodes);
 
        for(Iterator it=fsnodes.iterator();it.hasNext();) {
            FlagState fs=(FlagState)it.next();
-           
            Iterator it_inedges=fs.inedges();   
-           TaskNode tn;
-           do {
-               if (!fs.inedges().hasNext()){
-                   tn=new TaskNode("Start Node");
-               } else {
+           TaskNode tn,sn;
+          
+               if (fs.isSourceNode()) {
+                       sn=new TaskNode("Start Node");
+                       if(fs.edges().hasNext()){
+                                addEdges(fs,sn,tasknodes);
+                       }       
+               }
+                                               
+               while(it_inedges.hasNext()){   
+                       
                    FEdge inedge=(FEdge)it_inedges.next();
                    tn=new TaskNode(inedge.getLabel());
+                   if(fs.edges().hasNext()){
+                       addEdges(fs,tn,tasknodes);
+                       }
+           }  
+       }
+    }
+    
+    private void produceAllTaskNodes(){
+           alltasknodes=new Hashtable<TaskNode,TaskNode>();
+           
+           for(Iterator it_tasks=state.getTaskSymbolTable().getDescriptorsIterator();it_tasks.hasNext();){
+                   TaskDescriptor td=(TaskDescriptor)it_tasks.next();
+                   TaskNode tn=new TaskNode(td.getSymbol());
+                   alltasknodes.put(tn,tn);
+           }
+           TaskNode tn_runtime=new TaskNode("Runtime");
+           alltasknodes.put(tn_runtime,tn_runtime);
+           
+           int ColorID=0;
+           for(Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();classit.hasNext()&&ColorID<10;) {
+           ClassDescriptor cd=(ClassDescriptor) classit.next();
+               Set fsnodes;
+               
+               if (cd.hasFlags()&&((fsnodes=taskanalysis.getFlagStates(cd))!=null)){
+                       //
+                       System.out.println("\nWorking on fses of Class: "+cd.getSymbol());
+                       //
+                       for(Iterator it=fsnodes.iterator();it.hasNext();) {
+                               FlagState fs=(FlagState)it.next();
+                               //
+                               System.out.println("Evaluating fs: "+fs.getTextLabel());
+                               //
+                                       Iterator it_inedges=fs.inedges();       
+                                   TaskNode tn,sn;
+                                   
+                                   
+                                   if (fs.isSourceNode()){
+                                           //
+                                           System.out.println("A sourcenode");
+                                           //
+                                           if(fs.edges().hasNext()){
+                                               Vector allocatingtasks=fs.getAllocatingTasks();
+                                               //
+                                               if (allocatingtasks.iterator().hasNext())
+                                                       System.out.println("has been allocated by "+allocatingtasks.size()+" tasks");
+                                               //
+                                                   for(Iterator it_at=allocatingtasks.iterator();it_at.hasNext();){
+                                                           TaskDescriptor allocatingtd=(TaskDescriptor)it_at.next();
+                                                           //
+                                                           System.out.println(allocatingtd.getSymbol());
+                                                           //
+                                                           tn=new TaskNode(allocatingtd.getSymbol());
+                                                           
+                                                           addEdges(fs,tn,alltasknodes,ColorID);
+                                                   }
+                                           }
+                                   }
+                                   
+                                   while(it_inedges.hasNext()){   
+                                           FEdge inedge=(FEdge)it_inedges.next();
+                                       tn=new TaskNode(inedge.getLabel());
+                                               if(fs.edges().hasNext()){
+                                               addEdges(fs,tn,alltasknodes,ColorID);
+                                               }
+                               }
+                       }
+                       ColorID++;
+                       }
+                       
                }
-               if(fs.edges().hasNext()){
-                   tn=(TaskNode)canonicalizeTaskNode(tasknodes, tn);
-                   for (Iterator it_edges=fs.edges();it_edges.hasNext();){
-                       TaskNode target=new TaskNode(((FEdge)it_edges.next()).getLabel());
-                       target=(TaskNode)canonicalizeTaskNode(tasknodes,target);
-                       TEdge tedge=new TEdge(target);
-                       //                      if (!tn.edges.contains(tedge))
-                           tn.addEdge(new TEdge(target));
-                   }
-               }
-           } while(it_inedges.hasNext());
+       }  
+       
+       public Set getAllTaskNodes(){
+               return alltasknodes.keySet();
        }
+                                   
+                                                   
+                   
+                   
+               
+       
+           
+    
+  /*   private void mergeAllNodes(){
+               Hashtable alltasks=new Hashtable();
+               for(Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();classit.hasNext();) {
+               ClassDescriptor cd=(ClassDescriptor) classit.next();
+                       Set tnodes=((Hashtable)cdtonodes.get(cd)).keyset();
+                       while (it_tnodes=tnodes.iterator();it_nodes.hasNext()){
+                               TaskNode tn=it_nodes.next();
+                               if (alltasks.containsKey(tn)){
+                                       while(tn.
+                               }
+                       }
+                       
+           
+           
+           
     }
     
+        */   
+    
+    private void addEdges(FlagState fs, TaskNode tn,Hashtable<TaskNode,TaskNode> tasknodes){
+           
+         //  Hashtable<TaskNode,TaskNode> tasknodes=(Hashtable<TaskNode,TaskNode>)cdtonodes.get(fs.getClassDescriptor());
+           tn=(TaskNode)canonicalizeTaskNode(tasknodes, tn);
+               for (Iterator it_edges=fs.edges();it_edges.hasNext();){
+                       TaskNode target=new TaskNode(((FEdge)it_edges.next()).getLabel());
+                       target=(TaskNode)canonicalizeTaskNode(tasknodes,target);
+
+                       TEdge newedge=new TEdge(target);
+                       if (! tn.edgeExists(newedge))
+                               tn.addEdge(newedge);
+           }
+
+       }
+       
+       private void addEdges(FlagState fs, TaskNode tn,Hashtable<TaskNode,TaskNode> tasknodes,int ColorID){
+               
+               tn=(TaskNode)canonicalizeTaskNode(tasknodes, tn);
+               for (Iterator it_edges=fs.edges();it_edges.hasNext();){
+                       TaskNode target=new TaskNode(((FEdge)it_edges.next()).getLabel());
+                       target=(TaskNode)canonicalizeTaskNode(tasknodes,target);
+
+                       TEdge newedge=new TEdge(target);
+                       newedge.setDotNodeParameters("style=bold, color = "+colors[ColorID]);
+                       if (! tn.edgeExists(newedge))
+                               tn.addEdge(newedge);
+           }
+
+       }
+       
 }