X-Git-Url: https://git.libre-soc.org/?p=soc.git;a=blobdiff_plain;f=src%2Fsoc%2Ffu%2Falu%2Fpipe_data.py;h=71363049ba5a437a708e53dfbc3370f17aa394d1;hp=7c91349a0789675c6a4e40883c5147a729736849;hb=HEAD;hpb=1f1344bfd96a7c0bad7664d088342e64924628f9 diff --git a/src/soc/fu/alu/pipe_data.py b/src/soc/fu/alu/pipe_data.py index 7c91349a..572ec9a6 100644 --- a/src/soc/fu/alu/pipe_data.py +++ b/src/soc/fu/alu/pipe_data.py @@ -1,90 +1,38 @@ -from nmigen import Signal, Const -from nmutil.dynamicpipe import SimpleHandshakeRedir from soc.fu.alu.alu_input_record import CompALUOpSubset -from ieee754.fpcommon.getop import FPPipeContext +from soc.fu.pipe_data import FUBaseData, CommonPipeSpec -class IntegerData: - +class ALUInputData(FUBaseData): def __init__(self, pspec): - self.ctx = FPPipeContext(pspec) - self.muxid = self.ctx.muxid - - def __iter__(self): - yield from self.ctx + super().__init__(pspec, False) + # convenience + self.a, self.b = self.ra, self.rb - def eq(self, i): - return [self.ctx.eq(i.ctx)] + @property + def regspec(self): + return [('INT', 'ra', self.intrange), # RA + ('INT', 'rb', self.intrange), # RB/immediate + ('XER', 'xer_so', '32'), # XER bit 32: SO + ('XER', 'xer_ca', '34,45')] # XER bit 34/45: CA/CA32 - def ports(self): - return self.ctx.ports() -class ALUInputData(IntegerData): +class ALUOutputData(FUBaseData): def __init__(self, pspec): - super().__init__(pspec) - self.a = Signal(64, reset_less=True) # RA - self.b = Signal(64, reset_less=True) # RB/immediate - self.so = Signal(reset_less=True) - self.carry_in = Signal(reset_less=True) - - def __iter__(self): - yield from super().__iter__() - yield self.a - yield self.b - yield self.carry_in - yield self.so - - def eq(self, i): - lst = super().eq(i) - return lst + [self.a.eq(i.a), self.b.eq(i.b), - self.carry_in.eq(i.carry_in), - self.so.eq(i.so)] - -# TODO: ALUIntermediateData which does not have -# cr0, ov, ov32 in it (because they are generated as outputs by -# the final output stage, not by the intermediate stage) -# https://bugs.libre-soc.org/show_bug.cgi?id=305#c19 - -class ALUOutputData(IntegerData): - def __init__(self, pspec): - super().__init__(pspec) - self.o = Signal(64, reset_less=True, name="stage_o") - self.carry_out = Signal(reset_less=True) - self.carry_out32 = Signal(reset_less=True) - self.cr0 = Signal(4, reset_less=True) - self.ov = Signal(reset_less=True) - self.ov32 = Signal(reset_less=True) - self.so = Signal(reset_less=True) - - def __iter__(self): - yield from super().__iter__() - yield self.o - yield self.carry_out - yield self.carry_out32 - yield self.cr0 - yield self.ov - yield self.ov32 - yield self.so - - def eq(self, i): - lst = super().eq(i) - return lst + [self.o.eq(i.o), - self.carry_out.eq(i.carry_out), - self.carry_out32.eq(i.carry_out32), - self.cr0.eq(i.cr0), self.ov.eq(i.ov), - self.ov32.eq(i.ov32), self.so.eq(i.so)] + super().__init__(pspec, True) + # convenience + self.cr0 = self.cr_a + @property + def regspec(self): + return [('INT', 'o', self.intrange), + ('CR', 'cr_a', '0:3'), + ('XER', 'xer_ca', '34,45'), # bit0: ca, bit1: ca32 + ('XER', 'xer_ov', '33,44'), # bit0: ov, bit1: ov32 + ('XER', 'xer_so', '32')] -class IntPipeSpec: - def __init__(self, id_wid=2, op_wid=1): - self.id_wid = id_wid - self.op_wid = op_wid - self.opkls = lambda _: CompALUOpSubset(name="op") - self.stage = None -class ALUPipeSpec(IntPipeSpec): - def __init__(self, id_wid, op_wid): - super().__init__(id_wid, op_wid) - self.pipekls = SimpleHandshakeRedir +class ALUPipeSpec(CommonPipeSpec): + opsubsetkls = CompALUOpSubset + regspecklses = (ALUInputData, ALUOutputData)