2 from random
import randint
3 from random
import seed
5 from sfpy
import Float64
10 return x
& 0x000fffffffffffff
13 return ((x
& 0x7ff0000000000000) >> 52) - 1023
15 def set_exponent(x
, e
):
16 return (x
& ~
0x7ff0000000000000) |
((e
+1023) << 52)
19 return ((x
& 0x8000000000000000) >> 63)
22 return get_exponent(x
) == 1024 and get_mantissa(x
) != 0
25 return get_exponent(x
) == 1024 and get_mantissa(x
) == 0
28 return is_inf(x
) and not get_sign(x
)
31 return is_inf(x
) and get_sign(x
)
35 (is_pos_inf(x
) and is_pos_inf(y
)) or
36 (is_neg_inf(x
) and is_neg_inf(y
)) or
37 (is_nan(x
) and is_nan(y
)) or
42 return set_exponent((s
<<63) | m
, e
)
45 return create(s
, 1024, 0)
48 return create(s
, 1024, 1<<51)
53 def get_case(dut
, a
, b
):
54 yield dut
.in_a
.v
.eq(a
)
55 yield dut
.in_a
.stb
.eq(1)
58 a_ack
= (yield dut
.in_a
.ack
)
60 yield dut
.in_b
.v
.eq(b
)
61 yield dut
.in_b
.stb
.eq(1)
62 b_ack
= (yield dut
.in_b
.ack
)
67 out_z_stb
= (yield dut
.out_z
.stb
)
70 yield dut
.in_a
.stb
.eq(0)
71 yield dut
.in_b
.stb
.eq(0)
72 yield dut
.out_z
.ack
.eq(1)
74 yield dut
.out_z
.ack
.eq(0)
79 out_z
= yield dut
.out_z
.v
82 def check_case(dut
, a
, b
, z
):
83 out_z
= yield from get_case(dut
, a
, b
)
84 assert out_z
== z
, "Output z 0x%x not equal to expected 0x%x" % (out_z
, z
)
87 def run_fpunit(dut
, stimulus_a
, stimulus_b
, op
):
89 expected_responses
= []
91 for a
, b
in zip(stimulus_a
, stimulus_b
):
92 af
= Float64
.from_bits(a
)
93 bf
= Float64
.from_bits(b
)
95 expected_responses
.append(z
.get_bits())
97 actual
= yield from get_case(dut
, a
, b
)
98 actual_responses
.append(actual
)
100 if len(actual_responses
) < len(expected_responses
):
101 print ("Fail ... not enough results")
104 for exp
, act
, a
, b
in zip(expected_responses
, actual_responses
,
105 stimulus_a
, stimulus_b
):
106 passed
= match(exp
, act
)
110 print ("Fail ... expected:", hex(exp
), "actual:", hex(act
))
113 print ("a mantissa:", a
& 0x000fffffffffffff)
114 print ("a exponent:", ((a
& 0x7ff0000000000000) >> 52)\
116 print ("a sign:", ((a
& 0x8000000000000000) >> 63))
119 print ("b mantissa:", b
& 0x000fffffffffffff)
120 print ("b exponent:", ((b
& 0x7ff0000000000000) >> 52)\
122 print ("b sign:", ((b
& 0x8000000000000000) >> 63))
125 print ("expected mantissa:", exp
& 0x000fffffffffffff)
126 print ("expected exponent:", ((exp
& 0x7ff0000000000000) >> 52)\
128 print ("expected sign:", ((exp
& 0x8000000000000000) >> 63))
131 print ("actual mantissa:", act
& 0x000fffffffffffff)
132 print ("actual exponent:", ((act
& 0x7ff0000000000000) >> 52)\
134 print ("actual sign:", ((act
& 0x8000000000000000) >> 63))
139 def run_corner_cases(dut
, count
, op
):
141 from itertools
import permutations
142 stimulus_a
= [i
[0] for i
in permutations([
150 stimulus_b
= [i
[1] for i
in permutations([
158 yield from run_fpunit(dut
, stimulus_a
, stimulus_b
, op
)
159 count
+= len(stimulus_a
)
160 print (count
, "vectors passed")
163 def run_edge_cases(dut
, count
, op
, maxcount
=1000, num_loops
=1000):
165 stimulus_a
= [0x8000000000000000 for i
in range(maxcount
)]
166 stimulus_b
= [randint(0, 1<<64) for i
in range(maxcount
)]
167 yield from run_fpunit(dut
, stimulus_a
, stimulus_b
, op
)
168 count
+= len(stimulus_a
)
169 print (count
, "vectors passed")
171 stimulus_a
= [0x0000000000000000 for i
in range(maxcount
)]
172 stimulus_b
= [randint(0, 1<<64) for i
in range(maxcount
)]
173 yield from run_fpunit(dut
, stimulus_a
, stimulus_b
, op
)
174 count
+= len(stimulus_a
)
175 print (count
, "vectors passed")
177 stimulus_b
= [0x8000000000000000 for i
in range(maxcount
)]
178 stimulus_a
= [randint(0, 1<<64) for i
in range(maxcount
)]
179 yield from run_fpunit(dut
, stimulus_a
, stimulus_b
, op
)
180 count
+= len(stimulus_a
)
181 print (count
, "vectors passed")
183 stimulus_b
= [0x0000000000000000 for i
in range(maxcount
)]
184 stimulus_a
= [randint(0, 1<<64) for i
in range(maxcount
)]
185 yield from run_fpunit(dut
, stimulus_a
, stimulus_b
, op
)
186 count
+= len(stimulus_a
)
187 print (count
, "vectors passed")
189 stimulus_a
= [0x7FF8000000000000 for i
in range(maxcount
)]
190 stimulus_b
= [randint(0, 1<<64) for i
in range(maxcount
)]
191 yield from run_fpunit(dut
, stimulus_a
, stimulus_b
, op
)
192 count
+= len(stimulus_a
)
193 print (count
, "vectors passed")
195 stimulus_a
= [0xFFF8000000000000 for i
in range(maxcount
)]
196 stimulus_b
= [randint(0, 1<<64) for i
in range(maxcount
)]
197 yield from run_fpunit(dut
, stimulus_a
, stimulus_b
, op
)
198 count
+= len(stimulus_a
)
199 print (count
, "vectors passed")
201 stimulus_b
= [0x7FF8000000000000 for i
in range(maxcount
)]
202 stimulus_a
= [randint(0, 1<<64) for i
in range(maxcount
)]
203 yield from run_fpunit(dut
, stimulus_a
, stimulus_b
, op
)
204 count
+= len(stimulus_a
)
205 print (count
, "vectors passed")
207 stimulus_b
= [0xFFF8000000000000 for i
in range(maxcount
)]
208 stimulus_a
= [randint(0, 1<<64) for i
in range(maxcount
)]
209 yield from run_fpunit(dut
, stimulus_a
, stimulus_b
, op
)
210 count
+= len(stimulus_a
)
211 print (count
, "vectors passed")
213 stimulus_a
= [0x7FF0000000000000 for i
in range(maxcount
)]
214 stimulus_b
= [randint(0, 1<<64) for i
in range(maxcount
)]
215 yield from run_fpunit(dut
, stimulus_a
, stimulus_b
, op
)
216 count
+= len(stimulus_a
)
217 print (count
, "vectors passed")
219 stimulus_a
= [0xFFF0000000000000 for i
in range(maxcount
)]
220 stimulus_b
= [randint(0, 1<<64) for i
in range(maxcount
)]
221 yield from run_fpunit(dut
, stimulus_a
, stimulus_b
, op
)
222 count
+= len(stimulus_a
)
223 print (count
, "vectors passed")
225 stimulus_b
= [0x7FF0000000000000 for i
in range(maxcount
)]
226 stimulus_a
= [randint(0, 1<<64) for i
in range(maxcount
)]
227 yield from run_fpunit(dut
, stimulus_a
, stimulus_b
, op
)
228 count
+= len(stimulus_a
)
229 print (count
, "vectors passed")
231 stimulus_b
= [0xFFF0000000000000 for i
in range(maxcount
)]
232 stimulus_a
= [randint(0, 1<<64) for i
in range(maxcount
)]
233 yield from run_fpunit(dut
, stimulus_a
, stimulus_b
, op
)
234 count
+= len(stimulus_a
)
235 print (count
, "vectors passed")
238 for i
in range(num_loops
):
239 stimulus_a
= [randint(0, 1<<64) for i
in range(maxcount
)]
240 stimulus_b
= [randint(0, 1<<64) for i
in range(maxcount
)]
241 yield from run_fpunit(dut
, stimulus_a
, stimulus_b
, op
)
243 print (count
, "random vectors passed")