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