summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Binkert <nate@binkert.org>2008-10-10 10:15:01 -0700
committerNathan Binkert <nate@binkert.org>2008-10-10 10:15:01 -0700
commit70dbe61ffc8dae4fc2ecc252f963a760a4387517 (patch)
tree9938a6ecdfc45bd4b64daff1ab8e0baef5f986d8
parent84364f36d0f763d3cef9847396fa4195184cb930 (diff)
downloadgem5-70dbe61ffc8dae4fc2ecc252f963a760a4387517.tar.xz
jobfile: Add support for dictionaries as jobfile options.
If the same dictionary option is seen in several options, those dictionaries are composed. If you define the same dictionary key in multiple options, the system flags an error. Also, clean up the jobfile code so that it is more debuggable.
-rw-r--r--src/python/m5/util/jobfile.py52
1 files changed, 37 insertions, 15 deletions
diff --git a/src/python/m5/util/jobfile.py b/src/python/m5/util/jobfile.py
index 5e015c4ad..c830895f6 100644
--- a/src/python/m5/util/jobfile.py
+++ b/src/python/m5/util/jobfile.py
@@ -28,8 +28,8 @@
import sys
-from attrdict import attrdict, optiondict
-from misc import crossproduct, flatten
+from attrdict import optiondict
+from misc import crossproduct
class Data(object):
def __init__(self, name, desc, **kwargs):
@@ -41,9 +41,29 @@ class Data(object):
if not isinstance(obj, Data):
raise AttributeError, "can only update from Data object"
- for k,v in obj.__dict__.iteritems():
- if not k.startswith('_'):
- self.__dict__[k] = v
+ for key,val in obj.__dict__.iteritems():
+ if key.startswith('_') or key in ('name', 'desc'):
+ continue
+
+ if key not in self.__dict__:
+ self.__dict__[key] = val
+ continue
+
+ if not isinstance(val, dict):
+ if self.__dict__[key] == val:
+ continue
+
+ raise AttributeError, \
+ "%s specified more than once old: %s new: %s" % \
+ (key, self.__dict__[key], val)
+
+ d = self.__dict__[key]
+ for k,v in val.iteritems():
+ if k in d:
+ raise AttributeError, \
+ "%s specified more than once in %s" % (k, key)
+ d[k] = v
+
if hasattr(self, 'system') and hasattr(obj, 'system'):
if self.system != obj.system:
raise AttributeError, \
@@ -93,6 +113,14 @@ class Data(object):
result[key] = self[key]
return result
+ def __repr__(self):
+ d = {}
+ for key,value in self.__dict__.iteritems():
+ if not key.startswith('_'):
+ d[key] = value
+
+ return "<%s: %s>" % (type(self).__name__, d)
+
def __str__(self):
return self.name
@@ -391,18 +419,12 @@ def JobFile(jobfile):
execfile(filename, data)
if 'conf' not in data:
raise ImportError, 'cannot import name conf from %s' % jobfile
- conf = data['conf']
- import jobfile
- if not isinstance(conf, Configuration):
- raise AttributeError, \
- 'conf in jobfile: %s (%s) is not type %s' % \
- (jobfile, type(conf), Configuration)
- return conf
+ return data['conf']
def main(conf=None):
- import sys
-
- usage = 'Usage: %s [-b] [-c] [-v] <jobfile>' % sys.argv[0]
+ usage = 'Usage: %s [-b] [-c] [-v]' % sys.argv[0]
+ if conf is None:
+ usage += ' <jobfile>'
try:
import getopt