3 * https://bugs.libre-soc.org/show_bug.cgi?id=348
4 * https://libre-soc.org/openpower/isa/sprset/
7 from nmigen
import (Module
, Signal
, Cat
)
8 from nmutil
.pipemodbase
import PipeModBase
9 from soc
.fu
.spr
.pipe_data
import SPRInputData
, SPROutputData
10 from soc
.decoder
.power_enums
import InternalOp
, SPR
, XER_bits
12 from soc
.decoder
.power_fields
import DecodeFields
13 from soc
.decoder
.power_fieldsn
import SignalBitRange
14 from soc
.decoder
.power_decoder2
import decode_spr_num
17 class SPRMainStage(PipeModBase
):
18 def __init__(self
, pspec
):
19 super().__init
__(pspec
, "spr_main")
20 self
.fields
= DecodeFields(SignalBitRange
, [self
.i
.ctx
.op
.insn
])
21 self
.fields
.create_specs()
24 return SPRInputData(self
.pspec
)
27 return SPROutputData(self
.pspec
)
29 def elaborate(self
, platform
):
34 # convenience variables
35 a_i
, spr1_i
, fast1_i
= self
.i
.a
, self
.i
.spr1
, self
.i
.fast1
36 so_i
, ov_i
, ca_i
= self
.i
.xer_so
, self
.i
.xer_ov
, self
.i
.xer_ca
37 so_o
, ov_o
, ca_o
= self
.o
.xer_so
, self
.o
.xer_ov
, self
.o
.xer_ca
38 o
, spr1_o
, fast1_o
= self
.o
.o
, self
.o
.spr1
, self
.o
.fast1
40 # take copy of D-Form TO field
41 x_fields
= self
.fields
.FormXFX
42 spr
= Signal(len(x_fields
.SPR
))
43 comb
+= spr
.eq(decode_spr_num(x_fields
.SPR
))
45 # TODO: some #defines for the bits n stuff.
46 with m
.Switch(op
.insn_type
):
48 with m
.Case(InternalOp
.OP_MTSPR
):
51 with m
.Case(SPR
.CTR
, SPR
.LR
, SPR
.TAR
, SPR
.SRR0
, SPR
.SRR1
):
52 comb
+= fast1_o
.data
.eq(a_i
)
53 comb
+= fast1_o
.ok
.eq(1)
57 comb
+= so_o
.data
.eq(a_i
[63-XER_bits
['SO']])
60 comb
+= ov_o
.data
[0].eq(a_i
[63-XER_bits
['OV']])
61 comb
+= ov_o
.data
[1].eq(a_i
[63-XER_bits
['OV32']])
64 comb
+= ca_o
.data
[0].eq(a_i
[63-XER_bits
['CA']])
65 comb
+= ca_o
.data
[1].eq(a_i
[63-XER_bits
['CA32']])
70 with m
.Case(InternalOp
.OP_MFSPR
):
74 with m
.Case(SPR
.CTR
, SPR
.LR
, SPR
.TAR
, SPR
.SRR0
, SPR
.SRR1
):
75 comb
+= o
.data
.eq(fast1_i
)
79 comb
+= o
[63-XER_bits
['SO']].eq(so_i
)
81 comb
+= o
[63-XER_bits
['OV']].eq(ov_i
[0])
82 comb
+= o
[63-XER_bits
['OV32']].eq(ov_i
[1])
84 comb
+= o
[63-XER_bits
['CA']].eq(ca_i
[0])
85 comb
+= o
[63-XER_bits
['CA32']].eq(ca_i
[1])
88 comb
+= self
.o
.ctx
.eq(self
.i
.ctx
)