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