attempt to make carry-in and overflow-enable optional on ALU
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 3 Jun 2020 11:41:44 +0000 (12:41 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 3 Jun 2020 11:41:44 +0000 (12:41 +0100)
src/soc/decoder/power_regspec_map.py
src/soc/fu/alu/test/test_pipe_caller.py
src/soc/fu/compunits/test/test_alu_compunit.py

index 4e90b8dba4981a4f466a888922b4522b4bc09e94..662159a334d627537e47dcb7477c151175bdf2df 100644 (file)
@@ -70,8 +70,8 @@ def regspec_decode(e, regfile, name):
         CA = 1<<XERRegs.CA
         OV = 1<<XERRegs.OV
         if name == 'xer_so':
-            return Const(1), SO, SO # TODO
             #return e.oe.oe & e.oe.oe_ok, SO, SO
+            return Const(1), SO, SO # TODO
         if name == 'xer_ov':
             return Const(1), OV, OV # TODO
             return e.oe.oe & e.oe.oe_ok, OV, OV
index 8517dc741312b8fbd0c7f588ae17423f5b4af7e0..5c57679e754dca6e49bd897424d22316c5b5ee85 100644 (file)
@@ -53,12 +53,18 @@ def set_alu_inputs(alu, dec2, sim):
 
 
 def set_extra_alu_inputs(alu, dec2, sim):
-    carry = 1 if sim.spr['XER'][XER_bits['CA']] else 0
-    carry32 = 1 if sim.spr['XER'][XER_bits['CA32']] else 0
-    yield alu.p.data_i.xer_ca[0].eq(carry)
-    yield alu.p.data_i.xer_ca[1].eq(carry32)
-    so = 1 if sim.spr['XER'][XER_bits['SO']] else 0
-    yield alu.p.data_i.xer_so.eq(so)
+    cry_in = yield dec2.e.input_carry
+    if cry_in:
+        carry = 1 if sim.spr['XER'][XER_bits['CA']] else 0
+        carry32 = 1 if sim.spr['XER'][XER_bits['CA32']] else 0
+        yield alu.p.data_i.xer_ca[0].eq(carry)
+        yield alu.p.data_i.xer_ca[1].eq(carry32)
+        print ("extra inputs: CA/32", carry, carry32)
+    oe = yield dec2.e.oe.data & dec2.e.oe.ok
+    if oe:
+        so = 1 if sim.spr['XER'][XER_bits['SO']] else 0
+        print ("extra inputs: so", so)
+        yield alu.p.data_i.xer_so.eq(so)
 
 
 # This test bench is a bit different than is usual. Initially when I
index 124752501b21db14d1f9879c09bbaa26a39d357d..87ba1bc757810548603fdbe58b1c497d6058e3f0 100644 (file)
@@ -32,13 +32,17 @@ class ALUTestRunner(TestRunner):
             res['rb'] = sim.gpr(data2).value
 
         # XER.ca
-        carry = 1 if sim.spr['XER'][XER_bits['CA']] else 0
-        carry32 = 1 if sim.spr['XER'][XER_bits['CA32']] else 0
-        res['xer_ca'] = carry | (carry32<<1)
+        cry_in = yield dec2.e.input_carry
+        if True: #cry_in:
+            carry = 1 if sim.spr['XER'][XER_bits['CA']] else 0
+            carry32 = 1 if sim.spr['XER'][XER_bits['CA32']] else 0
+            res['xer_ca'] = carry | (carry32<<1)
 
         # XER.so
-        so = 1 if sim.spr['XER'][XER_bits['SO']] else 0
-        res['xer_so'] = so
+        oe = yield dec2.e.oe.data & dec2.e.oe.ok
+        if True: #oe:
+            so = 1 if sim.spr['XER'][XER_bits['SO']] else 0
+            res['xer_so'] = so
 
         return res