switch to exact version of cython
[ieee754fpu.git] / src / ieee754 / fpmax / test / test_fpmax_pipe.py
1 """ test of FPCVTMuxInOut
2 """
3
4 from ieee754.fpmax.pipeline import (FPMAXMuxInOut)
5 from ieee754.fpcommon.test.fpmux import runfp
6 from ieee754.fpcommon.test.case_gen import run_pipe_fp
7 from ieee754.fpcommon.test import unit_test_single
8
9 from sfpy import Float16, Float32, Float64
10 import math
11
12
13 def fpmax_f32_max(a, b):
14 # Apparently, sfpy doesn't include a min or max function. Python's
15 # min/max work, however python min/max are not IEEE754 Compliant
16 # (namely, they don't behave correctly with NaNs
17 # IEEE754 defines max(num, NaN) and max(NaN, num) as both
18 # returning num (and the same for min)
19 if math.isnan(a) or math.isnan(b):
20 if math.isnan(a) and math.isnan(b):
21 return Float32(float('nan'))
22 else:
23 return b if math.isnan(a) else a
24 if a.bits & (1<<31) != b.bits & (1<<31):
25 return b if a.bits & (1<<31) else a
26 elif a > b:
27 return a
28 else:
29 return b
30
31
32 def fpmax_f32_min(a, b):
33 if math.isnan(a) or math.isnan(b):
34 if math.isnan(a) and math.isnan(b):
35 return Float32(float('nan'))
36 else:
37 return b if math.isnan(a) else a
38 if a.bits & (1<<31) != b.bits & (1<<31):
39 return a if a.bits & (1<<31) else b
40 elif a < b:
41 return a
42 else:
43 return b
44
45
46 def test_fpmax_f32_max():
47 dut = FPMAXMuxInOut(32, 4)
48 runfp(dut, 32, "test_fpmax_f32_max", Float32, fpmax_f32_max,
49 n_vals=100, opcode=0x0)
50
51
52 def test_fpmax_f32_min():
53 dut = FPMAXMuxInOut(32, 4)
54 runfp(dut, 32, "test_fpmax_f32_min", Float32, fpmax_f32_min,
55 n_vals=100, opcode=0x1)
56
57 def nan_testcases():
58 nan = Float32(float('nan')).bits
59 yield nan, Float32(1.0).bits
60 yield Float32(1.0).bits, nan
61 yield nan, nan
62 yield Float32(0.0).bits, Float32(-0.0).bits
63 yield Float32(-0.0).bits, Float32(0.0).bits
64
65 def test_fpmax_f32_nans():
66 dut = FPMAXMuxInOut(32, 4)
67 run_pipe_fp(dut, 32, "test_fpmax_f32_max_nans", unit_test_single,
68 Float32, nan_testcases, fpmax_f32_max, 5,
69 opcode=0b0)
70 run_pipe_fp(dut, 32, "test_fpmax_f32_min_nans", unit_test_single,
71 Float32, nan_testcases, fpmax_f32_min, 5,
72 opcode=0b1)
73
74
75 if __name__ == '__main__':
76 test_fpmax_f32_nans()
77 for i in range(50):
78 test_fpmax_f32_max()
79 test_fpmax_f32_min()