changeset 722f2ad014a7 in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=722f2ad014a7
description:
sim: make Python Root object a singleton
Enforce that the Python Root SimObject is instantiated only
once. The C++ Root object already panics if more than one is
created. This change avoids the need to track what the root
object is, since it's available from Root.getInstance() (if it
exists). It's now redundant to have the user pass the root
object to functions like instantiate(), checkpoint(), and
restoreCheckpoint(), so that arg is gone. Users who use
configs/common/Simulate.py should not notice.
diffstat:
configs/common/Simulation.py | 20 ++++++++++----------
configs/example/memtest-ruby.py | 2 +-
configs/example/memtest.py | 2 +-
configs/example/rubytest.py | 2 +-
configs/splash2/cluster.py | 2 +-
configs/splash2/run.py | 2 +-
src/python/m5/SimObject.py | 2 +-
src/python/m5/simulate.py | 14 +++++++++++---
src/sim/Root.py | 25 +++++++++++++++++++++++++
tests/run.py | 2 +-
10 files changed, 53 insertions(+), 20 deletions(-)
diffs (248 lines):
diff -r 1eb0be76e800 -r 722f2ad014a7 configs/common/Simulation.py
--- a/configs/common/Simulation.py Tue Aug 17 05:06:22 2010 -0700
+++ b/configs/common/Simulation.py Tue Aug 17 05:06:22 2010 -0700
@@ -190,7 +190,7 @@
for i in xrange(np):
testsys.cpu[i].max_insts_any_thread = offset
- m5.instantiate(root)
+ m5.instantiate()
if options.checkpoint_restore != None:
from os.path import isdir, exists
@@ -207,7 +207,7 @@
fatal("Unable to find checkpoint directory %s", checkpoint_dir)
print "Restoring checkpoint ..."
- m5.restoreCheckpoint(root, checkpoint_dir)
+ m5.restoreCheckpoint(checkpoint_dir)
print "Done."
elif options.simpoint:
# assume workload 0 has the simpoint
@@ -224,7 +224,7 @@
options.bench, options.checkpoint_restore)
print "Restoring checkpoint ..."
- m5.restoreCheckpoint(root,checkpoint_dir)
+ m5.restoreCheckpoint(checkpoint_dir)
print "Done."
else:
dirs = listdir(cptdir)
@@ -246,8 +246,8 @@
maxtick = maxtick - int(cpts[cpt_num - 1])
## Restore the checkpoint
- m5.restoreCheckpoint(root,
- joinpath(cptdir, "cpt.%s" % cpts[cpt_num - 1]))
+ m5.restoreCheckpoint(joinpath(cptdir,
+ "cpt.%s" % cpts[cpt_num - 1]))
if options.standard_switch or cpu_class:
if options.standard_switch:
@@ -324,7 +324,7 @@
if exit_event.getCause() == \
"a thread reached the max instruction count":
- m5.checkpoint(root, joinpath(cptdir, "cpt.%s.%d" % \
+ m5.checkpoint(joinpath(cptdir, "cpt.%s.%d" % \
(options.bench, checkpoint_inst)))
print "Checkpoint written."
num_checkpoints += 1
@@ -341,7 +341,7 @@
exit_event = m5.simulate(when - m5.curTick())
if exit_event.getCause() == "simulate() limit reached":
- m5.checkpoint(root, joinpath(cptdir, "cpt.%d"))
+ m5.checkpoint(joinpath(cptdir, "cpt.%d"))
num_checkpoints += 1
sim_ticks = when
@@ -358,7 +358,7 @@
while exit_event.getCause() == "checkpoint":
exit_event = m5.simulate(sim_ticks - m5.curTick())
if exit_event.getCause() == "simulate() limit reached":
- m5.checkpoint(root, joinpath(cptdir, "cpt.%d"))
+ m5.checkpoint(joinpath(cptdir, "cpt.%d"))
num_checkpoints += 1
if exit_event.getCause() != "simulate() limit reached":
@@ -371,7 +371,7 @@
exit_event = m5.simulate(maxtick)
while exit_event.getCause() == "checkpoint":
- m5.checkpoint(root, joinpath(cptdir, "cpt.%d"))
+ m5.checkpoint(joinpath(cptdir, "cpt.%d"))
num_checkpoints += 1
if num_checkpoints == max_checkpoints:
exit_cause = "maximum %d checkpoints dropped" % max_checkpoints
@@ -385,5 +385,5 @@
print 'Exiting @ cycle %i because %s' % (m5.curTick(), exit_cause)
if options.checkpoint_at_end:
- m5.checkpoint(root, joinpath(cptdir, "cpt.%d"))
+ m5.checkpoint(joinpath(cptdir, "cpt.%d"))
diff -r 1eb0be76e800 -r 722f2ad014a7 configs/example/memtest-ruby.py
--- a/configs/example/memtest-ruby.py Tue Aug 17 05:06:22 2010 -0700
+++ b/configs/example/memtest-ruby.py Tue Aug 17 05:06:22 2010 -0700
@@ -129,7 +129,7 @@
m5.ticks.setGlobalFrequency('1ns')
# instantiate configuration
-m5.instantiate(root)
+m5.instantiate()
# simulate until program terminates
exit_event = m5.simulate(options.maxtick)
diff -r 1eb0be76e800 -r 722f2ad014a7 configs/example/memtest.py
--- a/configs/example/memtest.py Tue Aug 17 05:06:22 2010 -0700
+++ b/configs/example/memtest.py Tue Aug 17 05:06:22 2010 -0700
@@ -181,7 +181,7 @@
m5.ticks.setGlobalFrequency('1ns')
# instantiate configuration
-m5.instantiate(root)
+m5.instantiate()
# simulate until program terminates
exit_event = m5.simulate(options.maxtick)
diff -r 1eb0be76e800 -r 722f2ad014a7 configs/example/rubytest.py
--- a/configs/example/rubytest.py Tue Aug 17 05:06:22 2010 -0700
+++ b/configs/example/rubytest.py Tue Aug 17 05:06:22 2010 -0700
@@ -118,7 +118,7 @@
m5.ticks.setGlobalFrequency('1ns')
# instantiate configuration
-m5.instantiate(root)
+m5.instantiate()
# simulate until program terminates
exit_event = m5.simulate(options.maxtick)
diff -r 1eb0be76e800 -r 722f2ad014a7 configs/splash2/cluster.py
--- a/configs/splash2/cluster.py Tue Aug 17 05:06:22 2010 -0700
+++ b/configs/splash2/cluster.py Tue Aug 17 05:06:22 2010 -0700
@@ -292,7 +292,7 @@
root.system.mem_mode = 'timing'
# instantiate configuration
-m5.instantiate(root)
+m5.instantiate()
# simulate until program terminates
if options.maxtick:
diff -r 1eb0be76e800 -r 722f2ad014a7 configs/splash2/run.py
--- a/configs/splash2/run.py Tue Aug 17 05:06:22 2010 -0700
+++ b/configs/splash2/run.py Tue Aug 17 05:06:22 2010 -0700
@@ -276,7 +276,7 @@
root.system.mem_mode = 'timing'
# instantiate configuration
-m5.instantiate(root)
+m5.instantiate()
# simulate until program terminates
if options.maxtick:
diff -r 1eb0be76e800 -r 722f2ad014a7 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
@@ -623,7 +623,7 @@
def path(self):
if not self._parent:
- return 'root'
+ return '(orphan)'
ppath = self._parent.path()
if ppath == 'root':
return self._name
diff -r 1eb0be76e800 -r 722f2ad014a7 src/python/m5/simulate.py
--- a/src/python/m5/simulate.py Tue Aug 17 05:06:22 2010 -0700
+++ b/src/python/m5/simulate.py Tue Aug 17 05:06:22 2010 -0700
@@ -39,13 +39,19 @@
import SimObject
import ticks
import objects
+from util import fatal
# define a MaxTick parameter
MaxTick = 2**63 - 1
# The final hook to generate .ini files. Called from the user script
# once the config is built.
-def instantiate(root):
+def instantiate():
+ root = objects.Root.getInstance()
+
+ if not root:
+ fatal("Need to instantiate Root() before calling instantiate()")
+
# we need to fix the global frequency
ticks.fixGlobalFrequency()
@@ -136,7 +142,8 @@
def resume(root):
root.resume()
-def checkpoint(root, dir):
+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)
@@ -144,7 +151,8 @@
internal.core.serializeAll(dir)
resume(root)
-def restoreCheckpoint(root, dir):
+def restoreCheckpoint(dir):
+ root = objects.Root.getInstance()
print "Restoring from checkpoint"
internal.core.unserializeAll(dir)
need_resume.append(root)
diff -r 1eb0be76e800 -r 722f2ad014a7 src/sim/Root.py
--- a/src/sim/Root.py Tue Aug 17 05:06:22 2010 -0700
+++ b/src/sim/Root.py Tue Aug 17 05:06:22 2010 -0700
@@ -28,7 +28,32 @@
from m5.SimObject import SimObject
from m5.params import *
+from m5.util import fatal
class Root(SimObject):
+
+ _the_instance = None
+
+ def __new__(cls, **kwargs):
+ if Root._the_instance:
+ fatal("Attempt to allocate multiple instances of Root.")
+ return None
+
+ # first call: allocate the unique instance
+ #
+ # If SimObject ever implements __new__, we may want to pass
+ # kwargs here, but for now this goes straight to
+ # object.__new__ which prints an ugly warning if you pass it
+ # args. Seems like a bad design but that's the way it is.
+ Root._the_instance = SimObject.__new__(cls)
+ return Root._the_instance
+
+ @classmethod
+ def getInstance(cls):
+ return Root._the_instance
+
+ def path(self):
+ return 'root'
+
type = 'Root'
dummy = Param.Int(0, "We don't support objects without params")
diff -r 1eb0be76e800 -r 722f2ad014a7 tests/run.py
--- a/tests/run.py Tue Aug 17 05:06:22 2010 -0700
+++ b/tests/run.py Tue Aug 17 05:06:22 2010 -0700
@@ -78,7 +78,7 @@
execfile(joinpath(tests_root, category, name, 'test.py'))
# instantiate configuration
-m5.instantiate(root)
+m5.instantiate()
# simulate until program terminates
exit_event = m5.simulate(maxtick)
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev