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
# Global Python includes
import os
import re
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 join as joinpath, split as splitpath
# SCons includes
import SCons
import SCons.Node
def read_command(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
# M5 includes
sys.path[1:1] = [ Dir('src/python').srcnode().abspath ]
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]
# 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
from m5.util import compareVersions, readCommand
########################################################################
#
@ -217,7 +177,7 @@ if hgdir.exists():
# 1) Grab repository revision if we know it.
cmd = "hg id -n -i -t -b"
try:
hg_info = read_command(cmd, cwd=main.root.abspath).strip()
hg_info = readCommand(cmd, cwd=main.root.abspath).strip()
except OSError:
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.
main.Append(ENV = { 'M5_PLY' : Dir('ext/ply').abspath })
CXX_version = read_command([main['CXX'],'--version'], exception=False)
CXX_V = read_command([main['CXX'],'-V'], exception=False)
CXX_version = readCommand([main['CXX'],'--version'], exception=False)
CXX_V = readCommand([main['CXX'],'-V'], exception=False)
main['GCC'] = CXX_version and CXX_version.find('g++') >= 0
main['SUNCC'] = CXX_V and CXX_V.find('Sun C++') >= 0
@ -435,7 +395,7 @@ if not main.has_key('SWIG'):
Exit(1)
# 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"
if len(swig_version) < 3 or \
swig_version[0] != 'SWIG' or swig_version[1] != 'Version':
@ -443,7 +403,7 @@ if len(swig_version) < 3 or \
Exit(1)
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 ' Installed version:', swig_version[2]
Exit(1)
@ -514,8 +474,8 @@ conf.CheckLeading()
try:
import platform
uname = platform.uname()
if uname[0] == 'Darwin' and compare_versions(uname[2], '9.0.0') >= 0:
if int(read_command('sysctl -n hw.cpu64bit_capable')[0]):
if uname[0] == 'Darwin' and compareVersions(uname[2], '9.0.0') >= 0:
if int(readCommand('sysctl -n hw.cpu64bit_capable')[0]):
main.Append(CCFLAGS='-arch x86_64')
main.Append(CFLAGS='-arch x86_64')
main.Append(LINKFLAGS='-arch x86_64')
@ -615,9 +575,9 @@ have_mysql = bool(mysql_config)
# Check MySQL version.
if have_mysql:
mysql_version = read_command(mysql_config + ' --version')
mysql_version = readCommand(mysql_config + ' --version')
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 ' Version', mysql_version, 'detected.'
have_mysql = False

View file

@ -26,7 +26,6 @@
#
# Authors: Lisa Hsu
import m5
from m5.objects import *
class L1Cache(BaseCache):

View file

@ -26,8 +26,6 @@
#
# Authors: Kevin Lim
import m5
from m5 import makeList
from m5.objects import *
from Benchmarks import *

View file

@ -28,9 +28,13 @@
from os import getcwd
from os.path import join as joinpath
import m5
from m5.defines import buildEnv
from m5.objects import *
m5.AddToPath('../common')
from m5.util import *
addToPath('../common')
def setCPUClass(options):
@ -82,10 +86,10 @@ def run(options, root, testsys, cpu_class):
cptdir = getcwd()
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:
m5.fatal("Error: Must specify --caches when using --standard-switch")
fatal("Must specify --caches when using --standard-switch")
np = options.num_cpus
max_checkpoints = options.max_checkpoints
@ -107,7 +111,7 @@ def run(options, root, testsys, cpu_class):
if options.fast_forward:
testsys.cpu[i].max_insts_any_thread = int(options.fast_forward)
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].clock = testsys.cpu[0].clock
# simulation period
@ -126,7 +130,7 @@ def run(options, root, testsys, cpu_class):
for i in xrange(np):
switch_cpus[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_1[i].workload = testsys.cpu[i].workload
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)
elif options.simpoint:
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].workload[0].simpoint
# No distance specified, just switch
@ -174,7 +178,7 @@ def run(options, root, testsys, cpu_class):
if options.simpoint:
for i in xrange(np):
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
testsys.cpu[i].max_insts_any_thread = checkpoint_inst
# used for output below
@ -194,14 +198,13 @@ def run(options, root, testsys, cpu_class):
import re
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:
checkpoint_dir = joinpath(cptdir, "cpt.%s.%s" % \
(options.bench, options.checkpoint_restore))
if not exists(checkpoint_dir):
m5.fatal("Unable to find checkpoint directory %s",
checkpoint_dir)
fatal("Unable to find checkpoint directory %s", checkpoint_dir)
print "Restoring checkpoint ..."
m5.restoreCheckpoint(root, checkpoint_dir)
@ -209,7 +212,7 @@ def run(options, root, testsys, cpu_class):
elif options.simpoint:
# assume workload 0 has the simpoint
if testsys.cpu[0].workload[0].simpoint == 0:
m5.fatal('Unable to find simpoint')
fatal('Unable to find simpoint')
options.checkpoint_restore += \
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" % \
(options.bench, options.checkpoint_restore))
if not exists(checkpoint_dir):
m5.fatal("Unable to find checkpoint directory %s.%s",
options.bench, options.checkpoint_restore)
fatal("Unable to find checkpoint directory %s.%s",
options.bench, options.checkpoint_restore)
print "Restoring checkpoint ..."
m5.restoreCheckpoint(root,checkpoint_dir)
@ -237,7 +240,7 @@ def run(options, root, testsys, cpu_class):
cpt_num = options.checkpoint_restore
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
maxtick = maxtick - int(cpts[cpt_num - 1])

