python: Move more code into m5.util allow SCons to use that code.
Get rid of misc.py and just stick misc things in __init__.py Move utility functions out of SCons files and into m5.util Move utility type stuff from m5/__init__.py to m5/util/__init__.py Remove buildEnv from m5 and allow access only from m5.defines Rename AddToPath to addToPath while we're moving it to m5.util Rename read_command to readCommand while we're moving it Rename compare_versions to compareVersions while we're moving it. --HG-- rename : src/python/m5/convert.py => src/python/m5/util/convert.py rename : src/python/m5/smartdict.py => src/python/m5/util/smartdict.py
This commit is contained in:
parent
0d58d32ad5
commit
9a8cb7db7e
64 changed files with 450 additions and 501 deletions
68
SConstruct
68
SConstruct
|
@ -96,6 +96,7 @@ For more details, see:
|
||||||
"""
|
"""
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
# Global Python includes
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import subprocess
|
import subprocess
|
||||||
|
@ -106,55 +107,14 @@ from os.path import abspath, basename, dirname, expanduser, normpath
|
||||||
from os.path import exists, isdir, isfile
|
from os.path import exists, isdir, isfile
|
||||||
from os.path import join as joinpath, split as splitpath
|
from os.path import join as joinpath, split as splitpath
|
||||||
|
|
||||||
|
# SCons includes
|
||||||
import SCons
|
import SCons
|
||||||
import SCons.Node
|
import SCons.Node
|
||||||
|
|
||||||
def read_command(cmd, **kwargs):
|
# M5 includes
|
||||||
"""run the command cmd, read the results and return them
|
sys.path[1:1] = [ Dir('src/python').srcnode().abspath ]
|
||||||
this is sorta like `cmd` in shell"""
|
|
||||||
from subprocess import Popen, PIPE, STDOUT
|
|
||||||
|
|
||||||
if isinstance(cmd, str):
|
from m5.util import compareVersions, readCommand
|
||||||
cmd = cmd.split()
|
|
||||||
|
|
||||||
no_exception = 'exception' in kwargs
|
|
||||||
exception = kwargs.pop('exception', None)
|
|
||||||
|
|
||||||
kwargs.setdefault('shell', False)
|
|
||||||
kwargs.setdefault('stdout', PIPE)
|
|
||||||
kwargs.setdefault('stderr', STDOUT)
|
|
||||||
kwargs.setdefault('close_fds', True)
|
|
||||||
try:
|
|
||||||
subp = Popen(cmd, **kwargs)
|
|
||||||
except Exception, e:
|
|
||||||
if no_exception:
|
|
||||||
return exception
|
|
||||||
raise
|
|
||||||
|
|
||||||
return subp.communicate()[0]
|
|
||||||
|
|
||||||
# helper function: compare arrays or strings of version numbers.
|
|
||||||
# E.g., compare_version((1,3,25), (1,4,1)')
|
|
||||||
# returns -1, 0, 1 if v1 is <, ==, > v2
|
|
||||||
def compare_versions(v1, v2):
|
|
||||||
def make_version_list(v):
|
|
||||||
if isinstance(v, (list,tuple)):
|
|
||||||
return v
|
|
||||||
elif isinstance(v, str):
|
|
||||||
return map(lambda x: int(re.match('\d+', x).group()), v.split('.'))
|
|
||||||
else:
|
|
||||||
raise TypeError
|
|
||||||
|
|
||||||
v1 = make_version_list(v1)
|
|
||||||
v2 = make_version_list(v2)
|
|
||||||
# Compare corresponding elements of lists
|
|
||||||
for n1,n2 in zip(v1, v2):
|
|
||||||
if n1 < n2: return -1
|
|
||||||
if n1 > n2: return 1
|
|
||||||
# all corresponding values are equal... see if one has extra values
|
|
||||||
if len(v1) < len(v2): return -1
|
|
||||||
if len(v1) > len(v2): return 1
|
|
||||||
return 0
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
#
|
#
|
||||||
|
@ -217,7 +177,7 @@ if hgdir.exists():
|
||||||
# 1) Grab repository revision if we know it.
|
# 1) Grab repository revision if we know it.
|
||||||
cmd = "hg id -n -i -t -b"
|
cmd = "hg id -n -i -t -b"
|
||||||
try:
|
try:
|
||||||
hg_info = read_command(cmd, cwd=main.root.abspath).strip()
|
hg_info = readCommand(cmd, cwd=main.root.abspath).strip()
|
||||||
except OSError:
|
except OSError:
|
||||||
print mercurial_bin_not_found
|
print mercurial_bin_not_found
|
||||||
|
|
||||||
|
@ -381,8 +341,8 @@ main.Append(CPPPATH=[Dir('ext')])
|
||||||
# M5_PLY is used by isa_parser.py to find the PLY package.
|
# M5_PLY is used by isa_parser.py to find the PLY package.
|
||||||
main.Append(ENV = { 'M5_PLY' : Dir('ext/ply').abspath })
|
main.Append(ENV = { 'M5_PLY' : Dir('ext/ply').abspath })
|
||||||
|
|
||||||
CXX_version = read_command([main['CXX'],'--version'], exception=False)
|
CXX_version = readCommand([main['CXX'],'--version'], exception=False)
|
||||||
CXX_V = read_command([main['CXX'],'-V'], exception=False)
|
CXX_V = readCommand([main['CXX'],'-V'], exception=False)
|
||||||
|
|
||||||
main['GCC'] = CXX_version and CXX_version.find('g++') >= 0
|
main['GCC'] = CXX_version and CXX_version.find('g++') >= 0
|
||||||
main['SUNCC'] = CXX_V and CXX_V.find('Sun C++') >= 0
|
main['SUNCC'] = CXX_V and CXX_V.find('Sun C++') >= 0
|
||||||
|
@ -435,7 +395,7 @@ if not main.has_key('SWIG'):
|
||||||
Exit(1)
|
Exit(1)
|
||||||
|
|
||||||
# Check for appropriate SWIG version
|
# Check for appropriate SWIG version
|
||||||
swig_version = read_command(('swig', '-version'), exception='').split()
|
swig_version = readCommand(('swig', '-version'), exception='').split()
|
||||||
# First 3 words should be "SWIG Version x.y.z"
|
# First 3 words should be "SWIG Version x.y.z"
|
||||||
if len(swig_version) < 3 or \
|
if len(swig_version) < 3 or \
|
||||||
swig_version[0] != 'SWIG' or swig_version[1] != 'Version':
|
swig_version[0] != 'SWIG' or swig_version[1] != 'Version':
|
||||||
|
@ -443,7 +403,7 @@ if len(swig_version) < 3 or \
|
||||||
Exit(1)
|
Exit(1)
|
||||||
|
|
||||||
min_swig_version = '1.3.28'
|
min_swig_version = '1.3.28'
|
||||||
if compare_versions(swig_version[2], min_swig_version) < 0:
|
if compareVersions(swig_version[2], min_swig_version) < 0:
|
||||||
print 'Error: SWIG version', min_swig_version, 'or newer required.'
|
print 'Error: SWIG version', min_swig_version, 'or newer required.'
|
||||||
print ' Installed version:', swig_version[2]
|
print ' Installed version:', swig_version[2]
|
||||||
Exit(1)
|
Exit(1)
|
||||||
|
@ -514,8 +474,8 @@ conf.CheckLeading()
|
||||||
try:
|
try:
|
||||||
import platform
|
import platform
|
||||||
uname = platform.uname()
|
uname = platform.uname()
|
||||||
if uname[0] == 'Darwin' and compare_versions(uname[2], '9.0.0') >= 0:
|
if uname[0] == 'Darwin' and compareVersions(uname[2], '9.0.0') >= 0:
|
||||||
if int(read_command('sysctl -n hw.cpu64bit_capable')[0]):
|
if int(readCommand('sysctl -n hw.cpu64bit_capable')[0]):
|
||||||
main.Append(CCFLAGS='-arch x86_64')
|
main.Append(CCFLAGS='-arch x86_64')
|
||||||
main.Append(CFLAGS='-arch x86_64')
|
main.Append(CFLAGS='-arch x86_64')
|
||||||
main.Append(LINKFLAGS='-arch x86_64')
|
main.Append(LINKFLAGS='-arch x86_64')
|
||||||
|
@ -615,9 +575,9 @@ have_mysql = bool(mysql_config)
|
||||||
|
|
||||||
# Check MySQL version.
|
# Check MySQL version.
|
||||||
if have_mysql:
|
if have_mysql:
|
||||||
mysql_version = read_command(mysql_config + ' --version')
|
mysql_version = readCommand(mysql_config + ' --version')
|
||||||
min_mysql_version = '4.1'
|
min_mysql_version = '4.1'
|
||||||
if compare_versions(mysql_version, min_mysql_version) < 0:
|
if compareVersions(mysql_version, min_mysql_version) < 0:
|
||||||
print 'Warning: MySQL', min_mysql_version, 'or newer required.'
|
print 'Warning: MySQL', min_mysql_version, 'or newer required.'
|
||||||
print ' Version', mysql_version, 'detected.'
|
print ' Version', mysql_version, 'detected.'
|
||||||
have_mysql = False
|
have_mysql = False
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
#
|
#
|
||||||
# Authors: Lisa Hsu
|
# Authors: Lisa Hsu
|
||||||
|
|
||||||
import m5
|
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
|
|
||||||
class L1Cache(BaseCache):
|
class L1Cache(BaseCache):
|
||||||
|
|
|
@ -26,8 +26,6 @@
|
||||||
#
|
#
|
||||||
# Authors: Kevin Lim
|
# Authors: Kevin Lim
|
||||||
|
|
||||||
import m5
|
|
||||||
from m5 import makeList
|
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
from Benchmarks import *
|
from Benchmarks import *
|
||||||
|
|
||||||
|
|
|
@ -28,9 +28,13 @@
|
||||||
|
|
||||||
from os import getcwd
|
from os import getcwd
|
||||||
from os.path import join as joinpath
|
from os.path import join as joinpath
|
||||||
|
|
||||||
import m5
|
import m5
|
||||||
|
from m5.defines import buildEnv
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
m5.AddToPath('../common')
|
from m5.util import *
|
||||||
|
|
||||||
|
addToPath('../common')
|
||||||
|
|
||||||
def setCPUClass(options):
|
def setCPUClass(options):
|
||||||
|
|
||||||
|
@ -82,10 +86,10 @@ def run(options, root, testsys, cpu_class):
|
||||||
cptdir = getcwd()
|
cptdir = getcwd()
|
||||||
|
|
||||||
if options.fast_forward and options.checkpoint_restore != None:
|
if options.fast_forward and options.checkpoint_restore != None:
|
||||||
m5.fatal("Error: Can't specify both --fast-forward and --checkpoint-restore")
|
fatal("Can't specify both --fast-forward and --checkpoint-restore")
|
||||||
|
|
||||||
if options.standard_switch and not options.caches:
|
if options.standard_switch and not options.caches:
|
||||||
m5.fatal("Error: Must specify --caches when using --standard-switch")
|
fatal("Must specify --caches when using --standard-switch")
|
||||||
|
|
||||||
np = options.num_cpus
|
np = options.num_cpus
|
||||||
max_checkpoints = options.max_checkpoints
|
max_checkpoints = options.max_checkpoints
|
||||||
|
@ -107,7 +111,7 @@ def run(options, root, testsys, cpu_class):
|
||||||
if options.fast_forward:
|
if options.fast_forward:
|
||||||
testsys.cpu[i].max_insts_any_thread = int(options.fast_forward)
|
testsys.cpu[i].max_insts_any_thread = int(options.fast_forward)
|
||||||
switch_cpus[i].system = testsys
|
switch_cpus[i].system = testsys
|
||||||
if not m5.build_env['FULL_SYSTEM']:
|
if not buildEnv['FULL_SYSTEM']:
|
||||||
switch_cpus[i].workload = testsys.cpu[i].workload
|
switch_cpus[i].workload = testsys.cpu[i].workload
|
||||||
switch_cpus[i].clock = testsys.cpu[0].clock
|
switch_cpus[i].clock = testsys.cpu[0].clock
|
||||||
# simulation period
|
# simulation period
|
||||||
|
@ -126,7 +130,7 @@ def run(options, root, testsys, cpu_class):
|
||||||
for i in xrange(np):
|
for i in xrange(np):
|
||||||
switch_cpus[i].system = testsys
|
switch_cpus[i].system = testsys
|
||||||
switch_cpus_1[i].system = testsys
|
switch_cpus_1[i].system = testsys
|
||||||
if not m5.build_env['FULL_SYSTEM']:
|
if not buildEnv['FULL_SYSTEM']:
|
||||||
switch_cpus[i].workload = testsys.cpu[i].workload
|
switch_cpus[i].workload = testsys.cpu[i].workload
|
||||||
switch_cpus_1[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[i].clock = testsys.cpu[0].clock
|
||||||
|
@ -141,7 +145,7 @@ def run(options, root, testsys, cpu_class):
|
||||||
# Fast forward to a simpoint (warning: time consuming)
|
# Fast forward to a simpoint (warning: time consuming)
|
||||||
elif options.simpoint:
|
elif options.simpoint:
|
||||||
if testsys.cpu[i].workload[0].simpoint == 0:
|
if testsys.cpu[i].workload[0].simpoint == 0:
|
||||||
m5.fatal('simpoint not found')
|
fatal('simpoint not found')
|
||||||
testsys.cpu[i].max_insts_any_thread = \
|
testsys.cpu[i].max_insts_any_thread = \
|
||||||
testsys.cpu[i].workload[0].simpoint
|
testsys.cpu[i].workload[0].simpoint
|
||||||
# No distance specified, just switch
|
# No distance specified, just switch
|
||||||
|
@ -174,7 +178,7 @@ def run(options, root, testsys, cpu_class):
|
||||||
if options.simpoint:
|
if options.simpoint:
|
||||||
for i in xrange(np):
|
for i in xrange(np):
|
||||||
if testsys.cpu[i].workload[0].simpoint == 0:
|
if testsys.cpu[i].workload[0].simpoint == 0:
|
||||||
m5.fatal('no simpoint for testsys.cpu[%d].workload[0]', i)
|
fatal('no simpoint for testsys.cpu[%d].workload[0]', i)
|
||||||
checkpoint_inst = int(testsys.cpu[i].workload[0].simpoint) + offset
|
checkpoint_inst = int(testsys.cpu[i].workload[0].simpoint) + offset
|
||||||
testsys.cpu[i].max_insts_any_thread = checkpoint_inst
|
testsys.cpu[i].max_insts_any_thread = checkpoint_inst
|
||||||
# used for output below
|
# used for output below
|
||||||
|
@ -194,14 +198,13 @@ def run(options, root, testsys, cpu_class):
|
||||||
import re
|
import re
|
||||||
|
|
||||||
if not isdir(cptdir):
|
if not isdir(cptdir):
|
||||||
m5.fatal("checkpoint dir %s does not exist!", cptdir)
|
fatal("checkpoint dir %s does not exist!", cptdir)
|
||||||
|
|
||||||
if options.at_instruction:
|
if options.at_instruction:
|
||||||
checkpoint_dir = joinpath(cptdir, "cpt.%s.%s" % \
|
checkpoint_dir = joinpath(cptdir, "cpt.%s.%s" % \
|
||||||
(options.bench, options.checkpoint_restore))
|
(options.bench, options.checkpoint_restore))
|
||||||
if not exists(checkpoint_dir):
|
if not exists(checkpoint_dir):
|
||||||
m5.fatal("Unable to find checkpoint directory %s",
|
fatal("Unable to find checkpoint directory %s", checkpoint_dir)
|
||||||
checkpoint_dir)
|
|
||||||
|
|
||||||
print "Restoring checkpoint ..."
|
print "Restoring checkpoint ..."
|
||||||
m5.restoreCheckpoint(root, checkpoint_dir)
|
m5.restoreCheckpoint(root, checkpoint_dir)
|
||||||
|
@ -209,7 +212,7 @@ def run(options, root, testsys, cpu_class):
|
||||||
elif options.simpoint:
|
elif options.simpoint:
|
||||||
# assume workload 0 has the simpoint
|
# assume workload 0 has the simpoint
|
||||||
if testsys.cpu[0].workload[0].simpoint == 0:
|
if testsys.cpu[0].workload[0].simpoint == 0:
|
||||||
m5.fatal('Unable to find simpoint')
|
fatal('Unable to find simpoint')
|
||||||
|
|
||||||
options.checkpoint_restore += \
|
options.checkpoint_restore += \
|
||||||
int(testsys.cpu[0].workload[0].simpoint)
|
int(testsys.cpu[0].workload[0].simpoint)
|
||||||
|
@ -217,7 +220,7 @@ def run(options, root, testsys, cpu_class):
|
||||||
checkpoint_dir = joinpath(cptdir, "cpt.%s.%d" % \
|
checkpoint_dir = joinpath(cptdir, "cpt.%s.%d" % \
|
||||||
(options.bench, options.checkpoint_restore))
|
(options.bench, options.checkpoint_restore))
|
||||||
if not exists(checkpoint_dir):
|
if not exists(checkpoint_dir):
|
||||||
m5.fatal("Unable to find checkpoint directory %s.%s",
|
fatal("Unable to find checkpoint directory %s.%s",
|
||||||
options.bench, options.checkpoint_restore)
|
options.bench, options.checkpoint_restore)
|
||||||
|
|
||||||
print "Restoring checkpoint ..."
|
print "Restoring checkpoint ..."
|
||||||
|
@ -237,7 +240,7 @@ def run(options, root, testsys, cpu_class):
|
||||||
cpt_num = options.checkpoint_restore
|
cpt_num = options.checkpoint_restore
|
||||||
|
|
||||||
if cpt_num > len(cpts):
|
if cpt_num > len(cpts):
|
||||||
m5.fatal('Checkpoint %d not found', cpt_num)
|
fatal('Checkpoint %d not found', cpt_num)
|
||||||
|
|
||||||
## Adjust max tick based on our starting tick
|
## Adjust max tick based on our starting tick
|
||||||
maxtick = maxtick - int(cpts[cpt_num - 1])
|
maxtick = maxtick - int(cpts[cpt_num - 1])
|
||||||
|
|
|
@ -26,15 +26,20 @@
|
||||||
#
|
#
|
||||||
# Authors: Ali Saidi
|
# Authors: Ali Saidi
|
||||||
|
|
||||||
import optparse, os, sys
|
import optparse
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
import m5
|
import m5
|
||||||
|
from m5.defines import buildEnv
|
||||||
if not m5.build_env['FULL_SYSTEM']:
|
|
||||||
m5.fatal("This script requires full-system mode (*_FS).")
|
|
||||||
|
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
m5.AddToPath('../common')
|
from m5.util import addToPath, fatal
|
||||||
|
|
||||||
|
if not buildEnv['FULL_SYSTEM']:
|
||||||
|
fatal("This script requires full-system mode (*_FS).")
|
||||||
|
|
||||||
|
addToPath('../common')
|
||||||
|
|
||||||
from FSConfig import *
|
from FSConfig import *
|
||||||
from SysPaths import *
|
from SysPaths import *
|
||||||
from Benchmarks import *
|
from Benchmarks import *
|
||||||
|
@ -98,16 +103,16 @@ else:
|
||||||
|
|
||||||
np = options.num_cpus
|
np = options.num_cpus
|
||||||
|
|
||||||
if m5.build_env['TARGET_ISA'] == "alpha":
|
if buildEnv['TARGET_ISA'] == "alpha":
|
||||||
test_sys = makeLinuxAlphaSystem(test_mem_mode, bm[0])
|
test_sys = makeLinuxAlphaSystem(test_mem_mode, bm[0])
|
||||||
elif m5.build_env['TARGET_ISA'] == "mips":
|
elif buildEnv['TARGET_ISA'] == "mips":
|
||||||
test_sys = makeLinuxMipsSystem(test_mem_mode, bm[0])
|
test_sys = makeLinuxMipsSystem(test_mem_mode, bm[0])
|
||||||
elif m5.build_env['TARGET_ISA'] == "sparc":
|
elif buildEnv['TARGET_ISA'] == "sparc":
|
||||||
test_sys = makeSparcSystem(test_mem_mode, bm[0])
|
test_sys = makeSparcSystem(test_mem_mode, bm[0])
|
||||||
elif m5.build_env['TARGET_ISA'] == "x86":
|
elif buildEnv['TARGET_ISA'] == "x86":
|
||||||
test_sys = makeLinuxX86System(test_mem_mode, np, bm[0])
|
test_sys = makeLinuxX86System(test_mem_mode, np, bm[0])
|
||||||
else:
|
else:
|
||||||
m5.fatal("incapable of building non-alpha or non-sparc full system!")
|
fatal("incapable of building non-alpha or non-sparc full system!")
|
||||||
|
|
||||||
if options.kernel is not None:
|
if options.kernel is not None:
|
||||||
test_sys.kernel = binary(options.kernel)
|
test_sys.kernel = binary(options.kernel)
|
||||||
|
@ -142,17 +147,17 @@ for i in xrange(np):
|
||||||
if options.fastmem:
|
if options.fastmem:
|
||||||
test_sys.cpu[i].physmem_port = test_sys.physmem.port
|
test_sys.cpu[i].physmem_port = test_sys.physmem.port
|
||||||
|
|
||||||
if m5.build_env['TARGET_ISA'] == 'mips':
|
if buildEnv['TARGET_ISA'] == 'mips':
|
||||||
setMipsOptions(TestCPUClass)
|
setMipsOptions(TestCPUClass)
|
||||||
|
|
||||||
if len(bm) == 2:
|
if len(bm) == 2:
|
||||||
if m5.build_env['TARGET_ISA'] == 'alpha':
|
if buildEnv['TARGET_ISA'] == 'alpha':
|
||||||
drive_sys = makeLinuxAlphaSystem(drive_mem_mode, bm[1])
|
drive_sys = makeLinuxAlphaSystem(drive_mem_mode, bm[1])
|
||||||
elif m5.build_env['TARGET_ISA'] == 'mips':
|
elif buildEnv['TARGET_ISA'] == 'mips':
|
||||||
drive_sys = makeLinuxMipsSystem(drive_mem_mode, bm[1])
|
drive_sys = makeLinuxMipsSystem(drive_mem_mode, bm[1])
|
||||||
elif m5.build_env['TARGET_ISA'] == 'sparc':
|
elif buildEnv['TARGET_ISA'] == 'sparc':
|
||||||
drive_sys = makeSparcSystem(drive_mem_mode, bm[1])
|
drive_sys = makeSparcSystem(drive_mem_mode, bm[1])
|
||||||
elif m5.build.env['TARGET_ISA'] == 'x86':
|
elif buildEnv['TARGET_ISA'] == 'x86':
|
||||||
drive_sys = makeX86System(drive_mem_mode, np, bm[1])
|
drive_sys = makeX86System(drive_mem_mode, np, bm[1])
|
||||||
drive_sys.cpu = DriveCPUClass(cpu_id=0)
|
drive_sys.cpu = DriveCPUClass(cpu_id=0)
|
||||||
drive_sys.cpu.connectMemPorts(drive_sys.membus)
|
drive_sys.cpu.connectMemPorts(drive_sys.membus)
|
||||||
|
|
|
@ -26,10 +26,11 @@
|
||||||
#
|
#
|
||||||
# Authors: Ron Dreslinski
|
# Authors: Ron Dreslinski
|
||||||
|
|
||||||
|
import optparse
|
||||||
|
import sys
|
||||||
|
|
||||||
import m5
|
import m5
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
import os, optparse, sys
|
|
||||||
m5.AddToPath('../common')
|
|
||||||
|
|
||||||
parser = optparse.OptionParser()
|
parser = optparse.OptionParser()
|
||||||
|
|
||||||
|
|
|
@ -30,17 +30,22 @@
|
||||||
#
|
#
|
||||||
# "m5 test.py"
|
# "m5 test.py"
|
||||||
|
|
||||||
import m5
|
import os
|
||||||
|
import optparse
|
||||||
if m5.build_env['FULL_SYSTEM']:
|
import sys
|
||||||
m5.panic("This script requires syscall emulation mode (*_SE).")
|
|
||||||
|
|
||||||
from m5.objects import *
|
|
||||||
import os, optparse, sys
|
|
||||||
from os.path import join as joinpath
|
from os.path import join as joinpath
|
||||||
m5.AddToPath('../common')
|
|
||||||
|
import m5
|
||||||
|
from m5.defines import buildEnv
|
||||||
|
from m5.objects import *
|
||||||
|
from m5.util import addToPath, panic
|
||||||
|
|
||||||
|
if buildEnv['FULL_SYSTEM']:
|
||||||
|
panic("This script requires syscall emulation mode (*_SE).")
|
||||||
|
|
||||||
|
addToPath('../common')
|
||||||
|
|
||||||
import Simulation
|
import Simulation
|
||||||
#from Caches import *
|
|
||||||
from cpu2000 import *
|
from cpu2000 import *
|
||||||
|
|
||||||
# Get paths we might need. It's expected this file is in m5/configs/example.
|
# Get paths we might need. It's expected this file is in m5/configs/example.
|
||||||
|
@ -72,7 +77,7 @@ if args:
|
||||||
|
|
||||||
if options.bench:
|
if options.bench:
|
||||||
try:
|
try:
|
||||||
if m5.build_env['TARGET_ISA'] != 'alpha':
|
if buildEnv['TARGET_ISA'] != 'alpha':
|
||||||
print >>sys.stderr, "Simpoints code only works for Alpha ISA at this time"
|
print >>sys.stderr, "Simpoints code only works for Alpha ISA at this time"
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
exec("workload = %s('alpha', 'tru64', 'ref')" % options.bench)
|
exec("workload = %s('alpha', 'tru64', 'ref')" % options.bench)
|
||||||
|
|
|
@ -30,15 +30,21 @@
|
||||||
#
|
#
|
||||||
# "m5 test.py"
|
# "m5 test.py"
|
||||||
|
|
||||||
import m5
|
import os
|
||||||
|
import optparse
|
||||||
if m5.build_env['FULL_SYSTEM']:
|
import sys
|
||||||
m5.fatal("This script requires syscall emulation mode (*_SE).")
|
|
||||||
|
|
||||||
from m5.objects import *
|
|
||||||
import os, optparse, sys
|
|
||||||
from os.path import join as joinpath
|
from os.path import join as joinpath
|
||||||
m5.AddToPath('../common')
|
|
||||||
|
import m5
|
||||||
|
from m5.defines import buildEnv
|
||||||
|
from m5.objects import *
|
||||||
|
from m5.util import addToPath, fatal
|
||||||
|
|
||||||
|
if buildEnv['FULL_SYSTEM']:
|
||||||
|
fatal("This script requires syscall emulation mode (*_SE).")
|
||||||
|
|
||||||
|
addToPath('../common')
|
||||||
|
|
||||||
import Simulation
|
import Simulation
|
||||||
from Caches import *
|
from Caches import *
|
||||||
from cpu2000 import *
|
from cpu2000 import *
|
||||||
|
@ -70,7 +76,7 @@ if args:
|
||||||
|
|
||||||
if options.bench:
|
if options.bench:
|
||||||
try:
|
try:
|
||||||
if m5.build_env['TARGET_ISA'] != 'alpha':
|
if buildEnv['TARGET_ISA'] != 'alpha':
|
||||||
print >>sys.stderr, "Simpoints code only works for Alpha ISA at this time"
|
print >>sys.stderr, "Simpoints code only works for Alpha ISA at this time"
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
exec("workload = %s('alpha', 'tru64', 'ref')" % options.bench)
|
exec("workload = %s('alpha', 'tru64', 'ref')" % options.bench)
|
||||||
|
|
|
@ -30,10 +30,14 @@
|
||||||
#
|
#
|
||||||
# "m5 test.py"
|
# "m5 test.py"
|
||||||
|
|
||||||
|
import os
|
||||||
|
import optparse
|
||||||
|
import sys
|
||||||
|
|
||||||
import m5
|
import m5
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
import os, optparse, sys
|
|
||||||
m5.AddToPath('../common')
|
m5.util.addToPath('../common')
|
||||||
|
|
||||||
# --------------------
|
# --------------------
|
||||||
# Define Command Line Options
|
# Define Command Line Options
|
||||||
|
@ -266,10 +270,11 @@ elif options.benchmark == 'WaterNSquared':
|
||||||
elif options.benchmark == 'WaterSpatial':
|
elif options.benchmark == 'WaterSpatial':
|
||||||
root.workload = Water_spatial()
|
root.workload = Water_spatial()
|
||||||
else:
|
else:
|
||||||
panic("The --benchmark environment variable was set to something" \
|
m5.util.panic("""
|
||||||
+" improper.\nUse Cholesky, FFT, LUContig, LUNoncontig, Radix" \
|
The --benchmark environment variable was set to something improper.
|
||||||
+", Barnes, FMM, OceanContig,\nOceanNoncontig, Raytrace," \
|
Use Cholesky, FFT, LUContig, LUNoncontig, Radix, Barnes, FMM, OceanContig,
|
||||||
+" WaterNSquared, or WaterSpatial\n")
|
OceanNoncontig, Raytrace, WaterNSquared, or WaterSpatial
|
||||||
|
""")
|
||||||
|
|
||||||
# --------------------
|
# --------------------
|
||||||
# Assign the workload to the cpus
|
# Assign the workload to the cpus
|
||||||
|
|
|
@ -29,10 +29,14 @@
|
||||||
# Splash2 Run Script
|
# Splash2 Run Script
|
||||||
#
|
#
|
||||||
|
|
||||||
|
import os
|
||||||
|
import optparse
|
||||||
|
import sys
|
||||||
|
|
||||||
import m5
|
import m5
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
import os, optparse, sys
|
|
||||||
m5.AddToPath('../common')
|
m5.util.addToPath('../common')
|
||||||
|
|
||||||
# --------------------
|
# --------------------
|
||||||
# Define Command Line Options
|
# Define Command Line Options
|
||||||
|
|
|
@ -49,7 +49,7 @@ Import('*')
|
||||||
# Children need to see the environment
|
# Children need to see the environment
|
||||||
Export('env')
|
Export('env')
|
||||||
|
|
||||||
build_env = dict([(opt, env[opt]) for opt in export_vars])
|
build_env = [(opt, env[opt]) for opt in export_vars]
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Code for adding source files of various types
|
# Code for adding source files of various types
|
||||||
|
@ -266,6 +266,8 @@ for opt in export_vars:
|
||||||
# Prevent any SimObjects from being added after this point, they
|
# Prevent any SimObjects from being added after this point, they
|
||||||
# should all have been added in the SConscripts above
|
# should all have been added in the SConscripts above
|
||||||
#
|
#
|
||||||
|
SimObject.fixed = True
|
||||||
|
|
||||||
class DictImporter(object):
|
class DictImporter(object):
|
||||||
'''This importer takes a dictionary of arbitrary module names that
|
'''This importer takes a dictionary of arbitrary module names that
|
||||||
map to arbitrary filenames.'''
|
map to arbitrary filenames.'''
|
||||||
|
@ -283,7 +285,7 @@ class DictImporter(object):
|
||||||
self.installed = set()
|
self.installed = set()
|
||||||
|
|
||||||
def find_module(self, fullname, path):
|
def find_module(self, fullname, path):
|
||||||
if fullname == 'defines':
|
if fullname == 'm5.defines':
|
||||||
return self
|
return self
|
||||||
|
|
||||||
if fullname == 'm5.objects':
|
if fullname == 'm5.objects':
|
||||||
|
@ -293,7 +295,7 @@ class DictImporter(object):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
source = self.modules.get(fullname, None)
|
source = self.modules.get(fullname, None)
|
||||||
if source is not None and exists(source.snode.abspath):
|
if source is not None and fullname.startswith('m5.objects'):
|
||||||
return self
|
return self
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
@ -308,8 +310,8 @@ class DictImporter(object):
|
||||||
mod.__path__ = fullname.split('.')
|
mod.__path__ = fullname.split('.')
|
||||||
return mod
|
return mod
|
||||||
|
|
||||||
if fullname == 'defines':
|
if fullname == 'm5.defines':
|
||||||
mod.__dict__['buildEnv'] = build_env
|
mod.__dict__['buildEnv'] = m5.util.SmartDict(build_env)
|
||||||
return mod
|
return mod
|
||||||
|
|
||||||
source = self.modules[fullname]
|
source = self.modules[fullname]
|
||||||
|
@ -321,15 +323,18 @@ class DictImporter(object):
|
||||||
|
|
||||||
return mod
|
return mod
|
||||||
|
|
||||||
|
import m5.SimObject
|
||||||
|
import m5.params
|
||||||
|
|
||||||
|
m5.SimObject.clear()
|
||||||
|
m5.params.clear()
|
||||||
|
|
||||||
# install the python importer so we can grab stuff from the source
|
# install the python importer so we can grab stuff from the source
|
||||||
# tree itself. We can't have SimObjects added after this point or
|
# tree itself. We can't have SimObjects added after this point or
|
||||||
# else we won't know about them for the rest of the stuff.
|
# else we won't know about them for the rest of the stuff.
|
||||||
SimObject.fixed = True
|
|
||||||
importer = DictImporter(PySource.modules)
|
importer = DictImporter(PySource.modules)
|
||||||
sys.meta_path[0:0] = [ importer ]
|
sys.meta_path[0:0] = [ importer ]
|
||||||
|
|
||||||
import m5
|
|
||||||
|
|
||||||
# import all sim objects so we can populate the all_objects list
|
# import all sim objects so we can populate the all_objects list
|
||||||
# make sure that we're working with a list, then let's sort it
|
# make sure that we're working with a list, then let's sort it
|
||||||
for modname in SimObject.modnames:
|
for modname in SimObject.modnames:
|
||||||
|
@ -346,6 +351,12 @@ all_enums = m5.params.allEnums
|
||||||
all_params = {}
|
all_params = {}
|
||||||
for name,obj in sorted(sim_objects.iteritems()):
|
for name,obj in sorted(sim_objects.iteritems()):
|
||||||
for param in obj._params.local.values():
|
for param in obj._params.local.values():
|
||||||
|
# load the ptype attribute now because it depends on the
|
||||||
|
# current version of SimObject.allClasses, but when scons
|
||||||
|
# actually uses the value, all versions of
|
||||||
|
# SimObject.allClasses will have been loaded
|
||||||
|
param.ptype
|
||||||
|
|
||||||
if not hasattr(param, 'swig_decl'):
|
if not hasattr(param, 'swig_decl'):
|
||||||
continue
|
continue
|
||||||
pname = param.ptype_str
|
pname = param.ptype_str
|
||||||
|
@ -365,13 +376,24 @@ depends = [ PySource.modules[dep].tnode for dep in module_depends ]
|
||||||
#
|
#
|
||||||
|
|
||||||
# Generate Python file containing a dict specifying the current
|
# Generate Python file containing a dict specifying the current
|
||||||
# build_env flags.
|
# buildEnv flags.
|
||||||
def makeDefinesPyFile(target, source, env):
|
def makeDefinesPyFile(target, source, env):
|
||||||
f = file(str(target[0]), 'w')
|
|
||||||
build_env, hg_info = [ x.get_contents() for x in source ]
|
build_env, hg_info = [ x.get_contents() for x in source ]
|
||||||
print >>f, "buildEnv = %s" % build_env
|
|
||||||
print >>f, "hgRev = '%s'" % hg_info
|
code = m5.util.code_formatter()
|
||||||
f.close()
|
code("""
|
||||||
|
import m5.internal
|
||||||
|
import m5.util
|
||||||
|
|
||||||
|
buildEnv = m5.util.SmartDict($build_env)
|
||||||
|
hgRev = '$hg_info'
|
||||||
|
|
||||||
|
compileDate = m5.internal.core.compileDate
|
||||||
|
for k,v in m5.internal.core.__dict__.iteritems():
|
||||||
|
if k.startswith('flag_'):
|
||||||
|
setattr(buildEnv, k[5:], v)
|
||||||
|
""")
|
||||||
|
code.write(str(target[0]))
|
||||||
|
|
||||||
defines_info = [ Value(build_env), Value(env['HG_INFO']) ]
|
defines_info = [ Value(build_env), Value(env['HG_INFO']) ]
|
||||||
# Generate a file with all of the compile options in it
|
# Generate a file with all of the compile options in it
|
||||||
|
|
|
@ -28,10 +28,11 @@
|
||||||
#
|
#
|
||||||
# Authors: Jaidev Patwardhan
|
# Authors: Jaidev Patwardhan
|
||||||
|
|
||||||
from m5 import build_env
|
from m5.defines import buildEnv
|
||||||
|
|
||||||
from System import *
|
from System import *
|
||||||
|
|
||||||
if build_env['FULL_SYSTEM']:
|
if buildEnv['FULL_SYSTEM']:
|
||||||
class BareIronMipsSystem(MipsSystem):
|
class BareIronMipsSystem(MipsSystem):
|
||||||
type = 'BareIronMipsSystem'
|
type = 'BareIronMipsSystem'
|
||||||
system_type = 34
|
system_type = 34
|
||||||
|
|
|
@ -29,12 +29,13 @@
|
||||||
# Authors: Jaidev Patwardhan
|
# Authors: Jaidev Patwardhan
|
||||||
# Korey Sewell
|
# Korey Sewell
|
||||||
|
|
||||||
from m5.SimObject import SimObject
|
from m5.defines import buildEnv
|
||||||
from m5.params import *
|
from m5.params import *
|
||||||
|
|
||||||
from BaseCPU import BaseCPU
|
from BaseCPU import BaseCPU
|
||||||
|
|
||||||
class BaseMipsCPU(BaseCPU)
|
class BaseMipsCPU(BaseCPU)
|
||||||
if build_env['TARGET_ISA'] == 'mips':
|
if buildEnv['TARGET_ISA'] == 'mips':
|
||||||
CP0_IntCtl_IPTI = Param.Unsigned(0,"No Description")
|
CP0_IntCtl_IPTI = Param.Unsigned(0,"No Description")
|
||||||
CP0_IntCtl_IPPCI = Param.Unsigned(0,"No Description")
|
CP0_IntCtl_IPPCI = Param.Unsigned(0,"No Description")
|
||||||
CP0_SrsCtl_HSS = Param.Unsigned(0,"No Description")
|
CP0_SrsCtl_HSS = Param.Unsigned(0,"No Description")
|
||||||
|
|
|
@ -28,10 +28,10 @@
|
||||||
#
|
#
|
||||||
# Authors: Jaidev Patwardhan
|
# Authors: Jaidev Patwardhan
|
||||||
|
|
||||||
from m5.SimObject import SimObject
|
from m5.defines import buildEnv
|
||||||
from m5.params import *
|
from m5.params import *
|
||||||
from m5.proxy import *
|
from m5.proxy import *
|
||||||
from m5 import build_env
|
|
||||||
from System import System
|
from System import System
|
||||||
|
|
||||||
class MipsSystem(System):
|
class MipsSystem(System):
|
||||||
|
@ -42,7 +42,7 @@ class MipsSystem(System):
|
||||||
system_type = Param.UInt64("Type of system we are emulating")
|
system_type = Param.UInt64("Type of system we are emulating")
|
||||||
system_rev = Param.UInt64("Revision of system we are emulating")
|
system_rev = Param.UInt64("Revision of system we are emulating")
|
||||||
|
|
||||||
if build_env['FULL_SYSTEM']:
|
if buildEnv['FULL_SYSTEM']:
|
||||||
class LinuxMipsSystem(MipsSystem):
|
class LinuxMipsSystem(MipsSystem):
|
||||||
type = 'LinuxMipsSystem'
|
type = 'LinuxMipsSystem'
|
||||||
system_type = 34
|
system_type = 34
|
||||||
|
|
|
@ -53,13 +53,14 @@
|
||||||
#
|
#
|
||||||
# Authors: Gabe Black
|
# Authors: Gabe Black
|
||||||
|
|
||||||
from MemObject import MemObject
|
from m5.defines import buildEnv
|
||||||
from m5.params import *
|
from m5.params import *
|
||||||
from m5.proxy import *
|
from m5.proxy import *
|
||||||
from m5 import build_env
|
|
||||||
from BaseTLB import BaseTLB
|
|
||||||
|
|
||||||
if build_env['FULL_SYSTEM']:
|
from BaseTLB import BaseTLB
|
||||||
|
from MemObject import MemObject
|
||||||
|
|
||||||
|
if buildEnv['FULL_SYSTEM']:
|
||||||
class X86PagetableWalker(MemObject):
|
class X86PagetableWalker(MemObject):
|
||||||
type = 'X86PagetableWalker'
|
type = 'X86PagetableWalker'
|
||||||
cxx_class = 'X86ISA::Walker'
|
cxx_class = 'X86ISA::Walker'
|
||||||
|
@ -70,6 +71,6 @@ class X86TLB(BaseTLB):
|
||||||
type = 'X86TLB'
|
type = 'X86TLB'
|
||||||
cxx_class = 'X86ISA::TLB'
|
cxx_class = 'X86ISA::TLB'
|
||||||
size = Param.Int(64, "TLB size")
|
size = Param.Int(64, "TLB size")
|
||||||
if build_env['FULL_SYSTEM']:
|
if buildEnv['FULL_SYSTEM']:
|
||||||
walker = Param.X86PagetableWalker(\
|
walker = Param.X86PagetableWalker(\
|
||||||
X86PagetableWalker(), "page table walker")
|
X86PagetableWalker(), "page table walker")
|
||||||
|
|
|
@ -26,36 +26,38 @@
|
||||||
#
|
#
|
||||||
# Authors: Nathan Binkert
|
# Authors: Nathan Binkert
|
||||||
|
|
||||||
from MemObject import MemObject
|
import sys
|
||||||
|
|
||||||
|
from m5.defines import buildEnv
|
||||||
from m5.params import *
|
from m5.params import *
|
||||||
from m5.proxy import *
|
from m5.proxy import *
|
||||||
from m5 import build_env
|
|
||||||
from Bus import Bus
|
from Bus import Bus
|
||||||
from InstTracer import InstTracer
|
from InstTracer import InstTracer
|
||||||
from ExeTracer import ExeTracer
|
from ExeTracer import ExeTracer
|
||||||
import sys
|
from MemObject import MemObject
|
||||||
|
|
||||||
default_tracer = ExeTracer()
|
default_tracer = ExeTracer()
|
||||||
|
|
||||||
if build_env['TARGET_ISA'] == 'alpha':
|
if buildEnv['TARGET_ISA'] == 'alpha':
|
||||||
from AlphaTLB import AlphaDTB, AlphaITB
|
from AlphaTLB import AlphaDTB, AlphaITB
|
||||||
if build_env['FULL_SYSTEM']:
|
if buildEnv['FULL_SYSTEM']:
|
||||||
from AlphaInterrupts import AlphaInterrupts
|
from AlphaInterrupts import AlphaInterrupts
|
||||||
elif build_env['TARGET_ISA'] == 'sparc':
|
elif buildEnv['TARGET_ISA'] == 'sparc':
|
||||||
from SparcTLB import SparcTLB
|
from SparcTLB import SparcTLB
|
||||||
if build_env['FULL_SYSTEM']:
|
if buildEnv['FULL_SYSTEM']:
|
||||||
from SparcInterrupts import SparcInterrupts
|
from SparcInterrupts import SparcInterrupts
|
||||||
elif build_env['TARGET_ISA'] == 'x86':
|
elif buildEnv['TARGET_ISA'] == 'x86':
|
||||||
from X86TLB import X86TLB
|
from X86TLB import X86TLB
|
||||||
if build_env['FULL_SYSTEM']:
|
if buildEnv['FULL_SYSTEM']:
|
||||||
from X86LocalApic import X86LocalApic
|
from X86LocalApic import X86LocalApic
|
||||||
elif build_env['TARGET_ISA'] == 'mips':
|
elif buildEnv['TARGET_ISA'] == 'mips':
|
||||||
from MipsTLB import MipsTLB
|
from MipsTLB import MipsTLB
|
||||||
if build_env['FULL_SYSTEM']:
|
if buildEnv['FULL_SYSTEM']:
|
||||||
from MipsInterrupts import MipsInterrupts
|
from MipsInterrupts import MipsInterrupts
|
||||||
elif build_env['TARGET_ISA'] == 'arm':
|
elif buildEnv['TARGET_ISA'] == 'arm':
|
||||||
from ArmTLB import ArmTLB
|
from ArmTLB import ArmTLB
|
||||||
if build_env['FULL_SYSTEM']:
|
if buildEnv['FULL_SYSTEM']:
|
||||||
from ArmInterrupts import ArmInterrupts
|
from ArmInterrupts import ArmInterrupts
|
||||||
|
|
||||||
class BaseCPU(MemObject):
|
class BaseCPU(MemObject):
|
||||||
|
@ -76,47 +78,47 @@ class BaseCPU(MemObject):
|
||||||
do_statistics_insts = Param.Bool(True,
|
do_statistics_insts = Param.Bool(True,
|
||||||
"enable statistics pseudo instructions")
|
"enable statistics pseudo instructions")
|
||||||
|
|
||||||
if build_env['FULL_SYSTEM']:
|
if buildEnv['FULL_SYSTEM']:
|
||||||
profile = Param.Latency('0ns', "trace the kernel stack")
|
profile = Param.Latency('0ns', "trace the kernel stack")
|
||||||
do_quiesce = Param.Bool(True, "enable quiesce instructions")
|
do_quiesce = Param.Bool(True, "enable quiesce instructions")
|
||||||
else:
|
else:
|
||||||
workload = VectorParam.Process("processes to run")
|
workload = VectorParam.Process("processes to run")
|
||||||
|
|
||||||
if build_env['TARGET_ISA'] == 'sparc':
|
if buildEnv['TARGET_ISA'] == 'sparc':
|
||||||
dtb = Param.SparcTLB(SparcTLB(), "Data TLB")
|
dtb = Param.SparcTLB(SparcTLB(), "Data TLB")
|
||||||
itb = Param.SparcTLB(SparcTLB(), "Instruction TLB")
|
itb = Param.SparcTLB(SparcTLB(), "Instruction TLB")
|
||||||
if build_env['FULL_SYSTEM']:
|
if buildEnv['FULL_SYSTEM']:
|
||||||
interrupts = Param.SparcInterrupts(
|
interrupts = Param.SparcInterrupts(
|
||||||
SparcInterrupts(), "Interrupt Controller")
|
SparcInterrupts(), "Interrupt Controller")
|
||||||
elif build_env['TARGET_ISA'] == 'alpha':
|
elif buildEnv['TARGET_ISA'] == 'alpha':
|
||||||
dtb = Param.AlphaTLB(AlphaDTB(), "Data TLB")
|
dtb = Param.AlphaTLB(AlphaDTB(), "Data TLB")
|
||||||
itb = Param.AlphaTLB(AlphaITB(), "Instruction TLB")
|
itb = Param.AlphaTLB(AlphaITB(), "Instruction TLB")
|
||||||
if build_env['FULL_SYSTEM']:
|
if buildEnv['FULL_SYSTEM']:
|
||||||
interrupts = Param.AlphaInterrupts(
|
interrupts = Param.AlphaInterrupts(
|
||||||
AlphaInterrupts(), "Interrupt Controller")
|
AlphaInterrupts(), "Interrupt Controller")
|
||||||
elif build_env['TARGET_ISA'] == 'x86':
|
elif buildEnv['TARGET_ISA'] == 'x86':
|
||||||
dtb = Param.X86TLB(X86TLB(), "Data TLB")
|
dtb = Param.X86TLB(X86TLB(), "Data TLB")
|
||||||
itb = Param.X86TLB(X86TLB(), "Instruction TLB")
|
itb = Param.X86TLB(X86TLB(), "Instruction TLB")
|
||||||
if build_env['FULL_SYSTEM']:
|
if buildEnv['FULL_SYSTEM']:
|
||||||
_localApic = X86LocalApic(pio_addr=0x2000000000000000)
|
_localApic = X86LocalApic(pio_addr=0x2000000000000000)
|
||||||
interrupts = \
|
interrupts = \
|
||||||
Param.X86LocalApic(_localApic, "Interrupt Controller")
|
Param.X86LocalApic(_localApic, "Interrupt Controller")
|
||||||
elif build_env['TARGET_ISA'] == 'mips':
|
elif buildEnv['TARGET_ISA'] == 'mips':
|
||||||
dtb = Param.MipsTLB(MipsTLB(), "Data TLB")
|
dtb = Param.MipsTLB(MipsTLB(), "Data TLB")
|
||||||
itb = Param.MipsTLB(MipsTLB(), "Instruction TLB")
|
itb = Param.MipsTLB(MipsTLB(), "Instruction TLB")
|
||||||
if build_env['FULL_SYSTEM']:
|
if buildEnv['FULL_SYSTEM']:
|
||||||
interrupts = Param.MipsInterrupts(
|
interrupts = Param.MipsInterrupts(
|
||||||
MipsInterrupts(), "Interrupt Controller")
|
MipsInterrupts(), "Interrupt Controller")
|
||||||
elif build_env['TARGET_ISA'] == 'arm':
|
elif buildEnv['TARGET_ISA'] == 'arm':
|
||||||
UnifiedTLB = Param.Bool(True, "Is this a Unified TLB?")
|
UnifiedTLB = Param.Bool(True, "Is this a Unified TLB?")
|
||||||
dtb = Param.ArmTLB(ArmTLB(), "Data TLB")
|
dtb = Param.ArmTLB(ArmTLB(), "Data TLB")
|
||||||
itb = Param.ArmTLB(ArmTLB(), "Instruction TLB")
|
itb = Param.ArmTLB(ArmTLB(), "Instruction TLB")
|
||||||
if build_env['FULL_SYSTEM']:
|
if buildEnv['FULL_SYSTEM']:
|
||||||
interrupts = Param.ArmInterrupts(
|
interrupts = Param.ArmInterrupts(
|
||||||
ArmInterrupts(), "Interrupt Controller")
|
ArmInterrupts(), "Interrupt Controller")
|
||||||
else:
|
else:
|
||||||
print "Don't know what TLB to use for ISA %s" % \
|
print "Don't know what TLB to use for ISA %s" % \
|
||||||
build_env['TARGET_ISA']
|
buildEnv['TARGET_ISA']
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
max_insts_all_threads = Param.Counter(0,
|
max_insts_all_threads = Param.Counter(0,
|
||||||
|
@ -139,7 +141,7 @@ class BaseCPU(MemObject):
|
||||||
tracer = Param.InstTracer(default_tracer, "Instruction tracer")
|
tracer = Param.InstTracer(default_tracer, "Instruction tracer")
|
||||||
|
|
||||||
_mem_ports = []
|
_mem_ports = []
|
||||||
if build_env['TARGET_ISA'] == 'x86' and build_env['FULL_SYSTEM']:
|
if buildEnv['TARGET_ISA'] == 'x86' and buildEnv['FULL_SYSTEM']:
|
||||||
_mem_ports = ["itb.walker.port",
|
_mem_ports = ["itb.walker.port",
|
||||||
"dtb.walker.port",
|
"dtb.walker.port",
|
||||||
"interrupts.pio",
|
"interrupts.pio",
|
||||||
|
@ -157,7 +159,7 @@ class BaseCPU(MemObject):
|
||||||
self.icache_port = ic.cpu_side
|
self.icache_port = ic.cpu_side
|
||||||
self.dcache_port = dc.cpu_side
|
self.dcache_port = dc.cpu_side
|
||||||
self._mem_ports = ['icache.mem_side', 'dcache.mem_side']
|
self._mem_ports = ['icache.mem_side', 'dcache.mem_side']
|
||||||
if build_env['TARGET_ISA'] == 'x86' and build_env['FULL_SYSTEM']:
|
if buildEnv['TARGET_ISA'] == 'x86' and buildEnv['FULL_SYSTEM']:
|
||||||
self._mem_ports += ["itb.walker_port", "dtb.walker_port"]
|
self._mem_ports += ["itb.walker_port", "dtb.walker_port"]
|
||||||
|
|
||||||
def addTwoLevelCacheHierarchy(self, ic, dc, l2c):
|
def addTwoLevelCacheHierarchy(self, ic, dc, l2c):
|
||||||
|
@ -168,7 +170,7 @@ class BaseCPU(MemObject):
|
||||||
self.l2cache.cpu_side = self.toL2Bus.port
|
self.l2cache.cpu_side = self.toL2Bus.port
|
||||||
self._mem_ports = ['l2cache.mem_side']
|
self._mem_ports = ['l2cache.mem_side']
|
||||||
|
|
||||||
if build_env['TARGET_ISA'] == 'mips':
|
if buildEnv['TARGET_ISA'] == 'mips':
|
||||||
CP0_IntCtl_IPTI = Param.Unsigned(0,"No Description")
|
CP0_IntCtl_IPTI = Param.Unsigned(0,"No Description")
|
||||||
CP0_IntCtl_IPPCI = Param.Unsigned(0,"No Description")
|
CP0_IntCtl_IPPCI = Param.Unsigned(0,"No Description")
|
||||||
CP0_SrsCtl_HSS = Param.Unsigned(0,"No Description")
|
CP0_SrsCtl_HSS = Param.Unsigned(0,"No Description")
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
# Authors: Nathan Binkert
|
# Authors: Nathan Binkert
|
||||||
|
|
||||||
from m5.params import *
|
from m5.params import *
|
||||||
from m5 import build_env
|
|
||||||
from BaseCPU import BaseCPU
|
from BaseCPU import BaseCPU
|
||||||
|
|
||||||
class CheckerCPU(BaseCPU):
|
class CheckerCPU(BaseCPU):
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
|
|
||||||
from m5.params import *
|
from m5.params import *
|
||||||
from m5.proxy import *
|
from m5.proxy import *
|
||||||
from m5 import build_env
|
|
||||||
from BaseCPU import BaseCPU
|
from BaseCPU import BaseCPU
|
||||||
|
|
||||||
class InOrderCPU(BaseCPU):
|
class InOrderCPU(BaseCPU):
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
from MemObject import MemObject
|
from MemObject import MemObject
|
||||||
from m5.params import *
|
from m5.params import *
|
||||||
from m5.proxy import *
|
from m5.proxy import *
|
||||||
from m5 import build_env
|
|
||||||
|
|
||||||
class MemTest(MemObject):
|
class MemTest(MemObject):
|
||||||
type = 'MemTest'
|
type = 'MemTest'
|
||||||
|
|
|
@ -26,21 +26,21 @@
|
||||||
#
|
#
|
||||||
# Authors: Kevin Lim
|
# Authors: Kevin Lim
|
||||||
|
|
||||||
|
from m5.defines import buildEnv
|
||||||
from m5.params import *
|
from m5.params import *
|
||||||
from m5.proxy import *
|
from m5.proxy import *
|
||||||
from m5 import build_env
|
|
||||||
from BaseCPU import BaseCPU
|
from BaseCPU import BaseCPU
|
||||||
from FUPool import *
|
from FUPool import *
|
||||||
|
|
||||||
if build_env['USE_CHECKER']:
|
if buildEnv['USE_CHECKER']:
|
||||||
from O3Checker import O3Checker
|
from O3Checker import O3Checker
|
||||||
|
|
||||||
class DerivO3CPU(BaseCPU):
|
class DerivO3CPU(BaseCPU):
|
||||||
type = 'DerivO3CPU'
|
type = 'DerivO3CPU'
|
||||||
activity = Param.Unsigned(0, "Initial count")
|
activity = Param.Unsigned(0, "Initial count")
|
||||||
|
|
||||||
if build_env['USE_CHECKER']:
|
if buildEnv['USE_CHECKER']:
|
||||||
if not build_env['FULL_SYSTEM']:
|
if not buildEnv['FULL_SYSTEM']:
|
||||||
checker = Param.BaseCPU(O3Checker(workload=Parent.workload,
|
checker = Param.BaseCPU(O3Checker(workload=Parent.workload,
|
||||||
exitOnError=False,
|
exitOnError=False,
|
||||||
updateOnError=True,
|
updateOnError=True,
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
# Authors: Nathan Binkert
|
# Authors: Nathan Binkert
|
||||||
|
|
||||||
from m5.params import *
|
from m5.params import *
|
||||||
from m5 import build_env
|
|
||||||
from BaseCPU import BaseCPU
|
from BaseCPU import BaseCPU
|
||||||
|
|
||||||
class O3Checker(BaseCPU):
|
class O3Checker(BaseCPU):
|
||||||
|
|
|
@ -26,11 +26,11 @@
|
||||||
#
|
#
|
||||||
# Authors: Kevin Lim
|
# Authors: Kevin Lim
|
||||||
|
|
||||||
|
from m5.defines import buildEnv
|
||||||
from m5.params import *
|
from m5.params import *
|
||||||
from m5 import build_env
|
|
||||||
from BaseCPU import BaseCPU
|
from BaseCPU import BaseCPU
|
||||||
|
|
||||||
if build_env['USE_CHECKER']:
|
if buildEnv['USE_CHECKER']:
|
||||||
from OzoneChecker import OzoneChecker
|
from OzoneChecker import OzoneChecker
|
||||||
|
|
||||||
class DerivOzoneCPU(BaseCPU):
|
class DerivOzoneCPU(BaseCPU):
|
||||||
|
@ -38,7 +38,7 @@ class DerivOzoneCPU(BaseCPU):
|
||||||
|
|
||||||
numThreads = Param.Unsigned("number of HW thread contexts")
|
numThreads = Param.Unsigned("number of HW thread contexts")
|
||||||
|
|
||||||
if build_env['USE_CHECKER']:
|
if buildEnv['USE_CHECKER']:
|
||||||
checker = Param.BaseCPU("Checker CPU")
|
checker = Param.BaseCPU("Checker CPU")
|
||||||
|
|
||||||
icache_port = Port("Instruction Port")
|
icache_port = Port("Instruction Port")
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
# Authors: Nathan Binkert
|
# Authors: Nathan Binkert
|
||||||
|
|
||||||
from m5.params import *
|
from m5.params import *
|
||||||
from m5 import build_env
|
|
||||||
from BaseCPU import BaseCPU
|
from BaseCPU import BaseCPU
|
||||||
|
|
||||||
class OzoneChecker(BaseCPU):
|
class OzoneChecker(BaseCPU):
|
||||||
|
|
|
@ -26,8 +26,8 @@
|
||||||
#
|
#
|
||||||
# Authors: Kevin Lim
|
# Authors: Kevin Lim
|
||||||
|
|
||||||
|
from m5.defines import buildEnv
|
||||||
from m5.params import *
|
from m5.params import *
|
||||||
from m5 import build_env
|
|
||||||
from BaseCPU import BaseCPU
|
from BaseCPU import BaseCPU
|
||||||
|
|
||||||
class SimpleOzoneCPU(BaseCPU):
|
class SimpleOzoneCPU(BaseCPU):
|
||||||
|
@ -35,7 +35,7 @@ class SimpleOzoneCPU(BaseCPU):
|
||||||
|
|
||||||
numThreads = Param.Unsigned("number of HW thread contexts")
|
numThreads = Param.Unsigned("number of HW thread contexts")
|
||||||
|
|
||||||
if not build_env['FULL_SYSTEM']:
|
if not buildEnv['FULL_SYSTEM']:
|
||||||
mem = Param.FunctionalMemory(NULL, "memory")
|
mem = Param.FunctionalMemory(NULL, "memory")
|
||||||
|
|
||||||
width = Param.Unsigned("Width")
|
width = Param.Unsigned("Width")
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
# Authors: Nathan Binkert
|
# Authors: Nathan Binkert
|
||||||
|
|
||||||
from m5.params import *
|
from m5.params import *
|
||||||
from m5 import build_env
|
|
||||||
from BaseSimpleCPU import BaseSimpleCPU
|
from BaseSimpleCPU import BaseSimpleCPU
|
||||||
|
|
||||||
class AtomicSimpleCPU(BaseSimpleCPU):
|
class AtomicSimpleCPU(BaseSimpleCPU):
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
# Authors: Nathan Binkert
|
# Authors: Nathan Binkert
|
||||||
|
|
||||||
from m5.params import *
|
from m5.params import *
|
||||||
from m5 import build_env
|
|
||||||
from BaseSimpleCPU import BaseSimpleCPU
|
from BaseSimpleCPU import BaseSimpleCPU
|
||||||
|
|
||||||
class TimingSimpleCPU(BaseSimpleCPU):
|
class TimingSimpleCPU(BaseSimpleCPU):
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
|
|
||||||
from m5.params import *
|
from m5.params import *
|
||||||
from m5.proxy import *
|
from m5.proxy import *
|
||||||
from m5 import build_env
|
|
||||||
from Device import BasicPioDevice
|
from Device import BasicPioDevice
|
||||||
|
|
||||||
class Uart(BasicPioDevice):
|
class Uart(BasicPioDevice):
|
||||||
|
|
|
@ -26,12 +26,12 @@
|
||||||
#
|
#
|
||||||
# Authors: Nathan Binkert
|
# Authors: Nathan Binkert
|
||||||
|
|
||||||
from m5 import build_env
|
from m5.defines import buildEnv
|
||||||
from m5.params import *
|
from m5.params import *
|
||||||
from m5.proxy import *
|
from m5.proxy import *
|
||||||
from MemObject import MemObject
|
from MemObject import MemObject
|
||||||
|
|
||||||
if build_env['FULL_SYSTEM']:
|
if buildEnv['FULL_SYSTEM']:
|
||||||
from Device import BadAddr
|
from Device import BadAddr
|
||||||
|
|
||||||
class Bus(MemObject):
|
class Bus(MemObject):
|
||||||
|
|
|
@ -38,7 +38,6 @@ PySource('', 'importer.py')
|
||||||
PySource('m5', 'm5/__init__.py')
|
PySource('m5', 'm5/__init__.py')
|
||||||
PySource('m5', 'm5/SimObject.py')
|
PySource('m5', 'm5/SimObject.py')
|
||||||
PySource('m5', 'm5/config.py')
|
PySource('m5', 'm5/config.py')
|
||||||
PySource('m5', 'm5/convert.py')
|
|
||||||
PySource('m5', 'm5/core.py')
|
PySource('m5', 'm5/core.py')
|
||||||
PySource('m5', 'm5/debug.py')
|
PySource('m5', 'm5/debug.py')
|
||||||
PySource('m5', 'm5/event.py')
|
PySource('m5', 'm5/event.py')
|
||||||
|
@ -47,18 +46,18 @@ PySource('m5', 'm5/options.py')
|
||||||
PySource('m5', 'm5/params.py')
|
PySource('m5', 'm5/params.py')
|
||||||
PySource('m5', 'm5/proxy.py')
|
PySource('m5', 'm5/proxy.py')
|
||||||
PySource('m5', 'm5/simulate.py')
|
PySource('m5', 'm5/simulate.py')
|
||||||
PySource('m5', 'm5/smartdict.py')
|
|
||||||
PySource('m5', 'm5/stats.py')
|
PySource('m5', 'm5/stats.py')
|
||||||
PySource('m5', 'm5/ticks.py')
|
PySource('m5', 'm5/ticks.py')
|
||||||
PySource('m5', 'm5/trace.py')
|
PySource('m5', 'm5/trace.py')
|
||||||
PySource('m5.util', 'm5/util/__init__.py')
|
PySource('m5.util', 'm5/util/__init__.py')
|
||||||
PySource('m5.util', 'm5/util/attrdict.py')
|
PySource('m5.util', 'm5/util/attrdict.py')
|
||||||
PySource('m5.util', 'm5/util/code_formatter.py')
|
PySource('m5.util', 'm5/util/code_formatter.py')
|
||||||
|
PySource('m5.util', 'm5/util/convert.py')
|
||||||
PySource('m5.util', 'm5/util/grammar.py')
|
PySource('m5.util', 'm5/util/grammar.py')
|
||||||
PySource('m5.util', 'm5/util/jobfile.py')
|
PySource('m5.util', 'm5/util/jobfile.py')
|
||||||
PySource('m5.util', 'm5/util/misc.py')
|
|
||||||
PySource('m5.util', 'm5/util/multidict.py')
|
PySource('m5.util', 'm5/util/multidict.py')
|
||||||
PySource('m5.util', 'm5/util/orderdict.py')
|
PySource('m5.util', 'm5/util/orderdict.py')
|
||||||
|
PySource('m5.util', 'm5/util/smartdict.py')
|
||||||
|
|
||||||
SwigSource('m5.internal', 'swig/core.i')
|
SwigSource('m5.internal', 'swig/core.i')
|
||||||
SwigSource('m5.internal', 'swig/debug.i')
|
SwigSource('m5.internal', 'swig/debug.i')
|
||||||
|
|
|
@ -31,47 +31,24 @@ import math
|
||||||
import sys
|
import sys
|
||||||
import types
|
import types
|
||||||
|
|
||||||
import proxy
|
try:
|
||||||
|
import pydot
|
||||||
|
except:
|
||||||
|
pydot = False
|
||||||
|
|
||||||
import m5
|
import m5
|
||||||
from util import *
|
from m5.util import *
|
||||||
|
|
||||||
# These utility functions have to come first because they're
|
|
||||||
# referenced in params.py... otherwise they won't be defined when we
|
|
||||||
# import params below, and the recursive import of this file from
|
|
||||||
# params.py will not find these names.
|
|
||||||
def isSimObject(value):
|
|
||||||
return isinstance(value, SimObject)
|
|
||||||
|
|
||||||
def isSimObjectClass(value):
|
|
||||||
return issubclass(value, SimObject)
|
|
||||||
|
|
||||||
def isSimObjectSequence(value):
|
|
||||||
if not isinstance(value, (list, tuple)) or len(value) == 0:
|
|
||||||
return False
|
|
||||||
|
|
||||||
for val in value:
|
|
||||||
if not isNullPointer(val) and not isSimObject(val):
|
|
||||||
return False
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
def isSimObjectOrSequence(value):
|
|
||||||
return isSimObject(value) or isSimObjectSequence(value)
|
|
||||||
|
|
||||||
# Have to import params up top since Param is referenced on initial
|
# Have to import params up top since Param is referenced on initial
|
||||||
# load (when SimObject class references Param to create a class
|
# load (when SimObject class references Param to create a class
|
||||||
# variable, the 'name' param)...
|
# variable, the 'name' param)...
|
||||||
from params import *
|
from m5.params import *
|
||||||
# There are a few things we need that aren't in params.__all__ since
|
# There are a few things we need that aren't in params.__all__ since
|
||||||
# normal users don't need them
|
# normal users don't need them
|
||||||
from params import ParamDesc, VectorParamDesc, isNullPointer, SimObjVector
|
from m5.params import ParamDesc, VectorParamDesc, isNullPointer, SimObjVector
|
||||||
from proxy import *
|
|
||||||
|
|
||||||
noDot = False
|
from m5.proxy import *
|
||||||
try:
|
from m5.proxy import isproxy
|
||||||
import pydot
|
|
||||||
except:
|
|
||||||
noDot = True
|
|
||||||
|
|
||||||
#####################################################################
|
#####################################################################
|
||||||
#
|
#
|
||||||
|
@ -141,7 +118,7 @@ class MetaSimObject(type):
|
||||||
# and only allow "private" attributes to be passed to the base
|
# and only allow "private" attributes to be passed to the base
|
||||||
# __new__ (starting with underscore).
|
# __new__ (starting with underscore).
|
||||||
def __new__(mcls, name, bases, dict):
|
def __new__(mcls, name, bases, dict):
|
||||||
assert name not in allClasses
|
assert name not in allClasses, "SimObject %s already present" % name
|
||||||
|
|
||||||
# Copy "private" attributes, functions, and classes to the
|
# Copy "private" attributes, functions, and classes to the
|
||||||
# official dict. Everything else goes in _init_dict to be
|
# official dict. Everything else goes in _init_dict to be
|
||||||
|
@ -678,7 +655,7 @@ class SimObject(object):
|
||||||
def unproxy_all(self):
|
def unproxy_all(self):
|
||||||
for param in self._params.iterkeys():
|
for param in self._params.iterkeys():
|
||||||
value = self._values.get(param)
|
value = self._values.get(param)
|
||||||
if value != None and proxy.isproxy(value):
|
if value != None and isproxy(value):
|
||||||
try:
|
try:
|
||||||
value = value.unproxy(self)
|
value = value.unproxy(self)
|
||||||
except:
|
except:
|
||||||
|
@ -749,7 +726,7 @@ class SimObject(object):
|
||||||
for param in param_names:
|
for param in param_names:
|
||||||
value = self._values.get(param)
|
value = self._values.get(param)
|
||||||
if value is None:
|
if value is None:
|
||||||
m5.fatal("%s.%s without default or user set value",
|
fatal("%s.%s without default or user set value",
|
||||||
self.path(), param)
|
self.path(), param)
|
||||||
|
|
||||||
value = value.getValue()
|
value = value.getValue()
|
||||||
|
@ -886,6 +863,34 @@ def resolveSimObject(name):
|
||||||
obj = instanceDict[name]
|
obj = instanceDict[name]
|
||||||
return obj.getCCObject()
|
return obj.getCCObject()
|
||||||
|
|
||||||
|
def isSimObject(value):
|
||||||
|
return isinstance(value, SimObject)
|
||||||
|
|
||||||
|
def isSimObjectClass(value):
|
||||||
|
return issubclass(value, SimObject)
|
||||||
|
|
||||||
|
def isSimObjectSequence(value):
|
||||||
|
if not isinstance(value, (list, tuple)) or len(value) == 0:
|
||||||
|
return False
|
||||||
|
|
||||||
|
for val in value:
|
||||||
|
if not isNullPointer(val) and not isSimObject(val):
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def isSimObjectOrSequence(value):
|
||||||
|
return isSimObject(value) or isSimObjectSequence(value)
|
||||||
|
|
||||||
|
baseClasses = allClasses.copy()
|
||||||
|
baseInstances = instanceDict.copy()
|
||||||
|
|
||||||
|
def clear():
|
||||||
|
global allClasses, instanceDict
|
||||||
|
|
||||||
|
allClasses = baseClasses.copy()
|
||||||
|
instanceDict = baseInstances.copy()
|
||||||
|
|
||||||
# __all__ defines the list of symbols that get exported when
|
# __all__ defines the list of symbols that get exported when
|
||||||
# 'from config import *' is invoked. Try to keep this reasonably
|
# 'from config import *' is invoked. Try to keep this reasonably
|
||||||
# short to avoid polluting other namespaces.
|
# short to avoid polluting other namespaces.
|
||||||
|
|
|
@ -25,106 +25,24 @@
|
||||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#
|
#
|
||||||
# Authors: Nathan Binkert
|
# Authors: Nathan Binkert
|
||||||
# Steve Reinhardt
|
|
||||||
|
|
||||||
import os
|
# Import useful subpackages of M5, but *only* when run as an m5
|
||||||
import sys
|
# script. This is mostly to keep backward compatibility with existing
|
||||||
|
# scripts while allowing new SCons code to operate properly.
|
||||||
|
|
||||||
import smartdict
|
|
||||||
|
|
||||||
# define a MaxTick parameter
|
|
||||||
MaxTick = 2**63 - 1
|
|
||||||
|
|
||||||
# define this here so we can use it right away if necessary
|
|
||||||
|
|
||||||
def errorURL(prefix, s):
|
|
||||||
try:
|
|
||||||
import zlib
|
|
||||||
hashstr = "%x" % zlib.crc32(s)
|
|
||||||
except:
|
|
||||||
hashstr = "UnableToHash"
|
|
||||||
return "For more information see: http://www.m5sim.org/%s/%s" % \
|
|
||||||
(prefix, hashstr)
|
|
||||||
|
|
||||||
|
|
||||||
# panic() should be called when something happens that should never
|
|
||||||
# ever happen regardless of what the user does (i.e., an acutal m5
|
|
||||||
# bug).
|
|
||||||
def panic(fmt, *args):
|
|
||||||
print >>sys.stderr, 'panic:', fmt % args
|
|
||||||
print >>sys.stderr, errorURL('panic',fmt)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# fatal() should be called when the simulation cannot continue due to
|
|
||||||
# some condition that is the user's fault (bad configuration, invalid
|
|
||||||
# arguments, etc.) and not a simulator bug.
|
|
||||||
def fatal(fmt, *args):
|
|
||||||
print >>sys.stderr, 'fatal:', fmt % args
|
|
||||||
print >>sys.stderr, errorURL('fatal',fmt)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# force scalars to one-element lists for uniformity
|
|
||||||
def makeList(objOrList):
|
|
||||||
if isinstance(objOrList, list):
|
|
||||||
return objOrList
|
|
||||||
return [objOrList]
|
|
||||||
|
|
||||||
# Prepend given directory to system module search path. We may not
|
|
||||||
# need this anymore if we can structure our config library more like a
|
|
||||||
# Python package.
|
|
||||||
def AddToPath(path):
|
|
||||||
# if it's a relative path and we know what directory the current
|
|
||||||
# python script is in, make the path relative to that directory.
|
|
||||||
if not os.path.isabs(path) and sys.path[0]:
|
|
||||||
path = os.path.join(sys.path[0], path)
|
|
||||||
path = os.path.realpath(path)
|
|
||||||
# sys.path[0] should always refer to the current script's directory,
|
|
||||||
# so place the new dir right after that.
|
|
||||||
sys.path.insert(1, path)
|
|
||||||
|
|
||||||
# make a SmartDict out of the build options for our local use
|
|
||||||
build_env = smartdict.SmartDict()
|
|
||||||
|
|
||||||
# make a SmartDict out of the OS environment too
|
|
||||||
env = smartdict.SmartDict()
|
|
||||||
env.update(os.environ)
|
|
||||||
|
|
||||||
# Since we have so many mutual imports in this package, we should:
|
|
||||||
# 1. Put all intra-package imports at the *bottom* of the file, unless
|
|
||||||
# they're absolutely needed before that (for top-level statements
|
|
||||||
# or class attributes). Imports of "trivial" packages that don't
|
|
||||||
# import other packages (e.g., 'smartdict') can be at the top.
|
|
||||||
# 2. Never use 'from foo import *' on an intra-package import since
|
|
||||||
# you can get the wrong result if foo is only partially imported
|
|
||||||
# at the point you do that (i.e., because foo is in the middle of
|
|
||||||
# importing *you*).
|
|
||||||
try:
|
try:
|
||||||
import internal
|
import internal
|
||||||
except ImportError:
|
except ImportError:
|
||||||
internal = None
|
internal = None
|
||||||
|
|
||||||
try:
|
|
||||||
import defines
|
|
||||||
build_env.update(defines.buildEnv)
|
|
||||||
except ImportError:
|
|
||||||
defines = None
|
|
||||||
|
|
||||||
if internal:
|
if internal:
|
||||||
defines.compileDate = internal.core.compileDate
|
import SimObject
|
||||||
for k,v in internal.core.__dict__.iteritems():
|
import core
|
||||||
if k.startswith('flag_'):
|
import objects
|
||||||
setattr(defines, k[5:], v)
|
import params
|
||||||
|
import stats
|
||||||
|
import util
|
||||||
|
|
||||||
from event import *
|
from event import *
|
||||||
from simulate import *
|
|
||||||
from main import options, main
|
from main import options, main
|
||||||
import stats
|
from simulate import *
|
||||||
import core
|
|
||||||
|
|
||||||
import SimObject
|
|
||||||
import params
|
|
||||||
|
|
||||||
try:
|
|
||||||
import objects
|
|
||||||
except ImportError:
|
|
||||||
objects = None
|
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
# Copyright (c) 2005 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
|
|
||||||
# Steve Reinhardt
|
|
||||||
|
|
||||||
import os
|
|
||||||
|
|
||||||
# import the m5 compile options
|
|
||||||
import defines
|
|
||||||
|
|
||||||
# make a SmartDict out of the build options for our local use
|
|
||||||
import smartdict
|
|
||||||
build_env = smartdict.SmartDict()
|
|
||||||
build_env.update(defines.m5_build_env)
|
|
||||||
|
|
||||||
# make a SmartDict out of the OS environment too
|
|
||||||
env = smartdict.SmartDict()
|
|
||||||
env.update(os.environ)
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ import os
|
||||||
import socket
|
import socket
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from util import attrdict
|
from util import attrdict, fatal
|
||||||
import config
|
import config
|
||||||
from options import OptionParser
|
from options import OptionParser
|
||||||
|
|
||||||
|
|
|
@ -50,13 +50,10 @@ import re
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
|
|
||||||
import convert
|
|
||||||
import proxy
|
import proxy
|
||||||
import ticks
|
import ticks
|
||||||
from util import *
|
from util import *
|
||||||
|
|
||||||
import SimObject
|
|
||||||
|
|
||||||
def isSimObject(*args, **kwargs):
|
def isSimObject(*args, **kwargs):
|
||||||
return SimObject.isSimObject(*args, **kwargs)
|
return SimObject.isSimObject(*args, **kwargs)
|
||||||
|
|
||||||
|
@ -711,32 +708,31 @@ class MetaEnum(MetaParamValue):
|
||||||
|
|
||||||
super(MetaEnum, cls).__init__(name, bases, init_dict)
|
super(MetaEnum, cls).__init__(name, bases, init_dict)
|
||||||
|
|
||||||
def __str__(cls):
|
|
||||||
return cls.__name__
|
|
||||||
|
|
||||||
# Generate C++ class declaration for this enum type.
|
# Generate C++ class declaration for this enum type.
|
||||||
# Note that we wrap the enum in a class/struct to act as a namespace,
|
# Note that we wrap the enum in a class/struct to act as a namespace,
|
||||||
# so that the enum strings can be brief w/o worrying about collisions.
|
# so that the enum strings can be brief w/o worrying about collisions.
|
||||||
def cxx_decl(cls):
|
def cxx_decl(cls):
|
||||||
code = "#ifndef __ENUM__%s\n" % cls
|
name = cls.__name__
|
||||||
code += '#define __ENUM__%s\n' % cls
|
code = "#ifndef __ENUM__%s\n" % name
|
||||||
|
code += '#define __ENUM__%s\n' % name
|
||||||
code += '\n'
|
code += '\n'
|
||||||
code += 'namespace Enums {\n'
|
code += 'namespace Enums {\n'
|
||||||
code += ' enum %s {\n' % cls
|
code += ' enum %s {\n' % name
|
||||||
for val in cls.vals:
|
for val in cls.vals:
|
||||||
code += ' %s = %d,\n' % (val, cls.map[val])
|
code += ' %s = %d,\n' % (val, cls.map[val])
|
||||||
code += ' Num_%s = %d,\n' % (cls, len(cls.vals))
|
code += ' Num_%s = %d,\n' % (name, len(cls.vals))
|
||||||
code += ' };\n'
|
code += ' };\n'
|
||||||
code += ' extern const char *%sStrings[Num_%s];\n' % (cls, cls)
|
code += ' extern const char *%sStrings[Num_%s];\n' % (name, name)
|
||||||
code += '}\n'
|
code += '}\n'
|
||||||
code += '\n'
|
code += '\n'
|
||||||
code += '#endif\n'
|
code += '#endif\n'
|
||||||
return code
|
return code
|
||||||
|
|
||||||
def cxx_def(cls):
|
def cxx_def(cls):
|
||||||
code = '#include "enums/%s.hh"\n' % cls
|
name = cls.__name__
|
||||||
|
code = '#include "enums/%s.hh"\n' % name
|
||||||
code += 'namespace Enums {\n'
|
code += 'namespace Enums {\n'
|
||||||
code += ' const char *%sStrings[Num_%s] =\n' % (cls, cls)
|
code += ' const char *%sStrings[Num_%s] =\n' % (name, name)
|
||||||
code += ' {\n'
|
code += ' {\n'
|
||||||
for val in cls.vals:
|
for val in cls.vals:
|
||||||
code += ' "%s",\n' % val
|
code += ' "%s",\n' % val
|
||||||
|
@ -1170,6 +1166,15 @@ class PortParamDesc(object):
|
||||||
ptype_str = 'Port'
|
ptype_str = 'Port'
|
||||||
ptype = Port
|
ptype = Port
|
||||||
|
|
||||||
|
baseEnums = allEnums.copy()
|
||||||
|
baseParams = allParams.copy()
|
||||||
|
|
||||||
|
def clear():
|
||||||
|
global allEnums, allParams
|
||||||
|
|
||||||
|
allEnums = baseEnums.copy()
|
||||||
|
allParams = baseParams.copy()
|
||||||
|
|
||||||
__all__ = ['Param', 'VectorParam',
|
__all__ = ['Param', 'VectorParam',
|
||||||
'Enum', 'Bool', 'String', 'Float',
|
'Enum', 'Bool', 'String', 'Float',
|
||||||
'Int', 'Unsigned', 'Int8', 'UInt8', 'Int16', 'UInt16',
|
'Int', 'Unsigned', 'Int8', 'UInt8', 'Int16', 'UInt16',
|
||||||
|
@ -1184,3 +1189,5 @@ __all__ = ['Param', 'VectorParam',
|
||||||
'Time',
|
'Time',
|
||||||
'NextEthernetAddr', 'NULL',
|
'NextEthernetAddr', 'NULL',
|
||||||
'Port', 'VectorPort']
|
'Port', 'VectorPort']
|
||||||
|
|
||||||
|
import SimObject
|
||||||
|
|
|
@ -40,6 +40,9 @@ import SimObject
|
||||||
import ticks
|
import ticks
|
||||||
import objects
|
import objects
|
||||||
|
|
||||||
|
# define a MaxTick parameter
|
||||||
|
MaxTick = 2**63 - 1
|
||||||
|
|
||||||
# The final hook to generate .ini files. Called from the user script
|
# The final hook to generate .ini files. Called from the user script
|
||||||
# once the config is built.
|
# once the config is built.
|
||||||
def instantiate(root):
|
def instantiate(root):
|
||||||
|
|
|
@ -41,7 +41,7 @@ def fixGlobalFrequency():
|
||||||
print "Global frequency set at %d ticks per second" % int(tps)
|
print "Global frequency set at %d ticks per second" % int(tps)
|
||||||
|
|
||||||
def setGlobalFrequency(ticksPerSecond):
|
def setGlobalFrequency(ticksPerSecond):
|
||||||
import convert
|
from m5.util import convert
|
||||||
|
|
||||||
global tps, tps_fixed
|
global tps, tps_fixed
|
||||||
|
|
||||||
|
|
|
@ -48,5 +48,5 @@ def help():
|
||||||
if flag == 'All':
|
if flag == 'All':
|
||||||
continue
|
continue
|
||||||
print " %s: %s" % (flag, flags.descriptions[flag])
|
print " %s: %s" % (flag, flags.descriptions[flag])
|
||||||
util.print_list(flags.compoundMap[flag], indent=8)
|
util.printList(flags.compoundMap[flag], indent=8)
|
||||||
print
|
print
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
# Copyright (c) 2008 The Hewlett-Packard Development Company
|
# Copyright (c) 2008-2009 The Hewlett-Packard Development Company
|
||||||
|
# Copyright (c) 2004-2006 The Regents of The University of Michigan
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -26,14 +27,130 @@
|
||||||
#
|
#
|
||||||
# Authors: Nathan Binkert
|
# Authors: Nathan Binkert
|
||||||
|
|
||||||
from attrdict import attrdict, optiondict
|
import os
|
||||||
from code_formatter import code_formatter
|
import re
|
||||||
from misc import *
|
import sys
|
||||||
from multidict import multidict
|
|
||||||
from orderdict import orderdict
|
import convert
|
||||||
import jobfile
|
import jobfile
|
||||||
|
|
||||||
def print_list(items, indent=4):
|
from attrdict import attrdict, optiondict
|
||||||
|
from code_formatter import code_formatter
|
||||||
|
from multidict import multidict
|
||||||
|
from orderdict import orderdict
|
||||||
|
from smartdict import SmartDict
|
||||||
|
|
||||||
|
# define this here so we can use it right away if necessary
|
||||||
|
def errorURL(prefix, s):
|
||||||
|
try:
|
||||||
|
import zlib
|
||||||
|
hashstr = "%x" % zlib.crc32(s)
|
||||||
|
except:
|
||||||
|
hashstr = "UnableToHash"
|
||||||
|
return "For more information see: http://www.m5sim.org/%s/%s" % \
|
||||||
|
(prefix, hashstr)
|
||||||
|
|
||||||
|
# panic() should be called when something happens that should never
|
||||||
|
# ever happen regardless of what the user does (i.e., an acutal m5
|
||||||
|
# bug).
|
||||||
|
def panic(fmt, *args):
|
||||||
|
print >>sys.stderr, 'panic:', fmt % args
|
||||||
|
print >>sys.stderr, errorURL('panic',fmt)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# fatal() should be called when the simulation cannot continue due to
|
||||||
|
# some condition that is the user's fault (bad configuration, invalid
|
||||||
|
# arguments, etc.) and not a simulator bug.
|
||||||
|
def fatal(fmt, *args):
|
||||||
|
print >>sys.stderr, 'fatal:', fmt % args
|
||||||
|
print >>sys.stderr, errorURL('fatal',fmt)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
class Singleton(type):
|
||||||
|
def __call__(cls, *args, **kwargs):
|
||||||
|
if hasattr(cls, '_instance'):
|
||||||
|
return cls._instance
|
||||||
|
|
||||||
|
cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
|
||||||
|
return cls._instance
|
||||||
|
|
||||||
|
def addToPath(path):
|
||||||
|
"""Prepend given directory to system module search path. We may not
|
||||||
|
need this anymore if we can structure our config library more like a
|
||||||
|
Python package."""
|
||||||
|
|
||||||
|
# if it's a relative path and we know what directory the current
|
||||||
|
# python script is in, make the path relative to that directory.
|
||||||
|
if not os.path.isabs(path) and sys.path[0]:
|
||||||
|
path = os.path.join(sys.path[0], path)
|
||||||
|
path = os.path.realpath(path)
|
||||||
|
# sys.path[0] should always refer to the current script's directory,
|
||||||
|
# so place the new dir right after that.
|
||||||
|
sys.path.insert(1, path)
|
||||||
|
|
||||||
|
# Apply method to object.
|
||||||
|
# applyMethod(obj, 'meth', <args>) is equivalent to obj.meth(<args>)
|
||||||
|
def applyMethod(obj, meth, *args, **kwargs):
|
||||||
|
return getattr(obj, meth)(*args, **kwargs)
|
||||||
|
|
||||||
|
# If the first argument is an (non-sequence) object, apply the named
|
||||||
|
# method with the given arguments. If the first argument is a
|
||||||
|
# sequence, apply the method to each element of the sequence (a la
|
||||||
|
# 'map').
|
||||||
|
def applyOrMap(objOrSeq, meth, *args, **kwargs):
|
||||||
|
if not isinstance(objOrSeq, (list, tuple)):
|
||||||
|
return applyMethod(objOrSeq, meth, *args, **kwargs)
|
||||||
|
else:
|
||||||
|
return [applyMethod(o, meth, *args, **kwargs) for o in objOrSeq]
|
||||||
|
|
||||||
|
def compareVersions(v1, v2):
|
||||||
|
"""helper function: compare arrays or strings of version numbers.
|
||||||
|
E.g., compare_version((1,3,25), (1,4,1)')
|
||||||
|
returns -1, 0, 1 if v1 is <, ==, > v2
|
||||||
|
"""
|
||||||
|
def make_version_list(v):
|
||||||
|
if isinstance(v, (list,tuple)):
|
||||||
|
return v
|
||||||
|
elif isinstance(v, str):
|
||||||
|
return map(lambda x: int(re.match('\d+', x).group()), v.split('.'))
|
||||||
|
else:
|
||||||
|
raise TypeError
|
||||||
|
|
||||||
|
v1 = make_version_list(v1)
|
||||||
|
v2 = make_version_list(v2)
|
||||||
|
# Compare corresponding elements of lists
|
||||||
|
for n1,n2 in zip(v1, v2):
|
||||||
|
if n1 < n2: return -1
|
||||||
|
if n1 > n2: return 1
|
||||||
|
# all corresponding values are equal... see if one has extra values
|
||||||
|
if len(v1) < len(v2): return -1
|
||||||
|
if len(v1) > len(v2): return 1
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def crossproduct(items):
|
||||||
|
if len(items) == 1:
|
||||||
|
for i in items[0]:
|
||||||
|
yield (i,)
|
||||||
|
else:
|
||||||
|
for i in items[0]:
|
||||||
|
for j in crossproduct(items[1:]):
|
||||||
|
yield (i,) + j
|
||||||
|
|
||||||
|
def flatten(items):
|
||||||
|
while items:
|
||||||
|
item = items.pop(0)
|
||||||
|
if isinstance(item, (list, tuple)):
|
||||||
|
items[0:0] = item
|
||||||
|
else:
|
||||||
|
yield item
|
||||||
|
|
||||||
|
# force scalars to one-element lists for uniformity
|
||||||
|
def makeList(objOrList):
|
||||||
|
if isinstance(objOrList, list):
|
||||||
|
return objOrList
|
||||||
|
return [objOrList]
|
||||||
|
|
||||||
|
def printList(items, indent=4):
|
||||||
line = ' ' * indent
|
line = ' ' * indent
|
||||||
for i,item in enumerate(items):
|
for i,item in enumerate(items):
|
||||||
if len(line) + len(item) > 76:
|
if len(line) + len(item) > 76:
|
||||||
|
@ -45,3 +162,27 @@ def print_list(items, indent=4):
|
||||||
else:
|
else:
|
||||||
line += item
|
line += item
|
||||||
print line
|
print line
|
||||||
|
|
||||||
|
def readCommand(cmd, **kwargs):
|
||||||
|
"""run the command cmd, read the results and return them
|
||||||
|
this is sorta like `cmd` in shell"""
|
||||||
|
from subprocess import Popen, PIPE, STDOUT
|
||||||
|
|
||||||
|
if isinstance(cmd, str):
|
||||||
|
cmd = cmd.split()
|
||||||
|
|
||||||
|
no_exception = 'exception' in kwargs
|
||||||
|
exception = kwargs.pop('exception', None)
|
||||||
|
|
||||||
|
kwargs.setdefault('shell', False)
|
||||||
|
kwargs.setdefault('stdout', PIPE)
|
||||||
|
kwargs.setdefault('stderr', STDOUT)
|
||||||
|
kwargs.setdefault('close_fds', True)
|
||||||
|
try:
|
||||||
|
subp = Popen(cmd, **kwargs)
|
||||||
|
except Exception, e:
|
||||||
|
if no_exception:
|
||||||
|
return exception
|
||||||
|
raise
|
||||||
|
|
||||||
|
return subp.communicate()[0]
|
||||||
|
|
|
@ -28,9 +28,6 @@
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from attrdict import optiondict
|
|
||||||
from misc import crossproduct
|
|
||||||
|
|
||||||
class Data(object):
|
class Data(object):
|
||||||
def __init__(self, name, desc, **kwargs):
|
def __init__(self, name, desc, **kwargs):
|
||||||
self.name = name
|
self.name = name
|
||||||
|
@ -108,7 +105,8 @@ class Data(object):
|
||||||
yield key
|
yield key
|
||||||
|
|
||||||
def optiondict(self):
|
def optiondict(self):
|
||||||
result = optiondict()
|
import m5.util
|
||||||
|
result = m5.util.optiondict()
|
||||||
for key in self:
|
for key in self:
|
||||||
result[key] = self[key]
|
result[key] = self[key]
|
||||||
return result
|
return result
|
||||||
|
@ -328,7 +326,9 @@ class Configuration(Data):
|
||||||
optgroups = [ g.subopts() for g in groups ]
|
optgroups = [ g.subopts() for g in groups ]
|
||||||
if not optgroups:
|
if not optgroups:
|
||||||
return
|
return
|
||||||
for options in crossproduct(optgroups):
|
|
||||||
|
import m5.util
|
||||||
|
for options in m5.util.crossproduct(optgroups):
|
||||||
for opt in options:
|
for opt in options:
|
||||||
cpt = opt._group._checkpoint
|
cpt = opt._group._checkpoint
|
||||||
if not isinstance(cpt, bool) and cpt != opt:
|
if not isinstance(cpt, bool) and cpt != opt:
|
||||||
|
|
|
@ -1,87 +0,0 @@
|
||||||
# Copyright (c) 2004-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: Steve Reinhardt
|
|
||||||
# Nathan Binkert
|
|
||||||
|
|
||||||
#############################
|
|
||||||
#
|
|
||||||
# Utility classes & methods
|
|
||||||
#
|
|
||||||
#############################
|
|
||||||
|
|
||||||
class Singleton(type):
|
|
||||||
def __call__(cls, *args, **kwargs):
|
|
||||||
if hasattr(cls, '_instance'):
|
|
||||||
return cls._instance
|
|
||||||
|
|
||||||
cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
|
|
||||||
return cls._instance
|
|
||||||
|
|
||||||
# Apply method to object.
|
|
||||||
# applyMethod(obj, 'meth', <args>) is equivalent to obj.meth(<args>)
|
|
||||||
def applyMethod(obj, meth, *args, **kwargs):
|
|
||||||
return getattr(obj, meth)(*args, **kwargs)
|
|
||||||
|
|
||||||
# If the first argument is an (non-sequence) object, apply the named
|
|
||||||
# method with the given arguments. If the first argument is a
|
|
||||||
# sequence, apply the method to each element of the sequence (a la
|
|
||||||
# 'map').
|
|
||||||
def applyOrMap(objOrSeq, meth, *args, **kwargs):
|
|
||||||
if not isinstance(objOrSeq, (list, tuple)):
|
|
||||||
return applyMethod(objOrSeq, meth, *args, **kwargs)
|
|
||||||
else:
|
|
||||||
return [applyMethod(o, meth, *args, **kwargs) for o in objOrSeq]
|
|
||||||
|
|
||||||
def crossproduct(items):
|
|
||||||
if not isinstance(items, (list, tuple)):
|
|
||||||
raise AttributeError, 'crossproduct works only on sequences'
|
|
||||||
|
|
||||||
if not items:
|
|
||||||
yield None
|
|
||||||
return
|
|
||||||
|
|
||||||
current = items[0]
|
|
||||||
remainder = items[1:]
|
|
||||||
|
|
||||||
if not hasattr(current, '__iter__'):
|
|
||||||
current = [ current ]
|
|
||||||
|
|
||||||
for item in current:
|
|
||||||
for rem in crossproduct(remainder):
|
|
||||||
data = [ item ]
|
|
||||||
if rem:
|
|
||||||
data += rem
|
|
||||||
yield data
|
|
||||||
|
|
||||||
def flatten(items):
|
|
||||||
if not isinstance(items, (list, tuple)):
|
|
||||||
yield items
|
|
||||||
return
|
|
||||||
|
|
||||||
for item in items:
|
|
||||||
for flat in flatten(item):
|
|
||||||
yield flat
|
|
|
@ -27,9 +27,10 @@
|
||||||
# Authors: Nathan Binkert
|
# Authors: Nathan Binkert
|
||||||
|
|
||||||
from m5.SimObject import SimObject
|
from m5.SimObject import SimObject
|
||||||
|
from m5.defines import buildEnv
|
||||||
from m5.params import *
|
from m5.params import *
|
||||||
from m5.proxy import *
|
from m5.proxy import *
|
||||||
from m5 import build_env
|
|
||||||
from PhysicalMemory import *
|
from PhysicalMemory import *
|
||||||
|
|
||||||
class MemoryMode(Enum): vals = ['invalid', 'atomic', 'timing']
|
class MemoryMode(Enum): vals = ['invalid', 'atomic', 'timing']
|
||||||
|
@ -40,7 +41,7 @@ class System(SimObject):
|
||||||
|
|
||||||
physmem = Param.PhysicalMemory(Parent.any, "physical memory")
|
physmem = Param.PhysicalMemory(Parent.any, "physical memory")
|
||||||
mem_mode = Param.MemoryMode('atomic', "The mode the memory system is in")
|
mem_mode = Param.MemoryMode('atomic', "The mode the memory system is in")
|
||||||
if build_env['FULL_SYSTEM']:
|
if buildEnv['FULL_SYSTEM']:
|
||||||
abstract = True
|
abstract = True
|
||||||
boot_cpu_frequency = Param.Frequency(Self.cpu[0].clock.frequency,
|
boot_cpu_frequency = Param.Frequency(Self.cpu[0].clock.frequency,
|
||||||
"boot processor frequency")
|
"boot processor frequency")
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
import m5
|
import m5
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
|
|
||||||
class MyCache(BaseCache):
|
class MyCache(BaseCache):
|
||||||
assoc = 2
|
assoc = 2
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
import m5
|
import m5
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
|
|
||||||
nb_cores = 4
|
nb_cores = 4
|
||||||
cpus = [ DerivO3CPU(cpu_id=i) for i in xrange(nb_cores) ]
|
cpus = [ DerivO3CPU(cpu_id=i) for i in xrange(nb_cores) ]
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
import m5
|
import m5
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
|
|
||||||
# --------------------
|
# --------------------
|
||||||
# Base L1 Cache
|
# Base L1 Cache
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
import m5
|
import m5
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
|
|
||||||
|
|
||||||
import ruby_config
|
import ruby_config
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
import m5
|
import m5
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
|
|
||||||
class MyCache(BaseCache):
|
class MyCache(BaseCache):
|
||||||
assoc = 2
|
assoc = 2
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
import m5
|
import m5
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
import FSConfig
|
import FSConfig
|
||||||
|
|
||||||
cpu = AtomicSimpleCPU(cpu_id=0)
|
cpu = AtomicSimpleCPU(cpu_id=0)
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
import m5
|
import m5
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
import FSConfig
|
import FSConfig
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
import m5
|
import m5
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
import FSConfig
|
import FSConfig
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
import m5
|
import m5
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
import FSConfig
|
import FSConfig
|
||||||
|
|
||||||
# --------------------
|
# --------------------
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
import m5
|
import m5
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
import FSConfig
|
import FSConfig
|
||||||
|
|
||||||
# --------------------
|
# --------------------
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
import m5
|
import m5
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
import FSConfig
|
import FSConfig
|
||||||
|
|
||||||
# --------------------
|
# --------------------
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
import m5
|
import m5
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
import FSConfig
|
import FSConfig
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
import m5
|
import m5
|
||||||
from m5.objects import *
|
from m5.objects import *
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
from FSConfig import *
|
from FSConfig import *
|
||||||
from Benchmarks import *
|
from Benchmarks import *
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#
|
#
|
||||||
# Authors: Korey Sewell
|
# Authors: Korey Sewell
|
||||||
|
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
from cpu2000 import gzip_log
|
from cpu2000 import gzip_log
|
||||||
|
|
||||||
workload = gzip_log(isa, opsys, 'smred')
|
workload = gzip_log(isa, opsys, 'smred')
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#
|
#
|
||||||
# Authors: Korey Sewell
|
# Authors: Korey Sewell
|
||||||
|
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
from cpu2000 import mcf
|
from cpu2000 import mcf
|
||||||
|
|
||||||
workload = mcf(isa, opsys, 'smred')
|
workload = mcf(isa, opsys, 'smred')
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#
|
#
|
||||||
# Authors: Korey Sewell
|
# Authors: Korey Sewell
|
||||||
|
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
from cpu2000 import parser
|
from cpu2000 import parser
|
||||||
|
|
||||||
workload = parser(isa, opsys, 'mdred')
|
workload = parser(isa, opsys, 'mdred')
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#
|
#
|
||||||
# Authors: Korey Sewell
|
# Authors: Korey Sewell
|
||||||
|
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
from cpu2000 import eon_cook
|
from cpu2000 import eon_cook
|
||||||
|
|
||||||
workload = eon_cook(isa, opsys, 'mdred')
|
workload = eon_cook(isa, opsys, 'mdred')
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#
|
#
|
||||||
# Authors: Korey Sewell
|
# Authors: Korey Sewell
|
||||||
|
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
from cpu2000 import perlbmk_makerand
|
from cpu2000 import perlbmk_makerand
|
||||||
|
|
||||||
workload = perlbmk_makerand(isa, opsys, 'lgred')
|
workload = perlbmk_makerand(isa, opsys, 'lgred')
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#
|
#
|
||||||
# Authors: Korey Sewell
|
# Authors: Korey Sewell
|
||||||
|
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
from cpu2000 import vortex
|
from cpu2000 import vortex
|
||||||
|
|
||||||
workload = vortex(isa, opsys, 'smred')
|
workload = vortex(isa, opsys, 'smred')
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#
|
#
|
||||||
# Authors: Korey Sewell
|
# Authors: Korey Sewell
|
||||||
|
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
from cpu2000 import bzip2_source
|
from cpu2000 import bzip2_source
|
||||||
|
|
||||||
workload = bzip2_source(isa, opsys, 'lgred')
|
workload = bzip2_source(isa, opsys, 'lgred')
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#
|
#
|
||||||
# Authors: Korey Sewell
|
# Authors: Korey Sewell
|
||||||
|
|
||||||
m5.AddToPath('../configs/common')
|
m5.util.addToPath('../configs/common')
|
||||||
from cpu2000 import twolf
|
from cpu2000 import twolf
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue