convert.py revision 1736
112027Sjungma@eit.uni-kl.de# Copyright (c) 2005 The Regents of The University of Michigan
212027Sjungma@eit.uni-kl.de# All rights reserved.
312027Sjungma@eit.uni-kl.de#
412027Sjungma@eit.uni-kl.de# Redistribution and use in source and binary forms, with or without
512027Sjungma@eit.uni-kl.de# modification, are permitted provided that the following conditions are
612027Sjungma@eit.uni-kl.de# met: redistributions of source code must retain the above copyright
712027Sjungma@eit.uni-kl.de# notice, this list of conditions and the following disclaimer;
812027Sjungma@eit.uni-kl.de# redistributions in binary form must reproduce the above copyright
912027Sjungma@eit.uni-kl.de# notice, this list of conditions and the following disclaimer in the
1012027Sjungma@eit.uni-kl.de# documentation and/or other materials provided with the distribution;
1112027Sjungma@eit.uni-kl.de# neither the name of the copyright holders nor the names of its
1212027Sjungma@eit.uni-kl.de# contributors may be used to endorse or promote products derived from
1312027Sjungma@eit.uni-kl.de# this software without specific prior written permission.
1412027Sjungma@eit.uni-kl.de#
1512027Sjungma@eit.uni-kl.de# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1612027Sjungma@eit.uni-kl.de# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1712027Sjungma@eit.uni-kl.de# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1812027Sjungma@eit.uni-kl.de# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1912027Sjungma@eit.uni-kl.de# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2012027Sjungma@eit.uni-kl.de# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2112027Sjungma@eit.uni-kl.de# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2212027Sjungma@eit.uni-kl.de# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2312027Sjungma@eit.uni-kl.de# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2412027Sjungma@eit.uni-kl.de# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2512027Sjungma@eit.uni-kl.de# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2612027Sjungma@eit.uni-kl.de
2712027Sjungma@eit.uni-kl.de# metric prefixes
2812027Sjungma@eit.uni-kl.deexa  = 1.0e18
2912027Sjungma@eit.uni-kl.depeta = 1.0e15
3012027Sjungma@eit.uni-kl.detera = 1.0e12
3112027Sjungma@eit.uni-kl.degiga = 1.0e9
3212027Sjungma@eit.uni-kl.demega = 1.0e6
3312027Sjungma@eit.uni-kl.dekilo = 1.0e3
3412027Sjungma@eit.uni-kl.de
3512027Sjungma@eit.uni-kl.demilli = 1.0e-3
3612027Sjungma@eit.uni-kl.demicro = 1.0e-6
3712027Sjungma@eit.uni-kl.denano  = 1.0e-9
3812027Sjungma@eit.uni-kl.depico  = 1.0e-12
3912027Sjungma@eit.uni-kl.defemto = 1.0e-15
4012027Sjungma@eit.uni-kl.deatto  = 1.0e-18
4112027Sjungma@eit.uni-kl.de
4212027Sjungma@eit.uni-kl.de# power of 2 prefixes
4312027Sjungma@eit.uni-kl.dekibi = 1024
4412027Sjungma@eit.uni-kl.demebi = kibi * 1024
4512027Sjungma@eit.uni-kl.degibi = mebi * 1024
4612027Sjungma@eit.uni-kl.detebi = gibi * 1024
4712027Sjungma@eit.uni-kl.depebi = tebi * 1024
4812027Sjungma@eit.uni-kl.deexbi = pebi * 1024
4912027Sjungma@eit.uni-kl.de
5012027Sjungma@eit.uni-kl.de# memory size configuration stuff
5112027Sjungma@eit.uni-kl.dedef toFloat(value):
5212027Sjungma@eit.uni-kl.de    if not isinstance(value, str):
5312027Sjungma@eit.uni-kl.de        raise TypeError, "wrong type '%s' should be str" % type(value)
5412027Sjungma@eit.uni-kl.de
5512027Sjungma@eit.uni-kl.de    if value.endswith('Ei'):
5612027Sjungma@eit.uni-kl.de        return float(value[:-2]) * exbi
5712027Sjungma@eit.uni-kl.de    elif value.endswith('Pi'):
5812027Sjungma@eit.uni-kl.de        return float(value[:-2]) * pebi
5912027Sjungma@eit.uni-kl.de    elif value.endswith('Ti'):
6012027Sjungma@eit.uni-kl.de        return float(value[:-2]) * tebi
6112027Sjungma@eit.uni-kl.de    elif value.endswith('Gi'):
6212027Sjungma@eit.uni-kl.de        return float(value[:-2]) * gibi
6312027Sjungma@eit.uni-kl.de    elif value.endswith('Mi'):
6412027Sjungma@eit.uni-kl.de        return float(value[:-2]) * mebi
6512027Sjungma@eit.uni-kl.de    elif value.endswith('ki'):
6612027Sjungma@eit.uni-kl.de        return float(value[:-2]) * kibi
6712027Sjungma@eit.uni-kl.de    elif value.endswith('E'):
6812027Sjungma@eit.uni-kl.de        return float(value[:-1]) * exa
6912027Sjungma@eit.uni-kl.de    elif value.endswith('P'):
7012027Sjungma@eit.uni-kl.de        return float(value[:-1]) * peta
7112027Sjungma@eit.uni-kl.de    elif value.endswith('T'):
7212027Sjungma@eit.uni-kl.de        return float(value[:-1]) * tera
7312027Sjungma@eit.uni-kl.de    elif value.endswith('G'):
7412027Sjungma@eit.uni-kl.de        return float(value[:-1]) * giga
7512027Sjungma@eit.uni-kl.de    elif value.endswith('M'):
7612027Sjungma@eit.uni-kl.de        return float(value[:-1]) * mega
7712027Sjungma@eit.uni-kl.de    elif value.endswith('k'):
7812027Sjungma@eit.uni-kl.de        return float(value[:-1]) * kilo
7912027Sjungma@eit.uni-kl.de    elif value.endswith('m'):
8012027Sjungma@eit.uni-kl.de        return float(value[:-1]) * milli
8112027Sjungma@eit.uni-kl.de    elif value.endswith('u'):
8212027Sjungma@eit.uni-kl.de        return float(value[:-1]) * micro
8312027Sjungma@eit.uni-kl.de    elif value.endswith('n'):
8412027Sjungma@eit.uni-kl.de        return float(value[:-1]) * nano
8512027Sjungma@eit.uni-kl.de    elif value.endswith('p'):
8612027Sjungma@eit.uni-kl.de        return float(value[:-1]) * pico
8712027Sjungma@eit.uni-kl.de    elif value.endswith('f'):
8812027Sjungma@eit.uni-kl.de        return float(value[:-1]) * femto
8912027Sjungma@eit.uni-kl.de    else:
9012027Sjungma@eit.uni-kl.de        return float(value)
9112027Sjungma@eit.uni-kl.de
9212027Sjungma@eit.uni-kl.dedef toLong(value):
9312027Sjungma@eit.uni-kl.de    value = toFloat(value)
9412027Sjungma@eit.uni-kl.de    result = int(value)
9512027Sjungma@eit.uni-kl.de    if value != result:
9612027Sjungma@eit.uni-kl.de        raise ValueError, "cannot convert '%s' to long" % value
9712027Sjungma@eit.uni-kl.de
9812027Sjungma@eit.uni-kl.de    return result
9912027Sjungma@eit.uni-kl.de
10012027Sjungma@eit.uni-kl.dedef toInteger(value):
10112027Sjungma@eit.uni-kl.de    value = toFloat(value)
10212027Sjungma@eit.uni-kl.de    result = int(value)
10312027Sjungma@eit.uni-kl.de    if value != result:
10412027Sjungma@eit.uni-kl.de        raise ValueError, "cannot convert '%s' to integer" % value
10512027Sjungma@eit.uni-kl.de
10612027Sjungma@eit.uni-kl.de    return result
10712027Sjungma@eit.uni-kl.de
10812027Sjungma@eit.uni-kl.dedef toBool(value):
10912027Sjungma@eit.uni-kl.de    if not isinstance(value, str):
11012027Sjungma@eit.uni-kl.de        raise TypeError, "wrong type '%s' should be str" % type(value)
11112027Sjungma@eit.uni-kl.de
11212027Sjungma@eit.uni-kl.de    value = value.lower()
11312027Sjungma@eit.uni-kl.de    if value == "true" or value == "t" or value == "yes" or value == "y":
11412027Sjungma@eit.uni-kl.de        return True
11512027Sjungma@eit.uni-kl.de    elif value == "false" or value == "f" or value == "no" or value == "n":
11612027Sjungma@eit.uni-kl.de        return False
11712027Sjungma@eit.uni-kl.de
11812027Sjungma@eit.uni-kl.de    raise ValueError, "cannot convert '%s' to bool" % value
11912027Sjungma@eit.uni-kl.de
12012027Sjungma@eit.uni-kl.dedef toFrequency(value):
12112027Sjungma@eit.uni-kl.de    if not isinstance(value, str):
12212027Sjungma@eit.uni-kl.de        raise TypeError, "wrong type '%s' should be str" % type(value)
12312027Sjungma@eit.uni-kl.de
12412027Sjungma@eit.uni-kl.de    if value.endswith('THz'):
12512027Sjungma@eit.uni-kl.de        return float(value[:-3]) * tera
12612027Sjungma@eit.uni-kl.de    elif value.endswith('GHz'):
12712027Sjungma@eit.uni-kl.de        return float(value[:-3]) * giga
12812027Sjungma@eit.uni-kl.de    elif value.endswith('MHz'):
12912027Sjungma@eit.uni-kl.de        return float(value[:-3]) * mega
13012027Sjungma@eit.uni-kl.de    elif value.endswith('kHz'):
13112027Sjungma@eit.uni-kl.de        return float(value[:-3]) * kilo
13212027Sjungma@eit.uni-kl.de    elif value.endswith('Hz'):
13312027Sjungma@eit.uni-kl.de        return float(value[:-2])
13412027Sjungma@eit.uni-kl.de
13512027Sjungma@eit.uni-kl.de    raise ValueError, "cannot convert '%s' to frequency" % value
13612027Sjungma@eit.uni-kl.de
13712027Sjungma@eit.uni-kl.dedef toLatency(value):
13812027Sjungma@eit.uni-kl.de    if not isinstance(value, str):
13912027Sjungma@eit.uni-kl.de        raise TypeError, "wrong type '%s' should be str" % type(value)
14012027Sjungma@eit.uni-kl.de
14112027Sjungma@eit.uni-kl.de    if value.endswith('ps'):
14212027Sjungma@eit.uni-kl.de        return float(value[:-2]) * pico
14312027Sjungma@eit.uni-kl.de    elif value.endswith('ns'):
14412027Sjungma@eit.uni-kl.de        return float(value[:-2]) * nano
14512027Sjungma@eit.uni-kl.de    elif value.endswith('us'):
14612027Sjungma@eit.uni-kl.de        return float(value[:-2]) * micro
14712027Sjungma@eit.uni-kl.de    elif value.endswith('ms'):
14812027Sjungma@eit.uni-kl.de        return float(value[:-2]) * milli
14912027Sjungma@eit.uni-kl.de    elif value.endswith('s'):
15012027Sjungma@eit.uni-kl.de        return float(value[:-1])
15112027Sjungma@eit.uni-kl.de
15212027Sjungma@eit.uni-kl.de    raise ValueError, "cannot convert '%s' to latency" % value
153
154def toClockPeriod(value):
155    """result is a clock period"""
156
157    if not isinstance(value, str):
158        raise TypeError, "wrong type '%s' should be str" % type(value)
159
160    try:
161        val = toFrequency(value)
162        if val != 0:
163            val = 1 / val
164        return val
165    except ValueError:
166        pass
167
168    try:
169        val = toLatency(value)
170        return val
171    except ValueError:
172        pass
173
174    raise ValueError, "cannot convert '%s' to clock period" % value
175
176
177def toNetworkBandwidth(value):
178    if not isinstance(value, str):
179        raise TypeError, "wrong type '%s' should be str" % type(value)
180
181    if value.endswith('Tbps'):
182        return float(value[:-4]) * tera
183    elif value.endswith('Gbps'):
184        return float(value[:-4]) * giga
185    elif value.endswith('Mbps'):
186        return float(value[:-4]) * mega
187    elif value.endswith('kbps'):
188        return float(value[:-4]) * kilo
189    elif value.endswith('bps'):
190        return float(value[:-3])
191    else:
192        return float(value)
193
194    raise ValueError, "cannot convert '%s' to network bandwidth" % value
195
196def toMemoryBandwidth(value):
197    if not isinstance(value, str):
198        raise TypeError, "wrong type '%s' should be str" % type(value)
199
200    if value.endswith('PB/s'):
201        return float(value[:-4]) * pebi
202    elif value.endswith('TB/s'):
203        return float(value[:-4]) * tebi
204    elif value.endswith('GB/s'):
205        return float(value[:-4]) * gibi
206    elif value.endswith('MB/s'):
207        return float(value[:-4]) * mebi
208    elif value.endswith('kB/s'):
209        return float(value[:-4]) * kibi
210    elif value.endswith('B/s'):
211        return float(value[:-3])
212
213    raise ValueError, "cannot convert '%s' to memory bandwidth" % value
214
215def toMemorySize(value):
216    if not isinstance(value, str):
217        raise TypeError, "wrong type '%s' should be str" % type(value)
218
219    if value.endswith('PB'):
220        return float(value[:-2]) * pebi
221    elif value.endswith('TB'):
222        return float(value[:-2]) * tebi
223    elif value.endswith('GB'):
224        return float(value[:-2]) * gibi
225    elif value.endswith('MB'):
226        return float(value[:-2]) * mebi
227    elif value.endswith('kB'):
228        return float(value[:-2]) * kibi
229    elif value.endswith('B'):
230        return float(value[:-1])
231
232    raise ValueError, "cannot convert '%s' to memory size" % value
233