simulate.py (9430:a113f27b68bd) simulate.py (9521:1cd02decbfd3)
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

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

55from m5.internal.stats import updateEvents as updateStatEvents
56
57from util import fatal
58from util import attrdict
59
60# define a MaxTick parameter
61MaxTick = 2**63 - 1
62
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

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

55from m5.internal.stats import updateEvents as updateStatEvents
56
57from util import fatal
58from util import attrdict
59
60# define a MaxTick parameter
61MaxTick = 2**63 - 1
62
63_memory_modes = {
64 "atomic" : objects.params.atomic,
65 "timing" : objects.params.timing,
66 }
67
63# The final hook to generate .ini files. Called from the user script
64# once the config is built.
65def instantiate(ckpt_dir=None):
66 from m5 import options
67
68 root = objects.Root.getInstance()
69
70 if not root:

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

197 if not isinstance(root, objects.Root):
198 raise TypeError, "Checkpoint must be called on a root object."
199 drain(root)
200 memWriteback(root)
201 print "Writing checkpoint"
202 internal.core.serializeAll(dir)
203 resume(root)
204
68# The final hook to generate .ini files. Called from the user script
69# once the config is built.
70def instantiate(ckpt_dir=None):
71 from m5 import options
72
73 root = objects.Root.getInstance()
74
75 if not root:

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

202 if not isinstance(root, objects.Root):
203 raise TypeError, "Checkpoint must be called on a root object."
204 drain(root)
205 memWriteback(root)
206 print "Writing checkpoint"
207 internal.core.serializeAll(dir)
208 resume(root)
209
205def changeMemoryMode(system, mode):
210def _changeMemoryMode(system, mode):
206 if not isinstance(system, (objects.Root, objects.System)):
207 raise TypeError, "Parameter of type '%s'. Must be type %s or %s." % \
208 (type(system), objects.Root, objects.System)
209 if system.getMemoryMode() != mode:
210 drain(system)
211 system.setMemoryMode(mode)
212 else:
213 print "System already in target mode. Memory mode unchanged."
214
211 if not isinstance(system, (objects.Root, objects.System)):
212 raise TypeError, "Parameter of type '%s'. Must be type %s or %s." % \
213 (type(system), objects.Root, objects.System)
214 if system.getMemoryMode() != mode:
215 drain(system)
216 system.setMemoryMode(mode)
217 else:
218 print "System already in target mode. Memory mode unchanged."
219
215def changeToAtomic(system, **kwargs):
216 print "Changing memory mode to atomic"
217 changeMemoryMode(system, objects.params.atomic, **kwargs)
220def switchCpus(system, cpuList, do_drain=True):
221 """Switch CPUs in a system.
218
222
219def changeToTiming(system, **kwargs):
220 print "Changing memory mode to timing"
221 changeMemoryMode(system, objects.params.timing, **kwargs)
223 By default, this method drains and resumes the system. This
224 behavior can be disabled by setting the keyword argument
225 'do_drain' to false, which might be desirable if multiple
226 operations requiring a drained system are going to be performed in
227 sequence.
222
228
223def switchCpus(cpuList):
229 Note: This method may switch the memory mode of the system if that
230 is required by the CPUs. It may also flush all caches in the
231 system.
232
233 Arguments:
234 system -- Simulated system.
235 cpuList -- (old_cpu, new_cpu) tuples
236
237 Keyword Arguments:
238 do_drain -- Perform a drain/resume of the system when switching.
239 """
224 print "switching cpus"
225 if not isinstance(cpuList, list):
226 raise RuntimeError, "Must pass a list to this function"
227 for item in cpuList:
228 if not isinstance(item, tuple) or len(item) != 2:
229 raise RuntimeError, "List must have tuples of (oldCPU,newCPU)"
230
240 print "switching cpus"
241 if not isinstance(cpuList, list):
242 raise RuntimeError, "Must pass a list to this function"
243 for item in cpuList:
244 if not isinstance(item, tuple) or len(item) != 2:
245 raise RuntimeError, "List must have tuples of (oldCPU,newCPU)"
246
231 old_cpu_set = set([old_cpu for old_cpu, new_cpu in cpuList])
247 old_cpus = [old_cpu for old_cpu, new_cpu in cpuList]
248 new_cpus = [new_cpu for old_cpu, new_cpu in cpuList]
249 old_cpu_set = set(old_cpus)
250 memory_mode_name = new_cpus[0].memory_mode()
232 for old_cpu, new_cpu in cpuList:
233 if not isinstance(old_cpu, objects.BaseCPU):
234 raise TypeError, "%s is not of type BaseCPU" % old_cpu
235 if not isinstance(new_cpu, objects.BaseCPU):
236 raise TypeError, "%s is not of type BaseCPU" % new_cpu
237 if new_cpu in old_cpu_set:
238 raise RuntimeError, \
239 "New CPU (%s) is in the list of old CPUs." % (old_cpu,)
240 if not new_cpu.switchedOut():
241 raise RuntimeError, \
242 "New CPU (%s) is already active." % (new_cpu,)
251 for old_cpu, new_cpu in cpuList:
252 if not isinstance(old_cpu, objects.BaseCPU):
253 raise TypeError, "%s is not of type BaseCPU" % old_cpu
254 if not isinstance(new_cpu, objects.BaseCPU):
255 raise TypeError, "%s is not of type BaseCPU" % new_cpu
256 if new_cpu in old_cpu_set:
257 raise RuntimeError, \
258 "New CPU (%s) is in the list of old CPUs." % (old_cpu,)
259 if not new_cpu.switchedOut():
260 raise RuntimeError, \
261 "New CPU (%s) is already active." % (new_cpu,)
262 if not new_cpu.support_take_over():
263 raise RuntimeError, \
264 "New CPU (%s) does not support CPU handover." % (old_cpu,)
265 if new_cpu.memory_mode() != memory_mode_name:
266 raise RuntimeError, \
267 "%s and %s require different memory modes." % (new_cpu,
268 new_cpus[0])
243 if old_cpu.switchedOut():
244 raise RuntimeError, \
245 "Old CPU (%s) is inactive." % (new_cpu,)
269 if old_cpu.switchedOut():
270 raise RuntimeError, \
271 "Old CPU (%s) is inactive." % (new_cpu,)
272 if not old_cpu.support_take_over():
273 raise RuntimeError, \
274 "Old CPU (%s) does not support CPU handover." % (old_cpu,)
246
275
276 try:
277 memory_mode = _memory_modes[memory_mode_name]
278 except KeyError:
279 raise RuntimeError, "Invalid memory mode (%s)" % memory_mode_name
280
281 if do_drain:
282 drain(system)
283
247 # Now all of the CPUs are ready to be switched out
248 for old_cpu, new_cpu in cpuList:
249 old_cpu.switchOut()
250
284 # Now all of the CPUs are ready to be switched out
285 for old_cpu, new_cpu in cpuList:
286 old_cpu.switchOut()
287
288 # Change the memory mode if required. We check if this is needed
289 # to avoid printing a warning if no switch was performed.
290 if system.getMemoryMode() != memory_mode:
291 _changeMemoryMode(system, memory_mode)
292
251 for old_cpu, new_cpu in cpuList:
252 new_cpu.takeOverFrom(old_cpu)
253
293 for old_cpu, new_cpu in cpuList:
294 new_cpu.takeOverFrom(old_cpu)
295
296 if do_drain:
297 resume(system)
298
254from internal.core import disableAllListeners
299from internal.core import disableAllListeners