36a37
> import Simulation
51,60d51
< # system options
< parser.add_option("-d", "--detailed", action="store_true")
< parser.add_option("-t", "--timing", action="store_true")
< parser.add_option("-n", "--num_cpus", type="int", default=1)
< parser.add_option("--caches", action="store_true")
<
< # Run duration options
< parser.add_option("-m", "--maxtick", type="int")
< parser.add_option("--maxtime", type="float")
<
66,78d56
< # Checkpointing options
< ###Note that performing checkpointing via python script files will override
< ###checkpoint instructions built into binaries.
< parser.add_option("--take_checkpoints", action="store", type="string",
< help="<M,N> will take checkpoint at cycle M and every N cycles \
< thereafter")
< parser.add_option("--max_checkpoints", action="store", type="int",
< help="the maximum number of checkpoints to drop",
< default=5)
< parser.add_option("--checkpoint_dir", action="store", type="string",
< help="Place all checkpoints in this absolute directory")
< parser.add_option("-r", "--checkpoint_restore", action="store", type="int",
< help="restore from checkpoint <N>")
80,84c58
< # CPU Switching - default switch model goes from a checkpoint
< # to a timing simple CPU with caches to warm up, then to detailed CPU for
< # data measurement
< parser.add_option("-s", "--standard_switch", action="store_true",
< help="switch from one cpu mode to another")
---
> execfile("Options.py")
92,99d65
< class MyCache(BaseCache):
< assoc = 2
< block_size = 64
< latency = 1
< mshrs = 10
< tgts_per_mshr = 5
< protocol = CoherenceProtocol(protocol='moesi')
<
137,138c103,104
< test_sys.cpu[i].addPrivateSplitL1Caches(MyCache(size = '32kB'),
< MyCache(size = '64kB'))
---
> test_sys.cpu[i].addPrivateSplitL1Caches(L1Cache(size = '32kB'),
> L2Cache(size = '64kB'))
139a106
> test_sys.cpu[i].mem = test_sys.physmem
144a112
> drive_sys.cpu.mem = drive_sys.physmem
152,275c120
< if options.standard_switch:
< switch_cpus = [TimingSimpleCPU(defer_registration=True, cpu_id=(np+i)) for i in xrange(np)]
< switch_cpus1 = [DerivO3CPU(defer_registration=True, cpu_id=(2*np+i)) for i in xrange(np)]
< for i in xrange(np):
< switch_cpus[i].system = test_sys
< switch_cpus1[i].system = test_sys
< switch_cpus[i].clock = TestCPUClass.clock
< switch_cpus1[i].clock = TestCPUClass.clock
< if options.caches:
< switch_cpus[i].addPrivateSplitL1Caches(MyCache(size = '32kB'),
< MyCache(size = '64kB'))
<
< switch_cpus[i].connectMemPorts(test_sys.membus)
< root.switch_cpus = switch_cpus
< root.switch_cpus1 = switch_cpus1
< switch_cpu_list = [(test_sys.cpu[i], switch_cpus[i]) for i in xrange(np)]
< switch_cpu_list1 = [(switch_cpus[i], switch_cpus1[i]) for i in xrange(np)]
<
< m5.instantiate(root)
<
< if options.checkpoint_dir:
< cptdir = options.checkpoint_dir
< else:
< cptdir = os.getcwd()
<
< if options.checkpoint_restore:
< from os.path import isdir
< from os import listdir, getcwd
< import re
<
< if not isdir(cptdir):
< m5.panic("checkpoint dir %s does not exist!" % cptdir)
<
< 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))
<
< cpts.sort(lambda a,b: cmp(long(a), long(b)))
<
< if options.checkpoint_restore > len(cpts):
< m5.panic('Checkpoint %d not found' % options.checkpoint_restore)
<
< m5.restoreCheckpoint(root, "/".join([cptdir, "cpt.%s" % cpts[options.checkpoint_restore - 1]]))
<
< if options.standard_switch:
< exit_event = m5.simulate(1000)
< ## 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.
< m5.changeToTiming(test_sys)
< m5.switchCpus(switch_cpu_list)
< m5.resume(test_sys)
<
< exit_event = m5.simulate(500000000000)
< m5.switchCpus(switch_cpu_list1)
<
< if options.maxtick:
< maxtick = options.maxtick
< elif options.maxtime:
< simtime = int(options.maxtime * root.clock.value)
< print "simulating for: ", simtime
< maxtick = simtime
< else:
< maxtick = -1
<
< num_checkpoints = 0
<
< exit_cause = ''
<
< if options.take_checkpoints:
< [when, period] = options.take_checkpoints.split(",", 1)
< when = int(when)
< period = int(period)
<
< 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, cptdir + "cpt.%d")
< num_checkpoints += 1
<
< sim_ticks = when
< exit_cause = "maximum %d checkpoints dropped" % options.max_checkpoints
< while num_checkpoints < options.max_checkpoints:
< if (sim_ticks + period) > maxtick and maxtick != -1:
< 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(period - m5.curTick())
< if exit_event.getCause() == "simulate() limit reached":
< m5.checkpoint(root, cptdir + "cpt.%d")
< num_checkpoints += 1
<
< else: #no checkpoints being taken via this script
< exit_event = m5.simulate(maxtick)
<
< while exit_event.getCause() == "checkpoint":
< m5.checkpoint(root, cptdir + "cpt.%d")
< num_checkpoints += 1
< if num_checkpoints == options.max_checkpoints:
< exit_cause = "maximum %d checkpoints dropped" % options.max_checkpoints
< break
<
< if maxtick == -1:
< exit_event = m5.simulate(maxtick)
< else:
< exit_event = m5.simulate(maxtick - m5.curTick())
<
< exit_cause = exit_event.getCause()
<
< if exit_cause == '':
< exit_cause = exit_event.getCause()
< print 'Exiting @ cycle', m5.curTick(), 'because ', exit_cause
---
> Simulation.run(options, root, test_sys)