Better handling of latency/frequency parameter types

python/m5/config.py:
    Addr is slightly different from memory size in that Addr
    will take non strings.
    Deal with the fact that the convert.toFoo functions only accept
    strings.
    Add RootFrequency as a special type for the Root.frequency
    parameter which is not scaled.
    Add ClockPeriod parameter type.
python/m5/convert.py:
    Be more strict about what's allowed.
    Only accept strings as inputs for these conversion functions.
    If the user wants to accept something else, they need to deal
    with the failure and convert other types on their own.
python/m5/objects/Bus.mpy:
    Use the new ClockPeriod parameter type
python/m5/objects/Root.mpy:
    Can't use integers for frequency anymore
python/m5/smartdict.py:
    rename SmartDict.Proxy to just Variable.  Create a new class
    UndefinedVariable that is returned when the user tries to get
    a variable that is not in the dict.  Undefined variable evaluates
    to false, and will cause an error elsewhere.

--HG--
extra : convert_revision : 1d55246fd1af65106f102396234827d6401ef9ce
This commit is contained in:
Nathan Binkert
2005-03-25 22:59:29 -05:00
parent 7e1995a29c
commit 40bab977bc
5 changed files with 337 additions and 207 deletions

View File

@@ -22,162 +22,185 @@ pebi = tebi * 1024
exbi = pebi * 1024
# memory size configuration stuff
def toInteger(value):
def toFloat(value):
if not isinstance(value, str):
result = int(value)
elif value.endswith('Ei'):
result = int(value[:-2]) * exbi
raise TypeError, "wrong type '%s' should be str" % type(value)
if value.endswith('Ei'):
return float(value[:-2]) * exbi
elif value.endswith('Pi'):
result = int(value[:-2]) * pebi
return float(value[:-2]) * pebi
elif value.endswith('Ti'):
result = int(value[:-2]) * tebi
return float(value[:-2]) * tebi
elif value.endswith('Gi'):
result = int(value[:-2]) * gibi
return float(value[:-2]) * gibi
elif value.endswith('Mi'):
result = int(value[:-2]) * mebi
return float(value[:-2]) * mebi
elif value.endswith('ki'):
result = int(value[:-2]) * kibi
return float(value[:-2]) * kibi
elif value.endswith('E'):
result = int(value[:-1]) * exa
return float(value[:-1]) * exa
elif value.endswith('P'):
result = int(value[:-1]) * peta
return float(value[:-1]) * peta
elif value.endswith('T'):
result = int(value[:-1]) * tera
return float(value[:-1]) * tera
elif value.endswith('G'):
result = int(value[:-1]) * giga
return float(value[:-1]) * giga
elif value.endswith('M'):
result = int(value[:-1]) * mega
return float(value[:-1]) * mega
elif value.endswith('k'):
result = int(value[:-1]) * kilo
return float(value[:-1]) * kilo
elif value.endswith('m'):
result = int(value[:-1]) * milli
return float(value[:-1]) * milli
elif value.endswith('u'):
result = int(value[:-1]) * micro
return float(value[:-1]) * micro
elif value.endswith('n'):
result = int(value[:-1]) * nano
return float(value[:-1]) * nano
elif value.endswith('p'):
result = int(value[:-1]) * pico
return float(value[:-1]) * pico
elif value.endswith('f'):
result = int(value[:-1]) * femto
return float(value[:-1]) * femto
else:
result = int(float(value))
return float(value)
def toLong(value):
value = toFloat(value)
result = int(value)
if value != result:
raise ValueError, "cannot convert '%s' to long" % value
return result
def toBool(val):
t = type(val)
if t == bool:
return val
def toInteger(value):
value = toFloat(value)
result = int(value)
if value != result:
raise ValueError, "cannot convert '%s' to integer" % value
if t == None:
return result
def toBool(value):
if not isinstance(value, str):
raise TypeError, "wrong type '%s' should be str" % type(value)
value = value.lower()
if value == "true" or value == "t" or value == "yes" or value == "y":
return True
elif value == "false" or value == "f" or value == "no" or value == "n":
return False
if t == int or t == long:
return bool(val)
if t == str:
val = val.lower()
if val == "true" or val == "t" or val == "yes" or val == "y":
return True
elif val == "false" or val == "f" or val == "no" or val == "n":
return False
elif val == "":
return False
return toInteger(val) != 0
raise ValueError, "cannot convert '%s' to bool" % value
def toFrequency(value):
if not isinstance(value, str):
result = float(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)
raise TypeError, "wrong type '%s' should be str" % type(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):
if not isinstance(value, str):
result = float(value)
elif value.endswith('c'):
result = float(value[:-1])
elif value.endswith('ps'):
result = float(value[:-2]) * pico
elif value.endswith('ns'):
result = float(value[:-2]) * nano
elif value.endswith('us'):
result = float(value[:-2]) * micro
elif value.endswith('ms'):
result = float(value[:-2]) * milli
elif value.endswith('s'):
result = float(value[:-1])
else:
result = float(value)
raise TypeError, "wrong type '%s' should be str" % type(value)
if value.endswith('ps'):
return float(value[:-2]) * pico
elif value.endswith('ns'):
return float(value[:-2]) * nano
elif value.endswith('us'):
return float(value[:-2]) * micro
elif value.endswith('ms'):
return float(value[:-2]) * milli
elif value.endswith('s'):
return float(value[:-1])
raise ValueError, "cannot convert '%s' to latency" % 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):
if not isinstance(value, str):
result = float(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)
raise TypeError, "wrong type '%s' should be str" % type(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):
if not isinstance(value, str):
result = int(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)
raise TypeError, "wrong type '%s' should be str" % type(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):
if not isinstance(value, str):
result = int(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)
raise TypeError, "wrong type '%s' should be str" % type(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