1 """ test of FPCVTMuxInOut
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
9 from sfpy
import Float16
, Float32
, Float64
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'))
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
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'))
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
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)
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)
58 nan
= Float32(float('nan')).bits
59 yield nan
, Float32(1.0).bits
60 yield Float32(1.0).bits
, nan
62 yield Float32(0.0).bits
, Float32(-0.0).bits
63 yield Float32(-0.0).bits
, Float32(0.0).bits
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,
70 run_pipe_fp(dut
, 32, "test_fpmax_f32_min_nans", unit_test_single
,
71 Float32
, nan_testcases
, fpmax_f32_min
, 5,
75 if __name__
== '__main__':