config: support outputing a pickle of the configuration tree
authorAli Saidi <Ali.Saidi@ARM.com>
Tue, 10 Jan 2012 00:08:20 +0000 (18:08 -0600)
committerAli Saidi <Ali.Saidi@ARM.com>
Tue, 10 Jan 2012 00:08:20 +0000 (18:08 -0600)
src/python/m5/SimObject.py
src/python/m5/main.py
src/python/m5/params.py
src/python/m5/simulate.py

index 60693758c3433713a592a6a3e9473207bee11252..dcc90e1bc1914b5e8286a0591573897e6c213a4b 100644 (file)
@@ -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
index 58de62cc3b64b5fc274d5365ac061a026adc9907..17e0c2f91ee57a1db59382db79fd59cac0a18a2e 100644 (file)
@@ -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")
index 03917d08525072102cb9286e81ed57f1de4568e8..05fe9b7741afd1fe8713762dd8efcbecdada7759 100644 (file)
@@ -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
index b4ccf82c1a490e6c46611d1bcc314c03ec6a2bf6..29d14f75deecfd8b68d4cda8fbb6d66996de0852 100644 (file)
@@ -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()