Deleted Added
sdiff udiff text old ( 11431:871eaaa0ab24 ) new ( 11802:be62996c95d1 )
full compact
1# Copyright (c) 2012 ARM Limited
2# All rights reserved.
3#
4# The license below extends only to copyright in the software and shall
5# not be construed as granting a license to any other intellectual
6# property including but not limited to intellectual property relating
7# to a hardware implementation of the functionality of the software
8# licensed hereunder. You may use the software subject to the license

--- 31 unchanged lines hidden (view full) ---

40# Authors: Nathan Binkert
41# Steve Reinhardt
42
43import atexit
44import os
45import sys
46
47# import the SWIG-wrapped main C++ functions
48import _m5.drain
49import _m5.core
50from _m5.stats import updateEvents as updateStatEvents
51
52import stats
53import SimObject
54import ticks
55import objects
56from m5.util.dot_writer import do_dot, do_dvfs_dot
57
58from util import fatal
59from util import attrdict
60
61# define a MaxTick parameter, unsigned 64 bit
62MaxTick = 2**64 - 1
63
64_memory_modes = {
65 "atomic" : objects.params.atomic,
66 "timing" : objects.params.timing,
67 "atomic_noncaching" : objects.params.atomic_noncaching,
68 }
69
70_drain_manager = _m5.drain.DrainManager.instance()
71
72# The final hook to generate .ini files. Called from the user script
73# once the config is built.
74def instantiate(ckpt_dir=None):
75 from m5 import options
76
77 root = objects.Root.getInstance()
78

--- 55 unchanged lines hidden (view full) ---

134 do_dvfs_dot(root, options.outdir, options.dot_dvfs_config)
135
136 # We're done registering statistics. Enable the stats package now.
137 stats.enable()
138
139 # Restore checkpoint (if any)
140 if ckpt_dir:
141 _drain_manager.preCheckpointRestore()
142 ckpt = _m5.core.getCheckpoint(ckpt_dir)
143 _m5.core.unserializeGlobals(ckpt);
144 for obj in root.descendants(): obj.loadState(ckpt)
145 else:
146 for obj in root.descendants(): obj.initState()
147
148 # Check to see if any of the stat events are in the past after resuming from
149 # a checkpoint, If so, this call will shift them to be at a valid time.
150 updateStatEvents()
151

--- 6 unchanged lines hidden (view full) ---

158 for obj in root.descendants(): obj.startup()
159 need_startup = False
160
161 # Python exit handlers happen in reverse order.
162 # We want to dump stats last.
163 atexit.register(stats.dump)
164
165 # register our C++ exit callback function with Python
166 atexit.register(_m5.core.doExitCleanup)
167
168 # Reset to put the stats in a consistent state.
169 stats.reset()
170
171 if _drain_manager.isDrained():
172 _drain_manager.resume()
173
174 return _m5.event.simulate(*args, **kwargs)
175
176def drain():
177 """Drain the simulator in preparation of a checkpoint or memory mode
178 switch.
179
180 This operation is a no-op if the simulator is already in the
181 Drained state.
182
183 """

--- 6 unchanged lines hidden (view full) ---

190 # Try to drain the system. The drain is successful if all
191 # objects are done without simulation. We need to simulate
192 # more if not.
193 if _drain_manager.tryDrain():
194 return True
195
196 # WARNING: if a valid exit event occurs while draining, it
197 # will not get returned to the user script
198 exit_event = _m5.event.simulate()
199 while exit_event.getCause() != 'Finished drain':
200 exit_event = simulate()
201
202 return False
203
204 # Don't try to drain a system that is already drained
205 is_drained = _drain_manager.isDrained()
206 while not is_drained:

--- 12 unchanged lines hidden (view full) ---

219def checkpoint(dir):
220 root = objects.Root.getInstance()
221 if not isinstance(root, objects.Root):
222 raise TypeError, "Checkpoint must be called on a root object."
223
224 drain()
225 memWriteback(root)
226 print "Writing checkpoint"
227 _m5.core.serializeAll(dir)
228
229def _changeMemoryMode(system, mode):
230 if not isinstance(system, (objects.Root, objects.System)):
231 raise TypeError, "Parameter of type '%s'. Must be type %s or %s." % \
232 (type(system), objects.Root, objects.System)
233 if system.getMemoryMode() != mode:
234 system.setMemoryMode(mode)
235 else:

--- 99 unchanged lines hidden (view full) ---

335 simout -- New simulation output directory.
336
337 Return Value:
338 pid of the child process or 0 if running in the child.
339 """
340 from m5 import options
341 global fork_count
342
343 if not _m5.core.listenersDisabled():
344 raise RuntimeError, "Can not fork a simulator with listeners enabled"
345
346 drain()
347
348 try:
349 pid = os.fork()
350 except OSError, e:
351 raise e

--- 4 unchanged lines hidden (view full) ---

356 notifyFork(root)
357 # Setup a new output directory
358 parent = options.outdir
359 options.outdir = simout % {
360 "parent" : parent,
361 "fork_seq" : fork_count,
362 "pid" : os.getpid(),
363 }
364 _m5.core.setOutputDir(options.outdir)
365 else:
366 fork_count += 1
367
368 return pid
369
370from _m5.core import disableAllListeners, listenersDisabled
371from _m5.core import curTick