54c54
< if options.checkpoint_restore:
---
> if options.checkpoint_restore or options.fast_forward:
88a89,90
> if options.fast_forward:
> testsys.cpu[i].max_insts_any_thread = options.fast_forward
98,100d99
< if (options.fast_forward and options.warmup):
< m5.panic("Must specify either warmup OR fast-forward with -s!")
<
115,116c114,134
< if options.fast_forward:
< switch_cpus[i].max_insts_any_thread = options.fast_forward
---
> # if restoring, make atomic cpu simulate only a few instructions
> if options.checkpoint_restore:
> testsys.cpu[i].max_insts_any_thread = 1
> # Fast forward to specified location if we are not restoring
> elif options.fast_forward:
> testsys.cpu[i].max_insts_any_thread = options.fast_forward
> # Fast forward to a simpoint (warning: time consuming)
> elif options.simpoint:
> if testsys.cpu[i].workload[0].simpoint == None:
> m5.panic('simpoint not found')
> testsys.cpu[i].max_insts_any_thread = \
> testsys.cpu[i].workload[0].simpoint
> # No distance specified, just switch
> else:
> testsys.cpu[i].max_insts_any_thread = 1
>
> # warmup period
> if options.warmup_insts:
> switch_cpus[i].max_insts_any_thread = options.warmup_insts
>
> # simulation period
126d143
<
132,134c149,167
< elif options.fast_forward:
< for i in xrange(np):
< testsys.cpu[i].max_insts_any_thread = options.fast_forward
---
> # set the checkpoint in the cpu before m5.instantiate is called
> if options.take_checkpoints and \
> (options.simpoint or options.at_instruction):
> offset = int(options.take_checkpoints)
> # Set an instruction break point
> if options.simpoint:
> for i in xrange(np):
> if testsys.cpu[i].workload[0].simpoint == None:
> m5.panic('no simpoint for testsys.cpu[%d].workload[0]' % i)
> checkpoint_inst = testsys.cpu[i].workload[0].simpoint + offset
> testsys.cpu[i].max_insts_any_thread = checkpoint_inst
> # used for output below
> options.take_checkpoints = checkpoint_inst
> else:
> options.take_checkpoints = offset
> # Set all test cpus with the right number of instructions
> # for the upcoming simulation
> for i in xrange(np):
> testsys.cpu[i].max_insts_any_thread = offset
135a169,170
> testsys.cpu_switch_list = cpu_switch_list
>
139c174
< from os.path import isdir
---
> from os.path import isdir, exists
146,152c181,186
< dirs = listdir(cptdir)
< expr = re.compile('cpt\.([0-9]*)')
< cpts = []
< for dir in dirs:
< match = expr.match(dir)
< if match:
< cpts.append(match.group(1))
---
> if options.at_instruction:
> checkpoint_dir = joinpath(cptdir, "cpt.%s.%s" % \
> (options.bench, options.checkpoint_restore))
> if not exists(checkpoint_dir):
> m5.panic("Unable to find checkpoint directory %s" % \
> checkpoint_dir)
154c188,194
< cpts.sort(lambda a,b: cmp(long(a), long(b)))
---
> print "Restoring checkpoint ..."
> m5.restoreCheckpoint(root, checkpoint_dir)
> print "Done."
> elif options.simpoint:
> # assume workload 0 has the simpoint
> if testsys.cpu[i].workload[0].simpoint == None:
> m5.panic('Unable to find simpoint')
156c196,197
< cpt_num = options.checkpoint_restore
---
> options.checkpoint_restore += \
> testsys.cpu[0].workload[0].simpoint
158,159c199,203
< if cpt_num > len(cpts):
< m5.panic('Checkpoint %d not found' % cpt_num)
---
> checkpoint_dir = joinpath(cptdir, "cpt.%s.%d" % \
> (options.bench, options.checkpoint_restore))
> if not exists(checkpoint_dir):
> m5.panic("Unable to find checkpoint directory %s.%s" % \
> (options.bench, options.checkpoint_restore))
161,162c205,215
< ## Adjust max tick based on our starting tick
< maxtick = maxtick - int(cpts[cpt_num - 1])
---
> print "Restoring checkpoint ..."
> m5.restoreCheckpoint(root,checkpoint_dir)
> print "Done."
> else:
> dirs = listdir(cptdir)
> expr = re.compile('cpt\.([0-9]*)')
> cpts = []
> for dir in dirs:
> match = expr.match(dir)
> if match:
> cpts.append(match.group(1))
164,166c217
< ## Restore the checkpoint
< m5.restoreCheckpoint(root,
< joinpath(cptdir, "cpt.%s" % cpts[cpt_num - 1]))
---
> cpts.sort(lambda a,b: cmp(long(a), long(b)))
167a219,230
> cpt_num = options.checkpoint_restore
>
> if cpt_num > len(cpts):
> m5.panic('Checkpoint %d not found' % cpt_num)
>
> ## Adjust max tick based on our starting tick
> maxtick = maxtick - int(cpts[cpt_num - 1])
>
> ## Restore the checkpoint
> m5.restoreCheckpoint(root,
> joinpath(cptdir, "cpt.%s" % cpts[cpt_num - 1]))
>
169c232,243
< exit_event = m5.simulate(10000)
---
> if options.standard_switch:
> print "Switch at instruction count:%s" % \
> str(testsys.cpu[0].max_insts_any_thread)
> exit_event = m5.simulate()
> elif cpu_class and options.fast_forward:
> print "Switch at instruction count:%s" % \
> str(testsys.cpu[0].max_insts_any_thread)
> exit_event = m5.simulate()
> else:
> print "Switch at curTick count:%s" % str(10000)
> exit_event = m5.simulate(10000)
> print "Switched CPUS @ cycle = %s" % (m5.curTick())
171,175c245,249
< ## when you change to Timing (or Atomic), you halt the system given
< ## as argument. When you are finished with the system changes
< ## (including switchCpus), you must resume the system manually.
< ## You DON'T need to resume after just switching CPUs if you haven't
< ## changed anything on the system level.
---
> # when you change to Timing (or Atomic), you halt the system
> # given as argument. When you are finished with the system
> # changes (including switchCpus), you must resume the system
> # manually. You DON'T need to resume after just switching
> # CPUs if you haven't changed anything on the system level.
182,184c256,260
< if (options.warmup):
< exit_event = m5.simulate(options.warmup)
< if options.fast_forward:
---
> print "Switch at instruction count:%d" % \
> (testsys.switch_cpus[0].max_insts_any_thread)
>
> #warmup instruction count may have already been set
> if options.warmup_insts:
185a262,266
> else:
> exit_event = m5.simulate(options.warmup)
> print "Switching CPUS @ cycle = %s" % (m5.curTick())
> print "Simulation ends instruction count:%d" % \
> (testsys.switch_cpus_1[0].max_insts_any_thread)
190,207d270
< # This should *only* be used by itself to take a checkpoint!
< # Otherwise, use standard_switch
< elif options.fast_forward:
< exit_event = m5.simulate()
<
< while exit_event.getCause() != "a thread reached the max instruction count":
< if exit_event.getCause() == "user interrupt received":
< print "User interrupt! Switching to simulation mode"
< break
< else:
< m5.simulate(True)
<
< if exit_event.getCause() == "a thread reached the max instruction count":
< print "Reached fast_forward count %d; starting simulation at cycle %d" % (options.fast_forward, m5.curTick())
<
< m5.checkpoint(root, joinpath(cptdir, "cpt.%d"))
< return
<
211,213c274,277
< ## Checkpoints being taken via the command line at <when> and at subsequent
< ## periods of <period>. Checkpoint instructions received from the benchmark running
< ## are ignored and skipped in favor of command line checkpoint instructions.
---
> # Checkpoints being taken via the command line at <when> and at
> # subsequent periods of <period>. Checkpoint instructions
> # received from the benchmark running are ignored and skipped in
> # favor of command line checkpoint instructions.
215c279
< [when, period] = options.take_checkpoints.split(",", 1)
---
> when, period = options.take_checkpoints.split(",", 1)
219,221c283,284
< exit_event = m5.simulate(when)
< while exit_event.getCause() == "checkpoint":
< exit_event = m5.simulate(when - m5.curTick())
---
> if options.at_instruction or options.simpoint:
> checkpoint_inst = when
223,225c286,288
< if exit_event.getCause() == "simulate() limit reached":
< m5.checkpoint(root, joinpath(cptdir, "cpt.%d"))
< num_checkpoints += 1
---
> # maintain correct offset if we restored from some instruction
> if options.checkpoint_restore:
> checkpoint_inst += options.checkpoint_restore
227,242c290,292
< sim_ticks = when
< exit_cause = "maximum %d checkpoints dropped" % max_checkpoints
< while num_checkpoints < max_checkpoints and \
< exit_event.getCause() == "simulate() limit reached":
< if (sim_ticks + period) > maxtick:
< exit_event = m5.simulate(maxtick - sim_ticks)
< exit_cause = exit_event.getCause()
< break
< else:
< exit_event = m5.simulate(period)
< sim_ticks += period
< 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"))
< num_checkpoints += 1
---
> print "Creating checkpoint at inst:%d" % (checkpoint_inst)
> exit_event = m5.simulate()
> print "exit cause = %s" % (exit_event.getCause())
244,245c294,296
< if exit_event.getCause() != "simulate() limit reached":
< exit_cause = exit_event.getCause();
---
> # skip checkpoint instructions should they exist
> while exit_event.getCause() == "checkpoint":
> exit_event = m5.simulate()
246a298,303
> if exit_event.getCause() == \
> "a thread reached the max instruction count":
> m5.checkpoint(root, joinpath(cptdir, "cpt.%s.%d" % \
> (options.bench, checkpoint_inst)))
> print "Checkpoint written."
> num_checkpoints += 1
248c305,339
< else: #no checkpoints being taken via this script
---
> if exit_event.getCause() == "user interrupt received":
> exit_cause = exit_event.getCause();
> else:
> exit_event = m5.simulate(when)
> while exit_event.getCause() == "checkpoint":
> exit_event = m5.simulate(when - m5.curTick())
>
> if exit_event.getCause() == "simulate() limit reached":
> m5.checkpoint(root, joinpath(cptdir, "cpt.%d"))
> num_checkpoints += 1
>
> sim_ticks = when
> exit_cause = "maximum %d checkpoints dropped" % max_checkpoints
> while num_checkpoints < max_checkpoints and \
> exit_event.getCause() == "simulate() limit reached":
> if (sim_ticks + period) > maxtick:
> exit_event = m5.simulate(maxtick - sim_ticks)
> exit_cause = exit_event.getCause()
> break
> else:
> exit_event = m5.simulate(period)
> sim_ticks += period
> 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"))
> num_checkpoints += 1
>
> if exit_event.getCause() != "simulate() limit reached":
> exit_cause = exit_event.getCause();
>
> else: # no checkpoints being taken via this script
> if options.fast_forward:
> m5.stats.reset()
> print "**** REAL SIMULATION ****"
255c346
< exit_cause = "maximum %d checkpoints dropped" % max_checkpoints
---
> exit_cause = "maximum %d checkpoints dropped" % max_checkpoints