View file

@ -26,15 +26,20 @@
#
# Authors: Ali Saidi
import optparse, os, sys
import optparse
import os
import sys
import m5
if not m5.build_env['FULL_SYSTEM']:
m5.fatal("This script requires full-system mode (*_FS).")
from m5.defines import buildEnv
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 SysPaths import *
from Benchmarks import *
@ -98,16 +103,16 @@ else:
np = options.num_cpus
if m5.build_env['TARGET_ISA'] == "alpha":
if buildEnv['TARGET_ISA'] == "alpha":
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])
elif m5.build_env['TARGET_ISA'] == "sparc":
elif buildEnv['TARGET_ISA'] == "sparc":
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])
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:
test_sys.kernel = binary(options.kernel)
@ -142,17 +147,17 @@ for i in xrange(np):
if options.fastmem:
test_sys.cpu[i].physmem_port = test_sys.physmem.port
if m5.build_env['TARGET_ISA'] == 'mips':
if buildEnv['TARGET_ISA'] == 'mips':
setMipsOptions(TestCPUClass)
if len(bm) == 2:
if m5.build_env['TARGET_ISA'] == 'alpha':
if buildEnv['TARGET_ISA'] == 'alpha':
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])
elif m5.build_env['TARGET_ISA'] == 'sparc':
elif buildEnv['TARGET_ISA'] == 'sparc':
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.cpu = DriveCPUClass(cpu_id=0)
drive_sys.cpu.connectMemPorts(drive_sys.membus)

View file

@ -26,10 +26,11 @@
#
# Authors: Ron Dreslinski
import optparse
import sys
import m5
from m5.objects import *
import os, optparse, sys
m5.AddToPath('../common')
parser = optparse.OptionParser()

View file

@ -30,17 +30,22 @@
#
# "m5 test.py"
import m5
if m5.build_env['FULL_SYSTEM']:
m5.panic("This script requires syscall emulation mode (*_SE).")
from m5.objects import *
import os, optparse, sys
import os
import optparse
import sys
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
#from Caches import *
from cpu2000 import *
# Get paths we might need. It's expected this file is in m5/configs/example.
@ -72,7 +77,7 @@ if args:
if options.bench:
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"
sys.exit(1)
exec("workload = %s('alpha', 'tru64', 'ref')" % options.bench)

View file

@ -30,15 +30,21 @@
#
# "m5 test.py"
import m5
if m5.build_env['FULL_SYSTEM']:
m5.fatal("This script requires syscall emulation mode (*_SE).")
from m5.objects import *
import os, optparse, sys
import os
import optparse
import sys
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
from Caches import *
from cpu2000 import *
@ -70,7 +76,7 @@ if args:
if options.bench:
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"
sys.exit(1)
exec("workload = %s('alpha', 'tru64', 'ref')" % options.bench)

View file

