36a37
> import Simulation
42c43
< default="../tests/test-progs/hello/bin/alpha/linux/hello",
---
> default="../../tests/test-progs/hello/bin/alpha/linux/hello",
50,53c51
< # System options
< parser.add_option("-d", "--detailed", action="store_true")
< parser.add_option("-t", "--timing", action="store_true")
< parser.add_option("--caches", action="store_true")
---
> execfile("Options.py")
55,78d52
< # Run duration options
< parser.add_option("-m", "--maxtick", type="int")
< parser.add_option("--maxtime", type="float")
<
< #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>")
<
< #CPU Switching - default switch model generally 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")
<
85,91d58
< class MyCache(BaseCache):
< assoc = 2
< block_size = 64
< latency = 1
< mshrs = 10
< tgts_per_mshr = 5
<
120c87,88
< cpu = TimingSimpleCPU()
---
> CPUClass = TimingSimpleCPU
> test_mem_mode = 'timing'
122c90,91
< cpu = DerivO3CPU()
---
> CPUClass = DerivO3CPU
> test_mem_mode = 'timing'
124c93,94
< cpu = AtomicSimpleCPU()
---
> CPUClass = AtomicSimpleCPU
> test_mem_mode = 'atomic'
126,127c96
< cpu.workload = process
< cpu.cpu_id = 0
---
> CPUClass.clock = '2GHz'
129c98,100
< system = System(cpu = cpu,
---
> np = options.num_cpus
>
> system = System(cpu = [CPUClass(cpu_id=i) for i in xrange(np)],
131c102,103
< membus = Bus())
---
> membus = Bus(), mem_mode = test_mem_mode)
>
133,137d104
< system.cpu.connectMemPorts(system.membus)
< system.cpu.clock = '2GHz'
< if options.caches and not options.standard_switch:
< system.cpu.addPrivateSplitL1Caches(MyCache(size = '32kB'),
< MyCache(size = '64kB'))
138a106,113
> for i in xrange(np):
> if options.caches and not options.standard_switch:
> system.cpu[i].addPrivateSplitL1Caches(L1Cache(size = '32kB'),
> L2Cache(size = '64kB'))
> system.cpu[i].connectMemPorts(system.membus)
> system.cpu[i].mem = system.physmem
> system.cpu[i].workload = process
>
141,272c116
< if options.timing or options.detailed:
< root.system.mem_mode = 'timing'
<
< if options.standard_switch:
< switch_cpu = TimingSimpleCPU(defer_registration=True, cpu_id=1)
< switch_cpu1 = DerivO3CPU(defer_registration=True, cpu_id=2)
< switch_cpu.system = system
< switch_cpu1.system = system
< switch_cpu.clock = cpu.clock
< switch_cpu1.clock = cpu.clock
< if options.caches:
< switch_cpu.addPrivateSplitL1Caches(MyCache(size = '32kB'),
< MyCache(size = '64kB'))
<
< switch_cpu.workload = process
< switch_cpu1.workload = process
< switch_cpu.connectMemPorts(system.membus)
< root.switch_cpu = switch_cpu
< root.switch_cpu1 = switch_cpu1
< switch_cpu_list = [(system.cpu, switch_cpu)]
< switch_cpu_list1 = [(switch_cpu, switch_cpu1)]
<
< # instantiate configuration
< m5.instantiate(root)
<
< if options.checkpoint_dir:
< cptdir = options.checkpoint_dir
< else:
< cptdir = 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)
<
< print "restoring checkpoint from ","/".join([cptdir, "cpt.%s" % cpts[options.checkpoint_restore - 1]])
< m5.restoreCheckpoint(root, "/".join([cptdir, "cpt.%s" % cpts[options.checkpoint_restore - 1]]))
<
< if options.standard_switch:
< exit_event = m5.simulate(10000)
< ## 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(system)
< m5.switchCpus(switch_cpu_list)
< m5.resume(system)
<
< 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, system)