diff options
Diffstat (limited to 'vaporize/library/CFGSimp.java')
| -rw-r--r-- | vaporize/library/CFGSimp.java | 45 | 
1 files changed, 33 insertions, 12 deletions
| diff --git a/vaporize/library/CFGSimp.java b/vaporize/library/CFGSimp.java index 9f2556d..f4d63cf 100644 --- a/vaporize/library/CFGSimp.java +++ b/vaporize/library/CFGSimp.java @@ -1,8 +1,10 @@  package vaporize.library;  import cs132.vapor.ast.*; -import st.*; +import graphviz.*;  import misc.*; + +import java.io.File;  import java.util.*;  public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeException> { @@ -11,6 +13,7 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE      private Kettle kettle;      private ArrayList<ControlFlowGraph> cfgs;      private CFGNode curr; +    private String dot_format;                  // a list of edges to be processed by graphviz      public CFGSimp(VaporProgram vp, ArrayList<String> vapor) {          this.vp = vp; @@ -21,6 +24,7 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE          for (VFunction f : this.vp.functions) {              ControlFlowGraph cfg = new ControlFlowGraph(); +            this.dot_format = "";              curr = new CFGNode(f.body[0]);              cfg.setStart(curr); @@ -46,6 +50,8 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE              for (VInstr s : f.body)                  s.accept(cfg, this); +            this.createDotGraph(this.kettle.parseFuncName(f)); +              this.cfgs.add(cfg);          }      } @@ -54,6 +60,21 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE          return this.cfgs;      } +    public void createDotGraph(String file_name) { +        MinimalLogger.info(String.format("Outputting %s to %s", +                                         this.dot_format, +                                         file_name)); +        GraphViz gv = new GraphViz(); +        gv.addln(gv.start_graph()); +        gv.add(this.dot_format); +        gv.addln(gv.end_graph()); +        String type = "svg"; +        gv.decreaseDpi(); +        gv.decreaseDpi(); +        File out = new File(file_name+"."+ type); +        gv.writeGraphToFile( gv.getGraph( gv.getDotSource(), type ), out ); +    } +      public String visit(ControlFlowGraph cfg, VMemRead n) throws RuntimeException {          MinimalLogger.info(String.format("->%s (\"%s\":%s)",                                           n.getClass().getSimpleName(), @@ -61,7 +82,7 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE                                           n.sourcePos.toString()));          ///////////////////////////////////////////////////////////////          CFGNode curr = cfg.getNode(n); -        cfg.addEdge(this.curr, cfg.getNode(n)); +        this.dot_format += cfg.addEdge(this.curr, cfg.getNode(n));          this.curr = curr;          ///////////////////////////////////////////////////////////////          MinimalLogger.info(String.format("<-%s (\"%s\":%s)", @@ -78,7 +99,7 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE                                           n.sourcePos.toString()));          ///////////////////////////////////////////////////////////////          CFGNode curr = cfg.getNode(n); -        cfg.addEdge(this.curr, cfg.getNode(n)); +        this.dot_format += cfg.addEdge(this.curr, cfg.getNode(n));          this.curr = curr;          ///////////////////////////////////////////////////////////////          MinimalLogger.info(String.format("<-%s (\"%s\":%s)", @@ -95,7 +116,7 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE                                           n.sourcePos.toString()));          ///////////////////////////////////////////////////////////////          CFGNode curr = cfg.getNode(n); -        cfg.addEdge(this.curr, cfg.getNode(n)); +        this.dot_format += cfg.addEdge(this.curr, cfg.getNode(n));          this.curr = curr;          ///////////////////////////////////////////////////////////////          MinimalLogger.info(String.format("<-%s (\"%s\":%s)", @@ -112,9 +133,9 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE                                           n.sourcePos.toString()));          ///////////////////////////////////////////////////////////////          CFGNode curr = cfg.getNode(n); -        cfg.addEdge(this.curr, cfg.getNode(n)); -        cfg.addEdge(this.curr, cfg.getNode(new Integer(this.kettle -                                                       .findLabelIndex(n.target.toString())))); +        this.dot_format += cfg.addEdge(this.curr, cfg.getNode(n)); +        this.dot_format += cfg.addEdge(this.curr, cfg.getNode(new Integer(this.kettle +                                                                          .findLabelIndex(n.target.toString()))));          this.curr = curr;          /////////////////////////////////////////////////////////////// @@ -132,8 +153,8 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE                                           n.sourcePos.toString()));          ///////////////////////////////////////////////////////////////          CFGNode curr = cfg.getNode(n); -        cfg.addEdge(this.curr, cfg.getNode(new Integer(this.kettle -                                                       .findLabelIndex(n.target.toString())))); +        this.dot_format += cfg.addEdge(this.curr, cfg.getNode(new Integer(this.kettle +                                                                          .findLabelIndex(n.target.toString()))));          this.curr = curr;          /////////////////////////////////////////////////////////////// @@ -151,7 +172,7 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE                                           n.sourcePos.toString()));          ///////////////////////////////////////////////////////////////          CFGNode curr = cfg.getNode(n); -        cfg.addEdge(this.curr, cfg.getNode(n)); +        this.dot_format += cfg.addEdge(this.curr, cfg.getNode(n));          this.curr = curr;          ///////////////////////////////////////////////////////////////          MinimalLogger.info(String.format("<-%s (\"%s\":%s)", @@ -168,7 +189,7 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE                                           n.sourcePos.toString()));          ///////////////////////////////////////////////////////////////          CFGNode curr = cfg.getNode(n); -        cfg.addEdge(this.curr, cfg.getNode(n)); +        this.dot_format += cfg.addEdge(this.curr, cfg.getNode(n));          this.curr = curr;          ///////////////////////////////////////////////////////////////          MinimalLogger.info(String.format("<-%s (\"%s\":%s)", @@ -185,7 +206,7 @@ public class CFGSimp extends VInstr.VisitorPR<ControlFlowGraph, String, RuntimeE                                           n.sourcePos.toString()));          ///////////////////////////////////////////////////////////////          CFGNode curr = cfg.getNode(n); -        cfg.addEdge(this.curr, cfg.getNode(n)); +        this.dot_format += cfg.addEdge(this.curr, cfg.getNode(n));          this.curr = curr;          ///////////////////////////////////////////////////////////////          MinimalLogger.info(String.format("<-%s (\"%s\":%s)", | 