@ -30,10 +30,14 @@
#
# "m5 test.py"
import os
import optparse
import sys
import m5
from m5.objects import *
import os, optparse, sys
m5.AddToPath('../common')
m5.util.addToPath('../common')
# --------------------
# Define Command Line Options
@ -266,10 +270,11 @@ elif options.benchmark == 'WaterNSquared':
elif options.benchmark == 'WaterSpatial':
root.workload = Water_spatial()
else:
panic("The --benchmark environment variable was set to something" \
+" improper.\nUse Cholesky, FFT, LUContig, LUNoncontig, Radix" \
+", Barnes, FMM, OceanContig,\nOceanNoncontig, Raytrace," \
+" WaterNSquared, or WaterSpatial\n")
m5.util.panic("""
The --benchmark environment variable was set to something improper.
Use Cholesky, FFT, LUContig, LUNoncontig, Radix, Barnes, FMM, OceanContig,
OceanNoncontig, Raytrace, WaterNSquared, or WaterSpatial
""")
# --------------------
# Assign the workload to the cpus

View file

@ -29,10 +29,14 @@
# Splash2 Run Script
#
import os
import optparse
import sys
import m5
from m5.objects import *
import os, optparse, sys
m5.AddToPath('../common')
m5.util.addToPath('../common')
# --------------------
# Define Command Line Options

View file

@ -49,7 +49,7 @@ Import('*')
# Children need to see the environment
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
@ -266,6 +266,8 @@ for opt in export_vars:
# Prevent any SimObjects from being added after this point, they
# should all have been added in the SConscripts above
#
SimObject.fixed = True
class DictImporter(object):
'''This importer takes a dictionary of arbitrary module names that
map to arbitrary filenames.'''
@ -283,7 +285,7 @@ class DictImporter(object):
self.installed = set()
def find_module(self, fullname, path):
if fullname == 'defines':
if fullname == 'm5.defines':
return self
if fullname == 'm5.objects':
@ -293,7 +295,7 @@ class DictImporter(object):
return 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 None
@ -308,8 +310,8 @@ class DictImporter(object):
mod.__path__ = fullname.split('.')
return mod
if fullname == 'defines':
mod.__dict__['buildEnv'] = build_env
if fullname == 'm5.defines':
mod.__dict__['buildEnv'] = m5.util.SmartDict(build_env)
return mod
source = self.modules[fullname]
@ -321,15 +323,18 @@ class DictImporter(object):
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
# 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.
SimObject.fixed = True
importer = DictImporter(PySource.modules)
sys.meta_path[0:0] = [ importer ]
import m5
# 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
for modname in SimObject.modnames:
@ -346,6 +351,12 @@ all_enums = m5.params.allEnums
all_params = {}
for name,obj in sorted(sim_objects.iteritems()):
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'):
continue
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
# build_env flags.
# buildEnv flags.
def makeDefinesPyFile(target, source, env):
f = file(str(target[0]), 'w')
build_env, hg_info = [ x.get_contents() for x in source ]
print >>f, "buildEnv = %s" % build_env
print >>f, "hgRev = '%s'" % hg_info
f.close()
code = m5.util.code_formatter()
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']) ]
# Generate a file with all of the compile options in it

View file

@ -28,10 +28,11 @@
#
# Authors: Jaidev Patwardhan
from m5 import build_env
from m5.defines import buildEnv
from System import *
if build_env['FULL_SYSTEM']:
if buildEnv['FULL_SYSTEM']:
class BareIronMipsSystem(MipsSystem):
type = 'BareIronMipsSystem'
system_type = 34

View file

@ -29,12 +29,13 @@
# Authors: Jaidev Patwardhan
# Korey Sewell
from m5.SimObject import SimObject
from m5.defines import buildEnv
from m5.params import *
from BaseCPU import 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_IPPCI = Param.Unsigned(0,"No Description")
CP0_SrsCtl_HSS = Param.Unsigned(0,"No Description")

View file

@ -28,10 +28,10 @@
#
# Authors: Jaidev Patwardhan
from m5.SimObject import SimObject
from m5.defines import buildEnv
from m5.params import *
from m5.proxy import *
from m5 import build_env
from System import System
class MipsSystem(System):
@ -42,7 +42,7 @@ class MipsSystem(System):
system_type = Param.UInt64("Type 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):
type = 'LinuxMipsSystem'
system_type = 34

View file

@ -53,13 +53,14 @@
#
# Authors: Gabe Black
from MemObject import MemObject
from m5.defines import buildEnv
from m5.params 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):
type = 'X86PagetableWalker'
cxx_class = 'X86ISA::Walker'
@ -70,6 +71,6 @@ class X86TLB(BaseTLB):
type = 'X86TLB'
cxx_class = 'X86ISA::TLB'
size = Param.Int(64, "TLB size")
if build_env['FULL_SYSTEM']:
if buildEnv['FULL_SYSTEM']:
walker = Param.X86PagetableWalker(\
X86PagetableWalker(), "page table walker")

