changes.
[IRC.git] / Robust / src / Analysis / SSJava / FlowGraph.java
index a35a93cb77ebec6a385a0f74e8dda6c94ab33c02..32af6ccf7b28267ff4b6edf794b505b8d75fd61e 100644 (file)
@@ -1,10 +1,18 @@
 package Analysis.SSJava;
 
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.Map.Entry;
 
+import Analysis.OoOJava.ConflictEdge;
+import Analysis.OoOJava.ConflictNode;
 import IR.Descriptor;
 import IR.MethodDescriptor;
 
@@ -30,7 +38,9 @@ public class FlowGraph {
     mapNodeToNeighborSet = new HashMap<NTuple<Descriptor>, Set<FlowNode>>();
 
     // create a node for 'this' varialbe
-    FlowNode thisNode = new FlowNode(null, md.getThis());
+    NTuple<Descriptor> thisDescTuple = new NTuple<Descriptor>();
+    thisDescTuple.add(md.getThis());
+    FlowNode thisNode = new FlowNode(thisDescTuple);
     NTuple<Descriptor> thisVarTuple = new NTuple<Descriptor>();
     thisVarTuple.add(md.getThis());
     mapDescTupleToInferNode.put(thisVarTuple, thisNode);
@@ -60,7 +70,7 @@ public class FlowGraph {
     for (int i = 0; i < fromTupleSize; i++) {
       Descriptor desc = fromDescTuple.get(i);
       curTuple.add(desc);
-      addNeighbor(getInferNode(curTuple), toNode);
+      addFlowEdge(getFlowNode(curTuple), toNode, fromDescTuple, toDescTuple);
     }
 
     int toTupleSize = toDescTuple.size();
@@ -68,30 +78,117 @@ public class FlowGraph {
     for (int i = 0; i < toTupleSize; i++) {
       Descriptor desc = toDescTuple.get(i);
       curTuple.add(desc);
-      addNeighbor(fromNode, getInferNode(curTuple));
+      addFlowEdge(fromNode, getFlowNode(curTuple), fromDescTuple, toDescTuple);
     }
 
   }
 
-  public FlowNode getInferNode(NTuple<Descriptor> descTuple) {
+  private void addFlowEdge(FlowNode fromNode, FlowNode toNode, NTuple<Descriptor> initTuple,
+      NTuple<Descriptor> endTuple) {
+
+    FlowEdge edge = new FlowEdge(fromNode, toNode, initTuple, endTuple);
+
+    fromNode.addOutEdge(edge);
+
+    System.out.println("add a new edge=" + edge);
+
+  }
+
+  public FlowNode getFlowNode(NTuple<Descriptor> descTuple) {
     if (mapDescTupleToInferNode.containsKey(descTuple)) {
       return mapDescTupleToInferNode.get(descTuple);
+    } else {
+      FlowNode node = new FlowNode(descTuple);
+      mapDescTupleToInferNode.put(descTuple, node);
+      return node;
     }
-    return null;
   }
 
   public FlowNode getThisVarNode() {
     return thisVarNode;
   }
 
-  public void createNewFlowNode(NTuple<Descriptor> base) {
+  public void createNewFlowNode(NTuple<Descriptor> tuple) {
+
+    if (!mapDescTupleToInferNode.containsKey(tuple)) {
+      FlowNode node = new FlowNode(tuple);
+      mapDescTupleToInferNode.put(tuple, node);
+      nodeSet.add(node);
+
+      if (tuple.size() > 1) {
+        NTuple<Descriptor> baseTuple = tuple.subList(0, tuple.size() - 1);
+        getFlowNode(baseTuple).addFieldNode(node);
+      }
+
+      System.out.println("Creating new node=" + node);
+    }
+
+  }
+
+  public void writeGraph() throws java.io.IOException {
+
+    String graphName = md.toString();
+    graphName = graphName.replaceAll("[\\W]", "");
+
+    BufferedWriter bw = new BufferedWriter(new FileWriter(graphName + ".dot"));
+    bw.write("digraph " + graphName + " {\n");
+    bw.write("compound=true;\n");
+
+    // then visit every flow node
+
+    Iterator<FlowNode> iter = nodeSet.iterator();
 
-    FlowNode node = new FlowNode(base);
-    mapDescTupleToInferNode.put(base, node);
+    Set<FlowEdge> addedSet = new HashSet<FlowEdge>();
 
-    System.out.println("Creating new node=" + node);
+    while (iter.hasNext()) {
+      FlowNode node = iter.next();
+
+      if (node.getFieldNodeSet().size() > 0) {
+        drawSubgraph(node, bw);
+      }
+
+      String attributes = " [";
+
+      attributes += "label=\"" + node.getID() + "\"]";
+
+      bw.write(node.getID() + attributes + ";\n");
+
+      Set<FlowEdge> edgeSet = node.getOutEdgeSet();
+
+      for (Iterator<FlowEdge> iterator = edgeSet.iterator(); iterator.hasNext();) {
+        FlowEdge flowEdge = iterator.next();
+
+        FlowNode u = flowEdge.getSrc();
+        FlowNode v = flowEdge.getDst();
+
+        if (!addedSet.contains(flowEdge)) {
+          bw.write("" + u.getID() + " -> " + v.getID() + ";\n");
+          addedSet.add(flowEdge);
+        }
+
+      }
+    }
+
+    bw.write("graphTitle[label=\"" + graphName + "\",shape=box];\n");
+
+    bw.write("}\n");
+    bw.close();
 
   }
-  
 
+  private void drawSubgraph(FlowNode node, BufferedWriter bw) throws IOException {
+
+    bw.write("  subgraph sg" + node.getID() + "{\n");
+    // bw.write("  color=gray;\n");
+    bw.write("  label=\"" + node.getID() + "\";\n");
+
+    Set<FlowNode> fieldNodeSet = node.getFieldNodeSet();
+    for (Iterator iterator = fieldNodeSet.iterator(); iterator.hasNext();) {
+      FlowNode fieldNode = (FlowNode) iterator.next();
+      String attribute = fieldNode.getID() + ";\n";
+      bw.write("  " + attribute);
+    }
+
+    bw.write("  }\n");
+  }
 }
\ No newline at end of file