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