From 948d94811000033c44a3ee0393ea8d152e72dd91 Mon Sep 17 00:00:00 2001 From: sivaji Date: Sat, 19 May 2007 19:19:45 +0000 Subject: [PATCH] Added Classes TaskNode and TEdge for task graphs. Updated TaskAnalysis.java with methods for producing taskgraphs. The createDOTFile method has been augmented to produce both dot files: one for the flagstates and another for the tasks. --- .../src/Analysis/TaskStateAnalysis/TEdge.java | 34 ++++++++++ .../TaskStateAnalysis/TaskAnalysis.java | 48 +++++++++++++- .../Analysis/TaskStateAnalysis/TaskNode.java | 63 +++++++++++++++++++ 3 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 Robust/src/Analysis/TaskStateAnalysis/TEdge.java create mode 100644 Robust/src/Analysis/TaskStateAnalysis/TaskNode.java diff --git a/Robust/src/Analysis/TaskStateAnalysis/TEdge.java b/Robust/src/Analysis/TaskStateAnalysis/TEdge.java new file mode 100644 index 00000000..869272cc --- /dev/null +++ b/Robust/src/Analysis/TaskStateAnalysis/TEdge.java @@ -0,0 +1,34 @@ +package Analysis.TaskStateAnalysis; +import IR.*; +import Analysis.TaskStateAnalysis.*; +import IR.Tree.*; +import IR.Flat.*; +import java.util.*; +import Util.Edge; + + +public class TEdge extends Edge{ + + private String target; + + public TEdge(TaskNode target){ + super(target); + } + + + + public int hashCode(){ + return target.hashCode()^target.toString().hashCode(); + } + + + public boolean equals(Object o) { + if (o instanceof TEdge) { + TEdge e=(TEdge)o; + return e.target.equals(target); + } + return false; + } + + +} diff --git a/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java b/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java index cedc52aa..6c3f8d0b 100644 --- a/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java +++ b/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java @@ -15,6 +15,7 @@ public class TaskAnalysis { Hashtable flags; Hashtable extern_flags; Queue toprocess; + TypeUtil typeutil; /** @@ -251,6 +252,7 @@ public class TaskAnalysis { //seen this node already fs_taskexit=canonicalizeFlagState(sourcenodes,fs_taskexit); FEdge newedge=new FEdge(fs_taskexit,taskname); + //FEdge newedge=new FEdge(fs_taskexit,td); fs.addEdge(newedge); } } @@ -411,9 +413,13 @@ private boolean isTaskTrigger_tag(TagExpressionList tel, FlagState fs){ */ public void createDOTfile(ClassDescriptor cd) throws java.io.IOException { - File dotfile= new File("graph"+cd.getSymbol()+".dot"); - FileOutputStream dotstream=new FileOutputStream(dotfile,true); + File dotfile_flagstates= new File("graph"+cd.getSymbol()+".dot"); + FileOutputStream dotstream=new FileOutputStream(dotfile_flagstates,true); FlagState.DOTVisitor.visit(dotstream,((Hashtable)flagstates.get(cd)).values()); + + File dotfile_tasknodes=new File("graph"+cd.getSymbol()+"_task.dot"); + dotstream=new FileOutputStream(dotfile_tasknodes,true); + TaskNode.DOTVisitor.visit(dotstream,(produceTaskNodes((Hashtable)flagstates.get(cd))).values()); } @@ -452,5 +458,43 @@ private boolean isTaskTrigger_tag(TagExpressionList tel, FlagState fs){ fs.addEdge(new FEdge(fstemp,"Runtime")); } } + + private TaskNode canonicalizeTaskNode(Hashtable nodes, TaskNode node){ + if (nodes.containsKey(node)) + return (TaskNode)nodes.get(node); + else{ + nodes.put(node,node); + return (TaskNode)node; + } + } + + public Hashtable produceTaskNodes(Hashtable fsnodes){ + + Hashtable tasknodes=new Hashtable(); + for(Enumeration en=fsnodes.keys();en.hasMoreElements();){ + FlagState fs=(FlagState)en.nextElement(); + + Iterator it_inedges=fs.inedges(); + TaskNode tn; + do{ + if (!fs.inedges().hasNext()){ + tn=new TaskNode("Start Node"); + }else{ + FEdge inedge=(FEdge)it_inedges.next(); + tn=new TaskNode(inedge.getLabel()); + } + 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); + tn.addEdge(new TEdge(target)); + } + } + }while(it_inedges.hasNext()); + } + return tasknodes; + } + } diff --git a/Robust/src/Analysis/TaskStateAnalysis/TaskNode.java b/Robust/src/Analysis/TaskStateAnalysis/TaskNode.java new file mode 100644 index 00000000..babae4b1 --- /dev/null +++ b/Robust/src/Analysis/TaskStateAnalysis/TaskNode.java @@ -0,0 +1,63 @@ +package Analysis.TaskStateAnalysis; +import Analysis.TaskStateAnalysis.*; +import IR.*; +import IR.Tree.*; +import IR.Flat.*; +import java.util.*; +import java.io.*; +import Util.GraphNode; + +public class TaskNode extends GraphNode { + + private final String name; + private int uid; + private static int nodeid=0; + + public void setOption(String option) { + this.nodeoption=","+option; + } + + /**Class Constructor + * Creates a new TaskNode using the TaskDescriptor. + * @param tasknode TaskDescriptor + */ + public TaskNode(String name){ + this.name=name; + this.uid=TaskNode.nodeid++; + } + + /**Returns the string representation of the node + * @return string representation of the tasknode (e.g "Task foo") + */ + public String getTextLabel() { + return "Task "+name; + } + + public String getLabel() { + return "N"+uid; + } + + + /**toString method. + * @return string representation of the tasknode (e.g "Task foo") + */ + public String toString(){ + return getTextLabel(); + } + + public int hashCode(){ + return name.hashCode(); + + } + + public boolean equals(Object o) { + if (o instanceof TaskNode) { + TaskNode tn=(TaskNode)o; + return (tn.name.equals(name)); + } + return false; + } +} + + + -- 2.34.1