bug in andc and orc, complement was taking place on RA not RB
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 22 Aug 2020 14:39:29 +0000 (15:39 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 22 Aug 2020 14:39:43 +0000 (15:39 +0100)
src/soc/fu/common_input_stage.py
src/soc/fu/logical/input_stage.py
src/soc/fu/shift_rot/input_stage.py
src/soc/fu/shift_rot/pipe_data.py

index 745be7726b032fa29b6d4cbbfe45c2140c90e0b7..1b64e5ce295342b760564d7764cd511192bbda85 100644 (file)
@@ -19,7 +19,11 @@ class CommonInputStage(PipeModBase):
         # operand a to be as-is or inverted
         a = Signal.like(self.i.a)
 
-        if hasattr(op, "invert_a"):
+        op_to_invert = 'ra'
+        if hasattr(self, "invert_op"):
+            op_to_invert = self.invert_op
+
+        if hasattr(op, "invert_a") and op_to_invert == 'ra':
             with m.If(op.invert_a):
                 comb += a.eq(~self.i.a)
             with m.Else():
@@ -29,6 +33,21 @@ class CommonInputStage(PipeModBase):
 
         comb += self.o.a.eq(a)
 
+        ##### operand B #####
+
+        # operand b to be as-is or inverted
+        b = Signal.like(self.i.b)
+
+        if hasattr(op, "invert_a") and op_to_invert == 'rb':
+            with m.If(op.invert_a):
+                comb += b.eq(~self.i.b)
+            with m.Else():
+                comb += b.eq(self.i.b)
+        else:
+            comb += b.eq(self.i.b)
+
+        comb += self.o.b.eq(b)
+
         ##### carry-in #####
 
         # either copy incoming carry or set to 1/0 as defined by op
index df28187701f145abc75805172d3680f8ad941221..43f20c6e30c2f02e1c73e2eda7c3e4e65bd4276c 100644 (file)
@@ -9,6 +9,7 @@ from soc.fu.logical.pipe_data import LogicalInputData
 class LogicalInputStage(CommonInputStage):
     def __init__(self, pspec):
         super().__init__(pspec, "input")
+        self.invert_op = "rb" # inversion is on register b
 
     def ispec(self):
         return LogicalInputData(self.pspec)
@@ -17,11 +18,8 @@ class LogicalInputStage(CommonInputStage):
         return LogicalInputData(self.pspec)
 
     def elaborate(self, platform):
-        m = super().elaborate(platform) # covers A-invert, carry, excludes SO
+        m = super().elaborate(platform) # covers B-invert, carry, excludes SO
         comb = m.d.comb
         ctx = self.i.ctx
 
-        # operand b
-        comb += self.o.b.eq(self.i.b)
-
         return m
index f195b40e82e3a1294662ea739f61b5651ade3f06..060555405752ca5e46a56d92e8391dbfa96c765c 100644 (file)
@@ -20,8 +20,7 @@ class ShiftRotInputStage(CommonInputStage):
         m = super().elaborate(platform) # handles A, carry and sticky overflow
         comb = m.d.comb
 
-        # operands ra and rb
-        comb += self.o.rb.eq(self.i.rb)
+        # operand rs
         comb += self.o.rs.eq(self.i.rs)
 
         return m
index 280a757566bd58acd2fc50e97a170a0165dc528b..0477629670c0947d618a66c09b8595ca2aac1a92 100644 (file)
@@ -11,7 +11,8 @@ class ShiftRotInputData(IntegerData):
     def __init__(self, pspec):
         super().__init__(pspec, False)
         # convenience
-        self.a, self.rs = self.ra, self.rc
+        self.a, self.b, self.rs = self.ra, self.rb, self.rc
+
 
 
 class ShiftRotPipeSpec(CommonPipeSpec):