Merge ktlim@zizzer.eecs.umich.edu:/bk/m5
into zamp.eecs.umich.edu:/z/ktlim2/m5 --HG-- extra : convert_revision : 95e94251150a3eea380b6b3bc3a9596e188df315
This commit is contained in:
commit
2e2d9b5c35
23 changed files with 2425 additions and 329 deletions
14
SConscript
14
SConscript
|
@ -28,6 +28,7 @@
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
from os.path import isdir
|
||||||
|
|
||||||
# This file defines how to build a particular configuration of M5
|
# This file defines how to build a particular configuration of M5
|
||||||
# based on variable settings in the 'env' build environment.
|
# based on variable settings in the 'env' build environment.
|
||||||
|
@ -366,18 +367,17 @@ else:
|
||||||
|
|
||||||
extra_libraries = []
|
extra_libraries = []
|
||||||
env.Append(LIBS=['z'])
|
env.Append(LIBS=['z'])
|
||||||
if env['USE_MYSQL']:
|
if isdir('/usr/lib64/mysql') or isdir('/usr/lib/mysql') or \
|
||||||
|
isdir('/usr/local/lib/mysql'):
|
||||||
|
print 'Compiling with MySQL support!'
|
||||||
|
env.Append(LIBPATH=['/usr/lib64/mysql', '/usr/local/lib/mysql/',
|
||||||
|
'/usr/lib/mysql'])
|
||||||
|
env.Append(CPPPATH=['/usr/local/include/mysql', '/usr/include/mysql'])
|
||||||
sources += mysql_sources
|
sources += mysql_sources
|
||||||
env.Append(CPPDEFINES = 'USE_MYSQL')
|
env.Append(CPPDEFINES = 'USE_MYSQL')
|
||||||
env.Append(CPPDEFINES = 'STATS_BINNING')
|
env.Append(CPPDEFINES = 'STATS_BINNING')
|
||||||
env.Append(CPPPATH=['/usr/local/include/mysql', '/usr/include/mysql'])
|
|
||||||
if os.path.isdir('/usr/lib64'):
|
|
||||||
env.Append(LIBPATH=['/usr/lib64/mysql'])
|
|
||||||
else:
|
|
||||||
env.Append(LIBPATH=['/usr/lib/mysql/'])
|
|
||||||
env.Append(LIBS=['mysqlclient'])
|
env.Append(LIBS=['mysqlclient'])
|
||||||
|
|
||||||
|
|
||||||
###################################################
|
###################################################
|
||||||
#
|
#
|
||||||
# Special build rules.
|
# Special build rules.
|
||||||
|
|
|
@ -104,15 +104,6 @@ configs_map = {
|
||||||
'KERNEL' : KernelConfig
|
'KERNEL' : KernelConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
# Enable detailed full-system binning.
|
|
||||||
def MeasureOpt(env):
|
|
||||||
env.Replace(USE_MYSQL = True)
|
|
||||||
env.Append(CPPDEFINES = 'FS_MEASURE')
|
|
||||||
|
|
||||||
# Enable MySql database output for stats.
|
|
||||||
def MySqlOpt(env):
|
|
||||||
env.Replace(USE_MYSQL = True)
|
|
||||||
|
|
||||||
# Disable FastAlloc object allocation.
|
# Disable FastAlloc object allocation.
|
||||||
def NoFastAllocOpt(env):
|
def NoFastAllocOpt(env):
|
||||||
env.Append(CPPDEFINES = 'NO_FAST_ALLOC')
|
env.Append(CPPDEFINES = 'NO_FAST_ALLOC')
|
||||||
|
@ -123,8 +114,6 @@ def EfenceOpt(env):
|
||||||
|
|
||||||
# Configuration options map.
|
# Configuration options map.
|
||||||
options_map = {
|
options_map = {
|
||||||
'MEASURE' : MeasureOpt,
|
|
||||||
'MYSQL' : MySqlOpt,
|
|
||||||
'NO_FAST_ALLOC' : NoFastAllocOpt,
|
'NO_FAST_ALLOC' : NoFastAllocOpt,
|
||||||
'EFENCE' : EfenceOpt
|
'EFENCE' : EfenceOpt
|
||||||
}
|
}
|
||||||
|
|
3
configs/boot/micro_ctx.rcS
Normal file
3
configs/boot/micro_ctx.rcS
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
/benchmarks/micros/lmbench/bin/alphaev6-linux-gnu/lat_ctx 2 4 8 16
|
||||||
|
m5 exit
|
||||||
|
|
3
configs/boot/micro_memlat8.rcS
Normal file
3
configs/boot/micro_memlat8.rcS
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
/benchmarks/micros/lmbench/bin/alphaev6-linux-gnu/lat_mem_rd 128 8
|
||||||
|
m5 exit
|
||||||
|
|
3
configs/boot/micro_stream.rcS
Normal file
3
configs/boot/micro_stream.rcS
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
/benchmarks/micros/stream
|
||||||
|
m5 exit
|
||||||
|
|
3
configs/boot/micro_streamcopy.rcS
Normal file
3
configs/boot/micro_streamcopy.rcS
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
/benchmarks/micros/simstreamcopy
|
||||||
|
m5 exit
|
||||||
|
|
3
configs/boot/micro_streamscale.rcS
Normal file
3
configs/boot/micro_streamscale.rcS
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
/benchmarks/micros/simstreamscale
|
||||||
|
m5 exit
|
||||||
|
|
50
configs/boot/nfs-client-nhfsstone.rcS
Executable file
50
configs/boot/nfs-client-nhfsstone.rcS
Executable file
|
@ -0,0 +1,50 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# /etc/init.d/rcS
|
||||||
|
#
|
||||||
|
|
||||||
|
echo -n "mounting swap..."
|
||||||
|
/sbin/swapon /dev/hdc
|
||||||
|
echo "done."
|
||||||
|
|
||||||
|
echo -n "setting up network..."
|
||||||
|
/sbin/ifconfig eth0 10.0.0.2 txqueuelen 1000
|
||||||
|
/sbin/ifconfig lo 127.0.0.1
|
||||||
|
|
||||||
|
echo "1" > /proc/sys/net/ipv4/tcp_tw_recycle
|
||||||
|
echo "1" > /proc/sys/net/ipv4/tcp_tw_reuse
|
||||||
|
echo "1" > /proc/sys/net/ipv4/tcp_window_scaling
|
||||||
|
echo "0" > /proc/sys/net/ipv4/tcp_timestamps
|
||||||
|
echo "0" > /proc/sys/net/ipv4/tcp_sack
|
||||||
|
echo "15" > /proc/sys/net/ipv4/tcp_fin_timeout
|
||||||
|
echo "16384" > /proc/sys/net/ipv4/tcp_max_syn_backlog
|
||||||
|
|
||||||
|
echo "1024 65535" > /proc/sys/net/ipv4/ip_local_port_range
|
||||||
|
echo "10000000 10000000 10000000" > /proc/sys/net/ipv4/tcp_rmem
|
||||||
|
echo "10000000 10000000 10000000" > /proc/sys/net/ipv4/tcp_wmem
|
||||||
|
echo "10000000 10000000 10000000" > /proc/sys/net/ipv4/tcp_mem
|
||||||
|
|
||||||
|
echo "524287" > /proc/sys/net/core/rmem_max
|
||||||
|
echo "524287" > /proc/sys/net/core/wmem_max
|
||||||
|
echo "524287" > /proc/sys/net/core/optmem_max
|
||||||
|
echo "300000" > /proc/sys/net/core/netdev_max_backlog
|
||||||
|
|
||||||
|
echo "131072" > /proc/sys/fs/file-max
|
||||||
|
echo "done."
|
||||||
|
|
||||||
|
echo -n "starting nfs client..."
|
||||||
|
/sbin/portmap &
|
||||||
|
/sbin/lockd &
|
||||||
|
echo "done."
|
||||||
|
|
||||||
|
echo -n "waiting for server..."
|
||||||
|
/usr/bin/netcat -c -l -p 8000
|
||||||
|
|
||||||
|
echo -n "mounting remote share..."
|
||||||
|
mkdir /nfs
|
||||||
|
mount 10.0.0.1:/nfs /nfs
|
||||||
|
echo "done."
|
||||||
|
|
||||||
|
/benchmarks/nhfsstone/nhfsstone -t 30 -p 10 /nfs
|
||||||
|
|
||||||
|
/sbin/m5 exit
|
67
configs/boot/nfs-server-nhfsstone.rcS
Executable file
67
configs/boot/nfs-server-nhfsstone.rcS
Executable file
|
@ -0,0 +1,67 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# /etc/init.d/rcS
|
||||||
|
#
|
||||||
|
|
||||||
|
echo -n "mounting swap..."
|
||||||
|
/sbin/swapon /dev/hdc
|
||||||
|
echo "done."
|
||||||
|
|
||||||
|
echo -n "setting up network..."
|
||||||
|
/sbin/ifconfig eth0 10.0.0.1 txqueuelen 1000
|
||||||
|
/sbin/ifconfig lo 127.0.0.1
|
||||||
|
|
||||||
|
echo "1" > /proc/sys/net/ipv4/tcp_tw_recycle
|
||||||
|
echo "1" > /proc/sys/net/ipv4/tcp_tw_reuse
|
||||||
|
echo "1" > /proc/sys/net/ipv4/tcp_window_scaling
|
||||||
|
echo "0" > /proc/sys/net/ipv4/tcp_timestamps
|
||||||
|
echo "0" > /proc/sys/net/ipv4/tcp_sack
|
||||||
|
echo "15" > /proc/sys/net/ipv4/tcp_fin_timeout
|
||||||
|
echo "16384" > /proc/sys/net/ipv4/tcp_max_syn_backlog
|
||||||
|
|
||||||
|
echo "1024 65535" > /proc/sys/net/ipv4/ip_local_port_range
|
||||||
|
echo "10000000 10000000 10000000" > /proc/sys/net/ipv4/tcp_rmem
|
||||||
|
echo "10000000 10000000 10000000" > /proc/sys/net/ipv4/tcp_wmem
|
||||||
|
echo "10000000 10000000 10000000" > /proc/sys/net/ipv4/tcp_mem
|
||||||
|
|
||||||
|
echo "524287" > /proc/sys/net/core/rmem_max
|
||||||
|
echo "524287" > /proc/sys/net/core/wmem_max
|
||||||
|
echo "524287" > /proc/sys/net/core/optmem_max
|
||||||
|
echo "300000" > /proc/sys/net/core/netdev_max_backlog
|
||||||
|
|
||||||
|
echo "131072" > /proc/sys/fs/file-max
|
||||||
|
echo "done."
|
||||||
|
|
||||||
|
#if [ ! -x /dev/sda ]
|
||||||
|
#then
|
||||||
|
# mknod /dev/sda b 8 0
|
||||||
|
# mknod /dev/sda1 b 8 1
|
||||||
|
#fi
|
||||||
|
|
||||||
|
/sbin/insmod /modules/scsi_debug.ko dev_size_mb=80
|
||||||
|
|
||||||
|
echo -n "creating partition and formatting..."
|
||||||
|
/sbin/mke2fs -F /dev/sda
|
||||||
|
mkdir /nfs
|
||||||
|
/bin/mount /dev/sda /nfs
|
||||||
|
chmod a+rwx /nfs
|
||||||
|
echo "done."
|
||||||
|
|
||||||
|
echo "/nfs 10.0.0.0/255.0.0.0(rw,sync,no_root_squash)" > /etc/exports
|
||||||
|
echo -n "starting nfs kernel server..."
|
||||||
|
/sbin/portmap
|
||||||
|
/sbin/lockd
|
||||||
|
/sbin/statd
|
||||||
|
/sbin/nfsd 8
|
||||||
|
/sbin/mountd
|
||||||
|
echo "done."
|
||||||
|
|
||||||
|
echo "Exporting shares..."
|
||||||
|
/sbin/exportfs -r -v
|
||||||
|
|
||||||
|
echo -n "signal client to mount..."
|
||||||
|
echo "server ready" | /usr/bin/netcat -c 10.0.0.2 8000
|
||||||
|
echo "done."
|
||||||
|
|
||||||
|
echo -n "starting bash shell..."
|
||||||
|
/bin/bash
|
25
configs/boot/ping-client.rcS
Normal file
25
configs/boot/ping-client.rcS
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
#!/bin/sh
|
||||||
|
SERVER=10.0.0.1
|
||||||
|
CLIENT=10.0.0.2
|
||||||
|
|
||||||
|
echo "setting up network..."
|
||||||
|
ifconfig lo 127.0.0.1
|
||||||
|
ifconfig eth0 $CLIENT txqueuelen 1000
|
||||||
|
|
||||||
|
echo "0" > /proc/sys/net/ipv4/tcp_timestamps
|
||||||
|
echo "0" > /proc/sys/net/ipv4/tcp_sack
|
||||||
|
echo "5000000 5000000 5000000" > /proc/sys/net/ipv4/tcp_rmem
|
||||||
|
echo "5000000 5000000 5000000" > /proc/sys/net/ipv4/tcp_wmem
|
||||||
|
echo "5000000 5000000 5000000" > /proc/sys/net/ipv4/tcp_mem
|
||||||
|
echo "262143" > /proc/sys/net/core/rmem_max
|
||||||
|
echo "262143" > /proc/sys/net/core/wmem_max
|
||||||
|
echo "262143" > /proc/sys/net/core/rmem_default
|
||||||
|
echo "262143" > /proc/sys/net/core/wmem_default
|
||||||
|
echo "262143" > /proc/sys/net/core/optmem_max
|
||||||
|
echo "100000" > /proc/sys/net/core/netdev_max_backlog
|
||||||
|
|
||||||
|
echo -n "waiting for server..."
|
||||||
|
/usr/bin/netcat -c -l -p 8000
|
||||||
|
|
||||||
|
ping $SERVER
|
||||||
|
/sbin/m5 exit
|
26
configs/boot/ping-server.rcS
Normal file
26
configs/boot/ping-server.rcS
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#!/bin/sh
|
||||||
|
SERVER=10.0.0.1
|
||||||
|
CLIENT=10.0.0.2
|
||||||
|
|
||||||
|
echo "setting up network..."
|
||||||
|
ifconfig lo 127.0.0.1
|
||||||
|
ifconfig eth0 $SERVER txqueuelen 1000
|
||||||
|
|
||||||
|
echo "0" > /proc/sys/net/ipv4/tcp_timestamps
|
||||||
|
echo "0" > /proc/sys/net/ipv4/tcp_sack
|
||||||
|
echo "5000000 5000000 5000000" > /proc/sys/net/ipv4/tcp_rmem
|
||||||
|
echo "5000000 5000000 5000000" > /proc/sys/net/ipv4/tcp_wmem
|
||||||
|
echo "5000000 5000000 5000000" > /proc/sys/net/ipv4/tcp_mem
|
||||||
|
echo "262143" > /proc/sys/net/core/rmem_max
|
||||||
|
echo "262143" > /proc/sys/net/core/wmem_max
|
||||||
|
echo "262143" > /proc/sys/net/core/rmem_default
|
||||||
|
echo "262143" > /proc/sys/net/core/wmem_default
|
||||||
|
echo "262143" > /proc/sys/net/core/optmem_max
|
||||||
|
echo "100000" > /proc/sys/net/core/netdev_max_backlog
|
||||||
|
|
||||||
|
echo -n "signal client to begin..."
|
||||||
|
echo "server ready" | /usr/bin/netcat -c $CLIENT 8000
|
||||||
|
echo "done."
|
||||||
|
|
||||||
|
echo "starting bash..."
|
||||||
|
exec /bin/bash
|
|
@ -27,7 +27,7 @@
|
||||||
from __future__ import generators
|
from __future__ import generators
|
||||||
import os, re, sys, types, inspect
|
import os, re, sys, types, inspect
|
||||||
|
|
||||||
from m5 import panic
|
from m5 import panic, env
|
||||||
from convert import *
|
from convert import *
|
||||||
from multidict import multidict
|
from multidict import multidict
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ class Singleton(type):
|
||||||
# object, either using keyword assignment in the constructor or in
|
# object, either using keyword assignment in the constructor or in
|
||||||
# separate assignment statements. For example:
|
# separate assignment statements. For example:
|
||||||
#
|
#
|
||||||
# cache = BaseCache('my_cache', root, size=64*K)
|
# cache = BaseCache('my_cache', root, size='64KB')
|
||||||
# cache.hit_latency = 3
|
# cache.hit_latency = 3
|
||||||
# cache.assoc = 8
|
# cache.assoc = 8
|
||||||
#
|
#
|
||||||
|
@ -373,7 +373,7 @@ classes. You're trying to derive from:
|
||||||
# now process remaining _init_dict items
|
# now process remaining _init_dict items
|
||||||
for key,val in cls._init_dict.items():
|
for key,val in cls._init_dict.items():
|
||||||
# param descriptions
|
# param descriptions
|
||||||
if isinstance(val, _Param):
|
if isinstance(val, ParamBase):
|
||||||
cls._new_param(key, val)
|
cls._new_param(key, val)
|
||||||
|
|
||||||
# init-time-only keywords
|
# init-time-only keywords
|
||||||
|
@ -433,8 +433,10 @@ classes. You're trying to derive from:
|
||||||
try:
|
try:
|
||||||
param.valid(value)
|
param.valid(value)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
panic("Exception: %s\nError setting param %s.%s to %s\n" % \
|
msg = "%s\nError setting param %s.%s to %s\n" % \
|
||||||
(e, cls.__name__, attr, value))
|
(e, cls.__name__, attr, value)
|
||||||
|
e.args = (msg, )
|
||||||
|
raise
|
||||||
cls._values[attr] = value
|
cls._values[attr] = value
|
||||||
elif isConfigNode(value) or isSimObjSequence(value):
|
elif isConfigNode(value) or isSimObjSequence(value):
|
||||||
cls._values[attr] = value
|
cls._values[attr] = value
|
||||||
|
@ -510,8 +512,10 @@ classes. You're trying to derive from:
|
||||||
instance.params.append(p)
|
instance.params.append(p)
|
||||||
instance.param_names[pname] = p
|
instance.param_names[pname] = p
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
raise e.__class__, 'Exception while evaluating %s.%s\n%s' % \
|
msg = 'Exception while evaluating %s.%s\n%s' % \
|
||||||
(instance.path, pname, e)
|
(instance.path, pname, e)
|
||||||
|
e.args = (msg, )
|
||||||
|
raise
|
||||||
|
|
||||||
return instance
|
return instance
|
||||||
|
|
||||||
|
@ -693,8 +697,10 @@ class Node(object):
|
||||||
else:
|
else:
|
||||||
param.value = self.unproxy(pval, ptype)
|
param.value = self.unproxy(pval, ptype)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
raise e.__class__, 'Error while fixing up %s:%s\n%s' % \
|
msg = 'Error while fixing up %s:%s\n%s' % \
|
||||||
(self.path, param.name, e)
|
(self.path, param.name, e)
|
||||||
|
e.args = (msg, )
|
||||||
|
raise
|
||||||
|
|
||||||
for child in self.children:
|
for child in self.children:
|
||||||
assert(child != self)
|
assert(child != self)
|
||||||
|
@ -727,8 +733,9 @@ class Node(object):
|
||||||
value = param.convert(param.value)
|
value = param.convert(param.value)
|
||||||
string = param.string(value)
|
string = param.string(value)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
raise e.__class__, 'exception in %s:%s\n%s' % \
|
msg = 'exception in %s:%s\n%s' % (self.path, param.name, e)
|
||||||
(self.path, param.name, e)
|
e.args = (msg, )
|
||||||
|
raise
|
||||||
|
|
||||||
print '%s = %s' % (param.name, string)
|
print '%s = %s' % (param.name, string)
|
||||||
|
|
||||||
|
@ -740,8 +747,6 @@ class Node(object):
|
||||||
|
|
||||||
# print type and parameter values to .ini file
|
# print type and parameter values to .ini file
|
||||||
def outputDot(self, dot):
|
def outputDot(self, dot):
|
||||||
|
|
||||||
|
|
||||||
label = "{%s|" % self.path
|
label = "{%s|" % self.path
|
||||||
if isSimObject(self.realtype):
|
if isSimObject(self.realtype):
|
||||||
label += '%s|' % self.type
|
label += '%s|' % self.type
|
||||||
|
@ -762,9 +767,10 @@ class Node(object):
|
||||||
value = param.convert(param.value)
|
value = param.convert(param.value)
|
||||||
string = param.string(value)
|
string = param.string(value)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
raise e.__class__, 'exception in %s:%s\n%s' % \
|
msg = 'exception in %s:%s\n%s' % (self.name, param.name, e)
|
||||||
(self.name, param.name, e)
|
e.args = (msg, )
|
||||||
raise
|
raise
|
||||||
|
|
||||||
if isConfigNode(param.ptype) and string != "Null":
|
if isConfigNode(param.ptype) and string != "Null":
|
||||||
simobjs.append(string)
|
simobjs.append(string)
|
||||||
else:
|
else:
|
||||||
|
@ -837,7 +843,7 @@ class Value(object):
|
||||||
return len(self._getattr())
|
return len(self._getattr())
|
||||||
|
|
||||||
# Regular parameter.
|
# Regular parameter.
|
||||||
class _Param(object):
|
class ParamBase(object):
|
||||||
def __init__(self, ptype, *args, **kwargs):
|
def __init__(self, ptype, *args, **kwargs):
|
||||||
if isinstance(ptype, types.StringType):
|
if isinstance(ptype, types.StringType):
|
||||||
self.ptype_string = ptype
|
self.ptype_string = ptype
|
||||||
|
@ -909,13 +915,13 @@ class _Param(object):
|
||||||
def cpp_decl(self, name):
|
def cpp_decl(self, name):
|
||||||
return '%s %s;' % (self.ptype._cpp_param_decl, name)
|
return '%s %s;' % (self.ptype._cpp_param_decl, name)
|
||||||
|
|
||||||
class _ParamProxy(object):
|
class ParamFactory(object):
|
||||||
def __init__(self, type):
|
def __init__(self, type):
|
||||||
self.ptype = type
|
self.ptype = type
|
||||||
|
|
||||||
# E.g., Param.Int(5, "number of widgets")
|
# E.g., Param.Int(5, "number of widgets")
|
||||||
def __call__(self, *args, **kwargs):
|
def __call__(self, *args, **kwargs):
|
||||||
return _Param(self.ptype, *args, **kwargs)
|
return ParamBase(self.ptype, *args, **kwargs)
|
||||||
|
|
||||||
# Strange magic to theoretically allow dotted names as Param classes,
|
# Strange magic to theoretically allow dotted names as Param classes,
|
||||||
# e.g., Param.Foo.Bar(...) to have a param of type Foo.Bar
|
# e.g., Param.Foo.Bar(...) to have a param of type Foo.Bar
|
||||||
|
@ -929,17 +935,16 @@ class _ParamProxy(object):
|
||||||
if attr != 'ptype':
|
if attr != 'ptype':
|
||||||
raise AttributeError, \
|
raise AttributeError, \
|
||||||
'Attribute %s not available in %s' % (attr, self.__class__)
|
'Attribute %s not available in %s' % (attr, self.__class__)
|
||||||
super(_ParamProxy, self).__setattr__(attr, value)
|
super(ParamFactory, self).__setattr__(attr, value)
|
||||||
|
|
||||||
|
Param = ParamFactory(None)
|
||||||
Param = _ParamProxy(None)
|
|
||||||
|
|
||||||
# Vector-valued parameter description. Just like Param, except that
|
# Vector-valued parameter description. Just like Param, except that
|
||||||
# the value is a vector (list) of the specified type instead of a
|
# the value is a vector (list) of the specified type instead of a
|
||||||
# single value.
|
# single value.
|
||||||
class _VectorParam(_Param):
|
class VectorParamBase(ParamBase):
|
||||||
def __init__(self, type, *args, **kwargs):
|
def __init__(self, type, *args, **kwargs):
|
||||||
_Param.__init__(self, type, *args, **kwargs)
|
ParamBase.__init__(self, type, *args, **kwargs)
|
||||||
|
|
||||||
def valid(self, value):
|
def valid(self, value):
|
||||||
if value == None:
|
if value == None:
|
||||||
|
@ -974,12 +979,12 @@ class _VectorParam(_Param):
|
||||||
def cpp_decl(self, name):
|
def cpp_decl(self, name):
|
||||||
return 'std::vector<%s> %s;' % (self.ptype._cpp_param_decl, name)
|
return 'std::vector<%s> %s;' % (self.ptype._cpp_param_decl, name)
|
||||||
|
|
||||||
class _VectorParamProxy(_ParamProxy):
|
class VectorParamFactory(ParamFactory):
|
||||||
# E.g., VectorParam.Int(5, "number of widgets")
|
# E.g., VectorParam.Int(5, "number of widgets")
|
||||||
def __call__(self, *args, **kwargs):
|
def __call__(self, *args, **kwargs):
|
||||||
return _VectorParam(self.ptype, *args, **kwargs)
|
return VectorParamBase(self.ptype, *args, **kwargs)
|
||||||
|
|
||||||
VectorParam = _VectorParamProxy(None)
|
VectorParam = VectorParamFactory(None)
|
||||||
|
|
||||||
#####################################################################
|
#####################################################################
|
||||||
#
|
#
|
||||||
|
@ -995,6 +1000,80 @@ VectorParam = _VectorParamProxy(None)
|
||||||
#
|
#
|
||||||
#####################################################################
|
#####################################################################
|
||||||
|
|
||||||
|
class MetaRange(type):
|
||||||
|
def __init__(cls, name, bases, dict):
|
||||||
|
super(MetaRange, cls).__init__(name, bases, dict)
|
||||||
|
if name == 'Range':
|
||||||
|
return
|
||||||
|
cls._cpp_param_decl = 'Range<%s>' % cls.type._cpp_param_decl
|
||||||
|
|
||||||
|
def _convert(cls, value):
|
||||||
|
if not isinstance(value, Range):
|
||||||
|
raise TypeError, 'value %s is not a Pair' % value
|
||||||
|
value = cls(value)
|
||||||
|
value.first = cls.type._convert(value.first)
|
||||||
|
value.second = cls.type._convert(value.second)
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _string(cls, value):
|
||||||
|
first = int(value.first)
|
||||||
|
second = int(value.second)
|
||||||
|
if value.extend:
|
||||||
|
second += first
|
||||||
|
if not value.inclusive:
|
||||||
|
second -= 1
|
||||||
|
return '%s:%s' % (cls.type._string(first), cls.type._string(second))
|
||||||
|
|
||||||
|
class Range(ParamType):
|
||||||
|
__metaclass__ = MetaRange
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
if len(args) == 0:
|
||||||
|
self.first = kwargs.pop('start')
|
||||||
|
|
||||||
|
if 'end' in kwargs:
|
||||||
|
self.second = kwargs.pop('end')
|
||||||
|
self.inclusive = True
|
||||||
|
self.extend = False
|
||||||
|
elif 'size' in kwargs:
|
||||||
|
self.second = kwargs.pop('size')
|
||||||
|
self.inclusive = False
|
||||||
|
self.extend = True
|
||||||
|
else:
|
||||||
|
raise TypeError, "Either end or size must be specified"
|
||||||
|
|
||||||
|
elif len(args) == 1:
|
||||||
|
if kwargs:
|
||||||
|
self.first = args[0]
|
||||||
|
if 'end' in kwargs:
|
||||||
|
self.second = kwargs.pop('end')
|
||||||
|
self.inclusive = True
|
||||||
|
self.extend = False
|
||||||
|
elif 'size' in kwargs:
|
||||||
|
self.second = kwargs.pop('size')
|
||||||
|
self.inclusive = False
|
||||||
|
self.extend = True
|
||||||
|
else:
|
||||||
|
raise TypeError, "Either end or size must be specified"
|
||||||
|
elif isinstance(args[0], Range):
|
||||||
|
self.first = args[0].first
|
||||||
|
self.second = args[0].second
|
||||||
|
self.inclusive = args[0].inclusive
|
||||||
|
self.extend = args[0].extend
|
||||||
|
else:
|
||||||
|
self.first = 0
|
||||||
|
self.second = args[0]
|
||||||
|
self.inclusive = False
|
||||||
|
self.extend = True
|
||||||
|
|
||||||
|
elif len(args) == 2:
|
||||||
|
self.first, self.second = args
|
||||||
|
self.inclusive = True
|
||||||
|
self.extend = False
|
||||||
|
else:
|
||||||
|
raise TypeError, "Too many arguments specified"
|
||||||
|
|
||||||
|
if kwargs:
|
||||||
|
raise TypeError, "too many keywords: %s" % kwargs.keys()
|
||||||
|
|
||||||
# Metaclass for bounds-checked integer parameters. See CheckedInt.
|
# Metaclass for bounds-checked integer parameters. See CheckedInt.
|
||||||
class CheckedIntType(type):
|
class CheckedIntType(type):
|
||||||
|
@ -1028,8 +1107,10 @@ class CheckedIntType(type):
|
||||||
if not isinstance(value, (int, long, float, str)):
|
if not isinstance(value, (int, long, float, str)):
|
||||||
raise TypeError, 'Integer param of invalid type %s' % type(value)
|
raise TypeError, 'Integer param of invalid type %s' % type(value)
|
||||||
|
|
||||||
if isinstance(value, (str, float)):
|
if isinstance(value, float):
|
||||||
value = long(float(value))
|
value = long(value)
|
||||||
|
elif isinstance(value, str):
|
||||||
|
value = toInteger(value)
|
||||||
|
|
||||||
if not cls.min <= value <= cls.max:
|
if not cls.min <= value <= cls.max:
|
||||||
raise TypeError, 'Integer param out of bounds %d < %d < %d' % \
|
raise TypeError, 'Integer param out of bounds %d < %d < %d' % \
|
||||||
|
@ -1044,7 +1125,7 @@ class CheckedIntType(type):
|
||||||
# class is subclassed to generate parameter classes with specific
|
# class is subclassed to generate parameter classes with specific
|
||||||
# bounds. Initialization of the min and max bounds is done in the
|
# bounds. Initialization of the min and max bounds is done in the
|
||||||
# metaclass CheckedIntType.__init__.
|
# metaclass CheckedIntType.__init__.
|
||||||
class CheckedInt(ParamType):
|
class CheckedInt(long,ParamType):
|
||||||
__metaclass__ = CheckedIntType
|
__metaclass__ = CheckedIntType
|
||||||
|
|
||||||
class Int(CheckedInt): cppname = 'int'; size = 32; unsigned = False
|
class Int(CheckedInt): cppname = 'int'; size = 32; unsigned = False
|
||||||
|
@ -1060,68 +1141,66 @@ class Int64(CheckedInt): cppname = 'int64_t'; size = 64; unsigned = False
|
||||||
class UInt64(CheckedInt): cppname = 'uint64_t'; size = 64; unsigned = True
|
class UInt64(CheckedInt): cppname = 'uint64_t'; size = 64; unsigned = True
|
||||||
|
|
||||||
class Counter(CheckedInt): cppname = 'Counter'; size = 64; unsigned = True
|
class Counter(CheckedInt): cppname = 'Counter'; size = 64; unsigned = True
|
||||||
class Addr(CheckedInt): cppname = 'Addr'; size = 64; unsigned = True
|
|
||||||
class Tick(CheckedInt): cppname = 'Tick'; size = 64; unsigned = True
|
class Tick(CheckedInt): cppname = 'Tick'; size = 64; unsigned = True
|
||||||
|
|
||||||
class Percent(CheckedInt): cppname = 'int'; min = 0; max = 100
|
class Percent(CheckedInt): cppname = 'int'; min = 0; max = 100
|
||||||
|
|
||||||
class Pair(object):
|
class MemorySize(CheckedInt):
|
||||||
def __init__(self, first, second):
|
cppname = 'uint64_t'
|
||||||
self.first = first
|
size = 64
|
||||||
self.second = second
|
unsigned = True
|
||||||
|
def __new__(cls, value):
|
||||||
class MetaRange(type):
|
return super(MemorySize, cls).__new__(cls, toMemorySize(value))
|
||||||
def __init__(cls, name, bases, dict):
|
|
||||||
super(MetaRange, cls).__init__(name, bases, dict)
|
|
||||||
if name == 'Range':
|
|
||||||
return
|
|
||||||
cls._cpp_param_decl = 'Range<%s>' % cls.type._cpp_param_decl
|
|
||||||
|
|
||||||
def _convert(cls, value):
|
def _convert(cls, value):
|
||||||
if not isinstance(value, Pair):
|
return cls(value)
|
||||||
raise TypeError, 'value %s is not a Pair' % value
|
_convert = classmethod(_convert)
|
||||||
return Pair(cls.type._convert(value.first),
|
|
||||||
cls.type._convert(value.second))
|
|
||||||
|
|
||||||
def _string(cls, value):
|
def _string(cls, value):
|
||||||
return '%s:%s' % (cls.type._string(value.first),
|
return '%d' % value
|
||||||
cls.type._string(value.second))
|
_string = classmethod(_string)
|
||||||
|
|
||||||
class Range(ParamType):
|
class Addr(CheckedInt):
|
||||||
__metaclass__ = MetaRange
|
cppname = 'Addr'
|
||||||
|
size = 64
|
||||||
|
unsigned = True
|
||||||
|
def __new__(cls, value):
|
||||||
|
try:
|
||||||
|
value = long(toMemorySize(value))
|
||||||
|
except TypeError:
|
||||||
|
value = long(value)
|
||||||
|
return super(Addr, cls).__new__(cls, value)
|
||||||
|
|
||||||
def RangeSize(start, size):
|
def _convert(cls, value):
|
||||||
return Pair(start, start + size - 1)
|
return cls(value)
|
||||||
|
_convert = classmethod(_convert)
|
||||||
|
|
||||||
class AddrRange(Range): type = Addr
|
def _string(cls, value):
|
||||||
|
return '%d' % value
|
||||||
|
_string = classmethod(_string)
|
||||||
|
|
||||||
|
class AddrRange(Range):
|
||||||
|
type = Addr
|
||||||
|
|
||||||
# Boolean parameter type.
|
# Boolean parameter type.
|
||||||
class Bool(ParamType):
|
class Bool(ParamType):
|
||||||
_cpp_param_decl = 'bool'
|
_cpp_param_decl = 'bool'
|
||||||
def _convert(value):
|
def __init__(self, value):
|
||||||
t = type(value)
|
try:
|
||||||
if t == bool:
|
self.value = toBool(value)
|
||||||
return value
|
except TypeError:
|
||||||
|
self.value = bool(value)
|
||||||
|
|
||||||
if t == int or t == long:
|
def _convert(cls, value):
|
||||||
return bool(value)
|
return cls(value)
|
||||||
|
_convert = classmethod(_convert)
|
||||||
|
|
||||||
if t == str:
|
def _string(cls, value):
|
||||||
v = value.lower()
|
if value.value:
|
||||||
if v == "true" or v == "t" or v == "yes" or v == "y":
|
|
||||||
return True
|
|
||||||
elif v == "false" or v == "f" or v == "no" or v == "n":
|
|
||||||
return False
|
|
||||||
|
|
||||||
raise TypeError, 'Bool parameter (%s) of invalid type %s' % (v, t)
|
|
||||||
_convert = staticmethod(_convert)
|
|
||||||
|
|
||||||
def _string(value):
|
|
||||||
if value:
|
|
||||||
return "true"
|
return "true"
|
||||||
else:
|
else:
|
||||||
return "false"
|
return "false"
|
||||||
_string = staticmethod(_string)
|
_string = classmethod(_string)
|
||||||
|
|
||||||
# String-valued parameter.
|
# String-valued parameter.
|
||||||
class String(ParamType):
|
class String(ParamType):
|
||||||
|
@ -1143,7 +1222,6 @@ class String(ParamType):
|
||||||
return value
|
return value
|
||||||
_string = classmethod(_string)
|
_string = classmethod(_string)
|
||||||
|
|
||||||
|
|
||||||
def IncEthernetAddr(addr, val = 1):
|
def IncEthernetAddr(addr, val = 1):
|
||||||
bytes = map(lambda x: int(x, 16), addr.split(':'))
|
bytes = map(lambda x: int(x, 16), addr.split(':'))
|
||||||
bytes[5] += val
|
bytes[5] += val
|
||||||
|
@ -1239,7 +1317,6 @@ Null = NULL = NullSimObject()
|
||||||
|
|
||||||
# Metaclass for Enum types
|
# Metaclass for Enum types
|
||||||
class MetaEnum(type):
|
class MetaEnum(type):
|
||||||
|
|
||||||
def __init__(cls, name, bases, init_dict):
|
def __init__(cls, name, bases, init_dict):
|
||||||
if init_dict.has_key('map'):
|
if init_dict.has_key('map'):
|
||||||
if not isinstance(cls.map, dict):
|
if not isinstance(cls.map, dict):
|
||||||
|
@ -1286,25 +1363,126 @@ class Enum(ParamType):
|
||||||
def _string(self, value):
|
def _string(self, value):
|
||||||
return str(value)
|
return str(value)
|
||||||
_string = classmethod(_string)
|
_string = classmethod(_string)
|
||||||
|
|
||||||
|
root_frequency = None
|
||||||
|
|
||||||
#
|
#
|
||||||
# "Constants"... handy aliases for various values.
|
# "Constants"... handy aliases for various values.
|
||||||
#
|
#
|
||||||
|
class RootFrequency(float,ParamType):
|
||||||
|
_cpp_param_decl = 'Tick'
|
||||||
|
|
||||||
|
def __new__(cls, value):
|
||||||
|
return super(cls, RootFrequency).__new__(cls, toFrequency(value))
|
||||||
|
|
||||||
|
def _convert(cls, value):
|
||||||
|
return cls(value)
|
||||||
|
_convert = classmethod(_convert)
|
||||||
|
|
||||||
|
def _string(cls, value):
|
||||||
|
return '%d' % int(value)
|
||||||
|
_string = classmethod(_string)
|
||||||
|
|
||||||
|
class ClockPeriod(float,ParamType):
|
||||||
|
_cpp_param_decl = 'Tick'
|
||||||
|
def __new__(cls, value):
|
||||||
|
relative = False
|
||||||
|
try:
|
||||||
|
val = toClockPeriod(value)
|
||||||
|
except ValueError, e:
|
||||||
|
relative = True
|
||||||
|
if value.endswith('f'):
|
||||||
|
val = float(value[:-1])
|
||||||
|
if val:
|
||||||
|
val = 1 / val
|
||||||
|
elif value.endswith('c'):
|
||||||
|
val = float(value[:-1])
|
||||||
|
else:
|
||||||
|
raise e
|
||||||
|
|
||||||
|
self = super(cls, ClockPeriod).__new__(cls, val)
|
||||||
|
self.relative = relative
|
||||||
|
return self
|
||||||
|
|
||||||
|
def _convert(cls, value):
|
||||||
|
return cls(value)
|
||||||
|
_convert = classmethod(_convert)
|
||||||
|
|
||||||
|
def _string(cls, value):
|
||||||
|
if not value.relative:
|
||||||
|
value *= root_frequency
|
||||||
|
|
||||||
|
return '%d' % int(value)
|
||||||
|
_string = classmethod(_string)
|
||||||
|
|
||||||
|
class Frequency(float,ParamType):
|
||||||
|
_cpp_param_decl = 'Tick'
|
||||||
|
|
||||||
|
def __new__(cls, value):
|
||||||
|
relative = False
|
||||||
|
try:
|
||||||
|
val = toFrequency(value)
|
||||||
|
except ValueError, e:
|
||||||
|
if value.endswith('f'):
|
||||||
|
val = float(value[:-1])
|
||||||
|
relative = True
|
||||||
|
else:
|
||||||
|
raise e
|
||||||
|
self = super(cls, Frequency).__new__(cls, val)
|
||||||
|
self.relative = relative
|
||||||
|
return self
|
||||||
|
|
||||||
|
def _convert(cls, value):
|
||||||
|
return cls(value)
|
||||||
|
_convert = classmethod(_convert)
|
||||||
|
|
||||||
|
def _string(cls, value):
|
||||||
|
if not value.relative:
|
||||||
|
value = root_frequency / value
|
||||||
|
|
||||||
|
return '%d' % int(value)
|
||||||
|
_string = classmethod(_string)
|
||||||
|
|
||||||
|
class Latency(float,ParamType):
|
||||||
|
_cpp_param_decl = 'Tick'
|
||||||
|
def __new__(cls, value):
|
||||||
|
relative = False
|
||||||
|
try:
|
||||||
|
val = toLatency(value)
|
||||||
|
except ValueError, e:
|
||||||
|
if value.endswith('c'):
|
||||||
|
val = float(value[:-1])
|
||||||
|
relative = True
|
||||||
|
else:
|
||||||
|
raise e
|
||||||
|
self = super(cls, Latency).__new__(cls, val)
|
||||||
|
self.relative = relative
|
||||||
|
return self
|
||||||
|
|
||||||
|
def _convert(cls, value):
|
||||||
|
return cls(value)
|
||||||
|
_convert = classmethod(_convert)
|
||||||
|
|
||||||
|
def _string(cls, value):
|
||||||
|
if not value.relative:
|
||||||
|
value *= root_frequency
|
||||||
|
return '%d' % value
|
||||||
|
_string = classmethod(_string)
|
||||||
|
|
||||||
|
|
||||||
# Some memory range specifications use this as a default upper bound.
|
# Some memory range specifications use this as a default upper bound.
|
||||||
MAX_ADDR = Addr.max
|
MaxAddr = Addr.max
|
||||||
MaxTick = Tick.max
|
MaxTick = Tick.max
|
||||||
|
AllMemory = AddrRange(0, MaxAddr)
|
||||||
# For power-of-two sizing, e.g. 64*K gives an integer value 65536.
|
|
||||||
K = 1024
|
|
||||||
M = K*K
|
|
||||||
G = K*M
|
|
||||||
|
|
||||||
#####################################################################
|
#####################################################################
|
||||||
|
|
||||||
# The final hook to generate .ini files. Called from configuration
|
# The final hook to generate .ini files. Called from configuration
|
||||||
# script once config is built.
|
# script once config is built.
|
||||||
def instantiate(root):
|
def instantiate(root):
|
||||||
|
global root_frequency
|
||||||
instance = root.instantiate('root')
|
instance = root.instantiate('root')
|
||||||
|
root_frequency = RootFrequency._convert(root.frequency._getattr())
|
||||||
instance.fixup()
|
instance.fixup()
|
||||||
instance.display()
|
instance.display()
|
||||||
if not noDot:
|
if not noDot:
|
||||||
|
@ -1337,6 +1515,7 @@ __all__ = ['ConfigNode', 'SimObject', 'ParamContext', 'Param', 'VectorParam',
|
||||||
'Int', 'Unsigned', 'Int8', 'UInt8', 'Int16', 'UInt16',
|
'Int', 'Unsigned', 'Int8', 'UInt8', 'Int16', 'UInt16',
|
||||||
'Int32', 'UInt32', 'Int64', 'UInt64',
|
'Int32', 'UInt32', 'Int64', 'UInt64',
|
||||||
'Counter', 'Addr', 'Tick', 'Percent',
|
'Counter', 'Addr', 'Tick', 'Percent',
|
||||||
'Pair', 'RangeSize', 'AddrRange', 'MAX_ADDR', 'NULL', 'K', 'M',
|
'MemorySize', 'RootFrequency', 'Frequency', 'Latency',
|
||||||
'NextEthernetAddr',
|
'ClockPeriod',
|
||||||
'instantiate']
|
'Range', 'AddrRange', 'MaxAddr', 'MaxTick', 'AllMemory', 'NULL',
|
||||||
|
'NextEthernetAddr', 'instantiate']
|
||||||
|
|
|
@ -22,160 +22,185 @@ pebi = tebi * 1024
|
||||||
exbi = pebi * 1024
|
exbi = pebi * 1024
|
||||||
|
|
||||||
# memory size configuration stuff
|
# memory size configuration stuff
|
||||||
def toInteger(value):
|
def toFloat(value):
|
||||||
if not isinstance(value, str):
|
if not isinstance(value, str):
|
||||||
result = int(value)
|
raise TypeError, "wrong type '%s' should be str" % type(value)
|
||||||
elif value.endswith('Ei'):
|
|
||||||
result = int(value[:-2]) * exbi
|
if value.endswith('Ei'):
|
||||||
|
return float(value[:-2]) * exbi
|
||||||
elif value.endswith('Pi'):
|
elif value.endswith('Pi'):
|
||||||
result = int(value[:-2]) * pebi
|
return float(value[:-2]) * pebi
|
||||||
elif value.endswith('Ti'):
|
elif value.endswith('Ti'):
|
||||||
result = int(value[:-2]) * tebi
|
return float(value[:-2]) * tebi
|
||||||
elif value.endswith('Gi'):
|
elif value.endswith('Gi'):
|
||||||
result = int(value[:-2]) * gibi
|
return float(value[:-2]) * gibi
|
||||||
elif value.endswith('Mi'):
|
elif value.endswith('Mi'):
|
||||||
result = int(value[:-2]) * mebi
|
return float(value[:-2]) * mebi
|
||||||
elif value.endswith('ki'):
|
elif value.endswith('ki'):
|
||||||
result = int(value[:-2]) * kibi
|
return float(value[:-2]) * kibi
|
||||||
elif value.endswith('E'):
|
elif value.endswith('E'):
|
||||||
result = int(value[:-1]) * exa
|
return float(value[:-1]) * exa
|
||||||
elif value.endswith('P'):
|
elif value.endswith('P'):
|
||||||
result = int(value[:-1]) * peta
|
return float(value[:-1]) * peta
|
||||||
elif value.endswith('T'):
|
elif value.endswith('T'):
|
||||||
result = int(value[:-1]) * tera
|
return float(value[:-1]) * tera
|
||||||
elif value.endswith('G'):
|
elif value.endswith('G'):
|
||||||
result = int(value[:-1]) * giga
|
return float(value[:-1]) * giga
|
||||||
elif value.endswith('M'):
|
elif value.endswith('M'):
|
||||||
result = int(value[:-1]) * mega
|
return float(value[:-1]) * mega
|
||||||
elif value.endswith('k'):
|
elif value.endswith('k'):
|
||||||
result = int(value[:-1]) * kilo
|
return float(value[:-1]) * kilo
|
||||||
elif value.endswith('m'):
|
elif value.endswith('m'):
|
||||||
result = int(value[:-1]) * milli
|
return float(value[:-1]) * milli
|
||||||
elif value.endswith('u'):
|
elif value.endswith('u'):
|
||||||
result = int(value[:-1]) * micro
|
return float(value[:-1]) * micro
|
||||||
elif value.endswith('n'):
|
elif value.endswith('n'):
|
||||||
result = int(value[:-1]) * nano
|
return float(value[:-1]) * nano
|
||||||
elif value.endswith('p'):
|
elif value.endswith('p'):
|
||||||
result = int(value[:-1]) * pico
|
return float(value[:-1]) * pico
|
||||||
elif value.endswith('f'):
|
elif value.endswith('f'):
|
||||||
result = int(value[:-1]) * femto
|
return float(value[:-1]) * femto
|
||||||
else:
|
else:
|
||||||
|
return float(value)
|
||||||
|
|
||||||
|
def toLong(value):
|
||||||
|
value = toFloat(value)
|
||||||
result = int(value)
|
result = int(value)
|
||||||
|
if value != result:
|
||||||
|
raise ValueError, "cannot convert '%s' to long" % value
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def toBool(val):
|
def toInteger(value):
|
||||||
t = type(val)
|
value = toFloat(value)
|
||||||
if t == bool:
|
result = int(value)
|
||||||
return val
|
if value != result:
|
||||||
|
raise ValueError, "cannot convert '%s' to integer" % value
|
||||||
|
|
||||||
if t == None:
|
return result
|
||||||
return False
|
|
||||||
|
|
||||||
if t == int or t == long:
|
def toBool(value):
|
||||||
return bool(val)
|
if not isinstance(value, str):
|
||||||
|
raise TypeError, "wrong type '%s' should be str" % type(value)
|
||||||
|
|
||||||
if t == str:
|
value = value.lower()
|
||||||
val = val.lower()
|
if value == "true" or value == "t" or value == "yes" or value == "y":
|
||||||
if val == "true" or val == "t" or val == "yes" or val == "y":
|
|
||||||
return True
|
return True
|
||||||
elif val == "false" or val == "f" or val == "no" or val == "n":
|
elif value == "false" or value == "f" or value == "no" or value == "n":
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return toInteger(val) != 0
|
raise ValueError, "cannot convert '%s' to bool" % value
|
||||||
|
|
||||||
def toFrequency(value):
|
def toFrequency(value):
|
||||||
if not isinstance(value, str):
|
if not isinstance(value, str):
|
||||||
result = float(value)
|
raise TypeError, "wrong type '%s' should be str" % type(value)
|
||||||
elif value.endswith('THz'):
|
|
||||||
result = float(value[:-3]) * tera
|
|
||||||
elif value.endswith('GHz'):
|
|
||||||
result = float(value[:-3]) * giga
|
|
||||||
elif value.endswith('MHz'):
|
|
||||||
result = float(value[:-3]) * mega
|
|
||||||
elif value.endswith('kHz'):
|
|
||||||
result = float(value[:-3]) * kilo
|
|
||||||
elif value.endswith('Hz'):
|
|
||||||
result = float(value[:-2])
|
|
||||||
else:
|
|
||||||
result = float(value)
|
|
||||||
|
|
||||||
return result
|
if value.endswith('THz'):
|
||||||
|
return float(value[:-3]) * tera
|
||||||
|
elif value.endswith('GHz'):
|
||||||
|
return float(value[:-3]) * giga
|
||||||
|
elif value.endswith('MHz'):
|
||||||
|
return float(value[:-3]) * mega
|
||||||
|
elif value.endswith('kHz'):
|
||||||
|
return float(value[:-3]) * kilo
|
||||||
|
elif value.endswith('Hz'):
|
||||||
|
return float(value[:-2])
|
||||||
|
|
||||||
|
raise ValueError, "cannot convert '%s' to frequency" % value
|
||||||
|
|
||||||
def toLatency(value):
|
def toLatency(value):
|
||||||
if not isinstance(value, str):
|
if not isinstance(value, str):
|
||||||
result = float(value)
|
raise TypeError, "wrong type '%s' should be str" % type(value)
|
||||||
elif value.endswith('c'):
|
|
||||||
result = float(value[:-1])
|
if value.endswith('ps'):
|
||||||
elif value.endswith('ps'):
|
return float(value[:-2]) * pico
|
||||||
result = float(value[:-2]) * pico
|
elif value.endswith('ns'):
|
||||||
elif value.endswith('ns'):
|
return float(value[:-2]) * nano
|
||||||
result = float(value[:-2]) * nano
|
elif value.endswith('us'):
|
||||||
elif value.endswith('us'):
|
return float(value[:-2]) * micro
|
||||||
result = float(value[:-2]) * micro
|
elif value.endswith('ms'):
|
||||||
elif value.endswith('ms'):
|
return float(value[:-2]) * milli
|
||||||
result = float(value[:-2]) * milli
|
elif value.endswith('s'):
|
||||||
elif value.endswith('s'):
|
return float(value[:-1])
|
||||||
result = float(value[:-1])
|
|
||||||
else:
|
raise ValueError, "cannot convert '%s' to latency" % value
|
||||||
result = float(value)
|
|
||||||
|
def toClockPeriod(value):
|
||||||
|
"""result is a clock period"""
|
||||||
|
|
||||||
|
if not isinstance(value, str):
|
||||||
|
raise TypeError, "wrong type '%s' should be str" % type(value)
|
||||||
|
|
||||||
|
try:
|
||||||
|
val = toFrequency(value)
|
||||||
|
if val != 0:
|
||||||
|
val = 1 / val
|
||||||
|
return val
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
val = toLatency(value)
|
||||||
|
return val
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
raise ValueError, "cannot convert '%s' to clock period" % value
|
||||||
|
|
||||||
return result;
|
|
||||||
|
|
||||||
def toNetworkBandwidth(value):
|
def toNetworkBandwidth(value):
|
||||||
if not isinstance(value, str):
|
if not isinstance(value, str):
|
||||||
result = float(value)
|
raise TypeError, "wrong type '%s' should be str" % type(value)
|
||||||
elif value.endswith('Tbps'):
|
|
||||||
result = float(value[:-3]) * tera
|
|
||||||
elif value.endswith('Gbps'):
|
|
||||||
result = float(value[:-3]) * giga
|
|
||||||
elif value.endswith('Mbps'):
|
|
||||||
result = float(value[:-3]) * mega
|
|
||||||
elif value.endswith('kbps'):
|
|
||||||
result = float(value[:-3]) * kilo
|
|
||||||
elif value.endswith('bps'):
|
|
||||||
result = float(value[:-2])
|
|
||||||
else:
|
|
||||||
result = float(value)
|
|
||||||
|
|
||||||
return result
|
if value.endswith('Tbps'):
|
||||||
|
return float(value[:-3]) * tera
|
||||||
|
elif value.endswith('Gbps'):
|
||||||
|
return float(value[:-3]) * giga
|
||||||
|
elif value.endswith('Mbps'):
|
||||||
|
return float(value[:-3]) * mega
|
||||||
|
elif value.endswith('kbps'):
|
||||||
|
return float(value[:-3]) * kilo
|
||||||
|
elif value.endswith('bps'):
|
||||||
|
return float(value[:-2])
|
||||||
|
else:
|
||||||
|
return float(value)
|
||||||
|
|
||||||
|
raise ValueError, "cannot convert '%s' to network bandwidth" % value
|
||||||
|
|
||||||
def toMemoryBandwidth(value):
|
def toMemoryBandwidth(value):
|
||||||
if not isinstance(value, str):
|
if not isinstance(value, str):
|
||||||
result = int(value)
|
raise TypeError, "wrong type '%s' should be str" % type(value)
|
||||||
elif value.endswith('PB/s'):
|
|
||||||
result = int(value[:-4]) * pebi
|
|
||||||
elif value.endswith('TB/s'):
|
|
||||||
result = int(value[:-4]) * tebi
|
|
||||||
elif value.endswith('GB/s'):
|
|
||||||
result = int(value[:-4]) * gibi
|
|
||||||
elif value.endswith('MB/s'):
|
|
||||||
result = int(value[:-4]) * mebi
|
|
||||||
elif value.endswith('kB/s'):
|
|
||||||
result = int(value[:-4]) * kibi
|
|
||||||
elif value.endswith('B/s'):
|
|
||||||
result = int(value[:-3])
|
|
||||||
else:
|
|
||||||
result = int(value)
|
|
||||||
|
|
||||||
return result
|
if value.endswith('PB/s'):
|
||||||
|
return float(value[:-4]) * pebi
|
||||||
|
elif value.endswith('TB/s'):
|
||||||
|
return float(value[:-4]) * tebi
|
||||||
|
elif value.endswith('GB/s'):
|
||||||
|
return float(value[:-4]) * gibi
|
||||||
|
elif value.endswith('MB/s'):
|
||||||
|
return float(value[:-4]) * mebi
|
||||||
|
elif value.endswith('kB/s'):
|
||||||
|
return float(value[:-4]) * kibi
|
||||||
|
elif value.endswith('B/s'):
|
||||||
|
return float(value[:-3])
|
||||||
|
|
||||||
|
raise ValueError, "cannot convert '%s' to memory bandwidth" % value
|
||||||
|
|
||||||
def toMemorySize(value):
|
def toMemorySize(value):
|
||||||
if not isinstance(value, str):
|
if not isinstance(value, str):
|
||||||
result = int(value)
|
raise TypeError, "wrong type '%s' should be str" % type(value)
|
||||||
elif value.endswith('PB'):
|
|
||||||
result = int(value[:-2]) * pebi
|
|
||||||
elif value.endswith('TB'):
|
|
||||||
result = int(value[:-2]) * tebi
|
|
||||||
elif value.endswith('GB'):
|
|
||||||
result = int(value[:-2]) * gibi
|
|
||||||
elif value.endswith('MB'):
|
|
||||||
result = int(value[:-2]) * mebi
|
|
||||||
elif value.endswith('kB'):
|
|
||||||
result = int(value[:-2]) * kibi
|
|
||||||
elif value.endswith('B'):
|
|
||||||
result = int(value[:-1])
|
|
||||||
else:
|
|
||||||
result = int(value)
|
|
||||||
|
|
||||||
return result
|
if value.endswith('PB'):
|
||||||
|
return float(value[:-2]) * pebi
|
||||||
|
elif value.endswith('TB'):
|
||||||
|
return float(value[:-2]) * tebi
|
||||||
|
elif value.endswith('GB'):
|
||||||
|
return float(value[:-2]) * gibi
|
||||||
|
elif value.endswith('MB'):
|
||||||
|
return float(value[:-2]) * mebi
|
||||||
|
elif value.endswith('kB'):
|
||||||
|
return float(value[:-2]) * kibi
|
||||||
|
elif value.endswith('B'):
|
||||||
|
return float(value[:-1])
|
||||||
|
|
||||||
|
raise ValueError, "cannot convert '%s' to memory size" % value
|
||||||
|
|
|
@ -23,7 +23,7 @@ simobj BaseCache(BaseMem):
|
||||||
"always service demand misses first")
|
"always service demand misses first")
|
||||||
protocol = Param.CoherenceProtocol(NULL, "coherence protocol to use")
|
protocol = Param.CoherenceProtocol(NULL, "coherence protocol to use")
|
||||||
repl = Param.Repl(NULL, "replacement policy")
|
repl = Param.Repl(NULL, "replacement policy")
|
||||||
size = Param.Int("capacity in bytes")
|
size = Param.MemorySize("capacity in bytes")
|
||||||
split = Param.Bool(False, "whether or not this cache is split")
|
split = Param.Bool(False, "whether or not this cache is split")
|
||||||
split_size = Param.Int(0,
|
split_size = Param.Int(0,
|
||||||
"How many ways of the cache belong to CPU/LRU partition")
|
"How many ways of the cache belong to CPU/LRU partition")
|
||||||
|
|
|
@ -2,5 +2,5 @@ from BaseHier import BaseHier
|
||||||
|
|
||||||
simobj Bus(BaseHier):
|
simobj Bus(BaseHier):
|
||||||
type = 'Bus'
|
type = 'Bus'
|
||||||
clock_ratio = Param.Int("ratio of CPU to bus frequency")
|
clock_ratio = Param.ClockPeriod("ratio of CPU to bus frequency")
|
||||||
width = Param.Int("bus width in bytes")
|
width = Param.Int("bus width in bytes")
|
||||||
|
|
|
@ -68,8 +68,8 @@ simobj NSGigE(PciDevice):
|
||||||
rx_delay = Param.Tick(1000, "Receive Delay")
|
rx_delay = Param.Tick(1000, "Receive Delay")
|
||||||
tx_delay = Param.Tick(1000, "Transmit Delay")
|
tx_delay = Param.Tick(1000, "Transmit Delay")
|
||||||
|
|
||||||
rx_fifo_size = Param.Int(131072, "max size in bytes of rxFifo")
|
rx_fifo_size = Param.MemorySize('128kB', "max size in bytes of rxFifo")
|
||||||
tx_fifo_size = Param.Int(131072, "max size in bytes of txFifo")
|
tx_fifo_size = Param.MemorySize('128kB', "max size in bytes of txFifo")
|
||||||
|
|
||||||
intr_delay = Param.Tick(0, "Interrupt Delay in microseconds")
|
intr_delay = Param.Tick(0, "Interrupt Delay in microseconds")
|
||||||
payload_bus = Param.Bus(NULL, "The IO Bus to attach to for payload")
|
payload_bus = Param.Bus(NULL, "The IO Bus to attach to for payload")
|
||||||
|
|
|
@ -5,7 +5,7 @@ from Trace import Trace
|
||||||
|
|
||||||
simobj Root(SimObject):
|
simobj Root(SimObject):
|
||||||
type = 'Root'
|
type = 'Root'
|
||||||
frequency = Param.Tick(200000000, "tick frequency")
|
frequency = Param.RootFrequency('200MHz', "tick frequency")
|
||||||
output_file = Param.String('cout', "file to dump simulator output to")
|
output_file = Param.String('cout', "file to dump simulator output to")
|
||||||
full_system = Param.Bool("Full system simulation?")
|
full_system = Param.Bool("Full system simulation?")
|
||||||
hier = HierParams(do_data = False, do_events = True)
|
hier = HierParams(do_data = False, do_events = True)
|
||||||
|
|
|
@ -16,15 +16,16 @@
|
||||||
|
|
||||||
from convert import *
|
from convert import *
|
||||||
|
|
||||||
class SmartDict(dict):
|
class Variable(str):
|
||||||
|
"""Intelligent proxy class for SmartDict. Variable will use the
|
||||||
class Proxy(str):
|
various convert functions to attempt to convert values to useable
|
||||||
|
types"""
|
||||||
def __int__(self):
|
def __int__(self):
|
||||||
return int(toInteger(str(self)))
|
return toInteger(str(self))
|
||||||
def __long__(self):
|
def __long__(self):
|
||||||
return long(toInteger(str(self)))
|
return toLong(str(self))
|
||||||
def __float__(self):
|
def __float__(self):
|
||||||
return float(toInteger(str(self)))
|
return toFloat(str(self))
|
||||||
def __nonzero__(self):
|
def __nonzero__(self):
|
||||||
return toBool(str(self))
|
return toBool(str(self))
|
||||||
def convert(self, other):
|
def convert(self, other):
|
||||||
|
@ -73,36 +74,53 @@ class SmartDict(dict):
|
||||||
def __rtruediv__(self, other):
|
def __rtruediv__(self, other):
|
||||||
return other / self.convert(other)
|
return other / self.convert(other)
|
||||||
|
|
||||||
|
class UndefinedVariable(object):
|
||||||
|
"""Placeholder class to represent undefined variables. Will
|
||||||
|
generally cause an exception whenever it is used, but evaluates to
|
||||||
|
zero for boolean truth testing such as in an if statement"""
|
||||||
|
def __nonzero__(self):
|
||||||
|
return False
|
||||||
|
|
||||||
|
class SmartDict(dict):
|
||||||
|
"""Dictionary class that holds strings, but intelligently converts
|
||||||
|
those strings to other types depending on their usage"""
|
||||||
|
|
||||||
# __getitem__ uses dict.get() to return 'False' if the key is not
|
|
||||||
# found (rather than raising KeyError). Note that this does *not*
|
|
||||||
# set the key's value to 'False' in the dict, so that even after
|
|
||||||
# we call env['foo'] we still get a meaningful answer from "'foo'
|
|
||||||
# in env" (which calls dict.__contains__, which we do not
|
|
||||||
# override).
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
return self.Proxy(dict.get(self, key, 'False'))
|
"""returns a Variable proxy if the values exists in the database and
|
||||||
|
returns an UndefinedVariable otherwise"""
|
||||||
|
|
||||||
|
if key in self:
|
||||||
|
return Variable(dict.get(self, key))
|
||||||
|
else:
|
||||||
|
# Note that this does *not* change the contents of the dict,
|
||||||
|
# so that even after we call env['foo'] we still get a
|
||||||
|
# meaningful answer from "'foo' in env" (which
|
||||||
|
# calls dict.__contains__, which we do not override).
|
||||||
|
return UndefinedVariable()
|
||||||
|
|
||||||
def __setitem__(self, key, item):
|
def __setitem__(self, key, item):
|
||||||
|
"""intercept the setting of any variable so that we always
|
||||||
|
store strings in the dict"""
|
||||||
dict.__setitem__(self, key, str(item))
|
dict.__setitem__(self, key, str(item))
|
||||||
|
|
||||||
def values(self):
|
def values(self):
|
||||||
return [ self.Proxy(v) for v in dict.values(self) ]
|
return [ Variable(v) for v in dict.values(self) ]
|
||||||
|
|
||||||
def itervalues(self):
|
def itervalues(self):
|
||||||
for value in dict.itervalues(self):
|
for value in dict.itervalues(self):
|
||||||
yield self.Proxy(value)
|
yield Variable(value)
|
||||||
|
|
||||||
def items(self):
|
def items(self):
|
||||||
return [ (k, self.Proxy(v)) for k,v in dict.items(self) ]
|
return [ (k, Variable(v)) for k,v in dict.items(self) ]
|
||||||
|
|
||||||
def iteritems(self):
|
def iteritems(self):
|
||||||
for key,value in dict.iteritems(self):
|
for key,value in dict.iteritems(self):
|
||||||
yield key, self.Proxy(value)
|
yield key, Variable(value)
|
||||||
|
|
||||||
def get(self, key, default='False'):
|
def get(self, key, default='False'):
|
||||||
return self.Proxy(dict.get(self, key, str(default)))
|
return Variable(dict.get(self, key, str(default)))
|
||||||
|
|
||||||
def setdefault(self, key, default='False'):
|
def setdefault(self, key, default='False'):
|
||||||
return self.Proxy(dict.setdefault(self, key, str(default)))
|
return Variable(dict.setdefault(self, key, str(default)))
|
||||||
|
|
||||||
|
__all__ = [ 'SmartDict' ]
|
||||||
|
|
1631
util/categories.py
Normal file
1631
util/categories.py
Normal file
File diff suppressed because it is too large
Load diff
63
util/oprofile-top.py
Executable file
63
util/oprofile-top.py
Executable file
|
@ -0,0 +1,63 @@
|
||||||
|
#! /usr/bin/env python
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
import getopt
|
||||||
|
from categories import *
|
||||||
|
|
||||||
|
def category(app,sym):
|
||||||
|
if re.search("vmlinux-2.6", app):
|
||||||
|
name = sym
|
||||||
|
else:
|
||||||
|
name = app
|
||||||
|
|
||||||
|
if categories.has_key(name):
|
||||||
|
return categories[name]
|
||||||
|
for regexp, cat in categories_re:
|
||||||
|
if regexp.match(name):
|
||||||
|
return cat
|
||||||
|
print "no match for symbol %s" % name
|
||||||
|
return 'other'
|
||||||
|
|
||||||
|
try:
|
||||||
|
(opts, files) = getopt.getopt(sys.argv[1:], 'i')
|
||||||
|
except getopt.GetoptError:
|
||||||
|
print "usage", sys.argv[0], "[-i] <files>"
|
||||||
|
sys.exit(2)
|
||||||
|
|
||||||
|
showidle = True
|
||||||
|
|
||||||
|
for o,v in opts:
|
||||||
|
if o == "-i":
|
||||||
|
showidle = False
|
||||||
|
print files
|
||||||
|
f = open(files.pop())
|
||||||
|
total = 0
|
||||||
|
prof = {}
|
||||||
|
linenum = 0
|
||||||
|
for line in f.readlines():
|
||||||
|
line = re.sub("\(no symbols\)", "nosym", line)
|
||||||
|
line = re.sub("anonymous.*", "nosym", line)
|
||||||
|
linenum += 1
|
||||||
|
if linenum < 4:
|
||||||
|
continue
|
||||||
|
(count, percent, app, sym) = line.split()
|
||||||
|
#total += int(count)
|
||||||
|
cat = category(app,sym)
|
||||||
|
if cat != 'idle' or showidle:
|
||||||
|
total += int(count)
|
||||||
|
prof[cat] = prof.get(cat,0) + int(count)
|
||||||
|
|
||||||
|
cats = ['other', 'user', 'copy', 'bufmgt', 'stack', 'driver', 'interrupt', 'alignment' ]
|
||||||
|
|
||||||
|
if showidle:
|
||||||
|
cats.insert(0,'idle')
|
||||||
|
|
||||||
|
#syms = [(i[1], i[0]) for i in prof.items()]
|
||||||
|
#syms.sort()
|
||||||
|
#for i in range(len(syms)):
|
||||||
|
# print "%s -- %5.1f%% " % (prof[i][1], 100 * float(prof[i][0])/float(total))
|
||||||
|
|
||||||
|
for d in cats:
|
||||||
|
if prof.has_key(d):
|
||||||
|
print "%s -- %5.1f%% " % (d, 100 * float(prof[d])/float(total))
|
||||||
|
|
|
@ -45,14 +45,16 @@ progpath = nfspath(sys.path[0])
|
||||||
progname = basename(sys.argv[0])
|
progname = basename(sys.argv[0])
|
||||||
usage = """\
|
usage = """\
|
||||||
Usage:
|
Usage:
|
||||||
%(progname)s [-c] [-e] [-f] [-q queue] [-v] <regexp>
|
%(progname)s [-c] [-e] [-f] [-j <jobfile>] [-q queue] [-v] <regexp>
|
||||||
-c clean directory if job can be run
|
-c clean directory if job can be run
|
||||||
-e only echo pbs command info, don't actually send the job
|
-e only echo pbs command info, don't actually send the job
|
||||||
-f force the job to run regardless of state
|
-f force the job to run regardless of state
|
||||||
-q <queue> submit job to the named queue
|
-q <queue> submit job to the named queue
|
||||||
|
-j <jobfile> specify the jobfile (default is <basedir>/test.py)
|
||||||
-v be verbose
|
-v be verbose
|
||||||
|
|
||||||
%(progname)s -l [-v] <regexp>
|
%(progname)s [-j <jobfile>] -l [-v] <regexp>
|
||||||
|
-j <jobfile> specify the jobfile (default is <basedir>/test.py)
|
||||||
-l list job names, don't submit
|
-l list job names, don't submit
|
||||||
-v be verbose (list job parameters)
|
-v be verbose (list job parameters)
|
||||||
|
|
||||||
|
@ -62,7 +64,7 @@ Usage:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import getopt
|
import getopt
|
||||||
opts, args = getopt.getopt(sys.argv[1:], '-cd:efhlq:v')
|
opts, args = getopt.getopt(sys.argv[1:], '-cd:efhj:lq:v')
|
||||||
except getopt.GetoptError:
|
except getopt.GetoptError:
|
||||||
sys.exit(usage)
|
sys.exit(usage)
|
||||||
|
|
||||||
|
@ -74,6 +76,7 @@ listonly = False
|
||||||
queue = ''
|
queue = ''
|
||||||
verbose = False
|
verbose = False
|
||||||
rootdir = nfspath(os.getcwd())
|
rootdir = nfspath(os.getcwd())
|
||||||
|
jfile = 'test.py'
|
||||||
for opt,arg in opts:
|
for opt,arg in opts:
|
||||||
if opt == '-c':
|
if opt == '-c':
|
||||||
clean = True
|
clean = True
|
||||||
|
@ -86,6 +89,8 @@ for opt,arg in opts:
|
||||||
if opt == '-h':
|
if opt == '-h':
|
||||||
print usage
|
print usage
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
if opt == '-j':
|
||||||
|
jfile = arg
|
||||||
if opt == '-l':
|
if opt == '-l':
|
||||||
listonly = True
|
listonly = True
|
||||||
if opt == '-q':
|
if opt == '-q':
|
||||||
|
@ -115,7 +120,7 @@ if not listonly and not onlyecho and isdir(linkdir):
|
||||||
|
|
||||||
import job, jobfile, pbs
|
import job, jobfile, pbs
|
||||||
|
|
||||||
test = jobfile.JobFile(joinpath(basedir, 'test.py'))
|
test = jobfile.JobFile(joinpath(basedir, jfile))
|
||||||
|
|
||||||
joblist = []
|
joblist = []
|
||||||
for jobname in test.jobs:
|
for jobname in test.jobs:
|
||||||
|
|
|
@ -19,6 +19,9 @@ Usage: %s [-E] [-F] [-d <db> ] [-g <get> ] [-h <host>] [-p]
|
||||||
stability <pairnum> <stats> Calculated statistical info about stats
|
stability <pairnum> <stats> Calculated statistical info about stats
|
||||||
stat <regex> Show stat data (only matching regex)
|
stat <regex> Show stat data (only matching regex)
|
||||||
stats [regex] List all stats (only matching regex)
|
stats [regex] List all stats (only matching regex)
|
||||||
|
|
||||||
|
database <command> Where command is drop, init, or clean
|
||||||
|
|
||||||
''' % sys.argv[0]
|
''' % sys.argv[0]
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
@ -100,7 +103,7 @@ def graphdata68(runs, options, tag, label, value):
|
||||||
#print >>f, '#set sublabels = %s' % ' '.join(configs)
|
#print >>f, '#set sublabels = %s' % ' '.join(configs)
|
||||||
print >>f, '#set sublabels = ste hte htd ocm occ ocs'
|
print >>f, '#set sublabels = ste hte htd ocm occ ocs'
|
||||||
|
|
||||||
for speed,freq in zip(['s', '6', '8', 'q'],['4GHz', '6GHz','8GHz', '10GHz']):
|
for speed,freq in zip(['s', 'm', 'f', 'q'],['4GHz', '6GHz','8GHz', '10GHz']):
|
||||||
print >>f, '"%s"' % freq,
|
print >>f, '"%s"' % freq,
|
||||||
for conf in configs:
|
for conf in configs:
|
||||||
name = '%s.%s.%s.%s.%s' % (conf, bench, dma, cache, speed)
|
name = '%s.%s.%s.%s.%s' % (conf, bench, dma, cache, speed)
|
||||||
|
@ -456,41 +459,41 @@ def commands(options, command, args):
|
||||||
|
|
||||||
if command == 'usertime':
|
if command == 'usertime':
|
||||||
import copy
|
import copy
|
||||||
kernel = copy.copy(system.full_cpu.numCycles)
|
kernel = copy.copy(system.full0.numCycles)
|
||||||
kernel.bins = 'kernel'
|
kernel.bins = 'kernel'
|
||||||
|
|
||||||
user = copy.copy(system.full_cpu.numCycles)
|
user = copy.copy(system.full0.numCycles)
|
||||||
user.bins = 'user'
|
user.bins = 'user'
|
||||||
|
|
||||||
if options.graph:
|
if options.graph:
|
||||||
graphdata(runs, options, 'usertime', 'User Fraction',
|
graphdata(runs, options, 'usertime', 'User Fraction',
|
||||||
user / system.full_cpu.numCycles)
|
user / system.full0.numCycles)
|
||||||
else:
|
else:
|
||||||
printdata(runs, user / system.full_cpu.numCycles)
|
printdata(runs, user / system.full0.numCycles)
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'ticks':
|
if command == 'ticks':
|
||||||
if options.binned:
|
if options.binned:
|
||||||
print 'kernel ticks'
|
print 'kernel ticks'
|
||||||
system.full_cpu.numCycles.bins = 'kernel'
|
system.full0.numCycles.bins = 'kernel'
|
||||||
printdata(runs, system.full_cpu.numCycles)
|
printdata(runs, system.full0.numCycles)
|
||||||
|
|
||||||
print 'idle ticks'
|
print 'idle ticks'
|
||||||
system.full_cpu.numCycles.bins = 'idle'
|
system.full0.numCycles.bins = 'idle'
|
||||||
printdata(runs, system.full_cpu.numCycles)
|
printdata(runs, system.full0.numCycles)
|
||||||
|
|
||||||
print 'user ticks'
|
print 'user ticks'
|
||||||
system.full_cpu.numCycles.bins = 'user'
|
system.full0.numCycles.bins = 'user'
|
||||||
printdata(runs, system.full_cpu.numCycles)
|
printdata(runs, system.full0.numCycles)
|
||||||
|
|
||||||
print 'total ticks'
|
print 'total ticks'
|
||||||
|
|
||||||
system.full_cpu.numCycles.bins = None
|
system.full0.numCycles.bins = None
|
||||||
printdata(runs, system.full_cpu.numCycles)
|
printdata(runs, system.full0.numCycles)
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'packets':
|
if command == 'packets':
|
||||||
packets = system.tsunami.etherdev.rxPackets
|
packets = system.tsunami.etherdev0.rxPackets
|
||||||
if options.graph:
|
if options.graph:
|
||||||
graphdata(runs, options, 'packets', 'Packets', packets)
|
graphdata(runs, options, 'packets', 'Packets', packets)
|
||||||
else:
|
else:
|
||||||
|
@ -498,12 +501,12 @@ def commands(options, command, args):
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'ppt' or command == 'tpp':
|
if command == 'ppt' or command == 'tpp':
|
||||||
ppt = system.tsunami.etherdev.rxPackets / sim_ticks
|
ppt = system.tsunami.etherdev0.rxPackets / sim_ticks
|
||||||
printdata(runs, ppt, command == 'tpp')
|
printdata(runs, ppt, command == 'tpp')
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'pps':
|
if command == 'pps':
|
||||||
pps = system.tsunami.etherdev.rxPackets / sim_seconds
|
pps = system.tsunami.etherdev0.rxPackets / sim_seconds
|
||||||
if options.graph:
|
if options.graph:
|
||||||
graphdata(runs, options, 'pps', 'Packets/s', pps)
|
graphdata(runs, options, 'pps', 'Packets/s', pps)
|
||||||
else:
|
else:
|
||||||
|
@ -511,7 +514,7 @@ def commands(options, command, args):
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'bpt' or command == 'tpb':
|
if command == 'bpt' or command == 'tpb':
|
||||||
bytes = system.tsunami.etherdev.rxBytes + system.tsunami.etherdev.txBytes
|
bytes = system.tsunami.etherdev0.rxBytes + system.tsunami.etherdev0.txBytes
|
||||||
bpt = bytes / sim_ticks * 8
|
bpt = bytes / sim_ticks * 8
|
||||||
if options.graph:
|
if options.graph:
|
||||||
graphdata(runs, options, 'bpt', 'bps / Hz', bpt)
|
graphdata(runs, options, 'bpt', 'bps / Hz', bpt)
|
||||||
|
@ -520,7 +523,7 @@ def commands(options, command, args):
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'bptb' or command == 'tpbb':
|
if command == 'bptb' or command == 'tpbb':
|
||||||
bytes = system.tsunami.etherdev.rxBytes + system.tsunami.etherdev.txBytes
|
bytes = system.tsunami.etherdev0.rxBytes + system.tsunami.etherdev0.txBytes
|
||||||
|
|
||||||
print 'kernel stats'
|
print 'kernel stats'
|
||||||
bytes.bins = 'kernel'
|
bytes.bins = 'kernel'
|
||||||
|
@ -537,7 +540,7 @@ def commands(options, command, args):
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'bytes':
|
if command == 'bytes':
|
||||||
stat = system.tsunami.etherdev.rxBytes + system.tsunami.etherdev.txBytes
|
stat = system.tsunami.etherdev0.rxBytes + system.tsunami.etherdev0.txBytes
|
||||||
|
|
||||||
if options.binned:
|
if options.binned:
|
||||||
print '%s kernel stats' % stat.name
|
print '%s kernel stats' % stat.name
|
||||||
|
@ -559,7 +562,7 @@ def commands(options, command, args):
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'rxbps':
|
if command == 'rxbps':
|
||||||
gbps = system.tsunami.etherdev.rxBandwidth / 1e9
|
gbps = system.tsunami.etherdev0.rxBandwidth / 1e9
|
||||||
if options.graph:
|
if options.graph:
|
||||||
graphdata(runs, options, 'rxbps', 'Bandwidth (Gbps)', gbps)
|
graphdata(runs, options, 'rxbps', 'Bandwidth (Gbps)', gbps)
|
||||||
else:
|
else:
|
||||||
|
@ -567,7 +570,7 @@ def commands(options, command, args):
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'txbps':
|
if command == 'txbps':
|
||||||
gbps = system.tsunami.etherdev.txBandwidth / 1e9
|
gbps = system.tsunami.etherdev0.txBandwidth / 1e9
|
||||||
if options.graph:
|
if options.graph:
|
||||||
graphdata(runs, options, 'txbps', 'Bandwidth (Gbps)', gbps)
|
graphdata(runs, options, 'txbps', 'Bandwidth (Gbps)', gbps)
|
||||||
else:
|
else:
|
||||||
|
@ -575,8 +578,8 @@ def commands(options, command, args):
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'bps':
|
if command == 'bps':
|
||||||
rxbps = system.tsunami.etherdev.rxBandwidth
|
rxbps = system.tsunami.etherdev0.rxBandwidth
|
||||||
txbps = system.tsunami.etherdev.txBandwidth
|
txbps = system.tsunami.etherdev0.txBandwidth
|
||||||
gbps = (rxbps + txbps) / 1e9
|
gbps = (rxbps + txbps) / 1e9
|
||||||
if options.graph:
|
if options.graph:
|
||||||
graphdata(runs, options, 'bps', 'Bandwidth (Gbps)', gbps)
|
graphdata(runs, options, 'bps', 'Bandwidth (Gbps)', gbps)
|
||||||
|
@ -585,7 +588,7 @@ def commands(options, command, args):
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'misses':
|
if command == 'misses':
|
||||||
stat = system.L2.overall_mshr_misses
|
stat = system.l2.overall_mshr_misses
|
||||||
if options.binned:
|
if options.binned:
|
||||||
print '%s kernel stats' % stat.name
|
print '%s kernel stats' % stat.name
|
||||||
stat.bins = 'kernel'
|
stat.bins = 'kernel'
|
||||||
|
@ -609,9 +612,9 @@ def commands(options, command, args):
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'mpkb':
|
if command == 'mpkb':
|
||||||
misses = system.L2.overall_mshr_misses
|
misses = system.l2.overall_mshr_misses
|
||||||
rxbytes = system.tsunami.etherdev.rxBytes
|
rxbytes = system.tsunami.etherdev0.rxBytes
|
||||||
txbytes = system.tsunami.etherdev.txBytes
|
txbytes = system.tsunami.etherdev0.txBytes
|
||||||
|
|
||||||
if options.binned:
|
if options.binned:
|
||||||
print 'mpkb kernel stats'
|
print 'mpkb kernel stats'
|
||||||
|
@ -640,9 +643,9 @@ def commands(options, command, args):
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'ipkb':
|
if command == 'ipkb':
|
||||||
interrupts = system.full_cpu.kern.faults[4]
|
interrupts = system.full0.kern.faults[4]
|
||||||
rxbytes = system.tsunami.etherdev.rxBytes
|
rxbytes = system.tsunami.etherdev0.rxBytes
|
||||||
txbytes = system.tsunami.etherdev.txBytes
|
txbytes = system.tsunami.etherdev0.txBytes
|
||||||
|
|
||||||
if options.binned:
|
if options.binned:
|
||||||
print 'ipkb kernel stats'
|
print 'ipkb kernel stats'
|
||||||
|
@ -671,19 +674,19 @@ def commands(options, command, args):
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'execute':
|
if command == 'execute':
|
||||||
printdata(runs, system.full_cpu.ISSUE__count)
|
printdata(runs, system.full0.ISSUE__count)
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'commit':
|
if command == 'commit':
|
||||||
printdata(runs, system.full_cpu.COM__count)
|
printdata(runs, system.full0.COM__count)
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'fetch':
|
if command == 'fetch':
|
||||||
printdata(runs, system.full_cpu.FETCH__count)
|
printdata(runs, system.full0.FETCH__count)
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'bpp':
|
if command == 'bpp':
|
||||||
ed = system.tsunami.etherdev
|
ed = system.tsunami.etherdev0
|
||||||
bpp = (ed.rxBytes + ed.txBytes) / (ed.rxPackets + ed.txPackets)
|
bpp = (ed.rxBytes + ed.txBytes) / (ed.rxPackets + ed.txPackets)
|
||||||
if options.graph:
|
if options.graph:
|
||||||
graphdata(runs, options, 'bpp', 'Bytes / Packet', bpp)
|
graphdata(runs, options, 'bpp', 'Bytes / Packet', bpp)
|
||||||
|
@ -692,7 +695,7 @@ def commands(options, command, args):
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'rxbpp':
|
if command == 'rxbpp':
|
||||||
bpp = system.tsunami.etherdev.rxBytes / system.tsunami.etherdev.rxPackets
|
bpp = system.tsunami.etherdev0.rxBytes / system.tsunami.etherdev0.rxPackets
|
||||||
if options.graph:
|
if options.graph:
|
||||||
graphdata(runs, options, 'rxbpp', 'Receive Bytes / Packet', bpp)
|
graphdata(runs, options, 'rxbpp', 'Receive Bytes / Packet', bpp)
|
||||||
else:
|
else:
|
||||||
|
@ -700,7 +703,7 @@ def commands(options, command, args):
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'txbpp':
|
if command == 'txbpp':
|
||||||
bpp = system.tsunami.etherdev.txBytes / system.tsunami.etherdev.txPackets
|
bpp = system.tsunami.etherdev0.txBytes / system.tsunami.etherdev0.txPackets
|
||||||
if options.graph:
|
if options.graph:
|
||||||
graphdata(runs, options, 'txbpp', 'Transmit Bytes / Packet', bpp)
|
graphdata(runs, options, 'txbpp', 'Transmit Bytes / Packet', bpp)
|
||||||
else:
|
else:
|
||||||
|
@ -708,7 +711,7 @@ def commands(options, command, args):
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'rtp':
|
if command == 'rtp':
|
||||||
rtp = system.tsunami.etherdev.rxPackets / system.tsunami.etherdev.txPackets
|
rtp = system.tsunami.etherdev0.rxPackets / system.tsunami.etherdev0.txPackets
|
||||||
if options.graph:
|
if options.graph:
|
||||||
graphdata(runs, options, 'rtp', 'rxPackets / txPackets', rtp)
|
graphdata(runs, options, 'rtp', 'rxPackets / txPackets', rtp)
|
||||||
else:
|
else:
|
||||||
|
@ -716,7 +719,7 @@ def commands(options, command, args):
|
||||||
return
|
return
|
||||||
|
|
||||||
if command == 'rtb':
|
if command == 'rtb':
|
||||||
rtb = system.tsunami.etherdev.rxBytes / system.tsunami.etherdev.txBytes
|
rtb = system.tsunami.etherdev0.rxBytes / system.tsunami.etherdev0.txBytes
|
||||||
if options.graph:
|
if options.graph:
|
||||||
graphdata(runs, options, 'rtb', 'rxBytes / txBytes', rtb)
|
graphdata(runs, options, 'rtb', 'rxBytes / txBytes', rtb)
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in a new issue