1 from nmigen
import Signal
, Const
2 from ieee754
.fpcommon
.getop
import FPPipeContext
3 from soc
.fu
.alu
.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
9 class TrapInputData(IntegerData
):
10 regspec
= [('INT', 'a', '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
22 yield from super().__iter
__()
30 return lst
+ [self
.a
.eq(i
.a
), self
.b
.eq(i
.b
),
31 self
.cia
.eq(i
.nia
), self
.msr
.eq(i
.msr
)]
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
47 yield from super().__iter
__()
55 return lst
+ [ self
.nia
.eq(i
.nia
), self
.msr
.eq(i
.msr
),
56 self
.srr0
.eq(i
.srr0
), self
.srr1
.eq(i
.srr1
)]
59 # TODO: replace CompALUOpSubset with CompTrapOpSubset
61 regspec
= (TrapInputData
.regspec
, TrapOutputData
.regspec
)
62 opsubsetkls
= CompALUOpSubset
63 def __init__(self
, id_wid
, op_wid
):
66 self
.opkls
= lambda _
: self
.opsubsetkls(name
="op")
68 self
.pipekls
= SimpleHandshakeRedir