move FU IntegerData to directory below
[soc.git] / src / soc / fu / trap / pipe_data.py
1 from nmigen import Signal, Const
2 from ieee754.fpcommon.getop import FPPipeContext
3 from soc.fu.pipe_data import IntegerData
4 from soc.decoder.power_decoder2 import Data
5 from nmutil.dynamicpipe import SimpleHandshakeRedir
6 from soc.fu.alu.alu_input_record import CompALUOpSubset # TODO: replace
7
8
9 class TrapInputData(IntegerData):
10 regspec = [('INT', 'a', '0:63'),
11 ('INT', 'b', '0:63'),
12 ('PC', 'cia', '0:63'),
13 ('MSR', 'msr', '0:63')]
14 def __init__(self, pspec):
15 super().__init__(pspec)
16 self.a = Signal(64, reset_less=True) # RA
17 self.b = Signal(64, reset_less=True) # RB/immediate
18 self.cia = Signal(64, reset_less=True) # Program counter
19 self.msr = Signal(64, reset_less=True) # MSR
20
21 def __iter__(self):
22 yield from super().__iter__()
23 yield self.a
24 yield self.b
25 yield self.cia
26 yield self.msr
27
28 def eq(self, i):
29 lst = super().eq(i)
30 return lst + [self.a.eq(i.a), self.b.eq(i.b),
31 self.cia.eq(i.nia), self.msr.eq(i.msr)]
32
33
34 class TrapOutputData(IntegerData):
35 regspec = [('SPR', 'srr0', '0:63'),
36 ('SPR', 'srr1', '0:63'),
37 ('PC', 'nia', '0:63'),
38 ('MSR', 'msr', '0:63')]
39 def __init__(self, pspec):
40 super().__init__(pspec)
41 self.srr0 = Data(64, name="srr0") # SRR0 SPR
42 self.srr1 = Data(64, name="srr1") # SRR1 SPR
43 self.nia = Data(64, name="nia") # NIA (Next PC)
44 self.msr = Signal(64, reset_less=True) # MSR
45
46 def __iter__(self):
47 yield from super().__iter__()
48 yield self.nia
49 yield self.msr
50 yield self.srr0
51 yield self.srr1
52
53 def eq(self, i):
54 lst = super().eq(i)
55 return lst + [ self.nia.eq(i.nia), self.msr.eq(i.msr),
56 self.srr0.eq(i.srr0), self.srr1.eq(i.srr1)]
57
58
59 # TODO: replace CompALUOpSubset with CompTrapOpSubset
60 class TrapPipeSpec:
61 regspec = (TrapInputData.regspec, TrapOutputData.regspec)
62 opsubsetkls = CompALUOpSubset
63 def __init__(self, id_wid, op_wid):
64 self.id_wid = id_wid
65 self.op_wid = op_wid
66 self.opkls = lambda _: self.opsubsetkls(name="op")
67 self.stage = None
68 self.pipekls = SimpleHandshakeRedir