summaryrefslogtreecommitdiff
path: root/src/python
diff options
context:
space:
mode:
authorSteve Reinhardt <steve.reinhardt@amd.com>2010-08-17 05:06:22 -0700
committerSteve Reinhardt <steve.reinhardt@amd.com>2010-08-17 05:06:22 -0700
commitc2cce96a0bb4878a9e6a4ae635096b5ce62e41c3 (patch)
treee4e9a5b2f49de0209dd9f5bf871266a8432d7248 /src/python
parent1fbe466345b43caabece9730c1f0456f1b57b82f (diff)
downloadgem5-c2cce96a0bb4878a9e6a4ae635096b5ce62e41c3.tar.xz
sim: fail on implicit creation of orphans via ports
Orphan SimObjects (not in the config hierarchy) could get created implicitly if they have a port connection to a SimObject that is in the hierarchy. This means that there are objects on the C++ SimObject list (created via the C++ SimObject constructor call) that are unknown to Python and will get skipped if we walk the hierarchy from the Python side (as we are about to do). This patch detects this situation and prints an error message. Also fix the rubytester config script which happened to rely on this behavior.
Diffstat (limited to 'src/python')
-rw-r--r--src/python/m5/SimObject.py11
-rw-r--r--src/python/m5/params.py10
2 files changed, 17 insertions, 4 deletions
diff --git a/src/python/m5/SimObject.py b/src/python/m5/SimObject.py
index 8e14b63d2..69f79ed61 100644
--- a/src/python/m5/SimObject.py
+++ b/src/python/m5/SimObject.py
@@ -761,13 +761,16 @@ class SimObject(object):
# children.
def getCCObject(self):
if not self._ccObject:
- # Cycles in the configuration heirarchy are not supported. This
+ # Make sure this object is in the configuration hierarchy
+ if not self._parent and not isRoot(self):
+ raise RuntimeError, "Attempt to instantiate orphan node"
+ # Cycles in the configuration hierarchy are not supported. This
# will catch the resulting recursion and stop.
self._ccObject = -1
params = self.getCCParams()
self._ccObject = params.create()
elif self._ccObject == -1:
- raise RuntimeError, "%s: Cycle found in configuration heirarchy." \
+ raise RuntimeError, "%s: Cycle found in configuration hierarchy." \
% self.path()
return self._ccObject
@@ -890,6 +893,10 @@ def isSimObjectSequence(value):
def isSimObjectOrSequence(value):
return isSimObject(value) or isSimObjectSequence(value)
+def isRoot(obj):
+ from m5.objects import Root
+ return obj and obj is Root.getInstance()
+
baseClasses = allClasses.copy()
baseInstances = instanceDict.copy()
diff --git a/src/python/m5/params.py b/src/python/m5/params.py
index cf64070c5..d9578e157 100644
--- a/src/python/m5/params.py
+++ b/src/python/m5/params.py
@@ -1049,8 +1049,14 @@ class PortRef(object):
peer = self.peer
if not self.peer: # nothing to connect to
return
- connectPorts(self.simobj.getCCObject(), self.name, self.index,
- peer.simobj.getCCObject(), peer.name, peer.index)
+ try:
+ connectPorts(self.simobj.getCCObject(), self.name, self.index,
+ peer.simobj.getCCObject(), peer.name, peer.index)
+ except:
+ print "Error connecting port %s.%s to %s.%s" % \
+ (self.simobj.path(), self.name,
+ peer.simobj.path(), peer.name)
+ raise
self.ccConnected = True
peer.ccConnected = True