X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fsoc%2Ffu%2Ftrap%2Fpipe_data.py;h=de55cf2e57072bf35623581603a60373d459e4d9;hb=0046884fcff53877a6cbfa322c0a86f6a6a17361;hp=af0e9d7a08bbbb220fd581181a1e19cf10163014;hpb=befa017af689356b30792b3102525211abb66dbd;p=soc.git diff --git a/src/soc/fu/trap/pipe_data.py b/src/soc/fu/trap/pipe_data.py index af0e9d7a..de55cf2e 100644 --- a/src/soc/fu/trap/pipe_data.py +++ b/src/soc/fu/trap/pipe_data.py @@ -1,68 +1,33 @@ -from nmigen import Signal, Const -from ieee754.fpcommon.getop import FPPipeContext -from soc.fu.alu.pipe_data import IntegerData -from soc.decoder.power_decoder2 import Data -from nmutil.dynamicpipe import SimpleHandshakeRedir -from soc.fu.alu.alu_input_record import CompALUOpSubset # TODO: replace +from soc.fu.pipe_data import IntegerData, CommonPipeSpec +from soc.fu.trap.trap_input_record import CompTrapOpSubset class TrapInputData(IntegerData): - regspec = [('INT', 'a', '0:63'), - ('INT', 'b', '0:63'), - ('PC', 'cia', '0:63'), - ('MSR', 'msr', '0:63')] + regspec = [('INT', 'ra', '0:63'), # RA + ('INT', 'rb', '0:63'), # RB/immediate + ('FAST', 'fast1', '0:63'), # SRR0 + ('FAST', 'fast2', '0:63'), # SRR1 + ] 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.cia = Signal(64, reset_less=True) # Program counter - self.msr = Signal(64, reset_less=True) # MSR - - def __iter__(self): - yield from super().__iter__() - yield self.a - yield self.b - yield self.cia - yield self.msr - - def eq(self, i): - lst = super().eq(i) - return lst + [self.a.eq(i.a), self.b.eq(i.b), - self.cia.eq(i.nia), self.msr.eq(i.msr)] + super().__init__(pspec, False) + # convenience + self.srr0, self.srr1 = self.fast1, self.fast2 + self.a, self.b = self.ra, self.rb class TrapOutputData(IntegerData): - regspec = [('SPR', 'srr0', '0:63'), - ('SPR', 'srr1', '0:63'), - ('PC', 'nia', '0:63'), - ('MSR', 'msr', '0:63')] + regspec = [('INT', 'o', '0:63'), # RA + ('FAST', 'fast1', '0:63'), # SRR0 SPR + ('FAST', 'fast2', '0:63'), # SRR1 SPR + ('FAST', 'nia', '0:63'), # NIA (Next PC) + ('FAST', 'msr', '0:63')] # MSR def __init__(self, pspec): - super().__init__(pspec) - self.srr0 = Data(64, name="srr0") # SRR0 SPR - self.srr1 = Data(64, name="srr1") # SRR1 SPR - self.nia = Data(64, name="nia") # NIA (Next PC) - self.msr = Signal(64, reset_less=True) # MSR - - def __iter__(self): - yield from super().__iter__() - yield self.nia - yield self.msr - yield self.srr0 - yield self.srr1 + super().__init__(pspec, True) + # convenience + self.srr0, self.srr1 = self.fast1, self.fast2 - def eq(self, i): - lst = super().eq(i) - return lst + [ self.nia.eq(i.nia), self.msr.eq(i.msr), - self.srr0.eq(i.srr0), self.srr1.eq(i.srr1)] -# TODO: replace CompALUOpSubset with CompTrapOpSubset -class TrapPipeSpec: +class TrapPipeSpec(CommonPipeSpec): regspec = (TrapInputData.regspec, TrapOutputData.regspec) - opsubsetkls = CompALUOpSubset - def __init__(self, id_wid, op_wid): - self.id_wid = id_wid - self.op_wid = op_wid - self.opkls = lambda _: self.opsubsetkls(name="op") - self.stage = None - self.pipekls = SimpleHandshakeRedir + opsubsetkls = CompTrapOpSubset