Adding gem5 source to svn.
git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1819 8c4709b5-6ec9-48aa-a5cd-a96041d1645a
This commit is contained in:
126
simulators/gem5/configs/common/Benchmarks.py
Normal file
126
simulators/gem5/configs/common/Benchmarks.py
Normal file
@ -0,0 +1,126 @@
|
||||
# Copyright (c) 2006-2007 The Regents of The University of Michigan
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Authors: Ali Saidi
|
||||
|
||||
from SysPaths import script, disk, binary
|
||||
from os import environ as env
|
||||
from m5.defines import buildEnv
|
||||
|
||||
class SysConfig:
|
||||
def __init__(self, script=None, mem=None, disk=None):
|
||||
self.scriptname = script
|
||||
self.diskname = disk
|
||||
self.memsize = mem
|
||||
|
||||
def script(self):
|
||||
if self.scriptname:
|
||||
return script(self.scriptname)
|
||||
else:
|
||||
return ''
|
||||
|
||||
def mem(self):
|
||||
if self.memsize:
|
||||
return self.memsize
|
||||
else:
|
||||
return '128MB'
|
||||
|
||||
def disk(self):
|
||||
if self.diskname:
|
||||
return disk(self.diskname)
|
||||
elif buildEnv['TARGET_ISA'] == 'alpha':
|
||||
return env.get('LINUX_IMAGE', disk('linux-latest.img'))
|
||||
elif buildEnv['TARGET_ISA'] == 'x86':
|
||||
return env.get('LINUX_IMAGE', disk('x86root.img'))
|
||||
elif buildEnv['TARGET_ISA'] == 'arm':
|
||||
return env.get('LINUX_IMAGE', disk('linux-arm-ael.img'))
|
||||
else:
|
||||
print "Don't know what default disk image to use for %s ISA" % \
|
||||
buildEnv['TARGET_ISA']
|
||||
exit(1)
|
||||
|
||||
# Benchmarks are defined as a key in a dict which is a list of SysConfigs
|
||||
# The first defined machine is the test system, the others are driving systems
|
||||
|
||||
Benchmarks = {
|
||||
'PovrayBench': [SysConfig('povray-bench.rcS', '512MB', 'povray.img')],
|
||||
'PovrayAutumn': [SysConfig('povray-autumn.rcS', '512MB', 'povray.img')],
|
||||
|
||||
'NetperfStream': [SysConfig('netperf-stream-client.rcS'),
|
||||
SysConfig('netperf-server.rcS')],
|
||||
'NetperfStreamUdp': [SysConfig('netperf-stream-udp-client.rcS'),
|
||||
SysConfig('netperf-server.rcS')],
|
||||
'NetperfUdpLocal': [SysConfig('netperf-stream-udp-local.rcS')],
|
||||
'NetperfStreamNT': [SysConfig('netperf-stream-nt-client.rcS'),
|
||||
SysConfig('netperf-server.rcS')],
|
||||
'NetperfMaerts': [SysConfig('netperf-maerts-client.rcS'),
|
||||
SysConfig('netperf-server.rcS')],
|
||||
'SurgeStandard': [SysConfig('surge-server.rcS', '512MB'),
|
||||
SysConfig('surge-client.rcS', '256MB')],
|
||||
'SurgeSpecweb': [SysConfig('spec-surge-server.rcS', '512MB'),
|
||||
SysConfig('spec-surge-client.rcS', '256MB')],
|
||||
'Nhfsstone': [SysConfig('nfs-server-nhfsstone.rcS', '512MB'),
|
||||
SysConfig('nfs-client-nhfsstone.rcS')],
|
||||
'Nfs': [SysConfig('nfs-server.rcS', '900MB'),
|
||||
SysConfig('nfs-client-dbench.rcS')],
|
||||
'NfsTcp': [SysConfig('nfs-server.rcS', '900MB'),
|
||||
SysConfig('nfs-client-tcp.rcS')],
|
||||
'IScsiInitiator': [SysConfig('iscsi-client.rcS', '512MB'),
|
||||
SysConfig('iscsi-server.rcS', '512MB')],
|
||||
'IScsiTarget': [SysConfig('iscsi-server.rcS', '512MB'),
|
||||
SysConfig('iscsi-client.rcS', '512MB')],
|
||||
'Validation': [SysConfig('iscsi-server.rcS', '512MB'),
|
||||
SysConfig('iscsi-client.rcS', '512MB')],
|
||||
'Ping': [SysConfig('ping-server.rcS',),
|
||||
SysConfig('ping-client.rcS')],
|
||||
|
||||
'ValAccDelay': [SysConfig('devtime.rcS', '512MB')],
|
||||
'ValAccDelay2': [SysConfig('devtimewmr.rcS', '512MB')],
|
||||
'ValMemLat': [SysConfig('micro_memlat.rcS', '512MB')],
|
||||
'ValMemLat2MB': [SysConfig('micro_memlat2mb.rcS', '512MB')],
|
||||
'ValMemLat8MB': [SysConfig('micro_memlat8mb.rcS', '512MB')],
|
||||
'ValMemLat': [SysConfig('micro_memlat8.rcS', '512MB')],
|
||||
'ValTlbLat': [SysConfig('micro_tlblat.rcS', '512MB')],
|
||||
'ValSysLat': [SysConfig('micro_syscall.rcS', '512MB')],
|
||||
'ValCtxLat': [SysConfig('micro_ctx.rcS', '512MB')],
|
||||
'ValStream': [SysConfig('micro_stream.rcS', '512MB')],
|
||||
'ValStreamScale': [SysConfig('micro_streamscale.rcS', '512MB')],
|
||||
'ValStreamCopy': [SysConfig('micro_streamcopy.rcS', '512MB')],
|
||||
|
||||
'MutexTest': [SysConfig('mutex-test.rcS', '128MB')],
|
||||
'ArmAndroid-GB': [SysConfig('null.rcS', '256MB',
|
||||
'ARMv7a-Gingerbread-Android.SMP.mouse.nolock.clean.img')],
|
||||
'bbench-gb': [SysConfig('bbench-gb.rcS', '256MB',
|
||||
'ARMv7a-Gingerbread-Android.SMP.mouse.nolock.img')],
|
||||
'ArmAndroid-ICS': [SysConfig('null.rcS', '256MB',
|
||||
'ARMv7a-ICS-Android.SMP.nolock.clean.img')],
|
||||
'bbench-ics': [SysConfig('bbench-ics.rcS', '256MB',
|
||||
'ARMv7a-ICS-Android.SMP.nolock.img')]
|
||||
}
|
||||
|
||||
benchs = Benchmarks.keys()
|
||||
benchs.sort()
|
||||
DefinedBenchmarks = ", ".join(benchs)
|
||||
79
simulators/gem5/configs/common/CacheConfig.py
Normal file
79
simulators/gem5/configs/common/CacheConfig.py
Normal file
@ -0,0 +1,79 @@
|
||||
# Copyright (c) 2010 Advanced Micro Devices, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Authors: Lisa Hsu
|
||||
|
||||
# Configure the M5 cache hierarchy config in one place
|
||||
#
|
||||
|
||||
import m5
|
||||
from m5.objects import *
|
||||
from Caches import *
|
||||
from O3_ARM_v7a import *
|
||||
|
||||
def config_cache(options, system):
|
||||
if options.l2cache:
|
||||
if options.cpu_type == "arm_detailed":
|
||||
system.l2 = O3_ARM_v7aL2(size = options.l2_size, assoc = options.l2_assoc,
|
||||
block_size=options.cacheline_size)
|
||||
else:
|
||||
system.l2 = L2Cache(size = options.l2_size, assoc = options.l2_assoc,
|
||||
block_size=options.cacheline_size)
|
||||
|
||||
system.tol2bus = CoherentBus()
|
||||
system.l2.cpu_side = system.tol2bus.master
|
||||
system.l2.mem_side = system.membus.slave
|
||||
|
||||
for i in xrange(options.num_cpus):
|
||||
if options.caches:
|
||||
if options.cpu_type == "arm_detailed":
|
||||
icache = O3_ARM_v7a_ICache(size = options.l1i_size,
|
||||
assoc = options.l1i_assoc,
|
||||
block_size=options.cacheline_size)
|
||||
dcache = O3_ARM_v7a_DCache(size = options.l1d_size,
|
||||
assoc = options.l1d_assoc,
|
||||
block_size=options.cacheline_size)
|
||||
else:
|
||||
icache = L1Cache(size = options.l1i_size,
|
||||
assoc = options.l1i_assoc,
|
||||
block_size=options.cacheline_size)
|
||||
dcache = L1Cache(size = options.l1d_size,
|
||||
assoc = options.l1d_assoc,
|
||||
block_size=options.cacheline_size)
|
||||
|
||||
if buildEnv['TARGET_ISA'] == 'x86':
|
||||
system.cpu[i].addPrivateSplitL1Caches(icache, dcache,
|
||||
PageTableWalkerCache(),
|
||||
PageTableWalkerCache())
|
||||
else:
|
||||
system.cpu[i].addPrivateSplitL1Caches(icache, dcache)
|
||||
system.cpu[i].createInterruptController()
|
||||
if options.l2cache:
|
||||
system.cpu[i].connectAllPorts(system.tol2bus, system.membus)
|
||||
else:
|
||||
system.cpu[i].connectAllPorts(system.membus)
|
||||
|
||||
return system
|
||||
63
simulators/gem5/configs/common/Caches.py
Normal file
63
simulators/gem5/configs/common/Caches.py
Normal file
@ -0,0 +1,63 @@
|
||||
# Copyright (c) 2006-2007 The Regents of The University of Michigan
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Authors: Lisa Hsu
|
||||
|
||||
from m5.objects import *
|
||||
|
||||
class L1Cache(BaseCache):
|
||||
assoc = 2
|
||||
block_size = 64
|
||||
latency = '1ns'
|
||||
mshrs = 10
|
||||
tgts_per_mshr = 20
|
||||
is_top_level = True
|
||||
|
||||
class L2Cache(BaseCache):
|
||||
assoc = 8
|
||||
block_size = 64
|
||||
latency = '10ns'
|
||||
mshrs = 20
|
||||
tgts_per_mshr = 12
|
||||
|
||||
class PageTableWalkerCache(BaseCache):
|
||||
assoc = 2
|
||||
block_size = 64
|
||||
latency = '1ns'
|
||||
mshrs = 10
|
||||
size = '1kB'
|
||||
tgts_per_mshr = 12
|
||||
is_top_level = True
|
||||
|
||||
class IOCache(BaseCache):
|
||||
assoc = 8
|
||||
block_size = 64
|
||||
latency = '10ns'
|
||||
mshrs = 20
|
||||
size = '1kB'
|
||||
tgts_per_mshr = 12
|
||||
forward_snoops = False
|
||||
is_top_level = True
|
||||
561
simulators/gem5/configs/common/FSConfig.py
Normal file
561
simulators/gem5/configs/common/FSConfig.py
Normal file
@ -0,0 +1,561 @@
|
||||
# Copyright (c) 2010-2012 ARM Limited
|
||||
# All rights reserved.
|
||||
#
|
||||
# The license below extends only to copyright in the software and shall
|
||||
# not be construed as granting a license to any other intellectual
|
||||
# property including but not limited to intellectual property relating
|
||||
# to a hardware implementation of the functionality of the software
|
||||
# licensed hereunder. You may use the software subject to the license
|
||||
# terms below provided that you ensure that this notice is replicated
|
||||
# unmodified and in its entirety in all distributions of the software,
|
||||
# modified or unmodified, in source code or in binary form.
|
||||
#
|
||||
# Copyright (c) 2010-2011 Advanced Micro Devices, Inc.
|
||||
# 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
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Authors: Kevin Lim
|
||||
|
||||
from m5.objects import *
|
||||
from Benchmarks import *
|
||||
from m5.util import convert
|
||||
|
||||
class CowIdeDisk(IdeDisk):
|
||||
image = CowDiskImage(child=RawDiskImage(read_only=True),
|
||||
read_only=False)
|
||||
|
||||
def childImage(self, ci):
|
||||
self.image.child.image_file = ci
|
||||
|
||||
class MemBus(CoherentBus):
|
||||
badaddr_responder = BadAddr()
|
||||
default = Self.badaddr_responder.pio
|
||||
|
||||
|
||||
def makeLinuxAlphaSystem(mem_mode, mdesc = None):
|
||||
IO_address_space_base = 0x80000000000
|
||||
class BaseTsunami(Tsunami):
|
||||
ethernet = NSGigE(pci_bus=0, pci_dev=1, pci_func=0)
|
||||
ide = IdeController(disks=[Parent.disk0, Parent.disk2],
|
||||
pci_func=0, pci_dev=0, pci_bus=0)
|
||||
|
||||
self = LinuxAlphaSystem()
|
||||
if not mdesc:
|
||||
# generic system
|
||||
mdesc = SysConfig()
|
||||
self.readfile = mdesc.script()
|
||||
self.iobus = NoncoherentBus()
|
||||
self.membus = MemBus()
|
||||
# By default the bridge responds to all addresses above the I/O
|
||||
# base address (including the PCI config space)
|
||||
self.bridge = Bridge(delay='50ns', nack_delay='4ns',
|
||||
ranges = [AddrRange(IO_address_space_base, Addr.max)])
|
||||
self.physmem = SimpleMemory(range = AddrRange(mdesc.mem()))
|
||||
self.bridge.master = self.iobus.slave
|
||||
self.bridge.slave = self.membus.master
|
||||
self.physmem.port = self.membus.master
|
||||
self.disk0 = CowIdeDisk(driveID='master')
|
||||
self.disk2 = CowIdeDisk(driveID='master')
|
||||
self.disk0.childImage(mdesc.disk())
|
||||
self.disk2.childImage(disk('linux-bigswap2.img'))
|
||||
self.tsunami = BaseTsunami()
|
||||
self.tsunami.attachIO(self.iobus)
|
||||
self.tsunami.ide.pio = self.iobus.master
|
||||
self.tsunami.ide.config = self.iobus.master
|
||||
self.tsunami.ide.dma = self.iobus.slave
|
||||
self.tsunami.ethernet.pio = self.iobus.master
|
||||
self.tsunami.ethernet.config = self.iobus.master
|
||||
self.tsunami.ethernet.dma = self.iobus.slave
|
||||
self.simple_disk = SimpleDisk(disk=RawDiskImage(image_file = mdesc.disk(),
|
||||
read_only = True))
|
||||
self.intrctrl = IntrControl()
|
||||
self.mem_mode = mem_mode
|
||||
self.terminal = Terminal()
|
||||
self.kernel = binary('vmlinux')
|
||||
self.pal = binary('ts_osfpal')
|
||||
self.console = binary('console')
|
||||
self.boot_osflags = 'root=/dev/hda1 console=ttyS0'
|
||||
|
||||
self.system_port = self.membus.slave
|
||||
|
||||
return self
|
||||
|
||||
def makeLinuxAlphaRubySystem(mem_mode, mdesc = None):
|
||||
class BaseTsunami(Tsunami):
|
||||
ethernet = NSGigE(pci_bus=0, pci_dev=1, pci_func=0)
|
||||
ide = IdeController(disks=[Parent.disk0, Parent.disk2],
|
||||
pci_func=0, pci_dev=0, pci_bus=0)
|
||||
|
||||
physmem = SimpleMemory(range = AddrRange(mdesc.mem()))
|
||||
self = LinuxAlphaSystem(physmem = physmem)
|
||||
if not mdesc:
|
||||
# generic system
|
||||
mdesc = SysConfig()
|
||||
self.readfile = mdesc.script()
|
||||
|
||||
# Create pio bus to connect all device pio ports to rubymem's pio port
|
||||
self.piobus = NoncoherentBus()
|
||||
|
||||
#
|
||||
# Pio functional accesses from devices need direct access to memory
|
||||
# RubyPort currently does support functional accesses. Therefore provide
|
||||
# the piobus a direct connection to physical memory
|
||||
#
|
||||
self.piobus.master = physmem.port
|
||||
|
||||
self.disk0 = CowIdeDisk(driveID='master')
|
||||
self.disk2 = CowIdeDisk(driveID='master')
|
||||
self.disk0.childImage(mdesc.disk())
|
||||
self.disk2.childImage(disk('linux-bigswap2.img'))
|
||||
self.tsunami = BaseTsunami()
|
||||
self.tsunami.attachIO(self.piobus)
|
||||
self.tsunami.ide.pio = self.piobus.master
|
||||
self.tsunami.ide.config = self.piobus.master
|
||||
self.tsunami.ethernet.pio = self.piobus.master
|
||||
self.tsunami.ethernet.config = self.piobus.master
|
||||
|
||||
#
|
||||
# Store the dma devices for later connection to dma ruby ports.
|
||||
# Append an underscore to dma_devices to avoid the SimObjectVector check.
|
||||
#
|
||||
self._dma_ports = [self.tsunami.ide.dma, self.tsunami.ethernet.dma]
|
||||
|
||||
self.simple_disk = SimpleDisk(disk=RawDiskImage(image_file = mdesc.disk(),
|
||||
read_only = True))
|
||||
self.intrctrl = IntrControl()
|
||||
self.mem_mode = mem_mode
|
||||
self.terminal = Terminal()
|
||||
self.kernel = binary('vmlinux')
|
||||
self.pal = binary('ts_osfpal')
|
||||
self.console = binary('console')
|
||||
self.boot_osflags = 'root=/dev/hda1 console=ttyS0'
|
||||
|
||||
return self
|
||||
|
||||
def makeSparcSystem(mem_mode, mdesc = None):
|
||||
# Constants from iob.cc and uart8250.cc
|
||||
iob_man_addr = 0x9800000000
|
||||
uart_pio_size = 8
|
||||
|
||||
class CowMmDisk(MmDisk):
|
||||
image = CowDiskImage(child=RawDiskImage(read_only=True),
|
||||
read_only=False)
|
||||
|
||||
def childImage(self, ci):
|
||||
self.image.child.image_file = ci
|
||||
|
||||
self = SparcSystem()
|
||||
if not mdesc:
|
||||
# generic system
|
||||
mdesc = SysConfig()
|
||||
self.readfile = mdesc.script()
|
||||
self.iobus = NoncoherentBus()
|
||||
self.membus = MemBus()
|
||||
self.bridge = Bridge(delay='50ns', nack_delay='4ns')
|
||||
self.t1000 = T1000()
|
||||
self.t1000.attachOnChipIO(self.membus)
|
||||
self.t1000.attachIO(self.iobus)
|
||||
self.physmem = SimpleMemory(range = AddrRange(Addr('1MB'), size = '64MB'),
|
||||
zero = True)
|
||||
self.physmem2 = SimpleMemory(range = AddrRange(Addr('2GB'), size ='256MB'),
|
||||
zero = True)
|
||||
self.bridge.master = self.iobus.slave
|
||||
self.bridge.slave = self.membus.master
|
||||
self.physmem.port = self.membus.master
|
||||
self.physmem2.port = self.membus.master
|
||||
self.rom.port = self.membus.master
|
||||
self.nvram.port = self.membus.master
|
||||
self.hypervisor_desc.port = self.membus.master
|
||||
self.partition_desc.port = self.membus.master
|
||||
self.intrctrl = IntrControl()
|
||||
self.disk0 = CowMmDisk()
|
||||
self.disk0.childImage(disk('disk.s10hw2'))
|
||||
self.disk0.pio = self.iobus.master
|
||||
|
||||
# The puart0 and hvuart are placed on the IO bus, so create ranges
|
||||
# for them. The remaining IO range is rather fragmented, so poke
|
||||
# holes for the iob and partition descriptors etc.
|
||||
self.bridge.ranges = \
|
||||
[
|
||||
AddrRange(self.t1000.puart0.pio_addr,
|
||||
self.t1000.puart0.pio_addr + uart_pio_size - 1),
|
||||
AddrRange(self.disk0.pio_addr,
|
||||
self.t1000.fake_jbi.pio_addr +
|
||||
self.t1000.fake_jbi.pio_size - 1),
|
||||
AddrRange(self.t1000.fake_clk.pio_addr,
|
||||
iob_man_addr - 1),
|
||||
AddrRange(self.t1000.fake_l2_1.pio_addr,
|
||||
self.t1000.fake_ssi.pio_addr +
|
||||
self.t1000.fake_ssi.pio_size - 1),
|
||||
AddrRange(self.t1000.hvuart.pio_addr,
|
||||
self.t1000.hvuart.pio_addr + uart_pio_size - 1)
|
||||
]
|
||||
self.reset_bin = binary('reset_new.bin')
|
||||
self.hypervisor_bin = binary('q_new.bin')
|
||||
self.openboot_bin = binary('openboot_new.bin')
|
||||
self.nvram_bin = binary('nvram1')
|
||||
self.hypervisor_desc_bin = binary('1up-hv.bin')
|
||||
self.partition_desc_bin = binary('1up-md.bin')
|
||||
|
||||
self.system_port = self.membus.slave
|
||||
|
||||
return self
|
||||
|
||||
def makeArmSystem(mem_mode, machine_type, mdesc = None, bare_metal=False):
|
||||
assert machine_type
|
||||
|
||||
if bare_metal:
|
||||
self = ArmSystem()
|
||||
else:
|
||||
self = LinuxArmSystem()
|
||||
|
||||
if not mdesc:
|
||||
# generic system
|
||||
mdesc = SysConfig()
|
||||
|
||||
self.readfile = mdesc.script()
|
||||
self.iobus = NoncoherentBus()
|
||||
self.membus = MemBus()
|
||||
self.membus.badaddr_responder.warn_access = "warn"
|
||||
self.bridge = Bridge(delay='50ns', nack_delay='4ns')
|
||||
self.bridge.master = self.iobus.slave
|
||||
self.bridge.slave = self.membus.master
|
||||
|
||||
self.mem_mode = mem_mode
|
||||
|
||||
if machine_type == "RealView_PBX":
|
||||
self.realview = RealViewPBX()
|
||||
elif machine_type == "RealView_EB":
|
||||
self.realview = RealViewEB()
|
||||
elif machine_type == "VExpress_ELT":
|
||||
self.realview = VExpress_ELT()
|
||||
elif machine_type == "VExpress_EMM":
|
||||
self.realview = VExpress_EMM()
|
||||
self.load_addr_mask = 0xffffffff
|
||||
else:
|
||||
print "Unknown Machine Type"
|
||||
sys.exit(1)
|
||||
|
||||
self.cf0 = CowIdeDisk(driveID='master')
|
||||
self.cf0.childImage(mdesc.disk())
|
||||
# default to an IDE controller rather than a CF one
|
||||
# assuming we've got one
|
||||
try:
|
||||
self.realview.ide.disks = [self.cf0]
|
||||
except:
|
||||
self.realview.cf_ctrl.disks = [self.cf0]
|
||||
|
||||
if bare_metal:
|
||||
# EOT character on UART will end the simulation
|
||||
self.realview.uart.end_on_eot = True
|
||||
self.physmem = SimpleMemory(range = AddrRange(Addr(mdesc.mem())),
|
||||
zero = True)
|
||||
else:
|
||||
self.kernel = binary('vmlinux.arm.smp.fb.2.6.38.8')
|
||||
self.machine_type = machine_type
|
||||
if convert.toMemorySize(mdesc.mem()) > int(self.realview.max_mem_size):
|
||||
print "The currently selected ARM platforms doesn't support"
|
||||
print " the amount of DRAM you've selected. Please try"
|
||||
print " another platform"
|
||||
sys.exit(1)
|
||||
|
||||
boot_flags = 'earlyprintk console=ttyAMA0 lpj=19988480 norandmaps ' + \
|
||||
'rw loglevel=8 mem=%s root=/dev/sda1' % mdesc.mem()
|
||||
|
||||
self.physmem = SimpleMemory(range =
|
||||
AddrRange(self.realview.mem_start_addr,
|
||||
size = mdesc.mem()),
|
||||
conf_table_reported = True)
|
||||
self.realview.setupBootLoader(self.membus, self, binary)
|
||||
self.gic_cpu_addr = self.realview.gic.cpu_addr
|
||||
self.flags_addr = self.realview.realview_io.pio_addr + 0x30
|
||||
|
||||
if mdesc.disk().lower().count('android'):
|
||||
boot_flags += " init=/init "
|
||||
self.boot_osflags = boot_flags
|
||||
|
||||
self.physmem.port = self.membus.master
|
||||
self.realview.attachOnChipIO(self.membus, self.bridge)
|
||||
self.realview.attachIO(self.iobus)
|
||||
self.intrctrl = IntrControl()
|
||||
self.terminal = Terminal()
|
||||
self.vncserver = VncServer()
|
||||
|
||||
self.system_port = self.membus.slave
|
||||
|
||||
return self
|
||||
|
||||
|
||||
def makeLinuxMipsSystem(mem_mode, mdesc = None):
|
||||
class BaseMalta(Malta):
|
||||
ethernet = NSGigE(pci_bus=0, pci_dev=1, pci_func=0)
|
||||
ide = IdeController(disks=[Parent.disk0, Parent.disk2],
|
||||
pci_func=0, pci_dev=0, pci_bus=0)
|
||||
|
||||
self = LinuxMipsSystem()
|
||||
if not mdesc:
|
||||
# generic system
|
||||
mdesc = SysConfig()
|
||||
self.readfile = mdesc.script()
|
||||
self.iobus = NoncoherentBus()
|
||||
self.membus = MemBus()
|
||||
self.bridge = Bridge(delay='50ns', nack_delay='4ns')
|
||||
self.physmem = SimpleMemory(range = AddrRange('1GB'))
|
||||
self.bridge.master = self.iobus.slave
|
||||
self.bridge.slave = self.membus.master
|
||||
self.physmem.port = self.membus.master
|
||||
self.disk0 = CowIdeDisk(driveID='master')
|
||||
self.disk2 = CowIdeDisk(driveID='master')
|
||||
self.disk0.childImage(mdesc.disk())
|
||||
self.disk2.childImage(disk('linux-bigswap2.img'))
|
||||
self.malta = BaseMalta()
|
||||
self.malta.attachIO(self.iobus)
|
||||
self.malta.ide.pio = self.iobus.master
|
||||
self.malta.ide.config = self.iobus.master
|
||||
self.malta.ide.dma = self.iobus.slave
|
||||
self.malta.ethernet.pio = self.iobus.master
|
||||
self.malta.ethernet.config = self.iobus.master
|
||||
self.malta.ethernet.dma = self.iobus.slave
|
||||
self.simple_disk = SimpleDisk(disk=RawDiskImage(image_file = mdesc.disk(),
|
||||
read_only = True))
|
||||
self.intrctrl = IntrControl()
|
||||
self.mem_mode = mem_mode
|
||||
self.terminal = Terminal()
|
||||
self.kernel = binary('mips/vmlinux')
|
||||
self.console = binary('mips/console')
|
||||
self.boot_osflags = 'root=/dev/hda1 console=ttyS0'
|
||||
|
||||
self.system_port = self.membus.slave
|
||||
|
||||
return self
|
||||
|
||||
def x86IOAddress(port):
|
||||
IO_address_space_base = 0x8000000000000000
|
||||
return IO_address_space_base + port
|
||||
|
||||
def connectX86ClassicSystem(x86_sys, numCPUs):
|
||||
# Constants similar to x86_traits.hh
|
||||
IO_address_space_base = 0x8000000000000000
|
||||
pci_config_address_space_base = 0xc000000000000000
|
||||
interrupts_address_space_base = 0xa000000000000000
|
||||
APIC_range_size = 1 << 12;
|
||||
|
||||
x86_sys.membus = MemBus()
|
||||
x86_sys.physmem.port = x86_sys.membus.master
|
||||
|
||||
# North Bridge
|
||||
x86_sys.iobus = NoncoherentBus()
|
||||
x86_sys.bridge = Bridge(delay='50ns', nack_delay='4ns')
|
||||
x86_sys.bridge.master = x86_sys.iobus.slave
|
||||
x86_sys.bridge.slave = x86_sys.membus.master
|
||||
# Allow the bridge to pass through the IO APIC (two pages),
|
||||
# everything in the IO address range up to the local APIC, and
|
||||
# then the entire PCI address space and beyond
|
||||
x86_sys.bridge.ranges = \
|
||||
[
|
||||
AddrRange(x86_sys.pc.south_bridge.io_apic.pio_addr,
|
||||
x86_sys.pc.south_bridge.io_apic.pio_addr +
|
||||
APIC_range_size - 1),
|
||||
AddrRange(IO_address_space_base,
|
||||
interrupts_address_space_base - 1),
|
||||
AddrRange(pci_config_address_space_base,
|
||||
Addr.max)
|
||||
]
|
||||
|
||||
# Create a bridge from the IO bus to the memory bus to allow access to
|
||||
# the local APIC (two pages)
|
||||
x86_sys.apicbridge = Bridge(delay='50ns', nack_delay='4ns')
|
||||
x86_sys.apicbridge.slave = x86_sys.iobus.master
|
||||
x86_sys.apicbridge.master = x86_sys.membus.slave
|
||||
x86_sys.apicbridge.ranges = [AddrRange(interrupts_address_space_base,
|
||||
interrupts_address_space_base +
|
||||
numCPUs * APIC_range_size
|
||||
- 1)]
|
||||
|
||||
# connect the io bus
|
||||
x86_sys.pc.attachIO(x86_sys.iobus)
|
||||
|
||||
x86_sys.system_port = x86_sys.membus.slave
|
||||
|
||||
def connectX86RubySystem(x86_sys):
|
||||
# North Bridge
|
||||
x86_sys.piobus = NoncoherentBus()
|
||||
|
||||
#
|
||||
# Pio functional accesses from devices need direct access to memory
|
||||
# RubyPort currently does support functional accesses. Therefore provide
|
||||
# the piobus a direct connection to physical memory
|
||||
#
|
||||
x86_sys.piobus.master = x86_sys.physmem.port
|
||||
# add the ide to the list of dma devices that later need to attach to
|
||||
# dma controllers
|
||||
x86_sys._dma_ports = [x86_sys.pc.south_bridge.ide.dma]
|
||||
x86_sys.pc.attachIO(x86_sys.piobus, x86_sys._dma_ports)
|
||||
|
||||
|
||||
def makeX86System(mem_mode, numCPUs = 1, mdesc = None, self = None, Ruby = False):
|
||||
if self == None:
|
||||
self = X86System()
|
||||
|
||||
if not mdesc:
|
||||
# generic system
|
||||
mdesc = SysConfig()
|
||||
self.readfile = mdesc.script()
|
||||
|
||||
self.mem_mode = mem_mode
|
||||
|
||||
# Physical memory
|
||||
self.physmem = SimpleMemory(range = AddrRange(mdesc.mem()))
|
||||
|
||||
# Platform
|
||||
self.pc = Pc()
|
||||
|
||||
# Create and connect the busses required by each memory system
|
||||
if Ruby:
|
||||
connectX86RubySystem(self)
|
||||
else:
|
||||
connectX86ClassicSystem(self, numCPUs)
|
||||
|
||||
self.intrctrl = IntrControl()
|
||||
|
||||
# Disks
|
||||
disk0 = CowIdeDisk(driveID='master')
|
||||
disk2 = CowIdeDisk(driveID='master')
|
||||
disk0.childImage(mdesc.disk())
|
||||
disk2.childImage(disk('linux-bigswap2.img'))
|
||||
self.pc.south_bridge.ide.disks = [disk0, disk2]
|
||||
|
||||
# Add in a Bios information structure.
|
||||
structures = [X86SMBiosBiosInformation()]
|
||||
self.smbios_table.structures = structures
|
||||
|
||||
# Set up the Intel MP table
|
||||
base_entries = []
|
||||
ext_entries = []
|
||||
for i in xrange(numCPUs):
|
||||
bp = X86IntelMPProcessor(
|
||||
local_apic_id = i,
|
||||
local_apic_version = 0x14,
|
||||
enable = True,
|
||||
bootstrap = (i == 0))
|
||||
base_entries.append(bp)
|
||||
io_apic = X86IntelMPIOAPIC(
|
||||
id = numCPUs,
|
||||
version = 0x11,
|
||||
enable = True,
|
||||
address = 0xfec00000)
|
||||
self.pc.south_bridge.io_apic.apic_id = io_apic.id
|
||||
base_entries.append(io_apic)
|
||||
isa_bus = X86IntelMPBus(bus_id = 0, bus_type='ISA')
|
||||
base_entries.append(isa_bus)
|
||||
pci_bus = X86IntelMPBus(bus_id = 1, bus_type='PCI')
|
||||
base_entries.append(pci_bus)
|
||||
connect_busses = X86IntelMPBusHierarchy(bus_id=0,
|
||||
subtractive_decode=True, parent_bus=1)
|
||||
ext_entries.append(connect_busses)
|
||||
pci_dev4_inta = X86IntelMPIOIntAssignment(
|
||||
interrupt_type = 'INT',
|
||||
polarity = 'ConformPolarity',
|
||||
trigger = 'ConformTrigger',
|
||||
source_bus_id = 1,
|
||||
source_bus_irq = 0 + (4 << 2),
|
||||
dest_io_apic_id = io_apic.id,
|
||||
dest_io_apic_intin = 16)
|
||||
base_entries.append(pci_dev4_inta)
|
||||
def assignISAInt(irq, apicPin):
|
||||
assign_8259_to_apic = X86IntelMPIOIntAssignment(
|
||||
interrupt_type = 'ExtInt',
|
||||
polarity = 'ConformPolarity',
|
||||
trigger = 'ConformTrigger',
|
||||
source_bus_id = 0,
|
||||
source_bus_irq = irq,
|
||||
dest_io_apic_id = io_apic.id,
|
||||
dest_io_apic_intin = 0)
|
||||
base_entries.append(assign_8259_to_apic)
|
||||
assign_to_apic = X86IntelMPIOIntAssignment(
|
||||
interrupt_type = 'INT',
|
||||
polarity = 'ConformPolarity',
|
||||
trigger = 'ConformTrigger',
|
||||
source_bus_id = 0,
|
||||
source_bus_irq = irq,
|
||||
dest_io_apic_id = io_apic.id,
|
||||
dest_io_apic_intin = apicPin)
|
||||
base_entries.append(assign_to_apic)
|
||||
assignISAInt(0, 2)
|
||||
assignISAInt(1, 1)
|
||||
for i in range(3, 15):
|
||||
assignISAInt(i, i)
|
||||
self.intel_mp_table.base_entries = base_entries
|
||||
self.intel_mp_table.ext_entries = ext_entries
|
||||
|
||||
def makeLinuxX86System(mem_mode, numCPUs = 1, mdesc = None, Ruby = False):
|
||||
self = LinuxX86System()
|
||||
|
||||
# Build up the x86 system and then specialize it for Linux
|
||||
makeX86System(mem_mode, numCPUs, mdesc, self, Ruby)
|
||||
|
||||
# We assume below that there's at least 1MB of memory. We'll require 2
|
||||
# just to avoid corner cases.
|
||||
assert(self.physmem.range.second.getValue() >= 0x200000)
|
||||
|
||||
self.e820_table.entries = \
|
||||
[
|
||||
# Mark the first megabyte of memory as reserved
|
||||
X86E820Entry(addr = 0, size = '1MB', range_type = 2),
|
||||
# Mark the rest as available
|
||||
X86E820Entry(addr = 0x100000,
|
||||
size = '%dB' % (self.physmem.range.second - 0x100000 + 1),
|
||||
range_type = 1)
|
||||
]
|
||||
|
||||
# Command line
|
||||
self.boot_osflags = 'earlyprintk=ttyS0 console=ttyS0 lpj=7999923 ' + \
|
||||
'root=/dev/hda1'
|
||||
return self
|
||||
|
||||
|
||||
def makeDualRoot(full_system, testSystem, driveSystem, dumpfile):
|
||||
self = Root(full_system = full_system)
|
||||
self.testsys = testSystem
|
||||
self.drivesys = driveSystem
|
||||
self.etherlink = EtherLink()
|
||||
self.etherlink.int0 = Parent.testsys.tsunami.ethernet.interface
|
||||
self.etherlink.int1 = Parent.drivesys.tsunami.ethernet.interface
|
||||
|
||||
if hasattr(testSystem, 'realview'):
|
||||
self.etherlink.int0 = Parent.testsys.realview.ethernet.interface
|
||||
self.etherlink.int1 = Parent.drivesys.realview.ethernet.interface
|
||||
elif hasattr(testSystem, 'tsunami'):
|
||||
self.etherlink.int0 = Parent.testsys.tsunami.ethernet.interface
|
||||
self.etherlink.int1 = Parent.drivesys.tsunami.ethernet.interface
|
||||
else:
|
||||
fatal("Don't know how to connect these system together")
|
||||
|
||||
if dumpfile:
|
||||
self.etherdump = EtherDump(file=dumpfile)
|
||||
self.etherlink.dump = Parent.etherdump
|
||||
|
||||
return self
|
||||
196
simulators/gem5/configs/common/O3_ARM_v7a.py
Normal file
196
simulators/gem5/configs/common/O3_ARM_v7a.py
Normal file
@ -0,0 +1,196 @@
|
||||
# Copyright (c) 2012 The Regents of The University of Michigan
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Authors: Ron Dreslinski
|
||||
|
||||
|
||||
from m5.objects import *
|
||||
|
||||
# Simple ALU Instructions have a latency of 1
|
||||
class O3_ARM_v7a_Simple_Int(FUDesc):
|
||||
opList = [ OpDesc(opClass='IntAlu', opLat=1) ]
|
||||
count = 2
|
||||
|
||||
# Complex ALU instructions have a variable latencies
|
||||
class O3_ARM_v7a_Complex_Int(FUDesc):
|
||||
opList = [ OpDesc(opClass='IntMult', opLat=3, issueLat=1),
|
||||
OpDesc(opClass='IntDiv', opLat=12, issueLat=12),
|
||||
OpDesc(opClass='IprAccess', opLat=3, issueLat=1) ]
|
||||
count = 1
|
||||
|
||||
|
||||
# Floating point and SIMD instructions
|
||||
class O3_ARM_v7a_FP(FUDesc):
|
||||
opList = [ OpDesc(opClass='SimdAdd', opLat=4),
|
||||
OpDesc(opClass='SimdAddAcc', opLat=4),
|
||||
OpDesc(opClass='SimdAlu', opLat=4),
|
||||
OpDesc(opClass='SimdCmp', opLat=4),
|
||||
OpDesc(opClass='SimdCvt', opLat=3),
|
||||
OpDesc(opClass='SimdMisc', opLat=3),
|
||||
OpDesc(opClass='SimdMult',opLat=5),
|
||||
OpDesc(opClass='SimdMultAcc',opLat=5),
|
||||
OpDesc(opClass='SimdShift',opLat=3),
|
||||
OpDesc(opClass='SimdShiftAcc', opLat=3),
|
||||
OpDesc(opClass='SimdSqrt', opLat=9),
|
||||
OpDesc(opClass='SimdFloatAdd',opLat=5),
|
||||
OpDesc(opClass='SimdFloatAlu',opLat=5),
|
||||
OpDesc(opClass='SimdFloatCmp', opLat=3),
|
||||
OpDesc(opClass='SimdFloatCvt', opLat=3),
|
||||
OpDesc(opClass='SimdFloatDiv', opLat=3),
|
||||
OpDesc(opClass='SimdFloatMisc', opLat=3),
|
||||
OpDesc(opClass='SimdFloatMult', opLat=3),
|
||||
OpDesc(opClass='SimdFloatMultAcc',opLat=1),
|
||||
OpDesc(opClass='SimdFloatSqrt', opLat=9),
|
||||
OpDesc(opClass='FloatAdd', opLat=5),
|
||||
OpDesc(opClass='FloatCmp', opLat=5),
|
||||
OpDesc(opClass='FloatCvt', opLat=5),
|
||||
OpDesc(opClass='FloatDiv', opLat=9, issueLat=9),
|
||||
OpDesc(opClass='FloatSqrt', opLat=33, issueLat=33),
|
||||
OpDesc(opClass='FloatMult', opLat=4) ]
|
||||
count = 2
|
||||
|
||||
|
||||
# Load/Store Units
|
||||
class O3_ARM_v7a_Load(FUDesc):
|
||||
opList = [ OpDesc(opClass='MemRead',opLat=2) ]
|
||||
count = 1
|
||||
|
||||
class O3_ARM_v7a_Store(FUDesc):
|
||||
opList = [OpDesc(opClass='MemWrite',opLat=2) ]
|
||||
count = 1
|
||||
|
||||
# Functional Units for this CPU
|
||||
class O3_ARM_v7a_FUP(FUPool):
|
||||
FUList = [O3_ARM_v7a_Simple_Int(), O3_ARM_v7a_Complex_Int(),
|
||||
O3_ARM_v7a_Load(), O3_ARM_v7a_Store(), O3_ARM_v7a_FP()]
|
||||
|
||||
|
||||
class O3_ARM_v7a_3(DerivO3CPU):
|
||||
predType = "tournament"
|
||||
localPredictorSize = 64
|
||||
localCtrBits = 2
|
||||
localHistoryTableSize = 64
|
||||
localHistoryBits = 6
|
||||
globalPredictorSize = 8192
|
||||
globalCtrBits = 2
|
||||
globalHistoryBits = 13
|
||||
choicePredictorSize = 8192
|
||||
choiceCtrBits = 2
|
||||
BTBEntries = 2048
|
||||
BTBTagSize = 18
|
||||
RASSize = 16
|
||||
instShiftAmt = 2
|
||||
LQEntries = 16
|
||||
SQEntries = 16
|
||||
LSQDepCheckShift = 0
|
||||
LFSTSize = 1024
|
||||
SSITSize = 1024
|
||||
decodeToFetchDelay = 1
|
||||
renameToFetchDelay = 1
|
||||
iewToFetchDelay = 1
|
||||
commitToFetchDelay = 1
|
||||
renameToDecodeDelay = 1
|
||||
iewToDecodeDelay = 1
|
||||
commitToDecodeDelay = 1
|
||||
iewToRenameDelay = 1
|
||||
commitToRenameDelay = 1
|
||||
commitToIEWDelay = 1
|
||||
fetchWidth = 3
|
||||
fetchToDecodeDelay = 3
|
||||
decodeWidth = 3
|
||||
decodeToRenameDelay = 2
|
||||
renameWidth = 3
|
||||
renameToIEWDelay = 1
|
||||
issueToExecuteDelay = 1
|
||||
dispatchWidth = 6
|
||||
issueWidth = 8
|
||||
wbWidth = 8
|
||||
wbDepth = 1
|
||||
fuPool = O3_ARM_v7a_FUP()
|
||||
iewToCommitDelay = 1
|
||||
renameToROBDelay = 1
|
||||
commitWidth = 8
|
||||
squashWidth = 8
|
||||
trapLatency = 13
|
||||
backComSize = 5
|
||||
forwardComSize = 5
|
||||
numPhysIntRegs = 128
|
||||
numPhysFloatRegs = 128
|
||||
numIQEntries = 32
|
||||
numROBEntries = 40
|
||||
|
||||
defer_registration= False
|
||||
|
||||
# Instruction Cache
|
||||
# All latencys assume a 1GHz clock rate, with a faster clock they would be faster
|
||||
class O3_ARM_v7a_ICache(BaseCache):
|
||||
latency = '1ns'
|
||||
block_size = 64
|
||||
mshrs = 2
|
||||
tgts_per_mshr = 8
|
||||
size = '32kB'
|
||||
assoc = 2
|
||||
is_top_level = 'true'
|
||||
|
||||
# Data Cache
|
||||
# All latencys assume a 1GHz clock rate, with a faster clock they would be faster
|
||||
class O3_ARM_v7a_DCache(BaseCache):
|
||||
latency = '2ns'
|
||||
block_size = 64
|
||||
mshrs = 6
|
||||
tgts_per_mshr = 8
|
||||
size = '32kB'
|
||||
assoc = 2
|
||||
write_buffers = 16
|
||||
is_top_level = 'true'
|
||||
|
||||
# TLB Cache
|
||||
# Use a cache as a L2 TLB
|
||||
class O3_ARM_v7aWalkCache(BaseCache):
|
||||
latency = '4ns'
|
||||
block_size = 64
|
||||
mshrs = 6
|
||||
tgts_per_mshr = 8
|
||||
size = '1kB'
|
||||
assoc = 8
|
||||
write_buffers = 16
|
||||
is_top_level = 'true'
|
||||
|
||||
|
||||
# L2 Cache
|
||||
# All latencys assume a 1GHz clock rate, with a faster clock they would be faster
|
||||
class O3_ARM_v7aL2(BaseCache):
|
||||
latency = '12ns'
|
||||
block_size = 64
|
||||
mshrs = 16
|
||||
tgts_per_mshr = 8
|
||||
size = '1MB'
|
||||
assoc = 16
|
||||
write_buffers = 8
|
||||
prefetch_on_access = 'true'
|
||||
# Simple stride prefetcher
|
||||
prefetcher = StridePrefetcher(degree=8, latency='1.0ns')
|
||||
|
||||
181
simulators/gem5/configs/common/Options.py
Normal file
181
simulators/gem5/configs/common/Options.py
Normal file
@ -0,0 +1,181 @@
|
||||
# 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
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Authors: Lisa Hsu
|
||||
|
||||
import m5
|
||||
from m5.defines import buildEnv
|
||||
from m5.objects import *
|
||||
from Benchmarks import *
|
||||
|
||||
def addCommonOptions(parser):
|
||||
# system options
|
||||
parser.add_option("--cpu-type", type="choice", default="atomic",
|
||||
choices = ["atomic", "timing", "detailed", "inorder",
|
||||
"arm_detailed"],
|
||||
help = "type of cpu to run with")
|
||||
parser.add_option("--checker", action="store_true");
|
||||
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")
|
||||
parser.add_option("--clock", action="store", type="string", default='2GHz')
|
||||
parser.add_option("--num-dirs", type="int", default=1)
|
||||
parser.add_option("--num-l2caches", type="int", default=1)
|
||||
parser.add_option("--num-l3caches", type="int", default=1)
|
||||
parser.add_option("--l1d_size", type="string", default="64kB")
|
||||
parser.add_option("--l1i_size", type="string", default="32kB")
|
||||
parser.add_option("--l2_size", type="string", default="2MB")
|
||||
parser.add_option("--l3_size", type="string", default="16MB")
|
||||
parser.add_option("--l1d_assoc", type="int", default=2)
|
||||
parser.add_option("--l1i_assoc", type="int", default=2)
|
||||
parser.add_option("--l2_assoc", type="int", default=8)
|
||||
parser.add_option("--l3_assoc", type="int", default=16)
|
||||
parser.add_option("--cacheline_size", type="int", default=64)
|
||||
parser.add_option("--ruby", action="store_true")
|
||||
|
||||
# Run duration options
|
||||
parser.add_option("-m", "--maxtick", type="int", default=m5.MaxTick,
|
||||
metavar="T", help="Stop after T ticks")
|
||||
parser.add_option("--maxtime", type="float")
|
||||
parser.add_option("-I", "--maxinsts", action="store", type="int",
|
||||
default=None, help="""Total number of instructions to
|
||||
simulate (default: run forever)""")
|
||||
parser.add_option("--work-item-id", action="store", type="int",
|
||||
help="the specific work id for exit & checkpointing")
|
||||
parser.add_option("--work-begin-cpu-id-exit", action="store", type="int",
|
||||
help="exit when work starts on the specified cpu")
|
||||
parser.add_option("--work-end-exit-count", action="store", type="int",
|
||||
help="exit at specified work end count")
|
||||
parser.add_option("--work-begin-exit-count", action="store", type="int",
|
||||
help="exit at specified work begin count")
|
||||
parser.add_option("--init-param", action="store", type="int", default=0,
|
||||
help="""Parameter available in simulation with m5
|
||||
initparam""")
|
||||
|
||||
# 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("--checkpoint-at-end", action="store_true",
|
||||
help="take a checkpoint at end of run")
|
||||
parser.add_option("--work-begin-checkpoint-count", action="store", type="int",
|
||||
help="checkpoint at specified work begin count")
|
||||
parser.add_option("--work-end-checkpoint-count", action="store", type="int",
|
||||
help="checkpoint at specified work end count")
|
||||
parser.add_option("--work-cpus-checkpoint-count", action="store", type="int",
|
||||
help="checkpoint and exit when active cpu count is reached")
|
||||
parser.add_option("--restore-with-cpu", action="store", type="choice",
|
||||
default="atomic", choices = ["atomic", "timing",
|
||||
"detailed", "inorder"],
|
||||
help = "cpu type for restoring 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
|
||||
# data measurement
|
||||
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("-p", "--prog-interval", type="int",
|
||||
help="CPU Progress Interval")
|
||||
|
||||
# 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("--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="""Treat value of --checkpoint-restore or --take-checkpoint as a
|
||||
number of instructions.""")
|
||||
|
||||
def addSEOptions(parser):
|
||||
# Benchmark options
|
||||
parser.add_option("-c", "--cmd", default="",
|
||||
help="The binary to run in syscall emulation mode.")
|
||||
parser.add_option("-o", "--options", default="",
|
||||
help="""The options to pass to the binary, use " "
|
||||
around the entire string""")
|
||||
parser.add_option("-i", "--input", default="",
|
||||
help="Read stdin from a file.")
|
||||
parser.add_option("--output", default="",
|
||||
help="Redirect stdout to a file.")
|
||||
parser.add_option("--errout", default="",
|
||||
help="Redirect stderr to a file.")
|
||||
|
||||
def addFSOptions(parser):
|
||||
# Simulation options
|
||||
parser.add_option("--timesync", action="store_true",
|
||||
help="Prevent simulated time from getting ahead of real time")
|
||||
|
||||
# System options
|
||||
parser.add_option("--kernel", action="store", type="string")
|
||||
parser.add_option("--script", action="store", type="string")
|
||||
parser.add_option("--frame-capture", action="store_true",
|
||||
help="Stores changed frame buffers from the VNC server to compressed "\
|
||||
"files in the gem5 output directory")
|
||||
|
||||
if buildEnv['TARGET_ISA'] == "arm":
|
||||
parser.add_option("--bare-metal", action="store_true",
|
||||
help="Provide the raw system without the linux specific bits")
|
||||
parser.add_option("--machine-type", action="store", type="choice",
|
||||
choices=ArmMachineType.map.keys(), default="RealView_PBX")
|
||||
# Benchmark options
|
||||
parser.add_option("--dual", action="store_true",
|
||||
help="Simulate two systems attached with an ethernet link")
|
||||
parser.add_option("-b", "--benchmark", action="store", type="string",
|
||||
dest="benchmark",
|
||||
help="Specify the benchmark to run. Available benchmarks: %s"\
|
||||
% DefinedBenchmarks)
|
||||
|
||||
# Metafile options
|
||||
parser.add_option("--etherdump", action="store", type="string", dest="etherdump",
|
||||
help="Specify the filename to dump a pcap capture of the" \
|
||||
"ethernet traffic")
|
||||
|
||||
# Disk Image Options
|
||||
parser.add_option("--disk-image", action="store", type="string", default=None,
|
||||
help="Path to the disk image to use.")
|
||||
|
||||
# Memory Size Options
|
||||
parser.add_option("--mem-size", action="store", type="string", default=None,
|
||||
help="Specify the physical memory size (single memory)")
|
||||
407
simulators/gem5/configs/common/Simulation.py
Normal file
407
simulators/gem5/configs/common/Simulation.py
Normal file
@ -0,0 +1,407 @@
|
||||
# Copyright (c) 2006-2008 The Regents of The University of Michigan
|
||||
# Copyright (c) 2010 Advanced Micro Devices, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Authors: Lisa Hsu
|
||||
|
||||
from os import getcwd
|
||||
from os.path import join as joinpath
|
||||
|
||||
import m5
|
||||
from m5.defines import buildEnv
|
||||
from m5.objects import *
|
||||
from m5.util import *
|
||||
from O3_ARM_v7a import *
|
||||
|
||||
addToPath('../common')
|
||||
|
||||
def setCPUClass(options):
|
||||
|
||||
atomic = False
|
||||
if options.cpu_type == "timing":
|
||||
class TmpClass(TimingSimpleCPU): pass
|
||||
elif options.cpu_type == "detailed" or options.cpu_type == "arm_detailed":
|
||||
if not options.caches and not options.ruby:
|
||||
print "O3 CPU must be used with caches"
|
||||
sys.exit(1)
|
||||
if options.cpu_type == "arm_detailed":
|
||||
class TmpClass(O3_ARM_v7a_3): pass
|
||||
else:
|
||||
class TmpClass(DerivO3CPU): pass
|
||||
elif options.cpu_type == "inorder":
|
||||
if not options.caches:
|
||||
print "InOrder CPU must be used with caches"
|
||||
sys.exit(1)
|
||||
class TmpClass(InOrderCPU): pass
|
||||
else:
|
||||
class TmpClass(AtomicSimpleCPU): pass
|
||||
atomic = True
|
||||
|
||||
CPUClass = None
|
||||
test_mem_mode = 'atomic'
|
||||
|
||||
if not atomic:
|
||||
if options.checkpoint_restore != None:
|
||||
if options.restore_with_cpu != options.cpu_type:
|
||||
CPUClass = TmpClass
|
||||
class TmpClass(AtomicSimpleCPU): pass
|
||||
else:
|
||||
if options.restore_with_cpu != "atomic":
|
||||
test_mem_mode = 'timing'
|
||||
|
||||
elif options.fast_forward:
|
||||
CPUClass = TmpClass
|
||||
class TmpClass(AtomicSimpleCPU): pass
|
||||
else:
|
||||
test_mem_mode = 'timing'
|
||||
|
||||
return (TmpClass, test_mem_mode, CPUClass)
|
||||
|
||||
def setWorkCountOptions(system, options):
|
||||
if options.work_item_id != None:
|
||||
system.work_item_id = options.work_item_id
|
||||
if options.work_begin_cpu_id_exit != None:
|
||||
system.work_begin_cpu_id_exit = options.work_begin_cpu_id_exit
|
||||
if options.work_end_exit_count != None:
|
||||
system.work_end_exit_count = options.work_end_exit_count
|
||||
if options.work_end_checkpoint_count != None:
|
||||
system.work_end_ckpt_count = options.work_end_checkpoint_count
|
||||
if options.work_begin_exit_count != None:
|
||||
system.work_begin_exit_count = options.work_begin_exit_count
|
||||
if options.work_begin_checkpoint_count != None:
|
||||
system.work_begin_ckpt_count = options.work_begin_checkpoint_count
|
||||
if options.work_cpus_checkpoint_count != None:
|
||||
system.work_cpus_ckpt_count = options.work_cpus_checkpoint_count
|
||||
|
||||
def run(options, root, testsys, cpu_class):
|
||||
if options.maxtick:
|
||||
maxtick = options.maxtick
|
||||
elif options.maxtime:
|
||||
simtime = m5.ticks.seconds(simtime)
|
||||
print "simulating for: ", simtime
|
||||
maxtick = simtime
|
||||
else:
|
||||
maxtick = m5.MaxTick
|
||||
|
||||
if options.checkpoint_dir:
|
||||
cptdir = options.checkpoint_dir
|
||||
elif m5.options.outdir:
|
||||
cptdir = m5.options.outdir
|
||||
else:
|
||||
cptdir = getcwd()
|
||||
|
||||
if options.fast_forward and options.checkpoint_restore != None:
|
||||
fatal("Can't specify both --fast-forward and --checkpoint-restore")
|
||||
|
||||
if options.standard_switch and not options.caches:
|
||||
fatal("Must specify --caches when using --standard-switch")
|
||||
|
||||
np = options.num_cpus
|
||||
max_checkpoints = options.max_checkpoints
|
||||
switch_cpus = None
|
||||
|
||||
if options.prog_interval:
|
||||
for i in xrange(np):
|
||||
testsys.cpu[i].progress_interval = options.prog_interval
|
||||
|
||||
if options.maxinsts:
|
||||
for i in xrange(np):
|
||||
testsys.cpu[i].max_insts_any_thread = options.maxinsts
|
||||
|
||||
if cpu_class:
|
||||
switch_cpus = [cpu_class(defer_registration=True, cpu_id=(np+i))
|
||||
for i in xrange(np)]
|
||||
|
||||
for i in xrange(np):
|
||||
if options.fast_forward:
|
||||
testsys.cpu[i].max_insts_any_thread = int(options.fast_forward)
|
||||
switch_cpus[i].system = testsys
|
||||
switch_cpus[i].workload = testsys.cpu[i].workload
|
||||
switch_cpus[i].clock = testsys.cpu[0].clock
|
||||
# simulation period
|
||||
if options.maxinsts:
|
||||
switch_cpus[i].max_insts_any_thread = options.maxinsts
|
||||
# Add checker cpu if selected
|
||||
if options.checker:
|
||||
switch_cpus[i].addCheckerCpu()
|
||||
|
||||
testsys.switch_cpus = switch_cpus
|
||||
switch_cpu_list = [(testsys.cpu[i], switch_cpus[i]) for i in xrange(np)]
|
||||
|
||||
if options.standard_switch:
|
||||
if not options.caches:
|
||||
# O3 CPU must have a cache to work.
|
||||
print "O3 CPU must be used with caches"
|
||||
sys.exit(1)
|
||||
|
||||
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))
|
||||
for i in xrange(np)]
|
||||
|
||||
for i in xrange(np):
|
||||
switch_cpus[i].system = testsys
|
||||
switch_cpus_1[i].system = testsys
|
||||
switch_cpus[i].workload = testsys.cpu[i].workload
|
||||
switch_cpus_1[i].workload = testsys.cpu[i].workload
|
||||
switch_cpus[i].clock = testsys.cpu[0].clock
|
||||
switch_cpus_1[i].clock = testsys.cpu[0].clock
|
||||
|
||||
# if restoring, make atomic cpu simulate only a few instructions
|
||||
if options.checkpoint_restore != None:
|
||||
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 = int(options.fast_forward)
|
||||
# Fast forward to a simpoint (warning: time consuming)
|
||||
elif options.simpoint:
|
||||
if testsys.cpu[i].workload[0].simpoint == 0:
|
||||
fatal('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.maxinsts:
|
||||
switch_cpus_1[i].max_insts_any_thread = options.maxinsts
|
||||
|
||||
# attach the checker cpu if selected
|
||||
if options.checker:
|
||||
switch_cpus[i].addCheckerCpu()
|
||||
switch_cpus_1[i].addCheckerCpu()
|
||||
|
||||
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)]
|
||||
|
||||
# set the checkpoint in the cpu before m5.instantiate is called
|
||||
if options.take_checkpoints != None 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 == 0:
|
||||
fatal('no simpoint for testsys.cpu[%d].workload[0]', i)
|
||||
checkpoint_inst = int(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
|
||||
|
||||
checkpoint_dir = None
|
||||
if options.checkpoint_restore != None:
|
||||
from os.path import isdir, exists
|
||||
from os import listdir
|
||||
import re
|
||||
|
||||
if not isdir(cptdir):
|
||||
fatal("checkpoint dir %s does not exist!", cptdir)
|
||||
|
||||
if options.at_instruction or options.simpoint:
|
||||
inst = options.checkpoint_restore
|
||||
if options.simpoint:
|
||||
# assume workload 0 has the simpoint
|
||||
if testsys.cpu[0].workload[0].simpoint == 0:
|
||||
fatal('Unable to find simpoint')
|
||||
inst += int(testsys.cpu[0].workload[0].simpoint)
|
||||
|
||||
checkpoint_dir = joinpath(cptdir,
|
||||
"cpt.%s.%s" % (options.bench, inst))
|
||||
if not exists(checkpoint_dir):
|
||||
fatal("Unable to find checkpoint directory %s", checkpoint_dir)
|
||||
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)))
|
||||
|
||||
cpt_num = options.checkpoint_restore
|
||||
|
||||
if cpt_num > len(cpts):
|
||||
fatal('Checkpoint %d not found', cpt_num)
|
||||
|
||||
## Adjust max tick based on our starting tick
|
||||
maxtick = maxtick - int(cpts[cpt_num - 1])
|
||||
checkpoint_dir = joinpath(cptdir, "cpt.%s" % cpts[cpt_num - 1])
|
||||
|
||||
m5.instantiate(checkpoint_dir)
|
||||
|
||||
if options.standard_switch or cpu_class:
|
||||
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 @ tick %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.
|
||||
|
||||
m5.changeToTiming(testsys)
|
||||
m5.switchCpus(switch_cpu_list)
|
||||
m5.resume(testsys)
|
||||
|
||||
if options.standard_switch:
|
||||
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 @ tick %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)
|
||||
|
||||
num_checkpoints = 0
|
||||
exit_cause = ''
|
||||
|
||||
# If we're taking and restoring checkpoints, use checkpoint_dir
|
||||
# option only for finding the checkpoints to restore from. This
|
||||
# lets us test checkpointing by restoring from one set of
|
||||
# checkpoints, generating a second set, and then comparing them.
|
||||
if options.take_checkpoints and options.checkpoint_restore:
|
||||
if m5.options.outdir:
|
||||
cptdir = m5.options.outdir
|
||||
else:
|
||||
cptdir = getcwd()
|
||||
|
||||
# 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 != None :
|
||||
if options.at_instruction or options.simpoint:
|
||||
checkpoint_inst = int(options.take_checkpoints)
|
||||
|
||||
# maintain correct offset if we restored from some instruction
|
||||
if options.checkpoint_restore != None:
|
||||
checkpoint_inst += options.checkpoint_restore
|
||||
|
||||
print "Creating checkpoint at inst:%d" % (checkpoint_inst)
|
||||
exit_event = m5.simulate()
|
||||
print "exit cause = %s" % (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(joinpath(cptdir, "cpt.%s.%d" % \
|
||||
(options.bench, checkpoint_inst)))
|
||||
print "Checkpoint written."
|
||||
num_checkpoints += 1
|
||||
|
||||
if exit_event.getCause() == "user interrupt received":
|
||||
exit_cause = exit_event.getCause();
|
||||
else:
|
||||
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 exit_event.getCause() == "simulate() limit reached":
|
||||
m5.checkpoint(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(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(joinpath(cptdir, "cpt.%d"))
|
||||
num_checkpoints += 1
|
||||
if num_checkpoints == max_checkpoints:
|
||||
exit_cause = "maximum %d checkpoints dropped" % max_checkpoints
|
||||
break
|
||||
|
||||
exit_event = m5.simulate(maxtick - m5.curTick())
|
||||
exit_cause = exit_event.getCause()
|
||||
|
||||
if exit_cause == '':
|
||||
exit_cause = exit_event.getCause()
|
||||
print 'Exiting @ tick %i because %s' % (m5.curTick(), exit_cause)
|
||||
|
||||
if options.checkpoint_at_end:
|
||||
m5.checkpoint(joinpath(cptdir, "cpt.%d"))
|
||||
|
||||
71
simulators/gem5/configs/common/SysPaths.py
Normal file
71
simulators/gem5/configs/common/SysPaths.py
Normal file
@ -0,0 +1,71 @@
|
||||
# Copyright (c) 2006 The Regents of The University of Michigan
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Authors: Ali Saidi
|
||||
|
||||
import os, sys
|
||||
from os.path import isdir, join as joinpath
|
||||
from os import environ as env
|
||||
|
||||
config_path = os.path.dirname(os.path.abspath(__file__))
|
||||
config_root = os.path.dirname(config_path)
|
||||
|
||||
def disk(file):
|
||||
system()
|
||||
return joinpath(disk.dir, file)
|
||||
|
||||
def binary(file):
|
||||
system()
|
||||
return joinpath(binary.dir, file)
|
||||
|
||||
def script(file):
|
||||
system()
|
||||
return joinpath(script.dir, file)
|
||||
|
||||
def system():
|
||||
if not system.dir:
|
||||
try:
|
||||
path = env['M5_PATH'].split(':')
|
||||
except KeyError:
|
||||
path = [ '/dist/m5/system', '/n/poolfs/z/dist/m5/system' ]
|
||||
|
||||
for system.dir in path:
|
||||
if os.path.isdir(system.dir):
|
||||
break
|
||||
else:
|
||||
raise ImportError, "Can't find a path to system files."
|
||||
|
||||
if not binary.dir:
|
||||
binary.dir = joinpath(system.dir, 'binaries')
|
||||
if not disk.dir:
|
||||
disk.dir = joinpath(system.dir, 'disks')
|
||||
if not script.dir:
|
||||
script.dir = joinpath(config_root, 'boot')
|
||||
|
||||
system.dir = None
|
||||
binary.dir = None
|
||||
disk.dir = None
|
||||
script.dir = None
|
||||
754
simulators/gem5/configs/common/cpu2000.py
Normal file
754
simulators/gem5/configs/common/cpu2000.py
Normal file
@ -0,0 +1,754 @@
|
||||
# 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
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Authors: Nathan Binkert
|
||||
|
||||
import os
|
||||
import sys
|
||||
from os.path import basename, exists, join as joinpath, normpath
|
||||
from os.path import isdir, isfile, islink
|
||||
|
||||
spec_dist = os.environ.get('M5_CPU2000', '/dist/m5/cpu2000')
|
||||
|
||||
def copyfiles(srcdir, dstdir):
|
||||
from filecmp import cmp as filecmp
|
||||
from shutil import copyfile
|
||||
|
||||
srcdir = normpath(srcdir)
|
||||
dstdir = normpath(dstdir)
|
||||
|
||||
if not isdir(dstdir):
|
||||
os.mkdir(dstdir)
|
||||
|
||||
for root, dirs, files in os.walk(srcdir):
|
||||
root = normpath(root)
|
||||
prefix = os.path.commonprefix([root, srcdir])
|
||||
|
||||
root = root[len(prefix):]
|
||||
if root.startswith('/'):
|
||||
root = root[1:]
|
||||
|
||||
for entry in dirs:
|
||||
newdir = joinpath(dstdir, root, entry)
|
||||
if not isdir(newdir):
|
||||
os.mkdir(newdir)
|
||||
|
||||
for entry in files:
|
||||
dest = normpath(joinpath(dstdir, root, entry))
|
||||
src = normpath(joinpath(srcdir, root, entry))
|
||||
if not isfile(dest) or not filecmp(src, dest):
|
||||
copyfile(src, dest)
|
||||
|
||||
# some of the spec benchmarks expect to be run from one directory up.
|
||||
# just create some symlinks that solve the problem
|
||||
inlink = joinpath(dstdir, 'input')
|
||||
outlink = joinpath(dstdir, 'output')
|
||||
if not exists(inlink):
|
||||
os.symlink('.', inlink)
|
||||
if not exists(outlink):
|
||||
os.symlink('.', outlink)
|
||||
|
||||
class Benchmark(object):
|
||||
def __init__(self, isa, os, input_set):
|
||||
if not hasattr(self.__class__, 'name'):
|
||||
self.name = self.__class__.__name__
|
||||
|
||||
if not hasattr(self.__class__, 'binary'):
|
||||
self.binary = self.name
|
||||
|
||||
if not hasattr(self.__class__, 'args'):
|
||||
self.args = []
|
||||
|
||||
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:
|
||||
raise AttributeError, \
|
||||
'The benchmark %s does not have the %s input set' % \
|
||||
(self.name, input_set)
|
||||
|
||||
executable = joinpath(spec_dist, 'binaries', isa, os, self.binary)
|
||||
if not isfile(executable):
|
||||
raise AttributeError, '%s not found' % executable
|
||||
self.executable = executable
|
||||
|
||||
# root of tree for input & output data files
|
||||
data_dir = joinpath(spec_dist, 'data', self.name)
|
||||
# optional subtree with files shared across input sets
|
||||
all_dir = joinpath(data_dir, 'all')
|
||||
# dirs for input & output files for this input set
|
||||
inputs_dir = joinpath(data_dir, input_set, 'input')
|
||||
outputs_dir = joinpath(data_dir, input_set, 'output')
|
||||
# keep around which input set was specified
|
||||
self.input_set = input_set
|
||||
|
||||
if not isdir(inputs_dir):
|
||||
raise AttributeError, '%s not found' % inputs_dir
|
||||
|
||||
self.inputs_dir = [ inputs_dir ]
|
||||
if isdir(all_dir):
|
||||
self.inputs_dir += [ joinpath(all_dir, 'input') ]
|
||||
if isdir(outputs_dir):
|
||||
self.outputs_dir = outputs_dir
|
||||
|
||||
if not hasattr(self.__class__, 'stdin'):
|
||||
self.stdin = joinpath(inputs_dir, '%s.in' % self.name)
|
||||
if not isfile(self.stdin):
|
||||
self.stdin = None
|
||||
|
||||
if not hasattr(self.__class__, 'stdout'):
|
||||
self.stdout = joinpath(outputs_dir, '%s.out' % self.name)
|
||||
if not isfile(self.stdout):
|
||||
self.stdout = None
|
||||
|
||||
func(self, isa, os)
|
||||
|
||||
def makeLiveProcessArgs(self, **kwargs):
|
||||
# set up default args for LiveProcess object
|
||||
process_args = {}
|
||||
process_args['cmd'] = [ self.name ] + self.args
|
||||
process_args['executable'] = self.executable
|
||||
if self.stdin:
|
||||
process_args['input'] = self.stdin
|
||||
if self.stdout:
|
||||
process_args['output'] = self.stdout
|
||||
if self.simpoint:
|
||||
process_args['simpoint'] = self.simpoint
|
||||
# explicit keywords override defaults
|
||||
process_args.update(kwargs)
|
||||
|
||||
return process_args
|
||||
|
||||
def makeLiveProcess(self, **kwargs):
|
||||
process_args = self.makeLiveProcessArgs(**kwargs)
|
||||
|
||||
# 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 import options
|
||||
cwd = options.outdir
|
||||
process_args['cwd'] = cwd
|
||||
if not isdir(cwd):
|
||||
os.makedirs(cwd)
|
||||
# copy input files to working directory
|
||||
for d in self.inputs_dir:
|
||||
copyfiles(d, cwd)
|
||||
# generate LiveProcess object
|
||||
from m5.objects import LiveProcess
|
||||
return LiveProcess(**process_args)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class DefaultBenchmark(Benchmark):
|
||||
def ref(self, isa, os): pass
|
||||
def test(self, isa, os): pass
|
||||
def train(self, isa, os): pass
|
||||
|
||||
class MinneDefaultBenchmark(DefaultBenchmark):
|
||||
def smred(self, isa, os): pass
|
||||
def mdred(self, isa, os): pass
|
||||
def lgred(self, isa, os): pass
|
||||
|
||||
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'
|
||||
number = 179
|
||||
lang = 'C'
|
||||
|
||||
def test(self, isa, os):
|
||||
self.args = [ '-scanfile', 'c756hel.in',
|
||||
'-trainfile1', 'a10.img',
|
||||
'-stride', '2',
|
||||
'-startx', '134',
|
||||
'-starty', '220',
|
||||
'-endx', '139',
|
||||
'-endy', '225',
|
||||
'-objects', '1' ]
|
||||
self.output = 'test.out'
|
||||
|
||||
def train(self, isa, os):
|
||||
self.args = [ '-scanfile', 'c756hel.in',
|
||||
'-trainfile1', 'a10.img',
|
||||
'-stride', '2',
|
||||
'-startx', '134',
|
||||
'-starty', '220',
|
||||
'-endx', '184',
|
||||
'-endy', '240',
|
||||
'-objects', '3' ]
|
||||
self.output = 'train.out'
|
||||
|
||||
def lgred(self, isa, os):
|
||||
self.args = ['-scanfile', 'c756hel.in',
|
||||
'-trainfile1', 'a10.img',
|
||||
'-stride', '5',
|
||||
'-startx', '134',
|
||||
'-starty', '220',
|
||||
'-endx', '184',
|
||||
'-endy', '240',
|
||||
'-objects', '1' ]
|
||||
self.output = 'lgred.out'
|
||||
|
||||
|
||||
class art110(art):
|
||||
def ref(self, isa, os):
|
||||
self.args = [ '-scanfile', 'c756hel.in',
|
||||
'-trainfile1', 'a10.img',
|
||||
'-trainfile2', 'hc.img',
|
||||
'-stride', '2',
|
||||
'-startx', '110',
|
||||
'-starty', '200',
|
||||
'-endx', '160',
|
||||
'-endy', '240',
|
||||
'-objects', '10' ]
|
||||
self.output = 'ref.1.out'
|
||||
self.simpoint = 340*100E6
|
||||
|
||||
class art470(art):
|
||||
def ref(self, isa, os):
|
||||
self.args = [ '-scanfile', 'c756hel.in',
|
||||
'-trainfile1', 'a10.img',
|
||||
'-trainfile2', 'hc.img',
|
||||
'-stride', '2',
|
||||
'-startx', '470',
|
||||
'-starty', '140',
|
||||
'-endx', '520',
|
||||
'-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
|
||||
|
||||
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'
|
||||
number = 177
|
||||
lang = 'C'
|
||||
stdin = None
|
||||
|
||||
def __set_args(self, frames):
|
||||
self.args = [ '-frames', frames, '-meshfile', '%s.in' % self.name,
|
||||
'-ppmfile', '%s.ppm' % self.name ]
|
||||
|
||||
def test(self, isa, os):
|
||||
self.__set_args('10')
|
||||
|
||||
def train(self, isa, os):
|
||||
self.__set_args('500')
|
||||
|
||||
def ref(self, isa, os):
|
||||
self.__set_args('1000')
|
||||
self.simpoint = 1135*100E6
|
||||
|
||||
def lgred(self, isa, os):
|
||||
self.__set_args('1')
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
class bzip2(DefaultBenchmark):
|
||||
name = 'bzip2'
|
||||
number = 256
|
||||
lang = 'C'
|
||||
|
||||
def test(self, isa, os):
|
||||
self.args = [ 'input.random' ]
|
||||
|
||||
def train(self, isa, os):
|
||||
self.args = [ 'input.compressed' ]
|
||||
|
||||
class bzip2_source(bzip2):
|
||||
def ref(self, isa, os):
|
||||
self.simpoint = 977*100E6
|
||||
self.args = [ 'input.source', '58' ]
|
||||
|
||||
def lgred(self, isa, os):
|
||||
self.args = [ 'input.source', '1' ]
|
||||
|
||||
class bzip2_graphic(bzip2):
|
||||
def ref(self, isa, os):
|
||||
self.simpoint = 718*100E6
|
||||
self.args = [ 'input.graphic', '58' ]
|
||||
|
||||
def lgred(self, isa, os):
|
||||
self.args = [ 'input.graphic', '1' ]
|
||||
|
||||
class bzip2_program(bzip2):
|
||||
def ref(self, isa, os):
|
||||
self.simpoint = 458*100E6
|
||||
self.args = [ 'input.program', '58' ]
|
||||
|
||||
def lgred(self, isa, os):
|
||||
self.args = [ 'input.program', '1' ]
|
||||
|
||||
class crafty(MinneDefaultBenchmark):
|
||||
name = 'crafty'
|
||||
number = 186
|
||||
lang = 'C'
|
||||
simpoint = 774*100E6
|
||||
|
||||
class eon(MinneDefaultBenchmark):
|
||||
name = 'eon'
|
||||
number = 252
|
||||
lang = 'CXX'
|
||||
stdin = None
|
||||
|
||||
class eon_kajiya(eon):
|
||||
args = [ 'chair.control.kajiya', 'chair.camera', 'chair.surfaces',
|
||||
'chair.kajiya.ppm', 'ppm', 'pixels_out.kajiya']
|
||||
output = 'kajiya_log.out'
|
||||
|
||||
|
||||
class eon_cook(eon):
|
||||
args = [ 'chair.control.cook', 'chair.camera', 'chair.surfaces',
|
||||
'chair.cook.ppm', 'ppm', 'pixels_out.cook' ]
|
||||
output = 'cook_log.out'
|
||||
|
||||
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'
|
||||
number = 254
|
||||
lang = 'C'
|
||||
|
||||
def __set_args(self, size):
|
||||
self.args = [ '-l', './', '-q', '-m', size ]
|
||||
|
||||
def test(self, isa, os):
|
||||
self.__set_args('64M')
|
||||
|
||||
def train(self, isa, os):
|
||||
self.__set_args('128M')
|
||||
|
||||
def ref(self, isa, os):
|
||||
self.__set_args('192M')
|
||||
self.simpoint = 674*100E6
|
||||
|
||||
def lgred(self, isa, os):
|
||||
self.__set_args('64M')
|
||||
|
||||
def mdred(self, isa, os):
|
||||
self.__set_args('64M')
|
||||
|
||||
def smred(self, isa, os):
|
||||
self.__set_args('64M')
|
||||
|
||||
class gcc(DefaultBenchmark):
|
||||
name = 'gcc'
|
||||
number = 176
|
||||
lang = 'C'
|
||||
|
||||
def test(self, isa, os):
|
||||
self.args = [ 'cccp.i', '-o', 'cccp.s' ]
|
||||
|
||||
def train(self, isa, os):
|
||||
self.args = [ 'cp-decl.i', '-o', 'cp-decl.s' ]
|
||||
|
||||
def smred(self, isa, os):
|
||||
self.args = [ 'c-iterate.i', '-o', 'c-iterate.s' ]
|
||||
|
||||
def mdred(self, isa, os):
|
||||
self.args = [ 'rdlanal.i', '-o', 'rdlanal.s' ]
|
||||
|
||||
def lgred(self, isa, os):
|
||||
self.args = [ 'cp-decl.i', '-o', 'cp-decl.s' ]
|
||||
|
||||
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):
|
||||
name = 'gzip'
|
||||
number = 164
|
||||
lang = 'C'
|
||||
|
||||
def test(self, isa, os):
|
||||
self.args = [ 'input.compressed', '2' ]
|
||||
|
||||
def train(self, isa, os):
|
||||
self.args = [ 'input.combined', '32' ]
|
||||
|
||||
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' ]
|
||||
def mdred(self, isa, os):
|
||||
self.args = [ 'input.source', '1' ]
|
||||
def lgred(self, isa, os):
|
||||
self.args = [ 'input.source', '1' ]
|
||||
|
||||
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' ]
|
||||
def mdred(self, isa, os):
|
||||
self.args = [ 'input.log', '1' ]
|
||||
def lgred(self, isa, os):
|
||||
self.args = [ 'input.log', '1' ]
|
||||
|
||||
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' ]
|
||||
def mdred(self, isa, os):
|
||||
self.args = [ 'input.graphic', '1' ]
|
||||
def lgred(self, isa, os):
|
||||
self.args = [ 'input.graphic', '1' ]
|
||||
|
||||
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' ]
|
||||
def mdred(self, isa, os):
|
||||
self.args = [ 'input.random', '1' ]
|
||||
def lgred(self, isa, os):
|
||||
self.args = [ 'input.random', '1' ]
|
||||
|
||||
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' ]
|
||||
def mdred(self, isa, os):
|
||||
self.args = [ 'input.program', '1' ]
|
||||
def lgred(self, isa, os):
|
||||
self.args = [ 'input.program', '1' ]
|
||||
|
||||
class mcf(MinneDefaultBenchmark):
|
||||
name = 'mcf'
|
||||
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'
|
||||
number = 253
|
||||
lang = 'C'
|
||||
|
||||
def test(self, isa, os):
|
||||
self.args = [ '-I.', '-I', 'lib', 'test.pl' ]
|
||||
self.stdin = 'test.in'
|
||||
|
||||
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' ]
|
||||
|
||||
def train(self, isa, os):
|
||||
self.args = [ '-I', 'lib', 'diffmail.pl', '2', '350', '15', '24',
|
||||
'23', '150' ]
|
||||
|
||||
class perlbmk_scrabbl(perlbmk):
|
||||
def train(self, isa, os):
|
||||
self.args = [ '-I.', '-I', 'lib', 'scrabbl.pl' ]
|
||||
self.stdin = 'scrabbl.in'
|
||||
|
||||
class perlbmk_makerand(perlbmk):
|
||||
def ref(self, isa, os):
|
||||
self.simpoint = 11*100E6
|
||||
self.args = [ '-I', 'lib', 'makerand.pl' ]
|
||||
|
||||
def lgred(self, isa, os):
|
||||
self.args = [ '-I.', '-I', 'lib', 'lgred.makerand.pl' ]
|
||||
|
||||
def mdred(self, isa, os):
|
||||
self.args = [ '-I.', '-I', 'lib', 'mdred.makerand.pl' ]
|
||||
|
||||
def smred(self, isa, os):
|
||||
self.args = [ '-I.', '-I', 'lib', 'smred.makerand.pl' ]
|
||||
|
||||
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):
|
||||
self.args = [ '-I', 'lib', 'perfect.pl', 'b', '3' ]
|
||||
|
||||
class perlbmk_splitmail1(perlbmk):
|
||||
def ref(self, isa, os):
|
||||
self.simpoint = 405*100E6
|
||||
self.args = [ '-I', 'lib', 'splitmail.pl', '850', '5', '19',
|
||||
'18', '1500' ]
|
||||
|
||||
class perlbmk_splitmail2(perlbmk):
|
||||
def ref(self, isa, os):
|
||||
self.args = [ '-I', 'lib', 'splitmail.pl', '704', '12', '26',
|
||||
'16', '836' ]
|
||||
|
||||
class perlbmk_splitmail3(perlbmk):
|
||||
def ref(self, isa, os):
|
||||
self.args = [ '-I', 'lib', 'splitmail.pl', '535', '13', '25',
|
||||
'24', '1091' ]
|
||||
|
||||
class perlbmk_splitmail4(perlbmk):
|
||||
def ref(self, isa, os):
|
||||
self.args = [ '-I', 'lib', 'splitmail.pl', '957', '12', '23',
|
||||
'26', '1014' ]
|
||||
|
||||
class twolf(Benchmark):
|
||||
name = 'twolf'
|
||||
number = 300
|
||||
lang = 'C'
|
||||
stdin = None
|
||||
|
||||
def test(self, isa, os):
|
||||
self.args = [ 'test' ]
|
||||
|
||||
def train(self, isa, os):
|
||||
self.args = [ 'train' ]
|
||||
|
||||
def ref(self, isa, os):
|
||||
self.simpoint = 1066*100E6
|
||||
self.args = [ 'ref' ]
|
||||
|
||||
def smred(self, isa, os):
|
||||
self.args = [ 'smred' ]
|
||||
|
||||
def mdred(self, isa, os):
|
||||
self.args = [ 'mdred' ]
|
||||
|
||||
def lgred(self, isa, os):
|
||||
self.args = [ 'lgred' ]
|
||||
|
||||
class vortex(Benchmark):
|
||||
name = 'vortex'
|
||||
number = 255
|
||||
lang = 'C'
|
||||
stdin = None
|
||||
|
||||
def __init__(self, isa, os, input_set):
|
||||
if (isa == 'alpha' or isa == 'arm'):
|
||||
self.endian = 'lendian'
|
||||
elif (isa == 'sparc' or isa == 'sparc32'):
|
||||
self.endian = 'bendian'
|
||||
else:
|
||||
raise AttributeError, "unknown ISA %s" % isa
|
||||
|
||||
super(vortex, self).__init__(isa, os, input_set)
|
||||
|
||||
def test(self, isa, os):
|
||||
self.args = [ '%s.raw' % self.endian ]
|
||||
self.output = 'vortex.out'
|
||||
|
||||
def train(self, isa, os):
|
||||
self.args = [ '%s.raw' % self.endian ]
|
||||
self.output = 'vortex.out'
|
||||
|
||||
def smred(self, isa, os):
|
||||
self.args = [ '%s.raw' % self.endian ]
|
||||
self.output = 'vortex.out'
|
||||
|
||||
def mdred(self, isa, os):
|
||||
self.args = [ '%s.raw' % self.endian ]
|
||||
self.output = 'vortex.out'
|
||||
|
||||
def lgred(self, isa, os):
|
||||
self.args = [ '%s.raw' % self.endian ]
|
||||
self.output = 'vortex.out'
|
||||
|
||||
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'
|
||||
|
||||
class vpr(MinneDefaultBenchmark):
|
||||
name = 'vpr'
|
||||
number = 175
|
||||
lang = 'C'
|
||||
|
||||
# not sure about vpr minnespec place.in
|
||||
class vpr_place(vpr):
|
||||
args = [ 'net.in', 'arch.in', 'place.out', 'dum.out', '-nodisp',
|
||||
'-place_only', '-init_t', '5', '-exit_t', '0.005',
|
||||
'-alpha_t', '0.9412', '-inner_num', '2' ]
|
||||
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',
|
||||
'-first_iter_pres_fac', '4', '-initial_pres_fac', '8' ]
|
||||
output = 'route_log.out'
|
||||
|
||||
all = [ ammp, applu, apsi, art, art110, art470, equake, facerec, fma3d, galgel,
|
||||
lucas, mesa, mgrid, sixtrack, swim, wupwise, bzip2_source,
|
||||
bzip2_graphic, bzip2_program, crafty, eon_kajiya, eon_cook,
|
||||
eon_rushmeier, gap, gcc_166, gcc_200, gcc_expr, gcc_integrate,
|
||||
gcc_scilab, gzip_source, gzip_log, gzip_graphic, gzip_random,
|
||||
gzip_program, mcf, parser, perlbmk_diffmail, perlbmk_makerand,
|
||||
perlbmk_perfect, perlbmk_splitmail1, perlbmk_splitmail2,
|
||||
perlbmk_splitmail3, perlbmk_splitmail4, twolf, vortex1, vortex2,
|
||||
vortex3, vpr_place, vpr_route ]
|
||||
|
||||
__all__ = [ x.__name__ for x in all ]
|
||||
|
||||
if __name__ == '__main__':
|
||||
from pprint import pprint
|
||||
for bench in all:
|
||||
for input_set in 'ref', 'test', 'train':
|
||||
print 'class: %s' % bench.__name__
|
||||
x = bench('alpha', 'tru64', input_set)
|
||||
print '%s: %s' % (x, input_set)
|
||||
pprint(x.makeLiveProcessArgs())
|
||||
print
|
||||
Reference in New Issue
Block a user