changeset 4bb5f5207617 in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=4bb5f5207617
description:
        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:

 src/python/m5/SimObject.py     |  11 +++++++++--
 src/python/m5/params.py        |  10 ++++++++--
 tests/configs/rubytest-ruby.py |   2 +-
 3 files changed, 18 insertions(+), 5 deletions(-)

diffs (65 lines):

diff -r 722f2ad014a7 -r 4bb5f5207617 src/python/m5/SimObject.py
--- a/src/python/m5/SimObject.py        Tue Aug 17 05:06:22 2010 -0700
+++ b/src/python/m5/SimObject.py        Tue Aug 17 05:06:22 2010 -0700
@@ -761,13 +761,16 @@
     # 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 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 -r 722f2ad014a7 -r 4bb5f5207617 src/python/m5/params.py
--- a/src/python/m5/params.py   Tue Aug 17 05:06:22 2010 -0700
+++ b/src/python/m5/params.py   Tue Aug 17 05:06:22 2010 -0700
@@ -1049,8 +1049,14 @@
         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
 
diff -r 722f2ad014a7 -r 4bb5f5207617 tests/configs/rubytest-ruby.py
--- a/tests/configs/rubytest-ruby.py    Tue Aug 17 05:06:22 2010 -0700
+++ b/tests/configs/rubytest-ruby.py    Tue Aug 17 05:06:22 2010 -0700
@@ -70,7 +70,7 @@
 #
 tester = RubyTester(checks_to_complete = 100, wakeup_frequency = 10)
 
-system = System(physmem = PhysicalMemory())
+system = System(tester = tester, physmem = PhysicalMemory())
 
 system.ruby = Ruby.create_system(options, system.physmem)
 
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to