Merge yet again with the main repository.
This commit is contained in:
@@ -874,29 +874,62 @@ 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:
|
||||
# Use native type for those supported by JSON and
|
||||
# strings for everything else. skipkeys=True seems
|
||||
# to not work as well as one would hope
|
||||
if type(self._values[param].value) in \
|
||||
[str, unicode, int, long, float, bool, None]:
|
||||
d[param] = self._values[param].value
|
||||
else:
|
||||
d[param] = str(self._values[param])
|
||||
|
||||
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
|
||||
|
||||
@@ -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")
|
||||
@@ -121,7 +123,6 @@ def parse_options():
|
||||
execfile(options_file, scope)
|
||||
|
||||
arguments = options.parse_args()
|
||||
|
||||
return options,arguments
|
||||
|
||||
def interact(scope):
|
||||
|
||||
@@ -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.
|
||||
@@ -256,6 +262,9 @@ class VectorParamDesc(ParamDesc):
|
||||
self.ptype.cxx_predecls(code)
|
||||
code('%}')
|
||||
code()
|
||||
# Make sure the SWIGPY_SLICE_ARG is defined through this inclusion
|
||||
code('%include "std_container.i"')
|
||||
code()
|
||||
self.ptype.swig_predecls(code)
|
||||
code()
|
||||
code('%include "std_vector.i"')
|
||||
@@ -961,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
|
||||
|
||||
@@ -40,6 +40,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 +72,17 @@ def instantiate(ckpt_dir=None):
|
||||
obj.print_ini(ini_file)
|
||||
ini_file.close()
|
||||
|
||||
if options.json_config:
|
||||
try:
|
||||
import json
|
||||
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()
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
# Initialize the global statistics
|
||||
stats.initSimStats()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user