summaryrefslogtreecommitdiff
path: root/src/python/m5/simulate.py
diff options
context:
space:
mode:
authorSteve Reinhardt <steve.reinhardt@amd.com>2010-08-17 05:08:50 -0700
committerSteve Reinhardt <steve.reinhardt@amd.com>2010-08-17 05:08:50 -0700
commit5ea906ba1625266ee80968d70e0c218adedcce9f (patch)
treea28387572527f0dac40d677a8320b797dcc2a137 /src/python/m5/simulate.py
parentc2cce96a0bb4878a9e6a4ae635096b5ce62e41c3 (diff)
downloadgem5-5ea906ba1625266ee80968d70e0c218adedcce9f.tar.xz
sim: move iterating over SimObjects into Python.
Diffstat (limited to 'src/python/m5/simulate.py')
-rw-r--r--src/python/m5/simulate.py33
1 files changed, 20 insertions, 13 deletions
diff --git a/src/python/m5/simulate.py b/src/python/m5/simulate.py
index 2db5c6952..54c6a0a2d 100644
--- a/src/python/m5/simulate.py
+++ b/src/python/m5/simulate.py
@@ -55,25 +55,29 @@ def instantiate():
# we need to fix the global frequency
ticks.fixGlobalFrequency()
- root.unproxy_all()
+ # Unproxy in sorted order for determinism
+ for obj in root.descendants(): obj.unproxyParams()
if options.dump_config:
ini_file = file(os.path.join(options.outdir, options.dump_config), 'w')
- root.print_ini(ini_file)
+ # Print ini sections in sorted order for easier diffing
+ for obj in sorted(root.descendants(), key=lambda o: o.path()):
+ obj.print_ini(ini_file)
ini_file.close()
# Initialize the global statistics
stats.initSimStats()
# Create the C++ sim objects and connect ports
- root.createCCObject()
- root.connectPorts()
+ for obj in root.descendants(): obj.createCCObject()
+ for obj in root.descendants(): obj.connectPorts()
# Do a second pass to finish initializing the sim objects
- core.initAll()
+ for obj in root.descendants(): obj.init()
# Do a third pass to initialize statistics
- core.regAllStats()
+ for obj in root.descendants(): obj.regStats()
+ for obj in root.descendants(): obj.regFormulas()
# We're done registering statistics. Enable the stats package now.
stats.enable()
@@ -97,7 +101,8 @@ def simulate(*args, **kwargs):
global need_resume, need_startup
if need_startup:
- internal.core.startupAll()
+ root = objects.Root.getInstance()
+ for obj in root.descendants(): obj.startup()
need_startup = False
for root in need_resume:
@@ -129,10 +134,10 @@ def doDrain(root):
def drain(root):
all_drained = False
drain_event = internal.event.createCountedDrain()
- unready_objects = root.startDrain(drain_event, True)
+ unready_objs = sum(obj.drain(drain_event) for obj in root.descendants())
# If we've got some objects that can't drain immediately, then simulate
- if unready_objects > 0:
- drain_event.setCount(unready_objects)
+ if unready_objs > 0:
+ drain_event.setCount(unready_objs)
simulate()
else:
all_drained = True
@@ -140,7 +145,7 @@ def drain(root):
return all_drained
def resume(root):
- root.resume()
+ for obj in root.descendants(): obj.resume()
def checkpoint(dir):
root = objects.Root.getInstance()
@@ -165,7 +170,8 @@ def changeToAtomic(system):
if system.getMemoryMode() != objects.params.atomic:
doDrain(system)
print "Changing memory mode to atomic"
- system.changeTiming(objects.params.atomic)
+ for obj in system.descendants():
+ obj.changeTiming(objects.params.atomic)
def changeToTiming(system):
if not isinstance(system, (objects.Root, objects.System)):
@@ -175,7 +181,8 @@ def changeToTiming(system):
if system.getMemoryMode() != objects.params.timing:
doDrain(system)
print "Changing memory mode to timing"
- system.changeTiming(objects.params.timing)
+ for obj in system.descendants():
+ obj.changeTiming(objects.params.timing)
def switchCpus(cpuList):
print "switching cpus"