util: Make dot_writer ignore NULL simobjects.
[gem5.git] / src / python / m5 / util / jobfile.py
index 5e015c4ad0189fa0bc65ddbadb3e7e0e21dc652b..9c59778e5416a1bef9f40589f24a136e1253884f 100644 (file)
@@ -28,9 +28,6 @@
 
 import sys
 
-from attrdict import attrdict, optiondict
-from misc import crossproduct, flatten
-
 class Data(object):
     def __init__(self, name, desc, **kwargs):
         self.name = name
@@ -41,9 +38,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, \
@@ -88,11 +105,20 @@ class Data(object):
                 yield key
 
     def optiondict(self):
-        result = optiondict()
+        import m5.util
+        result = m5.util.optiondict()
         for key in self:
             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
 
@@ -300,7 +326,9 @@ class Configuration(Data):
             optgroups = [ g.subopts() for g in groups ]
         if not optgroups:
             return
-        for options in crossproduct(optgroups):
+
+        import m5.util
+        for options in m5.util.crossproduct(optgroups):
             for opt in options:
                 cpt = opt._group._checkpoint
                 if not isinstance(cpt, bool) and cpt != opt:
@@ -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