View file

@ -26,36 +26,38 @@
#
# Authors: Nathan Binkert
from MemObject import MemObject
import sys
from m5.defines import buildEnv
from m5.params import *
from m5.proxy import *
from m5 import build_env
from Bus import Bus
from InstTracer import InstTracer
from ExeTracer import ExeTracer
import sys
from MemObject import MemObject
default_tracer = ExeTracer()
if build_env['TARGET_ISA'] == 'alpha':
if buildEnv['TARGET_ISA'] == 'alpha':
from AlphaTLB import AlphaDTB, AlphaITB
if build_env['FULL_SYSTEM']:
if buildEnv['FULL_SYSTEM']:
from AlphaInterrupts import AlphaInterrupts
elif build_env['TARGET_ISA'] == 'sparc':
elif buildEnv['TARGET_ISA'] == 'sparc':
from SparcTLB import SparcTLB
if build_env['FULL_SYSTEM']:
if buildEnv['FULL_SYSTEM']:
from SparcInterrupts import SparcInterrupts
elif build_env['TARGET_ISA'] == 'x86':
elif buildEnv['TARGET_ISA'] == 'x86':
from X86TLB import X86TLB
if build_env['FULL_SYSTEM']:
if buildEnv['FULL_SYSTEM']:
from X86LocalApic import X86LocalApic
elif build_env['TARGET_ISA'] == 'mips':
elif buildEnv['TARGET_ISA'] == 'mips':
from MipsTLB import MipsTLB
if build_env['FULL_SYSTEM']:
if buildEnv['FULL_SYSTEM']:
from MipsInterrupts import MipsInterrupts
elif build_env['TARGET_ISA'] == 'arm':
elif buildEnv['TARGET_ISA'] == 'arm':
from ArmTLB import ArmTLB
if build_env['FULL_SYSTEM']:
if buildEnv['FULL_SYSTEM']:
from ArmInterrupts import ArmInterrupts
class BaseCPU(MemObject):
@ -76,47 +78,47 @@ class BaseCPU(MemObject):
do_statistics_insts = Param.Bool(True,
"enable statistics pseudo instructions")
if build_env['FULL_SYSTEM']:
if buildEnv['FULL_SYSTEM']:
profile = Param.Latency('0ns', "trace the kernel stack")
do_quiesce = Param.Bool(True, "enable quiesce instructions")
else:
workload = VectorParam.Process("processes to run")
if build_env['TARGET_ISA'] == 'sparc':
if buildEnv['TARGET_ISA'] == 'sparc':
dtb = Param.SparcTLB(SparcTLB(), "Data TLB")
itb = Param.SparcTLB(SparcTLB(), "Instruction TLB")
if build_env['FULL_SYSTEM']:
if buildEnv['FULL_SYSTEM']:
interrupts = Param.SparcInterrupts(
SparcInterrupts(), "Interrupt Controller")
elif build_env['TARGET_ISA'] == 'alpha':
elif buildEnv['TARGET_ISA'] == 'alpha':
dtb = Param.AlphaTLB(AlphaDTB(), "Data TLB")
itb = Param.AlphaTLB(AlphaITB(), "Instruction TLB")
if build_env['FULL_SYSTEM']:
if buildEnv['FULL_SYSTEM']:
interrupts = Param.AlphaInterrupts(
AlphaInterrupts(), "Interrupt Controller")
elif build_env['TARGET_ISA'] == 'x86':
elif buildEnv['TARGET_ISA'] == 'x86':
dtb = Param.X86TLB(X86TLB(), "Data TLB")
itb = Param.X86TLB(X86TLB(), "Instruction TLB")
if build_env['FULL_SYSTEM']:
if buildEnv['FULL_SYSTEM']:
_localApic = X86LocalApic(pio_addr=0x2000000000000000)
interrupts = \
Param.X86LocalApic(_localApic, "Interrupt Controller")
elif build_env['TARGET_ISA'] == 'mips':
elif buildEnv['TARGET_ISA'] == 'mips':
dtb = Param.MipsTLB(MipsTLB(), "Data TLB")
itb = Param.MipsTLB(MipsTLB(), "Instruction TLB")
if build_env['FULL_SYSTEM']:
if buildEnv['FULL_SYSTEM']:
interrupts = Param.MipsInterrupts(
MipsInterrupts(), "Interrupt Controller")
elif build_env['TARGET_ISA'] == 'arm':
elif buildEnv['TARGET_ISA'] == 'arm':
UnifiedTLB = Param.Bool(True, "Is this a Unified TLB?")
dtb = Param.ArmTLB(ArmTLB(), "Data TLB")
itb = Param.ArmTLB(ArmTLB(), "Instruction TLB")
if build_env['FULL_SYSTEM']:
if buildEnv['FULL_SYSTEM']:
interrupts = Param.ArmInterrupts(
ArmInterrupts(), "Interrupt Controller")
else:
print "Don't know what TLB to use for ISA %s" % \
build_env['TARGET_ISA']
buildEnv['TARGET_ISA']
sys.exit(1)
max_insts_all_threads = Param.Counter(0,
@ -139,7 +141,7 @@ class BaseCPU(MemObject):
tracer = Param.InstTracer(default_tracer, "Instruction tracer")
_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",
"dtb.walker.port",
"interrupts.pio",
@ -157,7 +159,7 @@ class BaseCPU(MemObject):
self.icache_port = ic.cpu_side
self.dcache_port = dc.cpu_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"]
def addTwoLevelCacheHierarchy(self, ic, dc, l2c):
@ -168,7 +170,7 @@ class BaseCPU(MemObject):
self.l2cache.cpu_side = self.toL2Bus.port
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_IPPCI = Param.Unsigned(0,"No Description")
CP0_SrsCtl_HSS = Param.Unsigned(0,"No Description")

View file

@ -27,7 +27,6 @@
# Authors: Nathan Binkert
from m5.params import *
from m5 import build_env
from BaseCPU import BaseCPU
class CheckerCPU(BaseCPU):

View file

@ -28,7 +28,6 @@
from m5.params import *
from m5.proxy import *
from m5 import build_env
from BaseCPU import BaseCPU
class InOrderCPU(BaseCPU):

View file

@ -29,7 +29,6 @@
from MemObject import MemObject
from m5.params import *
from m5.proxy import *
from m5 import build_env
class MemTest(MemObject):
type = 'MemTest'

View file

@ -26,21 +26,21 @@
#
# Authors: Kevin Lim
from m5.defines import buildEnv
from m5.params import *
from m5.proxy import *
from m5 import build_env
from BaseCPU import BaseCPU
from FUPool import *
if build_env['USE_CHECKER']:
if buildEnv['USE_CHECKER']:
from O3Checker import O3Checker
class DerivO3CPU(BaseCPU):
type = 'DerivO3CPU'
activity = Param.Unsigned(0, "Initial count")
if build_env['USE_CHECKER']:
if not build_env['FULL_SYSTEM']:
if buildEnv['USE_CHECKER']:
if not buildEnv['FULL_SYSTEM']:
checker = Param.BaseCPU(O3Checker(workload=Parent.workload,
exitOnError=False,
updateOnError=True,

View file

@ -27,7 +27,6 @@
# Authors: Nathan Binkert
from m5.params import *
from m5 import build_env
from BaseCPU import BaseCPU
class O3Checker(BaseCPU):

View file

@ -26,11 +26,11 @@
#
# Authors: Kevin Lim
from m5.defines import buildEnv
from m5.params import *
from m5 import build_env
from BaseCPU import BaseCPU
if build_env['USE_CHECKER']:
if buildEnv['USE_CHECKER']:
from OzoneChecker import OzoneChecker
class DerivOzoneCPU(BaseCPU):
@ -38,7 +38,7 @@ class DerivOzoneCPU(BaseCPU):
numThreads = Param.Unsigned("number of HW thread contexts")
if build_env['USE_CHECKER']:
if buildEnv['USE_CHECKER']:
checker = Param.BaseCPU("Checker CPU")
icache_port = Port("Instruction Port")

View file

@ -27,7 +27,6 @@
# Authors: Nathan Binkert
from m5.params import *
from m5 import build_env
from BaseCPU import BaseCPU
class OzoneChecker(BaseCPU):

View file

@ -26,8 +26,8 @@
#
# Authors: Kevin Lim
from m5.defines import buildEnv
from m5.params import *
from m5 import build_env
from BaseCPU import BaseCPU
class SimpleOzoneCPU(BaseCPU):
@ -35,7 +35,7 @@ class SimpleOzoneCPU(BaseCPU):
numThreads = Param.Unsigned("number of HW thread contexts")
if not build_env['FULL_SYSTEM']:
if not buildEnv['FULL_SYSTEM']:
mem = Param.FunctionalMemory(NULL, "memory")
width = Param.Unsigned("Width")

View file

@ -27,7 +27,6 @@
# Authors: Nathan Binkert
from m5.params import *
from m5 import build_env
from BaseSimpleCPU import BaseSimpleCPU
class AtomicSimpleCPU(BaseSimpleCPU):

View file

@ -27,7 +27,6 @@
# Authors: Nathan Binkert
from m5.params import *
from m5 import build_env
from BaseSimpleCPU import BaseSimpleCPU
class TimingSimpleCPU(BaseSimpleCPU):

View file

@ -28,7 +28,6 @@
from m5.params import *
from m5.proxy import *
from m5 import build_env
from Device import BasicPioDevice
class Uart(BasicPioDevice):

View file

@ -26,12 +26,12 @@
#
# Authors: Nathan Binkert
from m5 import build_env
from m5.defines import buildEnv
from m5.params import *
from m5.proxy import *
from MemObject import MemObject
if build_env['FULL_SYSTEM']:
if buildEnv['FULL_SYSTEM']:
from Device import BadAddr
class Bus(MemObject):

View file

@ -38,7 +38,6 @@ PySource('', 'importer.py')
PySource('m5', 'm5/__init__.py')
PySource('m5', 'm5/SimObject.py')
PySource('m5', 'm5/config.py')
PySource('m5', 'm5/convert.py')
PySource('m5', 'm5/core.py')
PySource('m5', 'm5/debug.py')
PySource('m5', 'm5/event.py')
@ -47,18 +46,18 @@ PySource('m5', 'm5/options.py')
PySource('m5', 'm5/params.py')
PySource('m5', 'm5/proxy.py')
PySource('m5', 'm5/simulate.py')
PySource('m5', 'm5/smartdict.py')
PySource('m5', 'm5/stats.py')
PySource('m5', 'm5/ticks.py')
PySource('m5', 'm5/trace.py')
PySource('m5.util', 'm5/util/__init__.py')
PySource('m5.util', 'm5/util/attrdict.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/jobfile.py')
PySource('m5.util', 'm5/util/misc.py')
PySource('m5.util', 'm5/util/multidict.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/debug.i')

View file

@ -31,47 +31,24 @@ import math
import sys
import types
import proxy
try:
import pydot
except:
pydot = False
import m5
from 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)
from m5.util import *
# Have to import params up top since Param is referenced on initial
# load (when SimObject class references Param to create a class
# 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
# normal users don't need them
from params import ParamDesc, VectorParamDesc, isNullPointer, SimObjVector
from proxy import *
from m5.params import ParamDesc, VectorParamDesc, isNullPointer, SimObjVector
noDot = False
try:
import pydot
except:
noDot = True
from m5.proxy import *
from m5.proxy import isproxy
#####################################################################
#
@ -141,7 +118,7 @@ class MetaSimObject(type):
# and only allow "private" attributes to be passed to the base
# __new__ (starting with underscore).
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
# official dict. Everything else goes in _init_dict to be
@ -678,7 +655,7 @@ class SimObject(object):
def unproxy_all(self):
for param in self._params.iterkeys():
value = self._values.get(param)
if value != None and proxy.isproxy(value):
if value != None and isproxy(value):
try:
value = value.unproxy(self)
except:
@ -749,8 +726,8 @@ class SimObject(object):
for param in param_names:
value = self._values.get(param)
if value is None:
m5.fatal("%s.%s without default or user set value",
self.path(), param)
fatal("%s.%s without default or user set value",
self.path(), param)
value = value.getValue()
if isinstance(self._params[param], VectorParamDesc):
@ -886,6 +863,34 @@ def resolveSimObject(name):
obj = instanceDict[name]
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
# 'from config import *' is invoked. Try to keep this reasonably
# short to avoid polluting other namespaces.

View file

@ -25,106 +25,24 @@
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# Authors: Nathan Binkert
# Steve Reinhardt
import os
import sys
# Import useful subpackages of M5, but *only* when run as an m5
# 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:
import internal
except ImportError:
internal = None
try:
import defines
build_env.update(defines.buildEnv)
except ImportError:
defines = None
if internal:
defines.compileDate = internal.core.compileDate
for k,v in internal.core.__dict__.iteritems():
if k.startswith('flag_'):
setattr(defines, k[5:], v)
import SimObject
import core
import objects
import params
import stats
import util
from event import *
from simulate import *
from main import options, main
import stats
import core
import SimObject
import params
try:
import objects
except ImportError:
objects = None
from simulate import *

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 sys
from util import attrdict
from util import attrdict, fatal
import config
from options import OptionParser

View file

@ -50,13 +50,10 @@ import re
import sys
import time
import convert
import proxy
import ticks
from util import *
import SimObject
def isSimObject(*args, **kwargs):
return SimObject.isSimObject(*args, **kwargs)
@ -711,32 +708,31 @@ class MetaEnum(MetaParamValue):
super(MetaEnum, cls).__init__(name, bases, init_dict)
def __str__(cls):
return cls.__name__
# Generate C++ class declaration for this enum type.
# 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.
def cxx_decl(cls):
code = "#ifndef __ENUM__%s\n" % cls
code += '#define __ENUM__%s\n' % cls
name = cls.__name__
code = "#ifndef __ENUM__%s\n" % name
code += '#define __ENUM__%s\n' % name
code += '\n'
code += 'namespace Enums {\n'
code += ' enum %s {\n' % cls
code += ' enum %s {\n' % name
for val in cls.vals:
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 += ' extern const char *%sStrings[Num_%s];\n' % (cls, cls)
code += ' extern const char *%sStrings[Num_%s];\n' % (name, name)
code += '}\n'
code += '\n'
code += '#endif\n'
return code
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 += ' const char *%sStrings[Num_%s] =\n' % (cls, cls)
code += ' const char *%sStrings[Num_%s] =\n' % (name, name)
code += ' {\n'
for val in cls.vals:
code += ' "%s",\n' % val
@ -1170,6 +1166,15 @@ class PortParamDesc(object):
ptype_str = 'Port'
ptype = Port
baseEnums = allEnums.copy()
baseParams = allParams.copy()
def clear():
global allEnums, allParams
allEnums = baseEnums.copy()
allParams = baseParams.copy()
__all__ = ['Param', 'VectorParam',
'Enum', 'Bool', 'String', 'Float',
'Int', 'Unsigned', 'Int8', 'UInt8', 'Int16', 'UInt16',
@ -1184,3 +1189,5 @@ __all__ = ['Param', 'VectorParam',
'Time',
'NextEthernetAddr', 'NULL',
'Port', 'VectorPort']
import SimObject

View file

@ -40,6 +40,9 @@ import SimObject
import ticks
import objects
# define a MaxTick parameter
MaxTick = 2**63 - 1
# The final hook to generate .ini files. Called from the user script
# once the config is built.
def instantiate(root):

View file

@ -41,7 +41,7 @@ def fixGlobalFrequency():
print "Global frequency set at %d ticks per second" % int(tps)
def setGlobalFrequency(ticksPerSecond):
import convert
from m5.util import convert
global tps, tps_fixed

View file

@ -48,5 +48,5 @@ def help():
if flag == 'All':
continue
print " %s: %s" % (flag, flags.descriptions[flag])
util.print_list(flags.compoundMap[flag], indent=8)
util.printList(flags.compoundMap[flag], indent=8)
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.
#
# Redistribution and use in source and binary forms, with or without
@ -26,14 +27,130 @@
#
# Authors: Nathan Binkert
from attrdict import attrdict, optiondict
from code_formatter import code_formatter
from misc import *
from multidict import multidict
from orderdict import orderdict
import os
import re
import sys
import convert
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
for i,item in enumerate(items):
if len(line) + len(item) > 76:
@ -45,3 +162,27 @@ def print_list(items, indent=4):
else:
line += item
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
from attrdict import optiondict
from misc import crossproduct
class Data(object):
def __init__(self, name, desc, **kwargs):
self.name = name
@ -108,7 +105,8 @@ class Data(object):
yield key
def optiondict(self):
result = optiondict()
import m5.util
result = m5.util.optiondict()
for key in self:
result[key] = self[key]
return result
@ -328,7 +326,9 @@ class Configuration(Data):
optgroups = [ g.subopts() for g in groups ]
if not optgroups:
return
for options in crossproduct(optgroups):
import m5.util
for options in m5.util.crossproduct(optgroups):
for opt in options:
cpt = opt._group._checkpoint
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
from m5.SimObject import SimObject
from m5.defines import buildEnv
from m5.params import *
from m5.proxy import *
from m5 import build_env
from PhysicalMemory import *
class MemoryMode(Enum): vals = ['invalid', 'atomic', 'timing']
@ -40,7 +41,7 @@ class System(SimObject):
physmem = Param.PhysicalMemory(Parent.any, "physical memory")
mem_mode = Param.MemoryMode('atomic', "The mode the memory system is in")
if build_env['FULL_SYSTEM']:
if buildEnv['FULL_SYSTEM']:
abstract = True
boot_cpu_frequency = Param.Frequency(Self.cpu[0].clock.frequency,
"boot processor frequency")

View file

@ -28,7 +28,7 @@
import m5
from m5.objects import *
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
class MyCache(BaseCache):
assoc = 2

View file

@ -28,7 +28,7 @@
import m5
from m5.objects import *
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
nb_cores = 4
cpus = [ DerivO3CPU(cpu_id=i) for i in xrange(nb_cores) ]

View file

@ -28,7 +28,7 @@
import m5
from m5.objects import *
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
# --------------------
# Base L1 Cache

View file

@ -28,7 +28,7 @@
import m5
from m5.objects import *
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
import ruby_config

View file

@ -28,7 +28,7 @@
import m5
from m5.objects import *
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
class MyCache(BaseCache):
assoc = 2

View file

@ -28,7 +28,7 @@
import m5
from m5.objects import *
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
import FSConfig
cpu = AtomicSimpleCPU(cpu_id=0)

View file

@ -28,7 +28,7 @@
import m5
from m5.objects import *
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
import FSConfig

View file

@ -28,7 +28,7 @@
import m5
from m5.objects import *
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
import FSConfig

View file

@ -28,7 +28,7 @@
import m5
from m5.objects import *
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
import FSConfig
# --------------------

View file

@ -28,7 +28,7 @@
import m5
from m5.objects import *
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
import FSConfig
# --------------------

View file

@ -28,7 +28,7 @@
import m5
from m5.objects import *
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
import FSConfig
# --------------------

View file

@ -28,7 +28,7 @@
import m5
from m5.objects import *
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
import FSConfig

View file

@ -28,7 +28,7 @@
import m5
from m5.objects import *
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
from FSConfig import *
from Benchmarks import *

View file

@ -26,7 +26,7 @@
#
# Authors: Korey Sewell
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
from cpu2000 import gzip_log
workload = gzip_log(isa, opsys, 'smred')

View file

@ -26,7 +26,7 @@
#
# Authors: Korey Sewell
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
from cpu2000 import mcf
workload = mcf(isa, opsys, 'smred')

View file

@ -26,7 +26,7 @@
#
# Authors: Korey Sewell
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
from cpu2000 import parser
workload = parser(isa, opsys, 'mdred')

View file

@ -26,7 +26,7 @@
#
# Authors: Korey Sewell
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
from cpu2000 import eon_cook
workload = eon_cook(isa, opsys, 'mdred')

View file

@ -26,7 +26,7 @@
#
# Authors: Korey Sewell
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
from cpu2000 import perlbmk_makerand
workload = perlbmk_makerand(isa, opsys, 'lgred')

View file

@ -26,7 +26,7 @@
#
# Authors: Korey Sewell
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
from cpu2000 import vortex
workload = vortex(isa, opsys, 'smred')

View file

@ -26,7 +26,7 @@
#
# Authors: Korey Sewell
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
from cpu2000 import bzip2_source
workload = bzip2_source(isa, opsys, 'lgred')

View file

@ -26,7 +26,7 @@
#
# Authors: Korey Sewell
m5.AddToPath('../configs/common')
m5.util.addToPath('../configs/common')
from cpu2000 import twolf
import os