summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Reinhardt <stever@eecs.umich.edu>2006-06-10 21:13:36 -0400
committerSteve Reinhardt <stever@eecs.umich.edu>2006-06-10 21:13:36 -0400
commitbb58e4b85163f263ebf5ea54fee5dba0109eb88c (patch)
tree9267f402eb8f301737751a9b674736507d83dc36
parent39f85a1de44789bf0afd1d492167d4fe4601bd82 (diff)
downloadgem5-bb58e4b85163f263ebf5ea54fee5dba0109eb88c.tar.xz
Don't allow SimObject-valued class params to be set
after the class has been instantiated or subclassed. This is one of the main situations that leads to confusing results. configs/test/fs.py: Clean up to avoid modifying BaseCPU after it's been subclassed. --HG-- extra : convert_revision : 335cb87bc3b211ecc8969cfb99ffc28f62f1f877
-rw-r--r--configs/test/fs.py15
-rw-r--r--src/python/m5/config.py10
2 files changed, 17 insertions, 8 deletions
diff --git a/configs/test/fs.py b/configs/test/fs.py
index 05b38991c..55e7003a4 100644
--- a/configs/test/fs.py
+++ b/configs/test/fs.py
@@ -197,6 +197,8 @@ class LinuxAlphaSystem(LinuxAlphaSystem):
else:
cpu = AtomicSimpleCPU()
cpu.mem = Parent.magicbus2
+ cpu.itb = AlphaITB()
+ cpu.dtb = AlphaDTB()
sim_console = SimConsole(listener=ConsoleListener(port=3456))
kernel = binary('vmlinux')
pal = binary('ts_osfpal')
@@ -205,18 +207,15 @@ class LinuxAlphaSystem(LinuxAlphaSystem):
# readfile = os.path.join(test_base, 'halt.sh')
-BaseCPU.itb = AlphaITB()
-BaseCPU.dtb = AlphaDTB()
-BaseCPU.system = Parent.any
class TsunamiRoot(System):
pass
-def DualRoot(ClientSystem, ServerSystem):
+def DualRoot(clientSystem, serverSystem):
self = Root()
- self.client = ClientSystem()
- self.server = ServerSystem()
+ self.client = clientSystem
+ self.server = serverSystem
self.etherdump = EtherDump(file='ethertrace')
self.etherlink = EtherLink(int1 = Parent.client.tsunami.etherint[0],
@@ -225,8 +224,8 @@ def DualRoot(ClientSystem, ServerSystem):
self.clock = '5GHz'
return self
-root = DualRoot(ClientSystem = LinuxAlphaSystem(readfile=script('netperf-stream-nt-client.rcS')),
- ServerSystem = LinuxAlphaSystem(readfile=script('netperf-server.rcS')))
+root = DualRoot(LinuxAlphaSystem(readfile=script('netperf-stream-nt-client.rcS')),
+ LinuxAlphaSystem(readfile=script('netperf-server.rcS')))
m5.instantiate(root)
diff --git a/src/python/m5/config.py b/src/python/m5/config.py
index 9de768d18..3eb99972f 100644
--- a/src/python/m5/config.py
+++ b/src/python/m5/config.py
@@ -211,6 +211,7 @@ class MetaSimObject(type):
# initialize required attributes
cls._params = multidict()
cls._values = multidict()
+ cls._instantiated = False # really instantiated or subclassed
cls._anon_subclass_counter = 0
# We don't support multiple inheritance. If you want to, you
@@ -225,6 +226,7 @@ class MetaSimObject(type):
if isinstance(base, MetaSimObject):
cls._params.parent = base._params
cls._values.parent = base._values
+ base._instantiated = True
# now process the _init_dict items
for key,val in cls._init_dict.items():
@@ -299,6 +301,12 @@ class MetaSimObject(type):
param = cls._params.get(attr, None)
if param:
# It's ok: set attribute by delegating to 'object' class.
+ if (isSimObject(value) or isSimObjSequence(value)) \
+ and cls._instantiated:
+ raise AttributeError, \
+ "Cannot set SimObject parameter '%s' after\n" \
+ " class %s has been instantiated or subclassed" \
+ % (attr, cls.__name__)
try:
cls._values[attr] = param.convert(value)
except Exception, e:
@@ -386,6 +394,8 @@ class SimObject(object):
# instantiated objects.
_memo = {}
+ self.__class__._instantiated = True
+
self._children = {}
# Inherit parameter values from class using multidict so
# individual value settings can be overridden.