FSGNJ: Replace use of Switch() with explicit muxes
authorMichael Nolan <mtnolan2640@gmail.com>
Mon, 27 Jan 2020 14:34:40 +0000 (09:34 -0500)
committerMichael Nolan <mtnolan2640@gmail.com>
Mon, 27 Jan 2020 14:34:40 +0000 (09:34 -0500)
From http://bugs.libre-riscv.org/show_bug.cgi?id=120

"If(), Switch() and friends are fine for modules that are strictly
scalar, but will not work if the module is converted to SIMD."

src/ieee754/fsgnj/fsgnj.py

index dfb1df664f87995a5dd3eee7e52b24c41d465d4c..31501743a159124216ccb29200b381977dda24e2 100644 (file)
@@ -3,7 +3,7 @@
 # Copyright (C) 2020 Michael Nolan <mtnolan2640@gmail.com>
 
 
-from nmigen import Module, Signal, Cat
+from nmigen import Module, Signal, Cat, Mux
 
 from nmutil.pipemodbase import PipeModBase
 from ieee754.fpcommon.basedata import FPBaseData
@@ -49,15 +49,9 @@ class FSGNJPipeMod(PipeModBase):
 
         sign = Signal()
 
-        with m.Switch(opcode):
-            with m.Case(0b00):
-                comb += sign.eq(b1.s)
-            with m.Case(0b01):
-                comb += sign.eq(~b1.s)
-            with m.Case(0b10):
-                comb += sign.eq(a1.s ^ b1.s)
-            with m.Default():
-                comb += sign.eq(b1.s)
+        sign = Mux(opcode[0], ~b1.s, b1.s)
+        sign = Mux(opcode[1], sign ^ a1.s, sign)
+
 
         comb += z1.eq(a1.fp.create2(sign, a1.e, a1.m))