[Python-ideas] SI scale factors in Python
Xavier Combelle
xavier.combelle at gmail.com
Thu Aug 25 19:35:04 EDT 2016
On 25/08/2016 22:06, Ken Kundert wrote:
> Here is a fairly typical example that illustrates the usefulness of supporting
> SI scale factors and units in Python.
>
> This is simple simulation code that is used to test a current mirror driving an
> 100kOhm resistor ...
>
> Here is some simulation code that uses SI scale factors
>
> for delta in [-500nA, 0, 500nA]:
> input = 2.75uA + delta
> wait(1us)
> expected = 100kOhm*(2.75uA + delta)
> tolerance = 2.2mV
> fails = check_output(expected, tolerance)
> print('%s: I(in)=%rA, measured V(out)=%rV, expected V(out)=%rV, diff=%rV.' % (
> 'FAIL' if fails else 'pass',
> input, get_output(), expected, get_output() - expected
> ))
>
> with the output being:
>
> pass: I(in)=2.25uA, measured V(out)=226.7mV, expected V(out)=225mV, diff=1.7mV.
> pass: I(in)=2.75uA, measured V(out)=276.8mV, expected V(out)=275mV, diff=1.8mV.
> FAIL: I(in)=3.25uA, measured V(out)=327.4mV, expected V(out)=325mV, diff=2.4mV.
>
> And the same code in Python today ...
>
> for delta in [-5e-7, 0, 5e-7]:
> input = 2.75e-6 + delta
> wait(1e-6)
> expected = 1e5*(2.75e-6 + delta)
> tolerance = 2.2e-3
> fails = check_output(expected, tolerance)
> print('%s: I(in)=%eA, measured V(out)=%eV, expected V(out)=%eV, diff=%eV.' % (
> 'FAIL' if fails else 'pass',
> input, get_output(), expected, get_output() - expected
> ))
>
> with the output being:
>
> pass: I(in)=2.25e-6A, measured V(out)=226.7e-3V, expected V(out)=225e-3V, diff=1.7e-3V.
> pass: I(in)=2.75e-6A, measured V(out)=276.8e-3V, expected V(out)=275e-3V, diff=1.8e-3V.
> FAIL: I(in)=3.25e-6A, measured V(out)=327.4e-3V, expected V(out)=325e-3V, diff=2.4e-3V.
>
> There are two things to notice. In the first example the numbers are easier to
> read: for example, 500nA is easier to read the 5e-7. Second, there is
> information in the units that provides provides useful information. One can
> easily see that the input signal is a current and that the output is a voltage.
> Furthermore, anybody can look at this code and do a simple sanity check on the
> expressions even if they don't understand the system being simulated. They can
> check the units on the input and output expressions to assure that they are all
> consistent.
>
> -Ken
> _______________________________________________
>
And the same code with python today
def wait(delay):
pass
def check_output(expected, tolerance):
return False
def get_output():
return 1*uA
def f():
for delta in [-500*nA, 0, 500*nA]:
input = 2.75*uA + delta
wait(1*us)
expected = 100*kOhm*(2.75*uA + delta)
tolerance = 2.2*mV
fails = check_output(expected, tolerance)
print('%s: I(in)=%rA, measured V(out)=%rV, expected V(out)=%rV,
diff=%rV.' % (
'FAIL' if fails else 'pass',
input, get_output(), expected, get_output() - expected
))
f()
pass: I(in)=2.25e-05A, measured V(out)=1e-05V, expected V(out)=22.5V,
diff=-22.49999V.
pass: I(in)=2.75e-05A, measured V(out)=1e-05V, expected V(out)=27.5V,
diff=-27.49999V.
pass: I(in)=3.2500000000000004e-05A, measured V(out)=1e-05V, expected
V(out)=32.50000000000001V, diff=-32.499990000000004V.
Do you really see fundamental difference with your original code?
More information about the Python-ideas
mailing list