1* test "sens dc"
2
3* The "sens" analysis does express "sensitivity" as
4*   S = (d out) / (d parameter)
5* instead of the normalized
6*   S = ((d out)/out) / ((d parameter)/parameter)
7*
8* here:
9*   v(1) = (R / m_R) * (m_i1 * i1)
10*
11* S[R] = (d v(1))/(d R) = m_i1 * i1 / m_R = 42m
12* S[i1] = (d v(1))/(d i1) = m_i1 * R1 / m_R = 1k
13* S[m_R] = (d v(1))/(d m_R) = -R * i1 *m_i1/m_R^2 = -42
14* S[m_i1] = (d v(1))/(d m_i1) = R * i1 / m_R = 42
15
16i1  0 1  dc=42mA
17r1  1 0  1k
18
19.control
20
21* express our "golden" expectations:
22setplot new
23set gold = $curplot
24let i1 = 1k
25let i1_m = 42.0
26let r1 = 42m
27let r1_m = -42.0
28let r1_scale = 42.0
29
30* run a "sens" analysis
31sens v(1) dc
32
33strcmp __flag $curplot $gold
34if $__flag = 0
35  echo "ERROR: sens failed to execute"
36  quit 1
37end
38
39* compare results with "golden" expectation
40
41define mismatch(a,b,err) abs(a-b)>err*abs(b)
42
43let total_count = 0
44let fail_count = 0
45
46foreach n i1 i1_m r1 r1_m r1_scale
47  set n_test = "$n"
48  set n_gold = "{$gold}.$n"
49  if mismatch($n_test, $n_gold, 1e-3)
50    let s_test = $n_test
51    let s_gold = $n_gold
52    echo "ERROR, test failure, s[$n] = $&s_test but should be $&s_gold"
53    let fail_count = fail_count + 1
54  end
55  let total_count = total_count + 1
56end
57
58if fail_count > 0
59  echo "ERROR: $&fail_count of $&total_count tests failed"
60  quit 1
61else
62  echo "INFO: $&fail_count of $&total_count tests failed"
63  quit 0
64end
65
66.endc
67
68.end
69