changeset c8bf5a20bc07 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=c8bf5a20bc07
description:
        DOT: fixed broken code for visualizing configuration using dot

        Fixed broken code which visualizes the system configuration by 
generating a
        tree from each component's children, starting from root.
        Requires DOT (hence pydot).

diffstat:

 src/python/m5/SimObject.py |  61 +++++++++++++++++++++------------------------
 src/python/m5/main.py      |   2 +
 src/python/m5/simulate.py  |  16 +++++++++--
 3 files changed, 43 insertions(+), 36 deletions(-)

diffs (136 lines):

diff -r f07639e4b676 -r c8bf5a20bc07 src/python/m5/SimObject.py
--- a/src/python/m5/SimObject.py        Thu May 10 18:04:27 2012 -0500
+++ b/src/python/m5/SimObject.py        Thu May 10 18:04:27 2012 -0500
@@ -1061,47 +1061,42 @@
         self._ccObject.takeOverFrom(old_cpu._ccObject)
 
     # generate output file for 'dot' to display as a pretty graph.
-    # this code is currently broken.
     def outputDot(self, dot):
-        label = "{%s|" % self.path
-        if isSimObject(self.realtype):
+        if isRoot(self):
+            label = "{root|"
+        else:
+            label = "{%s|" % self._name
+
+        if isSimObject(self._base):
             label +=  '%s|' % self.type
 
-        if self.children:
-            # instantiate children in same order they were added for
-            # backward compatibility (else we can end up with cpu1
-            # before cpu0).
-            for c in self.children:
-                dot.add_edge(pydot.Edge(self.path,c.path, style="bold"))
+        if self._children:
+            for c in self._children:
+                child = self._children[c]
+                if isSimObjectVector(child):
+                    for obj in child:
+                        dot.add_edge(pydot.Edge(self.path(), obj.path(), 
style="bold"))
+                else:
+                    dot.add_edge(pydot.Edge(self.path(), child.path(), 
style="bold"))
 
-        simobjs = []
-        for param in self.params:
-            try:
-                if param.value is None:
-                    raise AttributeError, 'Parameter with no value'
+        for param in self._params.keys():
+            value = self._values.get(param)
+            if value != None:
+                ini_str_value = self._values[param].ini_str()
+                label += '%s = %s\\n' % (param, re.sub(':', '-', 
ini_str_value))
 
-                value = param.value
-                string = param.string(value)
-            except Exception, e:
-                msg = 'exception in %s:%s\n%s' % (self.name, param.name, e)
-                e.args = (msg, )
-                raise
+        label += '}'
 
-            if isSimObject(param.ptype) and string != "Null":
-                simobjs.append(string)
-            else:
-                label += '%s = %s\\n' % (param.name, string)
-
-        for so in simobjs:
-            label += "|<%s> %s" % (so, so)
-            dot.add_edge(pydot.Edge("%s:%s" % (self.path, so), so,
-                                    tailport="w"))
-        label += '}'
-        dot.add_node(pydot.Node(self.path,shape="Mrecord",label=label))
+        dot.add_node(pydot.Node(self.path(), shape="Mrecord",label=label))
 
         # recursively dump out children
-        for c in self.children:
-            c.outputDot(dot)
+        for c in self._children:
+            child = self._children[c]
+            if isSimObjectVector(child):
+                for obj in child:
+                    obj.outputDot(dot)
+            else:
+                child.outputDot(dot)
 
 # Function to provide to C++ so it can look up instances based on paths
 def resolveSimObject(name):
diff -r f07639e4b676 -r c8bf5a20bc07 src/python/m5/main.py
--- a/src/python/m5/main.py     Thu May 10 18:04:27 2012 -0500
+++ b/src/python/m5/main.py     Thu May 10 18:04:27 2012 -0500
@@ -89,6 +89,8 @@
         help="Dump configuration output file [Default: %default]")
     option("--json-config", metavar="FILE", default="config.json",
         help="Create JSON output of the configuration [Default: %default]")
+    option("--dot-config", metavar="FILE", default="config.dot",
+        help="Create DOT & pdf outputs of the configuration [Default: 
%default]")
 
     # Debugging options
     group("Debugging Options")
diff -r f07639e4b676 -r c8bf5a20bc07 src/python/m5/simulate.py
--- a/src/python/m5/simulate.py Thu May 10 18:04:27 2012 -0500
+++ b/src/python/m5/simulate.py Thu May 10 18:04:27 2012 -0500
@@ -32,6 +32,12 @@
 import os
 import sys
 
+try:
+    import pydot
+except:
+    pydot = False
+
+
 # import the SWIG-wrapped main C++ functions
 import internal
 import core
@@ -82,6 +88,8 @@
         except ImportError:
             pass
 
+    if pydot:
+        doDot(root)
 
     # Initialize the global statistics
     stats.initSimStats()
@@ -113,14 +121,16 @@
     stats.reset()
 
 def doDot(root):
+    from m5 import options
     dot = pydot.Dot()
-    instance.outputDot(dot)
+    root.outputDot(dot)
     dot.orientation = "portrait"
     dot.size = "8.5,11"
     dot.ranksep="equally"
     dot.rank="samerank"
-    dot.write("config.dot")
-    dot.write_ps("config.ps")
+    dot_filename = os.path.join(options.outdir, options.dot_config)
+    dot.write(dot_filename)
+    dot.write_pdf(dot_filename + ".pdf")
 
 need_resume = []
 need_startup = True
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to