python: Rename doDrain()->drain() and make it do the right thing
authorAndreas Sandberg <Andreas.Sandberg@arm.com>
Fri, 2 Nov 2012 16:32:02 +0000 (11:32 -0500)
committerAndreas Sandberg <Andreas.Sandberg@arm.com>
Fri, 2 Nov 2012 16:32:02 +0000 (11:32 -0500)
There is no point in exporting the old drain() method in
Simulate.py. It should only be used internally by doDrain(). This
patch moves the old drain() method into doDrain() and renames
doDrain() to drain().

configs/common/Simulation.py
src/python/m5/simulate.py

index f6273a6f06ce8c8dae1b1a89bb5b11ba319631a2..53ccf0a144f4a45c4d88f32a553c57bb94f4f030 100644 (file)
@@ -242,7 +242,7 @@ def repeatSwitch(testsys, repeat_switch_cpu_list, maxtick, switch_freq):
             return exit_cause
 
         print "draining the system"
-        m5.doDrain(testsys)
+        m5.drain(testsys)
         m5.switchCpus(repeat_switch_cpu_list)
         m5.resume(testsys)
 
@@ -469,7 +469,7 @@ def run(options, root, testsys, cpu_class):
             print "Switching CPUS @ tick %s" % (m5.curTick())
             print "Simulation ends instruction count:%d" % \
                     (testsys.switch_cpus_1[0].max_insts_any_thread)
-            m5.doDrain(testsys)
+            m5.drain(testsys)
             m5.switchCpus(switch_cpu_list1)
             m5.resume(testsys)
 
index 4c60765813f950d683033285f97b64b5a0edab4f..ca2cc4a9c7956ffca6bd25e24159e61a3ae707a5 100644 (file)
@@ -157,28 +157,29 @@ atexit.register(stats.dump)
 # register our C++ exit callback function with Python
 atexit.register(internal.core.doExitCleanup)
 
-# 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.
+# Drain the system in preparation of a checkpoint or memory mode
+# switch.
 def drain(root):
-    all_drained = False
-    dm = internal.drain.createDrainManager()
-    unready_objs = sum(obj.drain(dm) for obj in root.descendants())
-    # If we've got some objects that can't drain immediately, then simulate
-    if unready_objs > 0:
-        dm.setCount(unready_objs)
-        simulate()
-    else:
-        all_drained = True
-    internal.drain.cleanupDrainManager(dm)
-    return all_drained
+    # Try 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():
+        all_drained = False
+        dm = internal.drain.createDrainManager()
+        unready_objs = sum(obj.drain(dm) for obj in root.descendants())
+        # If we've got some objects that can't drain immediately, then simulate
+        if unready_objs > 0:
+            dm.setCount(unready_objs)
+            simulate()
+        else:
+            all_drained = True
+        internal.drain.cleanupDrainManager(dm)
+        return all_drained
+
+    all_drained = _drain()
+    while (not all_drained):
+        all_drained = _drain()
 
 def resume(root):
     for obj in root.descendants(): obj.drainResume()
@@ -187,7 +188,7 @@ def checkpoint(dir):
     root = objects.Root.getInstance()
     if not isinstance(root, objects.Root):
         raise TypeError, "Checkpoint must be called on a root object."
-    doDrain(root)
+    drain(root)
     print "Writing checkpoint"
     internal.core.serializeAll(dir)
     resume(root)
@@ -197,7 +198,7 @@ def changeMemoryMode(system, mode):
         raise TypeError, "Parameter of type '%s'.  Must be type %s or %s." % \
               (type(system), objects.Root, objects.System)
     if system.getMemoryMode() != mode:
-        doDrain(system)
+        drain(system)
         system.setMemoryMode(mode)
     else:
         print "System already in target mode. Memory mode unchanged."