diff -r 5beb40dad122 -r cf49901df862 configs/common/Simulation.py --- a/configs/common/Simulation.py Tue Jul 27 21:23:56 2010 -0700 +++ b/configs/common/Simulation.py Tue Jul 27 21:23:56 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 diff -r 5beb40dad122 -r cf49901df862 configs/example/memtest-ruby.py --- a/configs/example/memtest-ruby.py Tue Jul 27 21:23:56 2010 -0700 +++ b/configs/example/memtest-ruby.py Tue Jul 27 21:23:56 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 5beb40dad122 -r cf49901df862 configs/example/memtest.py --- a/configs/example/memtest.py Tue Jul 27 21:23:56 2010 -0700 +++ b/configs/example/memtest.py Tue Jul 27 21:23:56 2010 -0700 @@ -182,7 +182,7 @@ m5.ticks.setGlobalFrequency('1ns') # instantiate configuration -m5.instantiate(root) +m5.instantiate() # simulate until program terminates exit_event = m5.simulate(options.maxtick) diff -r 5beb40dad122 -r cf49901df862 configs/example/rubytest.py --- a/configs/example/rubytest.py Tue Jul 27 21:23:56 2010 -0700 +++ b/configs/example/rubytest.py Tue Jul 27 21:23:56 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 5beb40dad122 -r cf49901df862 configs/splash2/cluster.py --- a/configs/splash2/cluster.py Tue Jul 27 21:23:56 2010 -0700 +++ b/configs/splash2/cluster.py Tue Jul 27 21:23:56 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 5beb40dad122 -r cf49901df862 configs/splash2/run.py --- a/configs/splash2/run.py Tue Jul 27 21:23:56 2010 -0700 +++ b/configs/splash2/run.py Tue Jul 27 21:23:56 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 5beb40dad122 -r cf49901df862 src/python/m5/SimObject.py --- a/src/python/m5/SimObject.py Tue Jul 27 21:23:56 2010 -0700 +++ b/src/python/m5/SimObject.py Tue Jul 27 21:23:56 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 5beb40dad122 -r cf49901df862 src/python/m5/simulate.py --- a/src/python/m5/simulate.py Tue Jul 27 21:23:56 2010 -0700 +++ b/src/python/m5/simulate.py Tue Jul 27 21:23:56 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 5beb40dad122 -r cf49901df862 src/sim/Root.py --- a/src/sim/Root.py Tue Jul 27 21:23:56 2010 -0700 +++ b/src/sim/Root.py Tue Jul 27 21:23:56 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 5beb40dad122 -r cf49901df862 tests/run.py --- a/tests/run.py Tue Jul 27 21:23:56 2010 -0700 +++ b/tests/run.py Tue Jul 27 21:23:56 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)