64 lines
1.4 KiB
Python
64 lines
1.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
## Very simple unit support:
|
|
## - creates variable names like 'mV' and 'kHz'
|
|
## - the value assigned to the variable corresponds to the scale prefix
|
|
## (mV = 0.001)
|
|
## - the actual units are purely cosmetic for making code clearer:
|
|
##
|
|
## x = 20*pA is identical to x = 20*1e-12
|
|
|
|
## No unicode variable names (μ,Ω) allowed until python 3
|
|
|
|
SI_PREFIXES = 'yzafpnum kMGTPEZY'
|
|
UNITS = 'm,s,g,W,J,V,A,F,T,Hz,Ohm,S,N,C,px,b,B'.split(',')
|
|
allUnits = {}
|
|
|
|
def addUnit(p, n):
|
|
g = globals()
|
|
v = 1000**n
|
|
for u in UNITS:
|
|
g[p+u] = v
|
|
allUnits[p+u] = v
|
|
|
|
for p in SI_PREFIXES:
|
|
if p == ' ':
|
|
p = ''
|
|
n = 0
|
|
elif p == 'u':
|
|
n = -2
|
|
else:
|
|
n = SI_PREFIXES.index(p) - 8
|
|
|
|
addUnit(p, n)
|
|
|
|
cm = 0.01
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def evalUnits(unitStr):
|
|
"""
|
|
Evaluate a unit string into ([numerators,...], [denominators,...])
|
|
Examples:
|
|
N m/s^2 => ([N, m], [s, s])
|
|
A*s / V => ([A, s], [V,])
|
|
"""
|
|
pass
|
|
|
|
def formatUnits(units):
|
|
"""
|
|
Format a unit specification ([numerators,...], [denominators,...])
|
|
into a string (this is the inverse of evalUnits)
|
|
"""
|
|
pass
|
|
|
|
def simplify(units):
|
|
"""
|
|
Cancel units that appear in both numerator and denominator, then attempt to replace
|
|
groups of units with single units where possible (ie, J/s => W)
|
|
"""
|
|
pass
|
|
|
|
|