add align phase
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 14 Feb 2019 08:49:48 +0000 (08:49 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 14 Feb 2019 08:49:48 +0000 (08:49 +0000)
src/add/nmigen_add_experiment.py

index 5eb20770c414485b56a5456a85cc79cabde3ac4b..e23bb8a7027b13ad7805d45c9e3c277d464beea4 100644 (file)
@@ -40,10 +40,10 @@ class FPADD:
         b_m = Signal(27) # ??? seems to be 1 bit extra??
         z_m = Signal(24)
 
-        # Exponent
-        a_e = Signal(10)
-        b_e = Signal(10)
-        z_e = Signal(10)
+        # Exponent: 10 bits, signed (the exponent bias is subtracted)
+        a_e = Signal((10, True))
+        b_e = Signal((10, True))
+        z_e = Signal((10, True))
 
         # Sign
         a_s = Signal()
@@ -184,6 +184,29 @@ class FPADD:
                     with m.Else():
                         m.d.sync += b_m[26].eq(1) # set highest mantissa bit
 
+            # ******
+            # align.  NOTE: this does *not* do single-cycle multi-shifting,
+            #         it *STAYS* in the align state until the exponents match
+
+            with m.State("align"):
+                # exponent of a greater than b: increment b exp, shift b mant
+                with m.If(a_e > b_e):
+                    m.d.sync += [
+                      b_e.eq(b_e + 1),
+                      b_m.eq(b_m >> 1),
+                      b_m[0].eq(b_m[0] | b_m[1]) # moo??
+                    ]
+                # exponent of b greater than a: increment a exp, shift a mant
+                with m.Elif(a_e < b_e):
+                    m.d.sync += [
+                      a_e.eq(a_e + 1),
+                      a_m.eq(a_m >> 1),
+                      a_m[0].eq(a_m[0] | a_m[1]) # moo??
+                    ]
+                # exponents equal: move to next stage.
+                with m.Else():
+                    m.next = "add_0"
+
             # ******
             # First stage of add