1* 'xpressn-3' check nint/floor/ceil
2
3* (exec-spice "ngspice -b %s" t)
4
5.subckt test_nint g n b value=0 gold=0
6vg   g 0  dc = 'gold'
7
8vn   n 0  dc = 'nint(value)'
9
10v1   1 0  dc = 'value'
11b1   b 0  v = nint(v(1))
12
13vid  id 0 dc = 1
14.ends
15
16.subckt test_floor g n b value=0 gold=0
17vg   g 0  dc = 'gold'
18
19vn   n 0  dc = 'floor(value)'
20
21v1   1 0  dc = 'value'
22b1   b 0  v = floor(v(1))
23
24vid  id 0 dc = 2
25.ends
26
27.subckt test_ceil g n b value=0 gold=0
28vg   g 0  dc = 'gold'
29
30vn   n 0  dc = 'ceil(value)'
31
32v1   1 0  dc = 'value'
33b1   b 0  v = ceil(v(1))
34
35vid  id 0 dc = 3
36.ends
37
38x1084_t  n1084_g n1084_n n1084_b  test_nint value=2.6  gold=3
39x1085_t  n1085_g n1085_n n1085_b  test_nint value=2.5  gold=2
40x1086_t  n1086_g n1086_n n1086_b  test_nint value=2.4  gold=2
41x1087_t  n1087_g n1087_n n1087_b  test_nint value=1.6  gold=2
42x1088_t  n1088_g n1088_n n1088_b  test_nint value=1.5  gold=2
43x1089_t  n1089_g n1089_n n1089_b  test_nint value=1.4  gold=1
44x1090_t  n1090_g n1090_n n1090_b  test_nint value=0.6  gold=1
45x1091_t  n1091_g n1091_n n1091_b  test_nint value=0.5  gold=0
46x1092_t  n1092_g n1092_n n1092_b  test_nint value=0.4  gold=0
47x1093_t  n1093_g n1093_n n1093_b  test_nint value=0    gold=0
48x1094_t  n1094_g n1094_n n1094_b  test_nint value=-0.4 gold=0
49x1095_t  n1095_g n1095_n n1095_b  test_nint value=-0.5 gold=0
50x1096_t  n1096_g n1096_n n1096_b  test_nint value=-0.6 gold=-1
51x1097_t  n1097_g n1097_n n1097_b  test_nint value=-1.4 gold=-1
52x1098_t  n1098_g n1098_n n1098_b  test_nint value=-1.5 gold=-2
53x1099_t  n1099_g n1099_n n1099_b  test_nint value=-1.6 gold=-2
54x1100_t  n1100_g n1100_n n1100_b  test_nint value=-2.4 gold=-2
55x1101_t  n1101_g n1101_n n1101_b  test_nint value=-2.5 gold=-2
56x1102_t  n1102_g n1102_n n1102_b  test_nint value=-2.6 gold=-3
57
58x1103_t  n1103_g n1103_n n1103_b  test_floor value=2.1  gold=2
59x1104_t  n1104_g n1104_n n1104_b  test_floor value=1.9  gold=1
60x1105_t  n1105_g n1105_n n1105_b  test_floor value=0    gold=0
61x1106_t  n1106_g n1106_n n1106_b  test_floor value=-1.9 gold=-2
62x1107_t  n1107_g n1107_n n1107_b  test_floor value=-2.1 gold=-3
63
64x1108_t  n1108_g n1108_n n1108_b  test_ceil value=2.1  gold=3
65x1109_t  n1109_g n1109_n n1109_b  test_ceil value=1.9  gold=2
66x1110_t  n1110_g n1110_n n1110_b  test_ceil value=0    gold=0
67x1111_t  n1111_g n1111_n n1111_b  test_ceil value=-1.9 gold=-1
68x1112_t  n1112_g n1112_n n1112_b  test_ceil value=-2.1 gold=-2
69
70
71* ----------------------------------------
72
73.control
74
75define mismatch(a,b,err) abs(a-b)>err
76
77op
78
79let total_count = 0
80let fail_count = 0
81
82let tests = 1084 + vector(29)
83
84foreach n $&tests
85
86  set n_id = "x{$n}_t.id"
87  set n_value = "x{$n}_t.1"
88  set n_gold = "n{$n}_g"
89  set n_numparm = "n{$n}_n"
90  set n_asrc = "n{$n}_b"
91
92  if v($n_id) eq 1
93    let v_control = nint(v($n_value))
94  else
95    if v($n_id) eq 2
96      let v_control = floor(v($n_value))
97    else
98      let v_control = ceil(v($n_value))
99    end
100  end
101
102  if mismatch(v($n_numparm), v($n_gold), 1e-9)
103    let v_numparm = v($n_numparm)
104    let v_gold = v($n_gold)
105    echo "ERROR, test failure, $n, v($n_numparm) = $&v_numparm but should be $&v_gold"
106    let fail_count = fail_count + 1
107  end
108
109  if mismatch(v($n_asrc), v($n_gold), 1e-9)
110    let v_asrc = v($n_asrc)
111    let v_gold = v($n_gold)
112    echo "ERROR, test failure, $n, v($n_asrc) = $&v_asrc but should be $&v_gold"
113    let fail_count = fail_count + 1
114  end
115
116  if mismatch(v_control, v($n_gold), 1e-9)
117    let v_gold = v($n_gold)
118    echo "ERROR, test failure, $n, v_control = $&v_control but should be $&v_gold"
119    let fail_count = fail_count + 1
120  end
121
122  let total_count = total_count + 1
123end
124
125if fail_count > 0
126  echo "ERROR: $&fail_count of $&total_count tests failed"
127  quit 1
128else
129  echo "INFO: $&fail_count of $&total_count tests failed"
130  quit 0
131end
132
133.endc
134
135.end
136