Fixes for draining.
authorKevin Lim <ktlim@umich.edu>
Thu, 6 Jul 2006 20:06:00 +0000 (16:06 -0400)
committerKevin Lim <ktlim@umich.edu>
Thu, 6 Jul 2006 20:06:00 +0000 (16:06 -0400)
src/cpu/simple/timing.cc:
    Update for changed return values.
src/python/m5/__init__.py:
    Loop in order to make sure all objects are really drained.  Objects may become undrained as other objects become drained (e.g. a bus-bridge has a packet, while a bus is empty, and the first drain() will cause the bus-bridge to give the packet to the bus).

    The only case we know every object is actually drained is if they all return immediately that they are drained.

--HG--
extra : convert_revision : 80057a1d6d30381bd0b67b23549bd202f447c5cb

src/cpu/simple/timing.cc
src/python/m5/__init__.py

index ad04c8d3bd639ae7d6bae221e27c16a5719db9d0..523d81d0bbd869287f316478184189b2d914adab 100644 (file)
@@ -118,11 +118,11 @@ TimingSimpleCPU::drain(Event *drain_event)
     // an access to complete.
     if (status() == Idle || status() == Running || status() == SwitchedOut) {
         changeState(SimObject::DrainedTiming);
-        return false;
+        return true;
     } else {
         changeState(SimObject::Draining);
         drainEvent = drain_event;
-        return true;
+        return false;
     }
 }
 
index 579785a469dd008d1f95763af015af06fd1b1a9f..7d35ee8b8a8a07e8d0d112da5b3237d52e361bfc 100644 (file)
@@ -213,14 +213,28 @@ atexit.register(cc_main.doExitCleanup)
 # matter since most scripts will probably 'from m5.objects import *'.
 import objects
 
+# This loops until all objects have been fully drained.
 def doDrain(root):
+    all_drained = drain(root)
+    while (not all_drained):
+        all_drained = drain(root)
+
+# Tries to drain all objects.  Draining might not be completed unless
+# all objects return that they are drained on the first call.  This is
+# because as objects drain they may cause other objects to no longer
+# be drained.
+def drain(root):
+    all_drained = False
     drain_event = cc_main.createCountedDrain()
     unready_objects = root.startDrain(drain_event, True)
     # If we've got some objects that can't drain immediately, then simulate
     if unready_objects > 0:
         drain_event.setCount(unready_objects)
         simulate()
+    else:
+        all_drained = True
     cc_main.cleanupCountedDrain(drain_event)
+    return all_drained
 
 def resume(root):
     root.resume()