mem, python: refactor error message formatting
This commit refactors the error message added to convert.py. A mapping between the base 10 and base 2 suffix magnitudes (e.g. k: ki, M: Mi, etc.) and a new function that extracts the magnitude and numerical value have been added. Also, a warning message has been added to the toMemoryBandwidth function in addition to the one in toMemorySize. Change-Id: I3ae157d13c7089d38a34a6e4c35a2b58978106d0
This commit is contained in:
@@ -53,10 +53,10 @@ class CfiMemory(AbstractMemory):
|
|||||||
|
|
||||||
latency = Param.Latency("30ns", "Request to response latency")
|
latency = Param.Latency("30ns", "Request to response latency")
|
||||||
latency_var = Param.Latency("0ns", "Request to response latency variance")
|
latency_var = Param.Latency("0ns", "Request to response latency variance")
|
||||||
# The memory bandwidth limit default is set to 12.8GB/s which is
|
# The memory bandwidth limit default is set to 12.8GiB/s which is
|
||||||
# representative of a x64 DDR3-1600 channel.
|
# representative of a x64 DDR3-1600 channel.
|
||||||
bandwidth = Param.MemoryBandwidth(
|
bandwidth = Param.MemoryBandwidth(
|
||||||
"12.8GB/s", "Combined read and write bandwidth"
|
"12.8GiB/s", "Combined read and write bandwidth"
|
||||||
)
|
)
|
||||||
|
|
||||||
vendor_id = Param.UInt16(0, "vendor ID")
|
vendor_id = Param.UInt16(0, "vendor ID")
|
||||||
|
|||||||
@@ -102,6 +102,15 @@ binary_prefixes = {
|
|||||||
"k": kibi,
|
"k": kibi,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
base_10_to_2 = {
|
||||||
|
"k": "Ki",
|
||||||
|
"M": "Mi",
|
||||||
|
"G": "Gi",
|
||||||
|
"T": "Ti",
|
||||||
|
"P": "Pi",
|
||||||
|
"E": "Ei",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def assertStr(value):
|
def assertStr(value):
|
||||||
if not isinstance(value, str):
|
if not isinstance(value, str):
|
||||||
@@ -124,6 +133,32 @@ def _split_suffix(value, suffixes):
|
|||||||
return (value[: -len(matches[0])], matches[0]) if matches else (value, "")
|
return (value[: -len(matches[0])], matches[0]) if matches else (value, "")
|
||||||
|
|
||||||
|
|
||||||
|
def _split_suffix_by_prefix(value):
|
||||||
|
"""Split a string based on a suffix from a list of suffixes.
|
||||||
|
This is intended to be used with the keys of binary_prefixes.
|
||||||
|
|
||||||
|
:param value: String value to test for a matching magnitude
|
||||||
|
(e.g. k, M, Gi, etc).
|
||||||
|
:param suffixes: Container of suffixes to test.
|
||||||
|
|
||||||
|
:returns: A tuple of (value, suffix). Suffix is the empty string
|
||||||
|
if there is no match.
|
||||||
|
|
||||||
|
"""
|
||||||
|
matches = [sfx for sfx in binary_prefixes.keys() if sfx in value]
|
||||||
|
|
||||||
|
if len(matches) == 2: # e.g. matches both M and Mi
|
||||||
|
matches.sort(key=len, reverse=True)
|
||||||
|
matches.pop()
|
||||||
|
assert len(matches) <= 1
|
||||||
|
|
||||||
|
return (
|
||||||
|
(value[: value.find(matches[0])], matches[0])
|
||||||
|
if matches
|
||||||
|
else (value, "")
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def toNum(value, target_type, units, prefixes, converter):
|
def toNum(value, target_type, units, prefixes, converter):
|
||||||
"""Convert a string using units and prefixes to (typically) a float or
|
"""Convert a string using units and prefixes to (typically) a float or
|
||||||
integer.
|
integer.
|
||||||
@@ -260,22 +295,24 @@ def toNetworkBandwidth(value):
|
|||||||
|
|
||||||
|
|
||||||
def toMemoryBandwidth(value):
|
def toMemoryBandwidth(value):
|
||||||
|
checkBaseConversion(value, "B/s")
|
||||||
return toBinaryFloat(value, "memory bandwidth", "B/s")
|
return toBinaryFloat(value, "memory bandwidth", "B/s")
|
||||||
|
|
||||||
|
|
||||||
def toMemorySize(value):
|
def checkBaseConversion(value, unit):
|
||||||
if (
|
if type(value) is str:
|
||||||
type(value) is str
|
size, prefix = _split_suffix_by_prefix(value)
|
||||||
and len(value) > 1
|
if prefix in base_10_to_2.keys():
|
||||||
and value[-2] in binary_prefixes.keys()
|
from m5.util import warn
|
||||||
and not "i" in value
|
|
||||||
):
|
|
||||||
from m5.util import warn
|
|
||||||
|
|
||||||
warn(
|
warn(
|
||||||
f"Base 10 memory/cache size {value} will be cast to base 2"
|
f"Base 10 memory/cache size {value} will be cast to base 2"
|
||||||
+ f" size {value[0:-2]}{value[-2].upper()}i{value[-1]}."
|
+ f" size {size}{base_10_to_2[prefix]}{unit}."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def toMemorySize(value):
|
||||||
|
checkBaseConversion(value, "B")
|
||||||
return toBinaryInteger(value, "memory size", "B")
|
return toBinaryInteger(value, "memory size", "B")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user