summaryrefslogtreecommitdiff
path: root/src/python/m5
diff options
context:
space:
mode:
authorAli Saidi <Ali.Saidi@ARM.com>2012-01-09 18:08:20 -0600
committerAli Saidi <Ali.Saidi@ARM.com>2012-01-09 18:08:20 -0600
commit68d387ec802083322196f609c755b993771e9d19 (patch)
treeefad84d35ea288a87c101a71a705962a0334f909 /src/python/m5
parentc94e5256d9d6a076118336a61b951bcf9b5482a1 (diff)
downloadgem5-68d387ec802083322196f609c755b993771e9d19.tar.xz
config: support outputing a pickle of the configuration tree
Diffstat (limited to 'src/python/m5')
-rw-r--r--src/python/m5/SimObject.py45
-rw-r--r--src/python/m5/main.py2
-rw-r--r--src/python/m5/params.py9
-rw-r--r--src/python/m5/simulate.py9
4 files changed, 55 insertions, 10 deletions
diff --git a/src/python/m5/SimObject.py b/src/python/m5/SimObject.py
index 60693758c..dcc90e1bc 100644
--- a/src/python/m5/SimObject.py
+++ b/src/python/m5/SimObject.py
@@ -874,29 +874,54 @@ class SimObject(object):
if hasattr(self, 'type'):
print >>ini_file, 'type=%s' % self.type
- child_names = self._children.keys()
- child_names.sort()
- if len(child_names):
+ if len(self._children.keys()):
print >>ini_file, 'children=%s' % \
- ' '.join(self._children[n].get_name() for n in child_names)
+ ' '.join(self._children[n].get_name() \
+ for n in sorted(self._children.keys()))
- param_names = self._params.keys()
- param_names.sort()
- for param in param_names:
+ for param in sorted(self._params.keys()):
value = self._values.get(param)
if value != None:
print >>ini_file, '%s=%s' % (param,
self._values[param].ini_str())
- port_names = self._ports.keys()
- port_names.sort()
- for port_name in port_names:
+ for port_name in sorted(self._ports.keys()):
port = self._port_refs.get(port_name, None)
if port != None:
print >>ini_file, '%s=%s' % (port_name, port.ini_str())
print >>ini_file # blank line between objects
+ # generate a tree of dictionaries expressing all the parameters in the
+ # instantiated system for use by scripts that want to do power, thermal
+ # visualization, and other similar tasks
+ def get_config_as_dict(self):
+ d = attrdict()
+ if hasattr(self, 'type'):
+ d.type = self.type
+ if hasattr(self, 'cxx_class'):
+ d.cxx_class = self.cxx_class
+
+ for param in sorted(self._params.keys()):
+ value = self._values.get(param)
+ try:
+ d[param] = self._values[param].value
+ except AttributeError:
+ pass
+
+ for n in sorted(self._children.keys()):
+ d[self._children[n].get_name()] = self._children[n].get_config_as_dict()
+
+ for port_name in sorted(self._ports.keys()):
+ port = self._port_refs.get(port_name, None)
+ if port != None:
+ # Might want to actually make this reference the object
+ # in the future, although execing the string problem would
+ # get some of the way there
+ d[port_name] = port.ini_str()
+
+ return d
+
def getCCParams(self):
if self._ccParams:
return self._ccParams
diff --git a/src/python/m5/main.py b/src/python/m5/main.py
index 58de62cc3..17e0c2f91 100644
--- a/src/python/m5/main.py
+++ b/src/python/m5/main.py
@@ -87,6 +87,8 @@ def parse_options():
group("Configuration Options")
option("--dump-config", metavar="FILE", default="config.ini",
help="Dump configuration output file [Default: %default]")
+ option("--json-config", metavar="FILE", default="config.json",
+ help="Create JSON output of the configuration [Default: %default]")
# Debugging options
group("Debugging Options")
diff --git a/src/python/m5/params.py b/src/python/m5/params.py
index 03917d085..05fe9b774 100644
--- a/src/python/m5/params.py
+++ b/src/python/m5/params.py
@@ -228,6 +228,12 @@ class SimObjectVector(VectorParamValue):
for obj in v.descendants():
yield obj
+ def get_config_as_dict(self):
+ a = []
+ for v in self:
+ a.append(v.get_config_as_dict())
+ return a
+
class VectorParamDesc(ParamDesc):
# Convert assigned value to appropriate type. If the RHS is not a
# list or tuple, it generates a single-element list.
@@ -964,6 +970,9 @@ class Time(ParamValue):
def ini_str(self):
return str(self)
+ def get_config_as_dict(self):
+ return str(self)
+
# Enumerated types are a little more complex. The user specifies the
# type as Enum(foo) where foo is either a list or dictionary of
# alternatives (typically strings, but not necessarily so). (In the
diff --git a/src/python/m5/simulate.py b/src/python/m5/simulate.py
index b4ccf82c1..29d14f75d 100644
--- a/src/python/m5/simulate.py
+++ b/src/python/m5/simulate.py
@@ -31,6 +31,7 @@
import atexit
import os
import sys
+import json
# import the SWIG-wrapped main C++ functions
import internal
@@ -40,6 +41,7 @@ import SimObject
import ticks
import objects
from util import fatal
+from util import attrdict
# define a MaxTick parameter
MaxTick = 2**63 - 1
@@ -71,6 +73,13 @@ def instantiate(ckpt_dir=None):
obj.print_ini(ini_file)
ini_file.close()
+ if options.json_config:
+ json_file = file(os.path.join(options.outdir, options.json_config), 'w')
+ d = root.get_config_as_dict()
+ json.dump(d, json_file, indent=4)
+ json_file.close()
+
+
# Initialize the global statistics
stats.initSimStats()