se.py revision 9268
111308Santhony.gutierrez@amd.com# Copyright (c) 2012 ARM Limited 211308Santhony.gutierrez@amd.com# All rights reserved. 311308Santhony.gutierrez@amd.com# 411308Santhony.gutierrez@amd.com# The license below extends only to copyright in the software and shall 511308Santhony.gutierrez@amd.com# not be construed as granting a license to any other intellectual 611308Santhony.gutierrez@amd.com# property including but not limited to intellectual property relating 711308Santhony.gutierrez@amd.com# to a hardware implementation of the functionality of the software 811308Santhony.gutierrez@amd.com# licensed hereunder. You may use the software subject to the license 911308Santhony.gutierrez@amd.com# terms below provided that you ensure that this notice is replicated 1011308Santhony.gutierrez@amd.com# unmodified and in its entirety in all distributions of the software, 1111308Santhony.gutierrez@amd.com# modified or unmodified, in source code or in binary form. 1211308Santhony.gutierrez@amd.com# 1311308Santhony.gutierrez@amd.com# Copyright (c) 2006-2008 The Regents of The University of Michigan 1411308Santhony.gutierrez@amd.com# All rights reserved. 1511308Santhony.gutierrez@amd.com# 1611308Santhony.gutierrez@amd.com# Redistribution and use in source and binary forms, with or without 1712697Santhony.gutierrez@amd.com# modification, are permitted provided that the following conditions are 1812697Santhony.gutierrez@amd.com# met: redistributions of source code must retain the above copyright 1912697Santhony.gutierrez@amd.com# notice, this list of conditions and the following disclaimer; 2011308Santhony.gutierrez@amd.com# redistributions in binary form must reproduce the above copyright 2111308Santhony.gutierrez@amd.com# notice, this list of conditions and the following disclaimer in the 2211308Santhony.gutierrez@amd.com# documentation and/or other materials provided with the distribution; 2311308Santhony.gutierrez@amd.com# neither the name of the copyright holders nor the names of its 2411308Santhony.gutierrez@amd.com# contributors may be used to endorse or promote products derived from 2511308Santhony.gutierrez@amd.com# this software without specific prior written permission. 2611308Santhony.gutierrez@amd.com# 2711308Santhony.gutierrez@amd.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2811308Santhony.gutierrez@amd.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2911308Santhony.gutierrez@amd.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 3011308Santhony.gutierrez@amd.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3111308Santhony.gutierrez@amd.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3211308Santhony.gutierrez@amd.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3312697Santhony.gutierrez@amd.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3411308Santhony.gutierrez@amd.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3511308Santhony.gutierrez@amd.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3611308Santhony.gutierrez@amd.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3711308Santhony.gutierrez@amd.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3811308Santhony.gutierrez@amd.com# 3911308Santhony.gutierrez@amd.com# Authors: Steve Reinhardt 4011308Santhony.gutierrez@amd.com 4111308Santhony.gutierrez@amd.com# Simple test script 4211308Santhony.gutierrez@amd.com# 4311308Santhony.gutierrez@amd.com# "m5 test.py" 4411308Santhony.gutierrez@amd.com 4511308Santhony.gutierrez@amd.comimport optparse 4611308Santhony.gutierrez@amd.comimport sys 4711308Santhony.gutierrez@amd.com 4811308Santhony.gutierrez@amd.comimport m5 4911308Santhony.gutierrez@amd.comfrom m5.defines import buildEnv 5012334Sgabeblack@google.comfrom m5.objects import * 5111308Santhony.gutierrez@amd.comfrom m5.util import addToPath, fatal 5211308Santhony.gutierrez@amd.com 5311308Santhony.gutierrez@amd.comaddToPath('../common') 5411308Santhony.gutierrez@amd.comaddToPath('../ruby') 5511308Santhony.gutierrez@amd.comaddToPath('../topologies') 5611308Santhony.gutierrez@amd.com 5711308Santhony.gutierrez@amd.comimport Options 5811308Santhony.gutierrez@amd.comimport Ruby 5911308Santhony.gutierrez@amd.comimport Simulation 6011308Santhony.gutierrez@amd.comimport CacheConfig 6111308Santhony.gutierrez@amd.comfrom Caches import * 6211308Santhony.gutierrez@amd.comfrom cpu2000 import * 6311308Santhony.gutierrez@amd.com 6411308Santhony.gutierrez@amd.comdef get_processes(options): 6511308Santhony.gutierrez@amd.com """Interprets provided options and returns a list of processes""" 6611308Santhony.gutierrez@amd.com 6711308Santhony.gutierrez@amd.com multiprocesses = [] 6811308Santhony.gutierrez@amd.com inputs = [] 6911308Santhony.gutierrez@amd.com outputs = [] 7012717Sbrandon.potter@amd.com errouts = [] 7111308Santhony.gutierrez@amd.com pargs = [] 7211308Santhony.gutierrez@amd.com 7311308Santhony.gutierrez@amd.com workloads = options.cmd.split(';') 7411308Santhony.gutierrez@amd.com if options.input != "": 7511308Santhony.gutierrez@amd.com inputs = options.input.split(';') 7611308Santhony.gutierrez@amd.com if options.output != "": 7711308Santhony.gutierrez@amd.com outputs = options.output.split(';') 7811308Santhony.gutierrez@amd.com if options.errout != "": 7911308Santhony.gutierrez@amd.com errouts = options.errout.split(';') 8011308Santhony.gutierrez@amd.com if options.options != "": 8111308Santhony.gutierrez@amd.com pargs = options.options.split(';') 8211308Santhony.gutierrez@amd.com 8311308Santhony.gutierrez@amd.com idx = 0 8411308Santhony.gutierrez@amd.com for wrkld in workloads: 8511308Santhony.gutierrez@amd.com process = LiveProcess() 8611308Santhony.gutierrez@amd.com process.executable = wrkld 8711308Santhony.gutierrez@amd.com 8811308Santhony.gutierrez@amd.com if len(pargs) > idx: 8911308Santhony.gutierrez@amd.com process.cmd = [wrkld] + pargs[idx].split() 9011308Santhony.gutierrez@amd.com else: 9111308Santhony.gutierrez@amd.com process.cmd = [wrkld] 9211308Santhony.gutierrez@amd.com 9311308Santhony.gutierrez@amd.com if len(inputs) > idx: 9411308Santhony.gutierrez@amd.com process.input = inputs[idx] 9511308Santhony.gutierrez@amd.com if len(outputs) > idx: 9611308Santhony.gutierrez@amd.com process.output = outputs[idx] 9711308Santhony.gutierrez@amd.com if len(errouts) > idx: 9811308Santhony.gutierrez@amd.com process.errout = errouts[idx] 9911308Santhony.gutierrez@amd.com 10011308Santhony.gutierrez@amd.com multiprocesses.append(process) 10111308Santhony.gutierrez@amd.com idx += 1 10211308Santhony.gutierrez@amd.com 10311308Santhony.gutierrez@amd.com if options.smt: 10411308Santhony.gutierrez@amd.com assert(options.cpu_type == "detailed" or options.cpu_type == "inorder") 10511308Santhony.gutierrez@amd.com return multiprocesses, idx 10611308Santhony.gutierrez@amd.com else: 10711308Santhony.gutierrez@amd.com return multiprocesses, 1 10811308Santhony.gutierrez@amd.com 10911308Santhony.gutierrez@amd.com 11011308Santhony.gutierrez@amd.comparser = optparse.OptionParser() 11111308Santhony.gutierrez@amd.comOptions.addCommonOptions(parser) 11211308Santhony.gutierrez@amd.comOptions.addSEOptions(parser) 11311308Santhony.gutierrez@amd.com 11411308Santhony.gutierrez@amd.comif '--ruby' in sys.argv: 11511308Santhony.gutierrez@amd.com Ruby.define_options(parser) 11612749Sgiacomo.travaglini@arm.com 11712749Sgiacomo.travaglini@arm.com(options, args) = parser.parse_args() 11811308Santhony.gutierrez@amd.com 11911308Santhony.gutierrez@amd.comif args: 12011308Santhony.gutierrez@amd.com print "Error: script doesn't take any positional arguments" 12112717Sbrandon.potter@amd.com sys.exit(1) 12211308Santhony.gutierrez@amd.com 12311308Santhony.gutierrez@amd.commultiprocesses = [] 12411308Santhony.gutierrez@amd.comnumThreads = 1 12511308Santhony.gutierrez@amd.com 12611308Santhony.gutierrez@amd.comif options.bench: 12711308Santhony.gutierrez@amd.com apps = options.bench.split("-") 12811308Santhony.gutierrez@amd.com if len(apps) != options.num_cpus: 12911308Santhony.gutierrez@amd.com print "number of benchmarks not equal to set num_cpus!" 13011308Santhony.gutierrez@amd.com sys.exit(1) 13111308Santhony.gutierrez@amd.com 13211308Santhony.gutierrez@amd.com for app in apps: 13311308Santhony.gutierrez@amd.com try: 13411308Santhony.gutierrez@amd.com if buildEnv['TARGET_ISA'] == 'alpha': 13511308Santhony.gutierrez@amd.com exec("workload = %s('alpha', 'tru64', 'ref')" % app) 13611308Santhony.gutierrez@amd.com else: 13711308Santhony.gutierrez@amd.com exec("workload = %s(buildEnv['TARGET_ISA'], 'linux', 'ref')" % app) 13811308Santhony.gutierrez@amd.com multiprocesses.append(workload.makeLiveProcess()) 13911308Santhony.gutierrez@amd.com except: 14011308Santhony.gutierrez@amd.com print >>sys.stderr, "Unable to find workload for %s: %s" % (buildEnv['TARGET_ISA'], app) 14111308Santhony.gutierrez@amd.com sys.exit(1) 14211308Santhony.gutierrez@amd.comelif options.cmd: 14311308Santhony.gutierrez@amd.com multiprocesses, numThreads = get_processes(options) 14411308Santhony.gutierrez@amd.comelse: 14511308Santhony.gutierrez@amd.com print >> sys.stderr, "No workload specified. Exiting!\n" 14611308Santhony.gutierrez@amd.com sys.exit(1) 14711308Santhony.gutierrez@amd.com 14811308Santhony.gutierrez@amd.com 14911308Santhony.gutierrez@amd.com(CPUClass, test_mem_mode, FutureClass) = Simulation.setCPUClass(options) 15011308Santhony.gutierrez@amd.comCPUClass.clock = options.clock 15111308Santhony.gutierrez@amd.comCPUClass.numThreads = numThreads 15211308Santhony.gutierrez@amd.com 15311308Santhony.gutierrez@amd.com# Check -- do not allow SMT with multiple CPUs 15411308Santhony.gutierrez@amd.comif options.smt and options.num_cpus > 1: 15511308Santhony.gutierrez@amd.com fatal("You cannot use SMT with multiple CPUs!") 15611308Santhony.gutierrez@amd.com 15711308Santhony.gutierrez@amd.comnp = options.num_cpus 15811308Santhony.gutierrez@amd.comsystem = System(cpu = [CPUClass(cpu_id=i) for i in xrange(np)], 15911308Santhony.gutierrez@amd.com physmem = SimpleMemory(range=AddrRange("512MB")), 16011308Santhony.gutierrez@amd.com membus = CoherentBus(), mem_mode = test_mem_mode) 16111308Santhony.gutierrez@amd.com 16212717Sbrandon.potter@amd.com# Sanity check 16311308Santhony.gutierrez@amd.comif options.fastmem and (options.caches or options.l2cache): 16411308Santhony.gutierrez@amd.com fatal("You cannot use fastmem in combination with caches!") 16511308Santhony.gutierrez@amd.com 16611308Santhony.gutierrez@amd.comfor i in xrange(np): 16711308Santhony.gutierrez@amd.com if options.smt: 16811308Santhony.gutierrez@amd.com system.cpu[i].workload = multiprocesses 16911308Santhony.gutierrez@amd.com elif len(multiprocesses) == 1: 17011308Santhony.gutierrez@amd.com system.cpu[i].workload = multiprocesses[0] 17111308Santhony.gutierrez@amd.com else: 17211308Santhony.gutierrez@amd.com system.cpu[i].workload = multiprocesses[i] 17311308Santhony.gutierrez@amd.com 17411308Santhony.gutierrez@amd.com if options.fastmem: 17511308Santhony.gutierrez@amd.com system.cpu[i].fastmem = True 17611308Santhony.gutierrez@amd.com 17711308Santhony.gutierrez@amd.com if options.checker: 17811308Santhony.gutierrez@amd.com system.cpu[i].addCheckerCpu() 17911308Santhony.gutierrez@amd.com 18012749Sgiacomo.travaglini@arm.comif options.ruby: 18111308Santhony.gutierrez@amd.com if not (options.cpu_type == "detailed" or options.cpu_type == "timing"): 18212749Sgiacomo.travaglini@arm.com print >> sys.stderr, "Ruby requires TimingSimpleCPU or O3CPU!!" 18311308Santhony.gutierrez@amd.com sys.exit(1) 18411308Santhony.gutierrez@amd.com 18511308Santhony.gutierrez@amd.com options.use_map = True 18611308Santhony.gutierrez@amd.com Ruby.create_system(options, system) 18711308Santhony.gutierrez@amd.com assert(options.num_cpus == len(system.ruby._cpu_ruby_ports)) 18811308Santhony.gutierrez@amd.com 18911308Santhony.gutierrez@amd.com for i in xrange(np): 19011308Santhony.gutierrez@amd.com ruby_port = system.ruby._cpu_ruby_ports[i] 19111308Santhony.gutierrez@amd.com 19211308Santhony.gutierrez@amd.com # Create the interrupt controller and connect its ports to Ruby 19311308Santhony.gutierrez@amd.com # Note that the interrupt controller is always present but only 19411308Santhony.gutierrez@amd.com # in x86 does it have message ports that need to be connected 19511308Santhony.gutierrez@amd.com system.cpu[i].createInterruptController() 19611308Santhony.gutierrez@amd.com 19711308Santhony.gutierrez@amd.com # Connect the cpu's cache ports to Ruby 19811308Santhony.gutierrez@amd.com system.cpu[i].icache_port = ruby_port.slave 19911308Santhony.gutierrez@amd.com system.cpu[i].dcache_port = ruby_port.slave 20011308Santhony.gutierrez@amd.com if buildEnv['TARGET_ISA'] == 'x86': 20111308Santhony.gutierrez@amd.com system.cpu[i].interrupts.pio = ruby_port.master 20211308Santhony.gutierrez@amd.com system.cpu[i].interrupts.int_master = ruby_port.slave 20311308Santhony.gutierrez@amd.com system.cpu[i].interrupts.int_slave = ruby_port.master 20411308Santhony.gutierrez@amd.com system.cpu[i].itb.walker.port = ruby_port.slave 20511308Santhony.gutierrez@amd.com system.cpu[i].dtb.walker.port = ruby_port.slave 20611308Santhony.gutierrez@amd.comelse: 20711308Santhony.gutierrez@amd.com system.system_port = system.membus.slave 20811308Santhony.gutierrez@amd.com system.physmem.port = system.membus.master 20911308Santhony.gutierrez@amd.com CacheConfig.config_cache(options, system) 21011308Santhony.gutierrez@amd.com 21111308Santhony.gutierrez@amd.comroot = Root(full_system = False, system = system) 21211308Santhony.gutierrez@amd.comSimulation.run(options, root, system, FutureClass) 21311308Santhony.gutierrez@amd.com