Add feq functionality to fpcmp
authorMichael Nolan <mtnolan2640@gmail.com>
Sun, 2 Feb 2020 16:29:48 +0000 (11:29 -0500)
committerMichael Nolan <mtnolan2640@gmail.com>
Sun, 2 Feb 2020 16:29:48 +0000 (11:29 -0500)
src/ieee754/fpcmp/fpcmp.py
src/ieee754/fpcmp/pipeline.py
src/ieee754/fpmax/test/test_fpmax_pipe.py

index 1b0629f5eb5b044116fe50c09f6455e0644c6ecf..8b22a8620e0238968ef8feaad924854dd59cf31b 100644 (file)
@@ -46,8 +46,12 @@ class FPCMPPipeMod(PipeModBase):
         m.d.comb += [a1.v.eq(self.i.a),
                      b1.v.eq(self.i.b)]
 
+        ab_equal = Signal()
+        m.d.comb += ab_equal.eq(a1.v == b1.v)
 
-        comb += z1.eq(0)
+        with m.Switch(opcode):
+            with m.Case(0b10):
+                comb += z1.eq(ab_equal)
 
         # copy the context (muxid, operator)
         comb += self.o.ctx.eq(self.i.ctx)
index 57fa9105dfb4d7fb805e7c12c7f36f642e6e89f7..ab2f9a34a50b5932e367450a173d01c57ddf3a41 100644 (file)
@@ -46,7 +46,7 @@ class FPCMPMuxInOut(ReservationStations):
         Fan-in and Fan-out are combinatorial.
     """
 
-    def __init__(self, in_width, num_rows, op_wid=1):
+    def __init__(self, in_width, num_rows, op_wid=2):
         self.op_wid = op_wid
         self.id_wid = num_bits(num_rows)
 
index e95d3430d31e9762082ca49a142a1b46db2881ca..b8168af78323f9e14f61ef63690c196d559e273c 100644 (file)
@@ -9,6 +9,11 @@ import math
 
 
 def fpmax_f32_max(a, b):
+    # Apparently, sfpy doesn't include a min or max function. Python's
+    # min/max work, however python min/max are not IEEE754 Compliant
+    # (namely, they don't behave correctly with NaNs
+    # IEEE754 defines max(num, NaN) and max(NaN, num) as both
+    # returning num (and the same for min)
     if math.isnan(a) or math.isnan(b):
         if math.isnan(a) and math.isnan(b):
             return Float32(float('nan'))
@@ -46,5 +51,5 @@ def test_fpmax_f32_min():
 
 if __name__ == '__main__':
     for i in range(50):
-        test_fpmax_f32_min()
         test_fpmax_f32_max()
+        test_fpmax_f32_min()