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:
Nathan Binkert 2009-09-22 15:24:16 -07:00
parent 0d58d32ad5
commit 9a8cb7db7e
64 changed files with 450 additions and 501 deletions

View file

@ -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

View file

@ -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):

View file

@ -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 *

View file

@ -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,8 +220,8 @@ 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 ..."
m5.restoreCheckpoint(root,checkpoint_dir) m5.restoreCheckpoint(root,checkpoint_dir)
@ -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])

View file

@ -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)

View file

@ -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()

View file

@ -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)

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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")

View file

@ -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

View file

@ -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")

View file

@ -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")

View file

@ -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):

View file

@ -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):

View file

@ -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'

View file

@ -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,

View file

@ -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):

View file

@ -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")

View file

@ -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):

View file

@ -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")

View file

@ -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):

View file

@ -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):

View file

@ -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):

View file

@ -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):

View file

@ -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')

View file

@ -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,8 +726,8 @@ 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()
if isinstance(self._params[param], VectorParamDesc): if isinstance(self._params[param], VectorParamDesc):
@ -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.

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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):

View file

@ -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

View file

@ -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

View file

@ -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]

View file

@ -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:

View file

@ -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

View file

@ -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")

View file

@ -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

View file

@ -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) ]

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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
# -------------------- # --------------------

View file

@ -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
# -------------------- # --------------------

View file

@ -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
# -------------------- # --------------------

View file

@ -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

View file

@ -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 *

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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