Configs: Make using Simpoints easier with some config files that support them easily
--HG-- extra : convert_revision : 0f21829306eb68b332f03da410e6c341c8595bdd
This commit is contained in:
parent
43ecce5fda
commit
fcfc8b8c4f
4 changed files with 256 additions and 106 deletions
|
@ -29,7 +29,7 @@
|
||||||
# system options
|
# system options
|
||||||
parser.add_option("-d", "--detailed", action="store_true")
|
parser.add_option("-d", "--detailed", action="store_true")
|
||||||
parser.add_option("-t", "--timing", action="store_true")
|
parser.add_option("-t", "--timing", action="store_true")
|
||||||
parser.add_option("-n", "--num_cpus", type="int", default=1)
|
parser.add_option("-n", "--num-cpus", type="int", default=1)
|
||||||
parser.add_option("--caches", action="store_true")
|
parser.add_option("--caches", action="store_true")
|
||||||
parser.add_option("--l2cache", action="store_true")
|
parser.add_option("--l2cache", action="store_true")
|
||||||
parser.add_option("--fastmem", action="store_true")
|
parser.add_option("--fastmem", action="store_true")
|
||||||
|
@ -41,26 +41,38 @@ parser.add_option("--maxtime", type="float")
|
||||||
# Checkpointing options
|
# Checkpointing options
|
||||||
###Note that performing checkpointing via python script files will override
|
###Note that performing checkpointing via python script files will override
|
||||||
###checkpoint instructions built into binaries.
|
###checkpoint instructions built into binaries.
|
||||||
parser.add_option("--take_checkpoints", action="store", type="string",
|
parser.add_option("--take-checkpoints", action="store", type="string",
|
||||||
help="<M,N> will take checkpoint at cycle M and every N cycles \
|
help="<M,N> will take checkpoint at cycle M and every N cycles thereafter")
|
||||||
thereafter")
|
parser.add_option("--max-checkpoints", action="store", type="int",
|
||||||
parser.add_option("--max_checkpoints", action="store", type="int",
|
help="the maximum number of checkpoints to drop", default=5)
|
||||||
help="the maximum number of checkpoints to drop",
|
parser.add_option("--checkpoint-dir", action="store", type="string",
|
||||||
default=5)
|
help="Place all checkpoints in this absolute directory")
|
||||||
parser.add_option("--checkpoint_dir", action="store", type="string",
|
parser.add_option("-r", "--checkpoint-restore", action="store", type="int",
|
||||||
help="Place all checkpoints in this absolute directory")
|
help="restore from checkpoint <N>")
|
||||||
parser.add_option("-r", "--checkpoint_restore", action="store", type="int",
|
|
||||||
help="restore from checkpoint <N>")
|
|
||||||
|
|
||||||
# CPU Switching - default switch model goes from a checkpoint
|
# CPU Switching - default switch model goes from a checkpoint
|
||||||
# to a timing simple CPU with caches to warm up, then to detailed CPU for
|
# to a timing simple CPU with caches to warm up, then to detailed CPU for
|
||||||
# data measurement
|
# data measurement
|
||||||
parser.add_option("-s", "--standard_switch", action="store_true",
|
parser.add_option("-s", "--standard-switch", action="store_true",
|
||||||
help="switch from timing CPU to Detailed CPU")
|
help="switch from timing CPU to Detailed CPU")
|
||||||
parser.add_option("-w", "--warmup", action="store", type="int",
|
parser.add_option("-w", "--warmup", action="store", type="int",
|
||||||
help="if -s, then this is the warmup period. else, this is ignored",
|
help="if -s, then this is the warmup period. else, this is ignored",
|
||||||
default=5000000000)
|
default=5000000000)
|
||||||
parser.add_option("-f", "--fast_forward", type="int", action="store",
|
|
||||||
help="fast_forward count in instructions: use alone to checkpoint or with -s and -max_inst")
|
# Fastforwarding and simpoint related materials
|
||||||
parser.add_option("--max_inst", type="int", action="store",
|
parser.add_option("-W", "--warmup-insts", action="store", type="int",
|
||||||
help="max_insts_any_thread value")
|
default=None,
|
||||||
|
help="Warmup period in total instructions (requires --standard-switch)")
|
||||||
|
parser.add_option("-I", "--max-inst", action="store", type="int", default=None,
|
||||||
|
help="Total number of instructions to simulate (default: run forever)")
|
||||||
|
parser.add_option("--bench", action="store", type="string", default=None,
|
||||||
|
help="base names for --take-checkpoint and --checkpoint-restore")
|
||||||
|
parser.add_option("-F", "--fast-forward", action="store", type="string",
|
||||||
|
default=None,
|
||||||
|
help="Number of instructions to fast forward before switching")
|
||||||
|
parser.add_option("-S", "--simpoint", action="store_true", default=False,
|
||||||
|
help="""Use workload simpoints as an instruction offset for
|
||||||
|
--checkpoint-restore or --take-checkpoint.""")
|
||||||
|
parser.add_option("--at-instruction", action="store_true", default=False,
|
||||||
|
help="""Treate value of --checkpoint-restore or --take-checkpoint as a
|
||||||
|
number of instructions.""")
|
||||||
|
|
|
@ -51,7 +51,7 @@ def setCPUClass(options):
|
||||||
test_mem_mode = 'atomic'
|
test_mem_mode = 'atomic'
|
||||||
|
|
||||||
if not atomic:
|
if not atomic:
|
||||||
if options.checkpoint_restore:
|
if options.checkpoint_restore or options.fast_forward:
|
||||||
CPUClass = TmpClass
|
CPUClass = TmpClass
|
||||||
class TmpClass(AtomicSimpleCPU): pass
|
class TmpClass(AtomicSimpleCPU): pass
|
||||||
else:
|
else:
|
||||||
|
@ -86,6 +86,8 @@ def run(options, root, testsys, cpu_class):
|
||||||
for i in xrange(np)]
|
for i in xrange(np)]
|
||||||
|
|
||||||
for i in xrange(np):
|
for i in xrange(np):
|
||||||
|
if options.fast_forward:
|
||||||
|
testsys.cpu[i].max_insts_any_thread = options.fast_forward
|
||||||
switch_cpus[i].system = testsys
|
switch_cpus[i].system = testsys
|
||||||
if not m5.build_env['FULL_SYSTEM']:
|
if not m5.build_env['FULL_SYSTEM']:
|
||||||
switch_cpus[i].workload = testsys.cpu[i].workload
|
switch_cpus[i].workload = testsys.cpu[i].workload
|
||||||
|
@ -95,9 +97,6 @@ def run(options, root, testsys, cpu_class):
|
||||||
switch_cpu_list = [(testsys.cpu[i], switch_cpus[i]) for i in xrange(np)]
|
switch_cpu_list = [(testsys.cpu[i], switch_cpus[i]) for i in xrange(np)]
|
||||||
|
|
||||||
if options.standard_switch:
|
if options.standard_switch:
|
||||||
if (options.fast_forward and options.warmup):
|
|
||||||
m5.panic("Must specify either warmup OR fast-forward with -s!")
|
|
||||||
|
|
||||||
switch_cpus = [TimingSimpleCPU(defer_registration=True, cpu_id=(np+i))
|
switch_cpus = [TimingSimpleCPU(defer_registration=True, cpu_id=(np+i))
|
||||||
for i in xrange(np)]
|
for i in xrange(np)]
|
||||||
switch_cpus_1 = [DerivO3CPU(defer_registration=True, cpu_id=(2*np+i))
|
switch_cpus_1 = [DerivO3CPU(defer_registration=True, cpu_id=(2*np+i))
|
||||||
|
@ -112,8 +111,27 @@ def run(options, root, testsys, cpu_class):
|
||||||
switch_cpus[i].clock = testsys.cpu[0].clock
|
switch_cpus[i].clock = testsys.cpu[0].clock
|
||||||
switch_cpus_1[i].clock = testsys.cpu[0].clock
|
switch_cpus_1[i].clock = testsys.cpu[0].clock
|
||||||
|
|
||||||
if options.fast_forward:
|
# if restoring, make atomic cpu simulate only a few instructions
|
||||||
switch_cpus[i].max_insts_any_thread = options.fast_forward
|
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
|
||||||
if options.max_inst:
|
if options.max_inst:
|
||||||
switch_cpus_1[i].max_insts_any_thread = options.max_inst
|
switch_cpus_1[i].max_insts_any_thread = options.max_inst
|
||||||
|
|
||||||
|
@ -123,136 +141,209 @@ def run(options, root, testsys, cpu_class):
|
||||||
L1Cache(size = '64kB'))
|
L1Cache(size = '64kB'))
|
||||||
switch_cpus_1[i].connectMemPorts(testsys.membus)
|
switch_cpus_1[i].connectMemPorts(testsys.membus)
|
||||||
|
|
||||||
|
|
||||||
testsys.switch_cpus = switch_cpus
|
testsys.switch_cpus = switch_cpus
|
||||||
testsys.switch_cpus_1 = switch_cpus_1
|
testsys.switch_cpus_1 = switch_cpus_1
|
||||||
switch_cpu_list = [(testsys.cpu[i], switch_cpus[i]) for i in xrange(np)]
|
switch_cpu_list = [(testsys.cpu[i], switch_cpus[i]) for i in xrange(np)]
|
||||||
switch_cpu_list1 = [(switch_cpus[i], switch_cpus_1[i]) for i in xrange(np)]
|
switch_cpu_list1 = [(switch_cpus[i], switch_cpus_1[i]) for i in xrange(np)]
|
||||||
|
|
||||||
elif options.fast_forward:
|
# set the checkpoint in the cpu before m5.instantiate is called
|
||||||
for i in xrange(np):
|
if options.take_checkpoints and \
|
||||||
testsys.cpu[i].max_insts_any_thread = options.fast_forward
|
(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
|
||||||
|
|
||||||
|
testsys.cpu_switch_list = cpu_switch_list
|
||||||
|
|
||||||
m5.instantiate(root)
|
m5.instantiate(root)
|
||||||
|
|
||||||
if options.checkpoint_restore:
|
if options.checkpoint_restore:
|
||||||
from os.path import isdir
|
from os.path import isdir, exists
|
||||||
from os import listdir
|
from os import listdir
|
||||||
import re
|
import re
|
||||||
|
|
||||||
if not isdir(cptdir):
|
if not isdir(cptdir):
|
||||||
m5.panic("checkpoint dir %s does not exist!" % cptdir)
|
m5.panic("checkpoint dir %s does not exist!" % cptdir)
|
||||||
|
|
||||||
dirs = listdir(cptdir)
|
if options.at_instruction:
|
||||||
expr = re.compile('cpt\.([0-9]*)')
|
checkpoint_dir = joinpath(cptdir, "cpt.%s.%s" % \
|
||||||
cpts = []
|
(options.bench, options.checkpoint_restore))
|
||||||
for dir in dirs:
|
if not exists(checkpoint_dir):
|
||||||
match = expr.match(dir)
|
m5.panic("Unable to find checkpoint directory %s" % \
|
||||||
if match:
|
checkpoint_dir)
|
||||||
cpts.append(match.group(1))
|
|
||||||
|
|
||||||
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')
|
||||||
|
|
||||||
cpt_num = options.checkpoint_restore
|
options.checkpoint_restore += \
|
||||||
|
testsys.cpu[0].workload[0].simpoint
|
||||||
|
|
||||||
if cpt_num > len(cpts):
|
checkpoint_dir = joinpath(cptdir, "cpt.%s.%d" % \
|
||||||
m5.panic('Checkpoint %d not found' % cpt_num)
|
(options.bench, options.checkpoint_restore))
|
||||||
|
if not exists(checkpoint_dir):
|
||||||
|
m5.panic("Unable to find checkpoint directory %s.%s" % \
|
||||||
|
(options.bench, options.checkpoint_restore))
|
||||||
|
|
||||||
## Adjust max tick based on our starting tick
|
print "Restoring checkpoint ..."
|
||||||
maxtick = maxtick - int(cpts[cpt_num - 1])
|
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))
|
||||||
|
|
||||||
## Restore the checkpoint
|
cpts.sort(lambda a,b: cmp(long(a), long(b)))
|
||||||
m5.restoreCheckpoint(root,
|
|
||||||
joinpath(cptdir, "cpt.%s" % cpts[cpt_num - 1]))
|
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]))
|
||||||
|
|
||||||
if options.standard_switch or cpu_class:
|
if options.standard_switch or cpu_class:
|
||||||
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())
|
||||||
|
|
||||||
## when you change to Timing (or Atomic), you halt the system given
|
# when you change to Timing (or Atomic), you halt the system
|
||||||
## as argument. When you are finished with the system changes
|
# given as argument. When you are finished with the system
|
||||||
## (including switchCpus), you must resume the system manually.
|
# changes (including switchCpus), you must resume the system
|
||||||
## You DON'T need to resume after just switching CPUs if you haven't
|
# manually. You DON'T need to resume after just switching
|
||||||
## changed anything on the system level.
|
# CPUs if you haven't changed anything on the system level.
|
||||||
|
|
||||||
m5.changeToTiming(testsys)
|
m5.changeToTiming(testsys)
|
||||||
m5.switchCpus(switch_cpu_list)
|
m5.switchCpus(switch_cpu_list)
|
||||||
m5.resume(testsys)
|
m5.resume(testsys)
|
||||||
|
|
||||||
if options.standard_switch:
|
if options.standard_switch:
|
||||||
if (options.warmup):
|
print "Switch at instruction count:%d" % \
|
||||||
exit_event = m5.simulate(options.warmup)
|
(testsys.switch_cpus[0].max_insts_any_thread)
|
||||||
if options.fast_forward:
|
|
||||||
|
#warmup instruction count may have already been set
|
||||||
|
if options.warmup_insts:
|
||||||
exit_event = m5.simulate()
|
exit_event = m5.simulate()
|
||||||
|
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)
|
||||||
m5.drain(testsys)
|
m5.drain(testsys)
|
||||||
m5.switchCpus(switch_cpu_list1)
|
m5.switchCpus(switch_cpu_list1)
|
||||||
m5.resume(testsys)
|
m5.resume(testsys)
|
||||||
|
|
||||||
# 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
|
|
||||||
|
|
||||||
num_checkpoints = 0
|
num_checkpoints = 0
|
||||||
exit_cause = ''
|
exit_cause = ''
|
||||||
|
|
||||||
## Checkpoints being taken via the command line at <when> and at subsequent
|
# Checkpoints being taken via the command line at <when> and at
|
||||||
## periods of <period>. Checkpoint instructions received from the benchmark running
|
# subsequent periods of <period>. Checkpoint instructions
|
||||||
## are ignored and skipped in favor of command line checkpoint instructions.
|
# received from the benchmark running are ignored and skipped in
|
||||||
|
# favor of command line checkpoint instructions.
|
||||||
if options.take_checkpoints:
|
if options.take_checkpoints:
|
||||||
[when, period] = options.take_checkpoints.split(",", 1)
|
when, period = options.take_checkpoints.split(",", 1)
|
||||||
when = int(when)
|
when = int(when)
|
||||||
period = int(period)
|
period = int(period)
|
||||||
|
|
||||||
exit_event = m5.simulate(when)
|
if options.at_instruction or options.simpoint:
|
||||||
while exit_event.getCause() == "checkpoint":
|
checkpoint_inst = when
|
||||||
exit_event = m5.simulate(when - m5.curTick())
|
|
||||||
|
|
||||||
if exit_event.getCause() == "simulate() limit reached":
|
# maintain correct offset if we restored from some instruction
|
||||||
m5.checkpoint(root, joinpath(cptdir, "cpt.%d"))
|
if options.checkpoint_restore:
|
||||||
num_checkpoints += 1
|
checkpoint_inst += options.checkpoint_restore
|
||||||
|
|
||||||
sim_ticks = when
|
print "Creating checkpoint at inst:%d" % (checkpoint_inst)
|
||||||
exit_cause = "maximum %d checkpoints dropped" % max_checkpoints
|
exit_event = m5.simulate()
|
||||||
while num_checkpoints < max_checkpoints and \
|
print "exit cause = %s" % (exit_event.getCause())
|
||||||
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":
|
# skip checkpoint instructions should they exist
|
||||||
exit_cause = exit_event.getCause();
|
while exit_event.getCause() == "checkpoint":
|
||||||
|
exit_event = m5.simulate()
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
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 ****"
|
||||||
exit_event = m5.simulate(maxtick)
|
exit_event = m5.simulate(maxtick)
|
||||||
|
|
||||||
while exit_event.getCause() == "checkpoint":
|
while exit_event.getCause() == "checkpoint":
|
||||||
m5.checkpoint(root, joinpath(cptdir, "cpt.%d"))
|
m5.checkpoint(root, joinpath(cptdir, "cpt.%d"))
|
||||||
num_checkpoints += 1
|
num_checkpoints += 1
|
||||||
if num_checkpoints == max_checkpoints:
|
if num_checkpoints == max_checkpoints:
|
||||||
exit_cause = "maximum %d checkpoints dropped" % max_checkpoints
|
exit_cause = "maximum %d checkpoints dropped" % max_checkpoints
|
||||||
break
|
break
|
||||||
|
|
||||||
exit_event = m5.simulate(maxtick - m5.curTick())
|
exit_event = m5.simulate(maxtick - m5.curTick())
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright (c) 2006-2007 The Regents of The University of Michigan
|
# Copyright (c) 2006-2008 The Regents of The University of Michigan
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -85,6 +85,9 @@ class Benchmark(object):
|
||||||
if not hasattr(self.__class__, 'output'):
|
if not hasattr(self.__class__, 'output'):
|
||||||
self.output = '%s.out' % self.name
|
self.output = '%s.out' % self.name
|
||||||
|
|
||||||
|
if not hasattr(self.__class__, 'simpoint'):
|
||||||
|
self.simpoint = None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
func = getattr(self.__class__, input_set)
|
func = getattr(self.__class__, input_set)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
|
@ -137,7 +140,7 @@ class Benchmark(object):
|
||||||
process_args['input'] = self.stdin
|
process_args['input'] = self.stdin
|
||||||
if self.stdout:
|
if self.stdout:
|
||||||
process_args['output'] = self.stdout
|
process_args['output'] = self.stdout
|
||||||
|
process_args['simpoint'] = self.simpoint
|
||||||
# explicit keywords override defaults
|
# explicit keywords override defaults
|
||||||
process_args.update(kwargs)
|
process_args.update(kwargs)
|
||||||
|
|
||||||
|
@ -149,6 +152,7 @@ class Benchmark(object):
|
||||||
# figure out working directory: use m5's outdir unless
|
# figure out working directory: use m5's outdir unless
|
||||||
# overridden by LiveProcess's cwd param
|
# overridden by LiveProcess's cwd param
|
||||||
cwd = process_args.get('cwd')
|
cwd = process_args.get('cwd')
|
||||||
|
|
||||||
if not cwd:
|
if not cwd:
|
||||||
from m5.main import options
|
from m5.main import options
|
||||||
cwd = options.outdir
|
cwd = options.outdir
|
||||||
|
@ -179,16 +183,19 @@ class ammp(MinneDefaultBenchmark):
|
||||||
name = 'ammp'
|
name = 'ammp'
|
||||||
number = 188
|
number = 188
|
||||||
lang = 'C'
|
lang = 'C'
|
||||||
|
simpoint = 108*100E6
|
||||||
|
|
||||||
class applu(MinneDefaultBenchmark):
|
class applu(MinneDefaultBenchmark):
|
||||||
name = 'applu'
|
name = 'applu'
|
||||||
number = 173
|
number = 173
|
||||||
lang = 'F77'
|
lang = 'F77'
|
||||||
|
simpoint = 2179*100E6
|
||||||
|
|
||||||
class apsi(MinneDefaultBenchmark):
|
class apsi(MinneDefaultBenchmark):
|
||||||
name = 'apsi'
|
name = 'apsi'
|
||||||
number = 301
|
number = 301
|
||||||
lang = 'F77'
|
lang = 'F77'
|
||||||
|
simpoint = 3408*100E6
|
||||||
|
|
||||||
class art(DefaultBenchmark):
|
class art(DefaultBenchmark):
|
||||||
name = 'art'
|
name = 'art'
|
||||||
|
@ -241,6 +248,7 @@ class art110(art):
|
||||||
'-endy', '240',
|
'-endy', '240',
|
||||||
'-objects', '10' ]
|
'-objects', '10' ]
|
||||||
self.output = 'ref.1.out'
|
self.output = 'ref.1.out'
|
||||||
|
self.simpoint = 340*100E6
|
||||||
|
|
||||||
class art470(art):
|
class art470(art):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
@ -254,11 +262,13 @@ class art470(art):
|
||||||
'-endy', '180',
|
'-endy', '180',
|
||||||
'-objects', '10' ]
|
'-objects', '10' ]
|
||||||
self.output = 'ref.2.out'
|
self.output = 'ref.2.out'
|
||||||
|
self.simpoint = 365*100E6
|
||||||
|
|
||||||
class equake(DefaultBenchmark):
|
class equake(DefaultBenchmark):
|
||||||
name = 'equake'
|
name = 'equake'
|
||||||
number = 183
|
number = 183
|
||||||
lang = 'C'
|
lang = 'C'
|
||||||
|
simpoint = 812*100E6
|
||||||
|
|
||||||
def lgred(self, isa, os): pass
|
def lgred(self, isa, os): pass
|
||||||
|
|
||||||
|
@ -266,21 +276,25 @@ class facerec(MinneDefaultBenchmark):
|
||||||
name = 'facerec'
|
name = 'facerec'
|
||||||
number = 187
|
number = 187
|
||||||
lang = 'F'
|
lang = 'F'
|
||||||
|
simpoint = 375*100E6
|
||||||
|
|
||||||
class fma3d(MinneDefaultBenchmark):
|
class fma3d(MinneDefaultBenchmark):
|
||||||
name = 'fma3d'
|
name = 'fma3d'
|
||||||
number = 191
|
number = 191
|
||||||
lang = 'F'
|
lang = 'F'
|
||||||
|
simpoint = 2541*100E6
|
||||||
|
|
||||||
class galgel(MinneDefaultBenchmark):
|
class galgel(MinneDefaultBenchmark):
|
||||||
name = 'galgel'
|
name = 'galgel'
|
||||||
number = 178
|
number = 178
|
||||||
lang = 'F'
|
lang = 'F'
|
||||||
|
simpoint = 2491*100E6
|
||||||
|
|
||||||
class lucas(MinneDefaultBenchmark):
|
class lucas(MinneDefaultBenchmark):
|
||||||
name = 'lucas'
|
name = 'lucas'
|
||||||
number = 189
|
number = 189
|
||||||
lang = 'F'
|
lang = 'F'
|
||||||
|
simpoint = 545*100E6
|
||||||
|
|
||||||
class mesa(Benchmark):
|
class mesa(Benchmark):
|
||||||
name = 'mesa'
|
name = 'mesa'
|
||||||
|
@ -300,6 +314,7 @@ class mesa(Benchmark):
|
||||||
|
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
self.__set_args('1000')
|
self.__set_args('1000')
|
||||||
|
self.simpoint = 1135*100E6
|
||||||
|
|
||||||
def lgred(self, isa, os):
|
def lgred(self, isa, os):
|
||||||
self.__set_args('1')
|
self.__set_args('1')
|
||||||
|
@ -308,11 +323,13 @@ class mgrid(MinneDefaultBenchmark):
|
||||||
name = 'mgrid'
|
name = 'mgrid'
|
||||||
number = 172
|
number = 172
|
||||||
lang = 'F77'
|
lang = 'F77'
|
||||||
|
simpoint = 3292*100E6
|
||||||
|
|
||||||
class sixtrack(DefaultBenchmark):
|
class sixtrack(DefaultBenchmark):
|
||||||
name = 'sixtrack'
|
name = 'sixtrack'
|
||||||
number = 200
|
number = 200
|
||||||
lang = 'F77'
|
lang = 'F77'
|
||||||
|
simpoint = 3043*100E6
|
||||||
|
|
||||||
def lgred(self, isa, os): pass
|
def lgred(self, isa, os): pass
|
||||||
|
|
||||||
|
@ -320,11 +337,13 @@ class swim(MinneDefaultBenchmark):
|
||||||
name = 'swim'
|
name = 'swim'
|
||||||
number = 171
|
number = 171
|
||||||
lang = 'F77'
|
lang = 'F77'
|
||||||
|
simpoint = 2079*100E6
|
||||||
|
|
||||||
class wupwise(DefaultBenchmark):
|
class wupwise(DefaultBenchmark):
|
||||||
name = 'wupwise'
|
name = 'wupwise'
|
||||||
number = 168
|
number = 168
|
||||||
lang = 'F77'
|
lang = 'F77'
|
||||||
|
simpoint = 3237*100E6
|
||||||
|
|
||||||
def lgred(self, isa, os): pass
|
def lgred(self, isa, os): pass
|
||||||
|
|
||||||
|
@ -341,6 +360,7 @@ class bzip2(DefaultBenchmark):
|
||||||
|
|
||||||
class bzip2_source(bzip2):
|
class bzip2_source(bzip2):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 977*100E6
|
||||||
self.args = [ 'input.source', '58' ]
|
self.args = [ 'input.source', '58' ]
|
||||||
|
|
||||||
def lgred(self, isa, os):
|
def lgred(self, isa, os):
|
||||||
|
@ -348,6 +368,7 @@ class bzip2_source(bzip2):
|
||||||
|
|
||||||
class bzip2_graphic(bzip2):
|
class bzip2_graphic(bzip2):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 718*100E6
|
||||||
self.args = [ 'input.graphic', '58' ]
|
self.args = [ 'input.graphic', '58' ]
|
||||||
|
|
||||||
def lgred(self, isa, os):
|
def lgred(self, isa, os):
|
||||||
|
@ -355,6 +376,7 @@ class bzip2_graphic(bzip2):
|
||||||
|
|
||||||
class bzip2_program(bzip2):
|
class bzip2_program(bzip2):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 458*100E6
|
||||||
self.args = [ 'input.program', '58' ]
|
self.args = [ 'input.program', '58' ]
|
||||||
|
|
||||||
def lgred(self, isa, os):
|
def lgred(self, isa, os):
|
||||||
|
@ -364,6 +386,7 @@ class crafty(MinneDefaultBenchmark):
|
||||||
name = 'crafty'
|
name = 'crafty'
|
||||||
number = 186
|
number = 186
|
||||||
lang = 'C'
|
lang = 'C'
|
||||||
|
simpoint = 774*100E6
|
||||||
|
|
||||||
class eon(MinneDefaultBenchmark):
|
class eon(MinneDefaultBenchmark):
|
||||||
name = 'eon'
|
name = 'eon'
|
||||||
|
@ -386,6 +409,7 @@ class eon_rushmeier(eon):
|
||||||
args = [ 'chair.control.rushmeier', 'chair.camera', 'chair.surfaces',
|
args = [ 'chair.control.rushmeier', 'chair.camera', 'chair.surfaces',
|
||||||
'chair.rushmeier.ppm', 'ppm', 'pixels_out.rushmeier' ]
|
'chair.rushmeier.ppm', 'ppm', 'pixels_out.rushmeier' ]
|
||||||
output = 'rushmeier_log.out'
|
output = 'rushmeier_log.out'
|
||||||
|
simpoint = 403*100E6
|
||||||
|
|
||||||
class gap(DefaultBenchmark):
|
class gap(DefaultBenchmark):
|
||||||
name = 'gap'
|
name = 'gap'
|
||||||
|
@ -403,6 +427,7 @@ class gap(DefaultBenchmark):
|
||||||
|
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
self.__set_args('192M')
|
self.__set_args('192M')
|
||||||
|
self.simpoint = 674*100E6
|
||||||
|
|
||||||
def lgred(self, isa, os):
|
def lgred(self, isa, os):
|
||||||
self.__set_args('64M')
|
self.__set_args('64M')
|
||||||
|
@ -435,22 +460,27 @@ class gcc(DefaultBenchmark):
|
||||||
|
|
||||||
class gcc_166(gcc):
|
class gcc_166(gcc):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 389*100E6
|
||||||
self.args = [ '166.i', '-o', '166.s' ]
|
self.args = [ '166.i', '-o', '166.s' ]
|
||||||
|
|
||||||
class gcc_200(gcc):
|
class gcc_200(gcc):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 736*100E6
|
||||||
self.args = [ '200.i', '-o', '200.s' ]
|
self.args = [ '200.i', '-o', '200.s' ]
|
||||||
|
|
||||||
class gcc_expr(gcc):
|
class gcc_expr(gcc):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 36*100E6
|
||||||
self.args = [ 'expr.i', '-o', 'expr.s' ]
|
self.args = [ 'expr.i', '-o', 'expr.s' ]
|
||||||
|
|
||||||
class gcc_integrate(gcc):
|
class gcc_integrate(gcc):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 4*100E6
|
||||||
self.args = [ 'integrate.i', '-o', 'integrate.s' ]
|
self.args = [ 'integrate.i', '-o', 'integrate.s' ]
|
||||||
|
|
||||||
class gcc_scilab(gcc):
|
class gcc_scilab(gcc):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 207*100E6
|
||||||
self.args = [ 'scilab.i', '-o', 'scilab.s' ]
|
self.args = [ 'scilab.i', '-o', 'scilab.s' ]
|
||||||
|
|
||||||
class gzip(DefaultBenchmark):
|
class gzip(DefaultBenchmark):
|
||||||
|
@ -466,6 +496,7 @@ class gzip(DefaultBenchmark):
|
||||||
|
|
||||||
class gzip_source(gzip):
|
class gzip_source(gzip):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 334*100E6
|
||||||
self.args = [ 'input.source', '1' ]
|
self.args = [ 'input.source', '1' ]
|
||||||
def smred(self, isa, os):
|
def smred(self, isa, os):
|
||||||
self.args = [ 'input.source', '1' ]
|
self.args = [ 'input.source', '1' ]
|
||||||
|
@ -476,6 +507,7 @@ class gzip_source(gzip):
|
||||||
|
|
||||||
class gzip_log(gzip):
|
class gzip_log(gzip):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 265*100E6
|
||||||
self.args = [ 'input.log', '60' ]
|
self.args = [ 'input.log', '60' ]
|
||||||
def smred(self, isa, os):
|
def smred(self, isa, os):
|
||||||
self.args = [ 'input.log', '1' ]
|
self.args = [ 'input.log', '1' ]
|
||||||
|
@ -486,6 +518,7 @@ class gzip_log(gzip):
|
||||||
|
|
||||||
class gzip_graphic(gzip):
|
class gzip_graphic(gzip):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 653*100E6
|
||||||
self.args = [ 'input.graphic', '60' ]
|
self.args = [ 'input.graphic', '60' ]
|
||||||
def smred(self, isa, os):
|
def smred(self, isa, os):
|
||||||
self.args = [ 'input.graphic', '1' ]
|
self.args = [ 'input.graphic', '1' ]
|
||||||
|
@ -496,6 +529,7 @@ class gzip_graphic(gzip):
|
||||||
|
|
||||||
class gzip_random(gzip):
|
class gzip_random(gzip):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 623*100E6
|
||||||
self.args = [ 'input.random', '60' ]
|
self.args = [ 'input.random', '60' ]
|
||||||
def smred(self, isa, os):
|
def smred(self, isa, os):
|
||||||
self.args = [ 'input.random', '1' ]
|
self.args = [ 'input.random', '1' ]
|
||||||
|
@ -506,6 +540,7 @@ class gzip_random(gzip):
|
||||||
|
|
||||||
class gzip_program(gzip):
|
class gzip_program(gzip):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 1189*100E6
|
||||||
self.args = [ 'input.program', '60' ]
|
self.args = [ 'input.program', '60' ]
|
||||||
def smred(self, isa, os):
|
def smred(self, isa, os):
|
||||||
self.args = [ 'input.program', '1' ]
|
self.args = [ 'input.program', '1' ]
|
||||||
|
@ -519,12 +554,14 @@ class mcf(MinneDefaultBenchmark):
|
||||||
number = 181
|
number = 181
|
||||||
lang = 'C'
|
lang = 'C'
|
||||||
args = [ 'mcf.in' ]
|
args = [ 'mcf.in' ]
|
||||||
|
simpoint = 553*100E6
|
||||||
|
|
||||||
class parser(MinneDefaultBenchmark):
|
class parser(MinneDefaultBenchmark):
|
||||||
name = 'parser'
|
name = 'parser'
|
||||||
number = 197
|
number = 197
|
||||||
lang = 'C'
|
lang = 'C'
|
||||||
args = [ '2.1.dict', '-batch' ]
|
args = [ '2.1.dict', '-batch' ]
|
||||||
|
simpoint = 1146*100E6
|
||||||
|
|
||||||
class perlbmk(DefaultBenchmark):
|
class perlbmk(DefaultBenchmark):
|
||||||
name = 'perlbmk'
|
name = 'perlbmk'
|
||||||
|
@ -537,6 +574,7 @@ class perlbmk(DefaultBenchmark):
|
||||||
|
|
||||||
class perlbmk_diffmail(perlbmk):
|
class perlbmk_diffmail(perlbmk):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 141*100E6
|
||||||
self.args = [ '-I', 'lib', 'diffmail.pl', '2', '550', '15', '24',
|
self.args = [ '-I', 'lib', 'diffmail.pl', '2', '550', '15', '24',
|
||||||
'23', '100' ]
|
'23', '100' ]
|
||||||
|
|
||||||
|
@ -551,6 +589,7 @@ class perlbmk_scrabbl(perlbmk):
|
||||||
|
|
||||||
class perlbmk_makerand(perlbmk):
|
class perlbmk_makerand(perlbmk):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 11*100E6
|
||||||
self.args = [ '-I', 'lib', 'makerand.pl' ]
|
self.args = [ '-I', 'lib', 'makerand.pl' ]
|
||||||
|
|
||||||
def lgred(self, isa, os):
|
def lgred(self, isa, os):
|
||||||
|
@ -564,6 +603,7 @@ class perlbmk_makerand(perlbmk):
|
||||||
|
|
||||||
class perlbmk_perfect(perlbmk):
|
class perlbmk_perfect(perlbmk):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 5*100E6
|
||||||
self.args = [ '-I', 'lib', 'perfect.pl', 'b', '3', 'm', '4' ]
|
self.args = [ '-I', 'lib', 'perfect.pl', 'b', '3', 'm', '4' ]
|
||||||
|
|
||||||
def train(self, isa, os):
|
def train(self, isa, os):
|
||||||
|
@ -571,6 +611,7 @@ class perlbmk_perfect(perlbmk):
|
||||||
|
|
||||||
class perlbmk_splitmail1(perlbmk):
|
class perlbmk_splitmail1(perlbmk):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 405*100E6
|
||||||
self.args = [ '-I', 'lib', 'splitmail.pl', '850', '5', '19',
|
self.args = [ '-I', 'lib', 'splitmail.pl', '850', '5', '19',
|
||||||
'18', '1500' ]
|
'18', '1500' ]
|
||||||
|
|
||||||
|
@ -602,6 +643,7 @@ class twolf(Benchmark):
|
||||||
self.args = [ 'train' ]
|
self.args = [ 'train' ]
|
||||||
|
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 1066*100E6
|
||||||
self.args = [ 'ref' ]
|
self.args = [ 'ref' ]
|
||||||
|
|
||||||
def smred(self, isa, os):
|
def smred(self, isa, os):
|
||||||
|
@ -653,15 +695,18 @@ class vortex1(vortex):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
self.args = [ '%s1.raw' % self.endian ]
|
self.args = [ '%s1.raw' % self.endian ]
|
||||||
self.output = 'vortex1.out'
|
self.output = 'vortex1.out'
|
||||||
|
self.simpoint = 271*100E6
|
||||||
|
|
||||||
|
|
||||||
class vortex2(vortex):
|
class vortex2(vortex):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 1024*100E6
|
||||||
self.args = [ '%s2.raw' % self.endian ]
|
self.args = [ '%s2.raw' % self.endian ]
|
||||||
self.output = 'vortex2.out'
|
self.output = 'vortex2.out'
|
||||||
|
|
||||||
class vortex3(vortex):
|
class vortex3(vortex):
|
||||||
def ref(self, isa, os):
|
def ref(self, isa, os):
|
||||||
|
self.simpoint = 564*100E6
|
||||||
self.args = [ '%s3.raw' % self.endian ]
|
self.args = [ '%s3.raw' % self.endian ]
|
||||||
self.output = 'vortex3.out'
|
self.output = 'vortex3.out'
|
||||||
|
|
||||||
|
@ -678,6 +723,7 @@ class vpr_place(vpr):
|
||||||
output = 'place_log.out'
|
output = 'place_log.out'
|
||||||
|
|
||||||
class vpr_route(vpr):
|
class vpr_route(vpr):
|
||||||
|
simpoint = 476*100E6
|
||||||
args = [ 'net.in', 'arch.in', 'place.in', 'route.out', '-nodisp',
|
args = [ 'net.in', 'arch.in', 'place.in', 'route.out', '-nodisp',
|
||||||
'-route_only', '-route_chan_width', '15',
|
'-route_only', '-route_chan_width', '15',
|
||||||
'-pres_fac_mult', '2', '-acc_fac', '1',
|
'-pres_fac_mult', '2', '-acc_fac', '1',
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright (c) 2005-2007 The Regents of The University of Michigan
|
# Copyright (c) 2005-2008 The Regents of The University of Michigan
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -50,3 +50,4 @@ class LiveProcess(Process):
|
||||||
egid = Param.Int(100, 'effective group id')
|
egid = Param.Int(100, 'effective group id')
|
||||||
pid = Param.Int(100, 'process id')
|
pid = Param.Int(100, 'process id')
|
||||||
ppid = Param.Int(99, 'parent process id')
|
ppid = Param.Int(99, 'parent process id')
|
||||||
|
simpoint = Param.UInt64(0, 'simulation point at which to start simulation')
|
||||||
|
|
Loading…
Reference in a new issue