convert.py revision 10427:26fee6c20087
13101Sstever@eecs.umich.edu# Copyright (c) 2005 The Regents of The University of Michigan
28579Ssteve.reinhardt@amd.com# Copyright (c) 2010 Advanced Micro Devices, Inc.
33101Sstever@eecs.umich.edu# All rights reserved.
43101Sstever@eecs.umich.edu#
53101Sstever@eecs.umich.edu# Redistribution and use in source and binary forms, with or without
63101Sstever@eecs.umich.edu# modification, are permitted provided that the following conditions are
73101Sstever@eecs.umich.edu# met: redistributions of source code must retain the above copyright
83101Sstever@eecs.umich.edu# notice, this list of conditions and the following disclaimer;
93101Sstever@eecs.umich.edu# redistributions in binary form must reproduce the above copyright
103101Sstever@eecs.umich.edu# notice, this list of conditions and the following disclaimer in the
113101Sstever@eecs.umich.edu# documentation and/or other materials provided with the distribution;
123101Sstever@eecs.umich.edu# neither the name of the copyright holders nor the names of its
133101Sstever@eecs.umich.edu# contributors may be used to endorse or promote products derived from
143101Sstever@eecs.umich.edu# this software without specific prior written permission.
153101Sstever@eecs.umich.edu#
163101Sstever@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173101Sstever@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183101Sstever@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193101Sstever@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203101Sstever@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213101Sstever@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223101Sstever@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233101Sstever@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243101Sstever@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253101Sstever@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263101Sstever@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273101Sstever@eecs.umich.edu#
283101Sstever@eecs.umich.edu# Authors: Nathan Binkert
293101Sstever@eecs.umich.edu#          Gabe Black
307778Sgblack@eecs.umich.edu
313101Sstever@eecs.umich.edu# metric prefixes
323101Sstever@eecs.umich.eduexa  = 1.0e18
333101Sstever@eecs.umich.edupeta = 1.0e15
343101Sstever@eecs.umich.edutera = 1.0e12
353101Sstever@eecs.umich.edugiga = 1.0e9
363101Sstever@eecs.umich.edumega = 1.0e6
373101Sstever@eecs.umich.edukilo = 1.0e3
383101Sstever@eecs.umich.edu
393101Sstever@eecs.umich.edumilli = 1.0e-3
403101Sstever@eecs.umich.edumicro = 1.0e-6
413101Sstever@eecs.umich.edunano  = 1.0e-9
423101Sstever@eecs.umich.edupico  = 1.0e-12
433101Sstever@eecs.umich.edufemto = 1.0e-15
443101Sstever@eecs.umich.eduatto  = 1.0e-18
453101Sstever@eecs.umich.edu
463101Sstever@eecs.umich.edu# power of 2 prefixes
473101Sstever@eecs.umich.edukibi = 1024
483101Sstever@eecs.umich.edumebi = kibi * 1024
493885Sbinkertn@umich.edugibi = mebi * 1024
503885Sbinkertn@umich.edutebi = gibi * 1024
514762Snate@binkert.orgpebi = tebi * 1024
523885Sbinkertn@umich.eduexbi = pebi * 1024
533885Sbinkertn@umich.edu
547528Ssteve.reinhardt@amd.com# memory size configuration stuff
553885Sbinkertn@umich.edudef toFloat(value):
564380Sbinkertn@umich.edu    if not isinstance(value, str):
574167Sbinkertn@umich.edu        raise TypeError, "wrong type '%s' should be str" % type(value)
583102Sstever@eecs.umich.edu
593101Sstever@eecs.umich.edu    if value.endswith('Ei'):
604762Snate@binkert.org        return float(value[:-2]) * exbi
614762Snate@binkert.org    elif value.endswith('Pi'):
624762Snate@binkert.org        return float(value[:-2]) * pebi
634762Snate@binkert.org    elif value.endswith('Ti'):
644762Snate@binkert.org        return float(value[:-2]) * tebi
654762Snate@binkert.org    elif value.endswith('Gi'):
664762Snate@binkert.org        return float(value[:-2]) * gibi
674762Snate@binkert.org    elif value.endswith('Mi'):
684762Snate@binkert.org        return float(value[:-2]) * mebi
695033Smilesck@eecs.umich.edu    elif value.endswith('ki'):
705033Smilesck@eecs.umich.edu        return float(value[:-2]) * kibi
715033Smilesck@eecs.umich.edu    elif value.endswith('E'):
725033Smilesck@eecs.umich.edu        return float(value[:-1]) * exa
735033Smilesck@eecs.umich.edu    elif value.endswith('P'):
745033Smilesck@eecs.umich.edu        return float(value[:-1]) * peta
755033Smilesck@eecs.umich.edu    elif value.endswith('T'):
765033Smilesck@eecs.umich.edu        return float(value[:-1]) * tera
775033Smilesck@eecs.umich.edu    elif value.endswith('G'):
785033Smilesck@eecs.umich.edu        return float(value[:-1]) * giga
793101Sstever@eecs.umich.edu    elif value.endswith('M'):
803101Sstever@eecs.umich.edu        return float(value[:-1]) * mega
813101Sstever@eecs.umich.edu    elif value.endswith('k'):
825033Smilesck@eecs.umich.edu        return float(value[:-1]) * kilo
833101Sstever@eecs.umich.edu    elif value.endswith('m'):
848596Ssteve.reinhardt@amd.com        return float(value[:-1]) * milli
858596Ssteve.reinhardt@amd.com    elif value.endswith('u'):
868596Ssteve.reinhardt@amd.com        return float(value[:-1]) * micro
878596Ssteve.reinhardt@amd.com    elif value.endswith('n'):
887673Snate@binkert.org        return float(value[:-1]) * nano
897673Snate@binkert.org    elif value.endswith('p'):
907673Snate@binkert.org        return float(value[:-1]) * pico
917673Snate@binkert.org    elif value.endswith('f'):
928596Ssteve.reinhardt@amd.com        return float(value[:-1]) * femto
938596Ssteve.reinhardt@amd.com    else:
948596Ssteve.reinhardt@amd.com        return float(value)
957673Snate@binkert.org
967673Snate@binkert.orgdef toInteger(value):
977673Snate@binkert.org    value = toFloat(value)
983101Sstever@eecs.umich.edu    result = long(value)
993101Sstever@eecs.umich.edu    if value != result:
1003101Sstever@eecs.umich.edu        raise ValueError, "cannot convert '%s' to integer" % value
1013101Sstever@eecs.umich.edu
1023101Sstever@eecs.umich.edu    return result
1033101Sstever@eecs.umich.edu
1043101Sstever@eecs.umich.edu_bool_dict = {
1053101Sstever@eecs.umich.edu    'true' : True,   't' : True,  'yes' : True, 'y' : True,  '1' : True,
1063101Sstever@eecs.umich.edu    'false' : False, 'f' : False, 'no' : False, 'n' : False, '0' : False
1073101Sstever@eecs.umich.edu    }
1083101Sstever@eecs.umich.edu
1093101Sstever@eecs.umich.edudef toBool(value):
1103101Sstever@eecs.umich.edu    if not isinstance(value, str):
1113101Sstever@eecs.umich.edu        raise TypeError, "wrong type '%s' should be str" % type(value)
1123101Sstever@eecs.umich.edu
1133101Sstever@eecs.umich.edu    value = value.lower()
1143101Sstever@eecs.umich.edu    result = _bool_dict.get(value, None)
1153101Sstever@eecs.umich.edu    if result == None:
1163101Sstever@eecs.umich.edu        raise ValueError, "cannot convert '%s' to bool" % value
1173101Sstever@eecs.umich.edu    return result
1183101Sstever@eecs.umich.edu
1193101Sstever@eecs.umich.edudef toFrequency(value):
1203101Sstever@eecs.umich.edu    if not isinstance(value, str):
1213101Sstever@eecs.umich.edu        raise TypeError, "wrong type '%s' should be str" % type(value)
1223101Sstever@eecs.umich.edu
1233101Sstever@eecs.umich.edu    if value.endswith('THz'):
1243101Sstever@eecs.umich.edu        return float(value[:-3]) * tera
1253101Sstever@eecs.umich.edu    elif value.endswith('GHz'):
1263101Sstever@eecs.umich.edu        return float(value[:-3]) * giga
1273101Sstever@eecs.umich.edu    elif value.endswith('MHz'):
1283101Sstever@eecs.umich.edu        return float(value[:-3]) * mega
1293101Sstever@eecs.umich.edu    elif value.endswith('kHz'):
1303101Sstever@eecs.umich.edu        return float(value[:-3]) * kilo
1313101Sstever@eecs.umich.edu    elif value.endswith('Hz'):
1323101Sstever@eecs.umich.edu        return float(value[:-2])
1333101Sstever@eecs.umich.edu
1343101Sstever@eecs.umich.edu    raise ValueError, "cannot convert '%s' to frequency" % value
1353101Sstever@eecs.umich.edu
1363101Sstever@eecs.umich.edudef toLatency(value):
1373101Sstever@eecs.umich.edu    if not isinstance(value, str):
1383101Sstever@eecs.umich.edu        raise TypeError, "wrong type '%s' should be str" % type(value)
1393101Sstever@eecs.umich.edu
1403101Sstever@eecs.umich.edu    if value.endswith('ps'):
1413101Sstever@eecs.umich.edu        return float(value[:-2]) * pico
1423101Sstever@eecs.umich.edu    elif value.endswith('ns'):
1433101Sstever@eecs.umich.edu        return float(value[:-2]) * nano
1445033Smilesck@eecs.umich.edu    elif value.endswith('us'):
1456656Snate@binkert.org        return float(value[:-2]) * micro
1465033Smilesck@eecs.umich.edu    elif value.endswith('ms'):
1475033Smilesck@eecs.umich.edu        return float(value[:-2]) * milli
1485033Smilesck@eecs.umich.edu    elif value.endswith('s'):
1493101Sstever@eecs.umich.edu        return float(value[:-1])
1503101Sstever@eecs.umich.edu
1513101Sstever@eecs.umich.edu    raise ValueError, "cannot convert '%s' to latency" % value
1523101Sstever@eecs.umich.edu
1533101Sstever@eecs.umich.edudef anyToLatency(value):
1543101Sstever@eecs.umich.edu    """result is a clock period"""
1553101Sstever@eecs.umich.edu
1563101Sstever@eecs.umich.edu    if not isinstance(value, str):
1573101Sstever@eecs.umich.edu        raise TypeError, "wrong type '%s' should be str" % type(value)
1583101Sstever@eecs.umich.edu
1593101Sstever@eecs.umich.edu    try:
1603101Sstever@eecs.umich.edu        val = toFrequency(value)
1613101Sstever@eecs.umich.edu        if val != 0:
1623102Sstever@eecs.umich.edu            val = 1 / val
1633101Sstever@eecs.umich.edu        return val
1643101Sstever@eecs.umich.edu    except ValueError:
1653101Sstever@eecs.umich.edu        pass
1667673Snate@binkert.org
1678607Sgblack@eecs.umich.edu    try:
1687673Snate@binkert.org        val = toLatency(value)
1693101Sstever@eecs.umich.edu        return val
1707673Snate@binkert.org    except ValueError:
1717673Snate@binkert.org        pass
1723101Sstever@eecs.umich.edu
1737673Snate@binkert.org    raise ValueError, "cannot convert '%s' to clock period" % value
1747673Snate@binkert.org
1753101Sstever@eecs.umich.edudef anyToFrequency(value):
1763101Sstever@eecs.umich.edu    """result is a clock period"""
1773101Sstever@eecs.umich.edu
1783101Sstever@eecs.umich.edu    if not isinstance(value, str):
1793101Sstever@eecs.umich.edu        raise TypeError, "wrong type '%s' should be str" % type(value)
1803101Sstever@eecs.umich.edu
1815033Smilesck@eecs.umich.edu    try:
1825475Snate@binkert.org        val = toFrequency(value)
1835475Snate@binkert.org        return val
1845475Snate@binkert.org    except ValueError:
1855475Snate@binkert.org        pass
1863101Sstever@eecs.umich.edu
1873101Sstever@eecs.umich.edu    try:
1883101Sstever@eecs.umich.edu        val = toLatency(value)
1894762Snate@binkert.org        if val != 0:
1904762Snate@binkert.org            val = 1 / val
1914762Snate@binkert.org        return val
1923101Sstever@eecs.umich.edu    except ValueError:
1938460SAli.Saidi@ARM.com        pass
1948459SAli.Saidi@ARM.com
1958459SAli.Saidi@ARM.com    raise ValueError, "cannot convert '%s' to clock period" % value
1968459SAli.Saidi@ARM.com
1973101Sstever@eecs.umich.edudef toNetworkBandwidth(value):
1987528Ssteve.reinhardt@amd.com    if not isinstance(value, str):
1997528Ssteve.reinhardt@amd.com        raise TypeError, "wrong type '%s' should be str" % type(value)
2007528Ssteve.reinhardt@amd.com
2017528Ssteve.reinhardt@amd.com    if value.endswith('Tbps'):
2027528Ssteve.reinhardt@amd.com        return float(value[:-4]) * tera
2037528Ssteve.reinhardt@amd.com    elif value.endswith('Gbps'):
2043101Sstever@eecs.umich.edu        return float(value[:-4]) * giga
2057528Ssteve.reinhardt@amd.com    elif value.endswith('Mbps'):
2067528Ssteve.reinhardt@amd.com        return float(value[:-4]) * mega
2077528Ssteve.reinhardt@amd.com    elif value.endswith('kbps'):
2087528Ssteve.reinhardt@amd.com        return float(value[:-4]) * kilo
2097528Ssteve.reinhardt@amd.com    elif value.endswith('bps'):
2107528Ssteve.reinhardt@amd.com        return float(value[:-3])
2117528Ssteve.reinhardt@amd.com    else:
2127528Ssteve.reinhardt@amd.com        return float(value)
2137528Ssteve.reinhardt@amd.com
2147528Ssteve.reinhardt@amd.com    raise ValueError, "cannot convert '%s' to network bandwidth" % value
2158321Ssteve.reinhardt@amd.com
2168321Ssteve.reinhardt@amd.comdef toMemoryBandwidth(value):
2177528Ssteve.reinhardt@amd.com    if not isinstance(value, str):
2187528Ssteve.reinhardt@amd.com        raise TypeError, "wrong type '%s' should be str" % type(value)
2197528Ssteve.reinhardt@amd.com
2207528Ssteve.reinhardt@amd.com    if value.endswith('PB/s'):
2217528Ssteve.reinhardt@amd.com        return float(value[:-4]) * pebi
2227528Ssteve.reinhardt@amd.com    elif value.endswith('TB/s'):
2237528Ssteve.reinhardt@amd.com        return float(value[:-4]) * tebi
2247528Ssteve.reinhardt@amd.com    elif value.endswith('GB/s'):
2257528Ssteve.reinhardt@amd.com        return float(value[:-4]) * gibi
2267528Ssteve.reinhardt@amd.com    elif value.endswith('MB/s'):
2277528Ssteve.reinhardt@amd.com        return float(value[:-4]) * mebi
2287528Ssteve.reinhardt@amd.com    elif value.endswith('kB/s'):
2297528Ssteve.reinhardt@amd.com        return float(value[:-4]) * kibi
2303101Sstever@eecs.umich.edu    elif value.endswith('B/s'):
2318664SAli.Saidi@ARM.com        return float(value[:-3])
2328664SAli.Saidi@ARM.com
2338664SAli.Saidi@ARM.com    raise ValueError, "cannot convert '%s' to memory bandwidth" % value
2348664SAli.Saidi@ARM.com
2358664SAli.Saidi@ARM.comdef toMemorySize(value):
2368664SAli.Saidi@ARM.com    if not isinstance(value, str):
2373101Sstever@eecs.umich.edu        raise TypeError, "wrong type '%s' should be str" % type(value)
2383101Sstever@eecs.umich.edu
2393101Sstever@eecs.umich.edu    if value.endswith('PB'):
2403101Sstever@eecs.umich.edu        return long(value[:-2]) * pebi
2413101Sstever@eecs.umich.edu    elif value.endswith('TB'):
2423101Sstever@eecs.umich.edu        return long(value[:-2]) * tebi
2433101Sstever@eecs.umich.edu    elif value.endswith('GB'):
2443101Sstever@eecs.umich.edu        return long(value[:-2]) * gibi
2454762Snate@binkert.org    elif value.endswith('MB'):
2464762Snate@binkert.org        return long(value[:-2]) * mebi
2474762Snate@binkert.org    elif value.endswith('kB'):
2484762Snate@binkert.org        return long(value[:-2]) * kibi
2497528Ssteve.reinhardt@amd.com    elif value.endswith('B'):
2504762Snate@binkert.org        return long(value[:-1])
2514762Snate@binkert.org
2524762Snate@binkert.org    raise ValueError, "cannot convert '%s' to memory size" % value
2538596Ssteve.reinhardt@amd.com
2548596Ssteve.reinhardt@amd.comdef toIpAddress(value):
2558596Ssteve.reinhardt@amd.com    if not isinstance(value, str):
2567673Snate@binkert.org        raise TypeError, "wrong type '%s' should be str" % type(value)
2578596Ssteve.reinhardt@amd.com
2584762Snate@binkert.org    bytes = value.split('.')
2597673Snate@binkert.org    if len(bytes) != 4:
2608596Ssteve.reinhardt@amd.com        raise ValueError, 'invalid ip address %s' % value
2617675Snate@binkert.org
2627675Snate@binkert.org    for byte in bytes:
2637675Snate@binkert.org        if not 0 <= int(byte) <= 0xff:
2647675Snate@binkert.org            raise ValueError, 'invalid ip address %s' % value
2658656Sandreas.hansson@arm.com
2668656Sandreas.hansson@arm.com    return (int(bytes[0]) << 24) | (int(bytes[1]) << 16) | \
2678656Sandreas.hansson@arm.com           (int(bytes[2]) << 8)  | (int(bytes[3]) << 0)
2687675Snate@binkert.org
2697675Snate@binkert.orgdef toIpNetmask(value):
2707673Snate@binkert.org    if not isinstance(value, str):
2717675Snate@binkert.org        raise TypeError, "wrong type '%s' should be str" % type(value)
2727675Snate@binkert.org
2737675Snate@binkert.org    (ip, netmask) = value.split('/')
2747675Snate@binkert.org    ip = toIpAddress(ip)
2757675Snate@binkert.org    netmaskParts = netmask.split('.')
2767673Snate@binkert.org    if len(netmaskParts) == 1:
2777675Snate@binkert.org        if not 0 <= int(netmask) <= 32:
2787675Snate@binkert.org            raise ValueError, 'invalid netmask %s' % netmask
2797675Snate@binkert.org        return (ip, int(netmask))
2807675Snate@binkert.org    elif len(netmaskParts) == 4:
2817675Snate@binkert.org        netmaskNum = toIpAddress(netmask)
2827675Snate@binkert.org        if netmaskNum == 0:
2837675Snate@binkert.org            return (ip, 0)
2847675Snate@binkert.org        testVal = 0
2857675Snate@binkert.org        for i in range(32):
2867675Snate@binkert.org            testVal |= (1 << (31 - i))
2877675Snate@binkert.org            if testVal == netmaskNum:
2887675Snate@binkert.org                return (ip, i + 1)
2897675Snate@binkert.org        raise ValueError, 'invalid netmask %s' % netmask
2907675Snate@binkert.org    else:
2917675Snate@binkert.org        raise ValueError, 'invalid netmask %s' % netmask
2927675Snate@binkert.org
2937673Snate@binkert.orgdef toIpWithPort(value):
2947673Snate@binkert.org    if not isinstance(value, str):
2953101Sstever@eecs.umich.edu        raise TypeError, "wrong type '%s' should be str" % type(value)
2967675Snate@binkert.org
2977675Snate@binkert.org    (ip, port) = value.split(':')
2987673Snate@binkert.org    ip = toIpAddress(ip)
2997673Snate@binkert.org    if not 0 <= int(port) <= 0xffff:
3007673Snate@binkert.org        raise ValueError, 'invalid port %s' % port
3013101Sstever@eecs.umich.edu    return (ip, int(port))
3027673Snate@binkert.org
3037673Snate@binkert.orgdef toVoltage(value):
3043101Sstever@eecs.umich.edu    if not isinstance(value, str):
3053101Sstever@eecs.umich.edu        raise TypeError, "wrong type '%s' should be str" % type(value)
3063101Sstever@eecs.umich.edu
3073101Sstever@eecs.umich.edu    if value.endswith('mV'):
3083101Sstever@eecs.umich.edu        return float(value[:-2]) * milli
3093101Sstever@eecs.umich.edu    elif value.endswith('V'):
3103101Sstever@eecs.umich.edu        return float(value[:-1])
3113101Sstever@eecs.umich.edu
3123101Sstever@eecs.umich.edu    raise ValueError, "cannot convert '%s' to voltage" % value
3133101Sstever@eecs.umich.edu
3143101Sstever@eecs.umich.edudef toCurrent(value):
3153101Sstever@eecs.umich.edu    if not isinstance(value, str):
3163101Sstever@eecs.umich.edu        raise TypeError, "wrong type '%s' should be str" % type(value)
3173101Sstever@eecs.umich.edu
3183101Sstever@eecs.umich.edu    if value.endswith('A'):
3195033Smilesck@eecs.umich.edu        return toFloat(value[:-1])
3205033Smilesck@eecs.umich.edu
3213101Sstever@eecs.umich.edu    raise ValueError, "cannot convert '%s' to current" % value
3223101Sstever@eecs.umich.edu