diff options
-rw-r--r-- | configs/common/Simulation.py | 20 | ||||
-rw-r--r-- | configs/example/memtest-ruby.py | 2 | ||||
-rw-r--r-- | configs/example/memtest.py | 2 | ||||
-rw-r--r-- | configs/example/rubytest.py | 2 | ||||
-rw-r--r-- | configs/splash2/cluster.py | 2 | ||||
-rw-r--r-- | configs/splash2/run.py | 2 | ||||
-rw-r--r-- | src/python/m5/SimObject.py | 2 | ||||
-rw-r--r-- | src/python/m5/simulate.py | 14 | ||||
-rw-r--r-- | src/sim/Root.py | 25 | ||||
-rw-r--r-- | tests/run.py | 2 |
10 files changed, 53 insertions, 20 deletions
diff --git a/configs/common/Simulation.py b/configs/common/Simulation.py index 905e435d3..0393b0dfa 100644 --- a/configs/common/Simulation.py +++ b/configs/common/Simulation.py @@ -190,7 +190,7 @@ def run(options, root, testsys, cpu_class): 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 @@ def run(options, root, testsys, cpu_class): 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 @@ def run(options, root, testsys, cpu_class): 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 @@ def run(options, root, testsys, cpu_class): 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 @@ def run(options, root, testsys, cpu_class): 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 @@ def run(options, root, testsys, cpu_class): 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 @@ def run(options, root, testsys, cpu_class): 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 @@ def run(options, root, testsys, cpu_class): 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 @@ def run(options, root, testsys, cpu_class): 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 --git a/configs/example/memtest-ruby.py b/configs/example/memtest-ruby.py index 709d31844..16d86f0bc 100644 --- a/configs/example/memtest-ruby.py +++ b/configs/example/memtest-ruby.py @@ -129,7 +129,7 @@ else: m5.ticks.setGlobalFrequency('1ns') # instantiate configuration -m5.instantiate(root) +m5.instantiate() # simulate until program terminates exit_event = m5.simulate(options.maxtick) diff --git a/configs/example/memtest.py b/configs/example/memtest.py index d4497092b..0713dd241 100644 --- a/configs/example/memtest.py +++ b/configs/example/memtest.py @@ -181,7 +181,7 @@ else: m5.ticks.setGlobalFrequency('1ns') # instantiate configuration -m5.instantiate(root) +m5.instantiate() # simulate until program terminates exit_event = m5.simulate(options.maxtick) diff --git a/configs/example/rubytest.py b/configs/example/rubytest.py index 13b862756..c9cf0aba4 100644 --- a/configs/example/rubytest.py +++ b/configs/example/rubytest.py @@ -118,7 +118,7 @@ root.system.mem_mode = 'timing' m5.ticks.setGlobalFrequency('1ns') # instantiate configuration -m5.instantiate(root) +m5.instantiate() # simulate until program terminates exit_event = m5.simulate(options.maxtick) diff --git a/configs/splash2/cluster.py b/configs/splash2/cluster.py index 45c9ede82..77591dc62 100644 --- a/configs/splash2/cluster.py +++ b/configs/splash2/cluster.py @@ -292,7 +292,7 @@ if options.timing or options.detailed: root.system.mem_mode = 'timing' # instantiate configuration -m5.instantiate(root) +m5.instantiate() # simulate until program terminates if options.maxtick: diff --git a/configs/splash2/run.py b/configs/splash2/run.py index 95ec790ba..24faade17 100644 --- a/configs/splash2/run.py +++ b/configs/splash2/run.py @@ -276,7 +276,7 @@ if options.timing or options.detailed: root.system.mem_mode = 'timing' # instantiate configuration -m5.instantiate(root) +m5.instantiate() # simulate until program terminates if options.maxtick: diff --git a/src/python/m5/SimObject.py b/src/python/m5/SimObject.py index 3b84d6000..8e14b63d2 100644 --- a/src/python/m5/SimObject.py +++ b/src/python/m5/SimObject.py @@ -623,7 +623,7 @@ class SimObject(object): def path(self): if not self._parent: - return 'root' + return '(orphan)' ppath = self._parent.path() if ppath == 'root': return self._name diff --git a/src/python/m5/simulate.py b/src/python/m5/simulate.py index e43f90173..2db5c6952 100644 --- a/src/python/m5/simulate.py +++ b/src/python/m5/simulate.py @@ -39,13 +39,19 @@ from main import options 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 drain(root): 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 @@ def checkpoint(root, dir): 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 --git a/src/sim/Root.py b/src/sim/Root.py index fff998e0d..c7404a11f 100644 --- a/src/sim/Root.py +++ b/src/sim/Root.py @@ -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 --git a/tests/run.py b/tests/run.py index 1e58f0283..f4105fb41 100644 --- a/tests/run.py +++ b/tests/run.py @@ -78,7 +78,7 @@ sys.path.append(joinpath(tests_root, category, name)) execfile(joinpath(tests_root, category, name, 'test.py')) # instantiate configuration -m5.instantiate(root) +m5.instantiate() # simulate until program terminates exit_event = m5.simulate(maxtick) |