Configs: Make using Simpoints easier with some config files that support them easily
authorRick Strong <rstrong@cs.ucsd.edu>
Wed, 27 Feb 2008 05:35:09 +0000 (00:35 -0500)
committerRick Strong <rstrong@cs.ucsd.edu>
Wed, 27 Feb 2008 05:35:09 +0000 (00:35 -0500)
--HG--
extra : convert_revision : 0f21829306eb68b332f03da410e6c341c8595bdd

configs/common/Options.py
configs/common/Simulation.py
configs/common/cpu2000.py
src/sim/Process.py

index 3cd3342b86bf5e928b6163624fe1e12b7f7b0a3c..34833e799dac3946bc1bef2235dc8f93feac8e70 100644 (file)
@@ -29,7 +29,7 @@
 # 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("-n", "--num-cpus", type="int", default=1)
 parser.add_option("--caches", action="store_true")
 parser.add_option("--l2cache", action="store_true")
 parser.add_option("--fastmem", action="store_true")
@@ -41,26 +41,38 @@ 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>")
+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 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 timing CPU to Detailed CPU")
+parser.add_option("-s", "--standard-switch", action="store_true",
+    help="switch from timing CPU to Detailed CPU")
 parser.add_option("-w", "--warmup", action="store", type="int",
-                  help="if -s, then this is the warmup period.  else, this is ignored",
-                  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")
-parser.add_option("--max_inst", type="int", action="store",
-                  help="max_insts_any_thread value")
+    help="if -s, then this is the warmup period.  else, this is ignored",
+    default=5000000000)
+
+# Fastforwarding and simpoint related materials
+parser.add_option("-W", "--warmup-insts", action="store", type="int",
+    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.""")
index f6b289fb5a26cc7e4198b78fc732972fa19f2d8f..9f3bf0cd9d33da5d092d6c17b8f9254cbbaad28c 100644 (file)
@@ -51,7 +51,7 @@ def setCPUClass(options):
     test_mem_mode = 'atomic'
 
     if not atomic:
-        if options.checkpoint_restore:
+        if options.checkpoint_restore or options.fast_forward:
             CPUClass = TmpClass
             class TmpClass(AtomicSimpleCPU): pass
         else:
@@ -86,6 +86,8 @@ def run(options, root, testsys, cpu_class):
                        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
             if not m5.build_env['FULL_SYSTEM']:
                 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)]
 
     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))
                        for i in xrange(np)]
         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_1[i].clock = testsys.cpu[0].clock
 
-            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
             if 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'))
                 switch_cpus_1[i].connectMemPorts(testsys.membus)
 
-
             testsys.switch_cpus = switch_cpus
             testsys.switch_cpus_1 = switch_cpus_1
             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)]
 
-    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
+
+        testsys.cpu_switch_list = cpu_switch_list
 
     m5.instantiate(root)
 
     if options.checkpoint_restore:
-        from os.path import isdir
+        from os.path import isdir, exists
         from os import listdir
         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))
+        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)
+
+            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')
+
+            options.checkpoint_restore += \
+                testsys.cpu[0].workload[0].simpoint
+
+            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))
+
+            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))
 
-        cpts.sort(lambda a,b: cmp(long(a), long(b)))
+            cpts.sort(lambda a,b: cmp(long(a), long(b)))
 
-        cpt_num = options.checkpoint_restore
+            cpt_num = options.checkpoint_restore
 
-        if cpt_num > len(cpts):
-            m5.panic('Checkpoint %d not found' % cpt_num)
+            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])
+            ## 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]))
+            ## Restore the checkpoint
+            m5.restoreCheckpoint(root,
+                    joinpath(cptdir, "cpt.%s" % cpts[cpt_num - 1]))
 
     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
-        ## 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.
 
         m5.changeToTiming(testsys)
         m5.switchCpus(switch_cpu_list)
         m5.resume(testsys)
 
         if options.standard_switch:
-            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:
                 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.switchCpus(switch_cpu_list1)
             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
     exit_cause = ''
 
-    ## 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.
     if options.take_checkpoints:
-        [when, period] = options.take_checkpoints.split(",", 1)
+        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 options.at_instruction or options.simpoint:
+            checkpoint_inst = when
 
-        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
 
-        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())
 
-        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()
 
+            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)
 
         while exit_event.getCause() == "checkpoint":
             m5.checkpoint(root, joinpath(cptdir, "cpt.%d"))
             num_checkpoints += 1
             if num_checkpoints == max_checkpoints:
-                exit_cause =  "maximum %d checkpoints dropped" % max_checkpoints
+                exit_cause = "maximum %d checkpoints dropped" % max_checkpoints
                 break
 
             exit_event = m5.simulate(maxtick - m5.curTick())
index 2f5844dc660a6874bc91e84f9ef951efdce68924..7fe15b5771a83073d91950996116339c130617e1 100644 (file)
@@ -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.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -85,6 +85,9 @@ class Benchmark(object):
         if not hasattr(self.__class__, 'output'):
             self.output = '%s.out' % self.name
 
+        if not hasattr(self.__class__, 'simpoint'):
+            self.simpoint = None
+
         try:
             func = getattr(self.__class__, input_set)
         except AttributeError:
@@ -137,7 +140,7 @@ class Benchmark(object):
             process_args['input'] = self.stdin
         if self.stdout:
             process_args['output'] = self.stdout
-
+        process_args['simpoint'] = self.simpoint
         # explicit keywords override defaults
         process_args.update(kwargs)
 
@@ -149,6 +152,7 @@ class Benchmark(object):
         # figure out working directory: use m5's outdir unless
         # overridden by LiveProcess's cwd param
         cwd = process_args.get('cwd')
+
         if not cwd:
             from m5.main import options
             cwd = options.outdir
@@ -179,16 +183,19 @@ class ammp(MinneDefaultBenchmark):
     name = 'ammp'
     number = 188
     lang = 'C'
+    simpoint = 108*100E6
 
 class applu(MinneDefaultBenchmark):
     name = 'applu'
     number = 173
     lang = 'F77'
+    simpoint = 2179*100E6
 
 class apsi(MinneDefaultBenchmark):
     name = 'apsi'
     number = 301
     lang = 'F77'
+    simpoint = 3408*100E6
 
 class art(DefaultBenchmark):
     name = 'art'
@@ -241,6 +248,7 @@ class art110(art):
                       '-endy', '240',
                       '-objects', '10' ]
         self.output = 'ref.1.out'
+        self.simpoint = 340*100E6
 
 class art470(art):
     def ref(self, isa, os):
@@ -254,11 +262,13 @@ class art470(art):
                       '-endy', '180',
                       '-objects', '10' ]
         self.output = 'ref.2.out'
+        self.simpoint = 365*100E6
 
 class equake(DefaultBenchmark):
     name = 'equake'
     number = 183
     lang = 'C'
+    simpoint = 812*100E6
 
     def lgred(self, isa, os): pass
 
@@ -266,21 +276,25 @@ class facerec(MinneDefaultBenchmark):
     name = 'facerec'
     number = 187
     lang = 'F'
+    simpoint = 375*100E6
 
 class fma3d(MinneDefaultBenchmark):
     name = 'fma3d'
     number = 191
     lang = 'F'
+    simpoint = 2541*100E6
 
 class galgel(MinneDefaultBenchmark):
     name = 'galgel'
     number = 178
     lang = 'F'
+    simpoint = 2491*100E6
 
 class lucas(MinneDefaultBenchmark):
     name = 'lucas'
     number = 189
     lang = 'F'
+    simpoint = 545*100E6
 
 class mesa(Benchmark):
     name = 'mesa'
@@ -300,6 +314,7 @@ class mesa(Benchmark):
 
     def ref(self, isa, os):
         self.__set_args('1000')
+        self.simpoint = 1135*100E6
 
     def lgred(self, isa, os):
         self.__set_args('1')
@@ -308,11 +323,13 @@ class mgrid(MinneDefaultBenchmark):
     name = 'mgrid'
     number = 172
     lang = 'F77'
+    simpoint = 3292*100E6
 
 class sixtrack(DefaultBenchmark):
     name = 'sixtrack'
     number = 200
     lang = 'F77'
+    simpoint = 3043*100E6
 
     def lgred(self, isa, os): pass
 
@@ -320,11 +337,13 @@ class swim(MinneDefaultBenchmark):
     name = 'swim'
     number = 171
     lang = 'F77'
+    simpoint = 2079*100E6
 
 class wupwise(DefaultBenchmark):
     name = 'wupwise'
     number = 168
     lang = 'F77'
+    simpoint = 3237*100E6
 
     def lgred(self, isa, os): pass
 
@@ -341,6 +360,7 @@ class bzip2(DefaultBenchmark):
 
 class bzip2_source(bzip2):
     def ref(self, isa, os):
+        self.simpoint = 977*100E6
         self.args = [ 'input.source', '58' ]
 
     def lgred(self, isa, os):
@@ -348,6 +368,7 @@ class bzip2_source(bzip2):
 
 class bzip2_graphic(bzip2):
     def ref(self, isa, os):
+        self.simpoint = 718*100E6
         self.args = [ 'input.graphic', '58' ]
 
     def lgred(self, isa, os):
@@ -355,6 +376,7 @@ class bzip2_graphic(bzip2):
 
 class bzip2_program(bzip2):
     def ref(self, isa, os):
+        self.simpoint = 458*100E6
         self.args = [ 'input.program', '58' ]
 
     def lgred(self, isa, os):
@@ -364,6 +386,7 @@ class crafty(MinneDefaultBenchmark):
     name = 'crafty'
     number = 186
     lang = 'C'
+    simpoint = 774*100E6
 
 class eon(MinneDefaultBenchmark):
     name = 'eon'
@@ -386,6 +409,7 @@ class eon_rushmeier(eon):
     args = [ 'chair.control.rushmeier', 'chair.camera', 'chair.surfaces',
              'chair.rushmeier.ppm', 'ppm', 'pixels_out.rushmeier' ]
     output = 'rushmeier_log.out'
+    simpoint = 403*100E6
 
 class gap(DefaultBenchmark):
     name = 'gap'
@@ -403,6 +427,7 @@ class gap(DefaultBenchmark):
 
     def ref(self, isa, os):
         self.__set_args('192M')
+        self.simpoint = 674*100E6
 
     def lgred(self, isa, os):
         self.__set_args('64M')
@@ -435,22 +460,27 @@ class gcc(DefaultBenchmark):
 
 class gcc_166(gcc):
     def ref(self, isa, os):
+        self.simpoint = 389*100E6
         self.args = [ '166.i', '-o', '166.s' ]
 
 class gcc_200(gcc):
     def ref(self, isa, os):
+        self.simpoint = 736*100E6
         self.args = [ '200.i', '-o', '200.s' ]
 
 class gcc_expr(gcc):
     def ref(self, isa, os):
+        self.simpoint = 36*100E6
         self.args = [ 'expr.i', '-o', 'expr.s' ]
 
 class gcc_integrate(gcc):
     def ref(self, isa, os):
+        self.simpoint = 4*100E6
         self.args = [ 'integrate.i', '-o', 'integrate.s' ]
 
 class gcc_scilab(gcc):
     def ref(self, isa, os):
+        self.simpoint = 207*100E6
         self.args = [ 'scilab.i', '-o', 'scilab.s' ]
 
 class gzip(DefaultBenchmark):
@@ -466,6 +496,7 @@ class gzip(DefaultBenchmark):
 
 class gzip_source(gzip):
     def ref(self, isa, os):
+        self.simpoint = 334*100E6
         self.args = [ 'input.source', '1' ]
     def smred(self, isa, os):
         self.args = [ 'input.source', '1' ]
@@ -476,6 +507,7 @@ class gzip_source(gzip):
 
 class gzip_log(gzip):
     def ref(self, isa, os):
+        self.simpoint = 265*100E6
         self.args = [ 'input.log', '60' ]
     def smred(self, isa, os):
         self.args = [ 'input.log', '1' ]
@@ -486,6 +518,7 @@ class gzip_log(gzip):
 
 class gzip_graphic(gzip):
     def ref(self, isa, os):
+        self.simpoint = 653*100E6
         self.args = [ 'input.graphic', '60' ]
     def smred(self, isa, os):
         self.args = [ 'input.graphic', '1' ]
@@ -496,6 +529,7 @@ class gzip_graphic(gzip):
 
 class gzip_random(gzip):
     def ref(self, isa, os):
+        self.simpoint = 623*100E6
         self.args = [ 'input.random', '60' ]
     def smred(self, isa, os):
         self.args = [ 'input.random', '1' ]
@@ -506,6 +540,7 @@ class gzip_random(gzip):
 
 class gzip_program(gzip):
     def ref(self, isa, os):
+        self.simpoint = 1189*100E6
         self.args = [ 'input.program', '60' ]
     def smred(self, isa, os):
         self.args = [ 'input.program', '1' ]
@@ -519,12 +554,14 @@ class mcf(MinneDefaultBenchmark):
     number = 181
     lang = 'C'
     args = [ 'mcf.in' ]
+    simpoint = 553*100E6
 
 class parser(MinneDefaultBenchmark):
     name = 'parser'
     number = 197
     lang = 'C'
     args = [ '2.1.dict', '-batch' ]
+    simpoint = 1146*100E6
 
 class perlbmk(DefaultBenchmark):
     name = 'perlbmk'
@@ -537,6 +574,7 @@ class perlbmk(DefaultBenchmark):
 
 class perlbmk_diffmail(perlbmk):
     def ref(self, isa, os):
+        self.simpoint = 141*100E6
         self.args = [ '-I', 'lib', 'diffmail.pl', '2', '550', '15', '24',
                       '23', '100' ]
 
@@ -551,6 +589,7 @@ class perlbmk_scrabbl(perlbmk):
 
 class perlbmk_makerand(perlbmk):
     def ref(self, isa, os):
+        self.simpoint = 11*100E6
         self.args = [ '-I', 'lib',  'makerand.pl' ]
 
     def lgred(self, isa, os):
@@ -564,6 +603,7 @@ class perlbmk_makerand(perlbmk):
 
 class perlbmk_perfect(perlbmk):
     def ref(self, isa, os):
+        self.simpoint = 5*100E6
         self.args = [ '-I', 'lib',  'perfect.pl', 'b', '3', 'm', '4' ]
 
     def train(self, isa, os):
@@ -571,6 +611,7 @@ class perlbmk_perfect(perlbmk):
 
 class perlbmk_splitmail1(perlbmk):
     def ref(self, isa, os):
+        self.simpoint = 405*100E6
         self.args = [ '-I', 'lib', 'splitmail.pl', '850', '5', '19',
                       '18', '1500' ]
 
@@ -602,6 +643,7 @@ class twolf(Benchmark):
         self.args = [ 'train' ]
 
     def ref(self, isa, os):
+        self.simpoint = 1066*100E6
         self.args = [ 'ref' ]
 
     def smred(self, isa, os):
@@ -653,15 +695,18 @@ class vortex1(vortex):
     def ref(self, isa, os):
         self.args = [ '%s1.raw' % self.endian ]
         self.output = 'vortex1.out'
+        self.simpoint = 271*100E6
 
 
 class vortex2(vortex):
     def ref(self, isa, os):
+        self.simpoint = 1024*100E6
         self.args = [ '%s2.raw' % self.endian ]
         self.output = 'vortex2.out'
 
 class vortex3(vortex):
     def ref(self, isa, os):
+        self.simpoint = 564*100E6
         self.args = [ '%s3.raw' % self.endian ]
         self.output = 'vortex3.out'
 
@@ -678,6 +723,7 @@ class vpr_place(vpr):
     output = 'place_log.out'
 
 class vpr_route(vpr):
+    simpoint = 476*100E6
     args = [ 'net.in', 'arch.in', 'place.in', 'route.out', '-nodisp',
              '-route_only', '-route_chan_width', '15',
              '-pres_fac_mult', '2', '-acc_fac', '1',
index 07ed2c6920e21644e5c63ad6b0c53e6764246a95..37a27bf3b74592ec144915e20c9831eb9ef7c454 100644 (file)
@@ -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.
 #
 # 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')
     pid = Param.Int(100, 'process id')
     ppid = Param.Int(99, 'parent process id')
+    simpoint = Param.UInt64(0, 'simulation point at which to start simulation')