se.py revision 8718
111752Snikos.nikoleris@arm.com# Copyright (c) 2012 ARM Limited 210705Sandreas.hansson@arm.com# All rights reserved. 310705Sandreas.hansson@arm.com# 410705Sandreas.hansson@arm.com# The license below extends only to copyright in the software and shall 510705Sandreas.hansson@arm.com# not be construed as granting a license to any other intellectual 610705Sandreas.hansson@arm.com# property including but not limited to intellectual property relating 710705Sandreas.hansson@arm.com# to a hardware implementation of the functionality of the software 810705Sandreas.hansson@arm.com# licensed hereunder. You may use the software subject to the license 910705Sandreas.hansson@arm.com# terms below provided that you ensure that this notice is replicated 1010705Sandreas.hansson@arm.com# unmodified and in its entirety in all distributions of the software, 1110705Sandreas.hansson@arm.com# modified or unmodified, in source code or in binary form. 1210705Sandreas.hansson@arm.com# 1310705Sandreas.hansson@arm.com# Copyright (c) 2006-2008 The Regents of The University of Michigan 1410705Sandreas.hansson@arm.com# All rights reserved. 1510705Sandreas.hansson@arm.com# 1610705Sandreas.hansson@arm.com# Redistribution and use in source and binary forms, with or without 1710705Sandreas.hansson@arm.com# modification, are permitted provided that the following conditions are 1810705Sandreas.hansson@arm.com# met: redistributions of source code must retain the above copyright 1910705Sandreas.hansson@arm.com# notice, this list of conditions and the following disclaimer; 2010705Sandreas.hansson@arm.com# redistributions in binary form must reproduce the above copyright 2110705Sandreas.hansson@arm.com# notice, this list of conditions and the following disclaimer in the 2210705Sandreas.hansson@arm.com# documentation and/or other materials provided with the distribution; 2310705Sandreas.hansson@arm.com# neither the name of the copyright holders nor the names of its 2410705Sandreas.hansson@arm.com# contributors may be used to endorse or promote products derived from 2510705Sandreas.hansson@arm.com# this software without specific prior written permission. 2610705Sandreas.hansson@arm.com# 2710705Sandreas.hansson@arm.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2810705Sandreas.hansson@arm.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2910705Sandreas.hansson@arm.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 3010705Sandreas.hansson@arm.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3110705Sandreas.hansson@arm.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3210705Sandreas.hansson@arm.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3310705Sandreas.hansson@arm.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3410705Sandreas.hansson@arm.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3510705Sandreas.hansson@arm.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3610705Sandreas.hansson@arm.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3710705Sandreas.hansson@arm.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3810705Sandreas.hansson@arm.com# 3910705Sandreas.hansson@arm.com# Authors: Steve Reinhardt 4010705Sandreas.hansson@arm.com 4110705Sandreas.hansson@arm.com# Simple test script 4212564Sgabeblack@google.com# 4312564Sgabeblack@google.com# "m5 test.py" 4410705Sandreas.hansson@arm.com 4511753Snikos.nikoleris@arm.comimport os 4610705Sandreas.hansson@arm.comimport optparse 4710705Sandreas.hansson@arm.comimport sys 4810705Sandreas.hansson@arm.comfrom os.path import join as joinpath 4910705Sandreas.hansson@arm.com 5010705Sandreas.hansson@arm.comimport m5 5110705Sandreas.hansson@arm.comfrom m5.defines import buildEnv 5210705Sandreas.hansson@arm.comfrom m5.objects import * 5310705Sandreas.hansson@arm.comfrom m5.util import addToPath, fatal 5410705Sandreas.hansson@arm.com 5510705Sandreas.hansson@arm.comif buildEnv['FULL_SYSTEM']: 5610705Sandreas.hansson@arm.com fatal("This script requires syscall emulation mode (*_SE).") 5710705Sandreas.hansson@arm.com 5810705Sandreas.hansson@arm.comaddToPath('../common') 5910705Sandreas.hansson@arm.comaddToPath('../ruby') 6010705Sandreas.hansson@arm.com 6110705Sandreas.hansson@arm.comimport Ruby 6210705Sandreas.hansson@arm.com 6310705Sandreas.hansson@arm.comimport Simulation 6410705Sandreas.hansson@arm.comimport CacheConfig 6510705Sandreas.hansson@arm.comfrom Caches import * 6610705Sandreas.hansson@arm.comfrom cpu2000 import * 6710705Sandreas.hansson@arm.com 6810705Sandreas.hansson@arm.com# Get paths we might need. It's expected this file is in m5/configs/example. 6910705Sandreas.hansson@arm.comconfig_path = os.path.dirname(os.path.abspath(__file__)) 7010705Sandreas.hansson@arm.comconfig_root = os.path.dirname(config_path) 7110705Sandreas.hansson@arm.comm5_root = os.path.dirname(config_root) 7210705Sandreas.hansson@arm.com 7310705Sandreas.hansson@arm.comparser = optparse.OptionParser() 7410705Sandreas.hansson@arm.com 7510705Sandreas.hansson@arm.com# Benchmark options 7610705Sandreas.hansson@arm.comparser.add_option("-c", "--cmd", 7710705Sandreas.hansson@arm.com default=joinpath(m5_root, "tests/test-progs/hello/bin/%s/linux/hello" % \ 7810705Sandreas.hansson@arm.com buildEnv['TARGET_ISA']), 7910705Sandreas.hansson@arm.com help="The binary to run in syscall emulation mode.") 8010705Sandreas.hansson@arm.comparser.add_option("-o", "--options", default="", 8110705Sandreas.hansson@arm.com help='The options to pass to the binary, use " " around the entire string') 8210705Sandreas.hansson@arm.comparser.add_option("-i", "--input", default="", help="Read stdin from a file.") 8310705Sandreas.hansson@arm.comparser.add_option("--output", default="", help="Redirect stdout to a file.") 8410705Sandreas.hansson@arm.comparser.add_option("--errout", default="", help="Redirect stderr to a file.") 8510705Sandreas.hansson@arm.com 8610705Sandreas.hansson@arm.comexecfile(os.path.join(config_root, "common", "Options.py")) 8710705Sandreas.hansson@arm.com 8810705Sandreas.hansson@arm.comif buildEnv['PROTOCOL'] != 'None': 8910705Sandreas.hansson@arm.com parser.add_option("--ruby", action="store_true") 9010705Sandreas.hansson@arm.com if '--ruby' in sys.argv: 9110705Sandreas.hansson@arm.com Ruby.define_options(parser) 9210705Sandreas.hansson@arm.com 9310705Sandreas.hansson@arm.com(options, args) = parser.parse_args() 9410705Sandreas.hansson@arm.com 9510705Sandreas.hansson@arm.comif args: 9610705Sandreas.hansson@arm.com print "Error: script doesn't take any positional arguments" 9710705Sandreas.hansson@arm.com sys.exit(1) 9810705Sandreas.hansson@arm.com 9910705Sandreas.hansson@arm.commultiprocesses = [] 10010705Sandreas.hansson@arm.comapps = [] 10110705Sandreas.hansson@arm.com 10210705Sandreas.hansson@arm.comif options.bench: 10311753Snikos.nikoleris@arm.com apps = options.bench.split("-") 10411753Snikos.nikoleris@arm.com if len(apps) != options.num_cpus: 10510705Sandreas.hansson@arm.com print "number of benchmarks not equal to set num_cpus!" 10610705Sandreas.hansson@arm.com sys.exit(1) 10710705Sandreas.hansson@arm.com 10810705Sandreas.hansson@arm.com for app in apps: 10910705Sandreas.hansson@arm.com try: 11010705Sandreas.hansson@arm.com if buildEnv['TARGET_ISA'] == 'alpha': 11110705Sandreas.hansson@arm.com exec("workload = %s('alpha', 'tru64', 'ref')" % app) 11210705Sandreas.hansson@arm.com else: 11312564Sgabeblack@google.com exec("workload = %s(buildEnv['TARGET_ISA'], 'linux', 'ref')" % app) 11410705Sandreas.hansson@arm.com multiprocesses.append(workload.makeLiveProcess()) 11510705Sandreas.hansson@arm.com except: 11610705Sandreas.hansson@arm.com print >>sys.stderr, "Unable to find workload for %s: %s" % (buildEnv['TARGET_ISA'], app) 11710705Sandreas.hansson@arm.com sys.exit(1) 11811753Snikos.nikoleris@arm.comelse: 11911753Snikos.nikoleris@arm.com process = LiveProcess() 12011753Snikos.nikoleris@arm.com process.executable = options.cmd 12111753Snikos.nikoleris@arm.com process.cmd = [options.cmd] + options.options.split() 12211753Snikos.nikoleris@arm.com multiprocesses.append(process) 12312564Sgabeblack@google.com 12412564Sgabeblack@google.com 12511753Snikos.nikoleris@arm.comif options.input != "": 12611753Snikos.nikoleris@arm.com process.input = options.input 12711753Snikos.nikoleris@arm.comif options.output != "": 12811753Snikos.nikoleris@arm.com process.output = options.output 12911753Snikos.nikoleris@arm.comif options.errout != "": 13012564Sgabeblack@google.com process.errout = options.errout 13110705Sandreas.hansson@arm.com 13210705Sandreas.hansson@arm.com 13311753Snikos.nikoleris@arm.com# By default, set workload to path of user-specified binary 13412564Sgabeblack@google.comworkloads = options.cmd 13510705Sandreas.hansson@arm.comnumThreads = 1 13610705Sandreas.hansson@arm.com 13711753Snikos.nikoleris@arm.comif options.cpu_type == "detailed" or options.cpu_type == "inorder": 13812564Sgabeblack@google.com #check for SMT workload 13911753Snikos.nikoleris@arm.com workloads = options.cmd.split(';') 14011753Snikos.nikoleris@arm.com if len(workloads) > 1: 14111753Snikos.nikoleris@arm.com process = [] 14212564Sgabeblack@google.com smt_idx = 0 14311753Snikos.nikoleris@arm.com inputs = [] 14411753Snikos.nikoleris@arm.com outputs = [] 14511753Snikos.nikoleris@arm.com errouts = [] 14611753Snikos.nikoleris@arm.com 14712564Sgabeblack@google.com if options.input != "": 14811753Snikos.nikoleris@arm.com inputs = options.input.split(';') 14911753Snikos.nikoleris@arm.com if options.output != "": 15011753Snikos.nikoleris@arm.com outputs = options.output.split(';') 15111753Snikos.nikoleris@arm.com if options.errout != "": 15212564Sgabeblack@google.com errouts = options.errout.split(';') 15311753Snikos.nikoleris@arm.com 15411753Snikos.nikoleris@arm.com for wrkld in workloads: 15510705Sandreas.hansson@arm.com smt_process = LiveProcess() 15610705Sandreas.hansson@arm.com smt_process.executable = wrkld 15710705Sandreas.hansson@arm.com smt_process.cmd = wrkld + " " + options.options 15810705Sandreas.hansson@arm.com if inputs and inputs[smt_idx]: 15910705Sandreas.hansson@arm.com smt_process.input = inputs[smt_idx] 16012564Sgabeblack@google.com if outputs and outputs[smt_idx]: 16110705Sandreas.hansson@arm.com smt_process.output = outputs[smt_idx] 16210705Sandreas.hansson@arm.com if errouts and errouts[smt_idx]: 16310705Sandreas.hansson@arm.com smt_process.errout = errouts[smt_idx] 16410705Sandreas.hansson@arm.com process += [smt_process, ] 16510705Sandreas.hansson@arm.com smt_idx += 1 16610705Sandreas.hansson@arm.com numThreads = len(workloads) 16710705Sandreas.hansson@arm.com 16811053Sandreas.hansson@arm.comif options.ruby: 16911722Ssophiane.senni@gmail.com if not (options.cpu_type == "detailed" or options.cpu_type == "timing"): 17011053Sandreas.hansson@arm.com print >> sys.stderr, "Ruby requires TimingSimpleCPU or O3CPU!!" 17110705Sandreas.hansson@arm.com sys.exit(1) 17210705Sandreas.hansson@arm.com 17310705Sandreas.hansson@arm.com(CPUClass, test_mem_mode, FutureClass) = Simulation.setCPUClass(options) 17410705Sandreas.hansson@arm.comCPUClass.clock = '2GHz' 17510705Sandreas.hansson@arm.comCPUClass.numThreads = numThreads; 17610705Sandreas.hansson@arm.com 17710705Sandreas.hansson@arm.comnp = options.num_cpus 17810705Sandreas.hansson@arm.com 17910705Sandreas.hansson@arm.comsystem = System(cpu = [CPUClass(cpu_id=i) for i in xrange(np)], 18010705Sandreas.hansson@arm.com physmem = PhysicalMemory(range=AddrRange("512MB")), 18110705Sandreas.hansson@arm.com membus = Bus(), mem_mode = test_mem_mode) 18210705Sandreas.hansson@arm.com 18310705Sandreas.hansson@arm.comif options.ruby: 18410705Sandreas.hansson@arm.com options.use_map = True 18510705Sandreas.hansson@arm.com Ruby.create_system(options, system) 18610705Sandreas.hansson@arm.com assert(options.num_cpus == len(system.ruby._cpu_ruby_ports)) 18710705Sandreas.hansson@arm.com system.system_port = system.ruby._sys_port_proxy.port 18810705Sandreas.hansson@arm.comelse: 18910705Sandreas.hansson@arm.com system.system_port = system.membus.port 19010705Sandreas.hansson@arm.com system.physmem.port = system.membus.port 19111722Ssophiane.senni@gmail.com CacheConfig.config_cache(options, system) 19211722Ssophiane.senni@gmail.com 19310705Sandreas.hansson@arm.comfor i in xrange(np): 19410705Sandreas.hansson@arm.com system.cpu[i].workload = multiprocesses[i] 19510705Sandreas.hansson@arm.com 19610705Sandreas.hansson@arm.com if options.ruby: 19710705Sandreas.hansson@arm.com system.cpu[i].icache_port = system.ruby._cpu_ruby_ports[i].port 19810705Sandreas.hansson@arm.com system.cpu[i].dcache_port = system.ruby._cpu_ruby_ports[i].port 19910705Sandreas.hansson@arm.com 20010705Sandreas.hansson@arm.com if options.fastmem: 20110705Sandreas.hansson@arm.com system.cpu[0].physmem_port = system.physmem.port 20210705Sandreas.hansson@arm.com 20310705Sandreas.hansson@arm.comroot = Root(system = system) 20411752Snikos.nikoleris@arm.com 20510705Sandreas.hansson@arm.comSimulation.run(options, root, system, FutureClass) 20611752Snikos.nikoleris@arm.com