1 # SPDX-License-Identifier: LGPLv3+
2 # Funded by NLnet https://nlnet.nl/
4 # XXX TODO: get this into openpower/consts.py instead.
5 # create the layout from an auto-created Enum FPSCRb
6 """ Record for FPSCR as defined in
7 Power ISA v3.1B Book I section 4.2.2 page 136(162)
11 |Bits |Mnemonic | Description |
12 |-----|---------|-------------------------------------------------------------|
13 |0:28 | | Reserved |
14 |29:31| DRN | Decimal Rounding Mode |
15 |32 | FX | FP Exception Summary |
16 |33 | FEX | FP Enabled Exception Summary |
17 |34 | VX | FP Invalid Operation Exception Summary |
18 |35 | OX | FP Overflow Exception |
19 |36 | UX | FP Underflow Exception |
20 |37 | ZX | FP Zero Divide Exception |
21 |38 | XX | FP Inexact Exception |
22 |39 | VXSNAN | FP Invalid Operation Exception (SNaN) |
23 |40 | VXISI | FP Invalid Operation Exception (∞ - ∞) |
24 |41 | VXIDI | FP Invalid Operation Exception (∞ ÷ ∞) |
25 |42 | VXZDZ | FP Invalid Operation Exception (0 ÷ 0) |
26 |43 | VXIMZ | FP Invalid Operation Exception (∞ × 0) |
27 |44 | VXVC | FP Invalid Operation Exception (Invalid Compare) |
28 |45 | FR | FP Fraction Rounded |
29 |46 | FI | FP Fraction Inexact |
30 |47:51| FPRF | FP Result Flags |
31 |47 | C | FP Result Class Descriptor |
32 |48:51| FPCC | FP Condition Code |
33 |48 | FL | FP Less Than or Negative |
34 |49 | FG | FP Greater Than or Positive |
35 |50 | FE | FP Equal or Zero |
36 |51 | FU | FP Unordered or NaN |
37 |52 | | Reserved |
38 |53 | VXSOFT | FP Invalid Operation Exception (Software-Defined Condition) |
39 |54 | VXSQRT | FP Invalid Operation Exception (Invalid Square Root) |
40 |55 | VXCVI | FP Invalid Operation Exception (Invalid Integer Convert) |
41 |56 | VE | FP Invalid Operation Exception Enable |
42 |57 | OE | FP Overflow Exception Enable |
43 |58 | UE | FP Underflow Exception Enable |
44 |59 | ZE | FP Zero Divide Exception Enable |
45 |60 | XE | FP Inexact Exception Enable |
46 |61 | NI | FP Non-IEEE Mode |
47 |62:63| RN | FP Rounding Control |
50 from nmigen
import Record
51 from copy
import deepcopy
52 from openpower
.util
import log
53 from openpower
.decoder
.selectable_int
import (
54 FieldSelectableInt
, SelectableInt
)
57 class FPSCRRecord(Record
):
69 ("FPCC", 4), # layout FL/FG/FE/FU TODO
70 ("FPRF", 2), # layout C/rsvd TODO
89 def __init__(self
, name
=None):
90 super().__init
__(name
=name
, layout
=FPSCRRecord
.layout
)
93 class FPSCRState(SelectableInt
):
94 def __init__(self
, value
=0):
95 SelectableInt
.__init
__(self
, value
, 64)
98 # set up sub-fields from Record layout
100 l
= deepcopy(FPSCRRecord
.layout
)
102 for field
, width
in l
:
104 fs
= tuple(range(offs
, end
))
105 v
= FieldSelectableInt(self
, fs
)
107 log("SVSTATE setup field", field
, offs
, end
)
109 # extra fields, temporarily explicitly added. TODO nested layout above
116 for offs
, field
in extras
:
118 fs
= tuple(range(offs
, end
))
119 v
= FieldSelectableInt(self
, fs
)
121 log("SVSTATE extra field", field
, offs
, end
)
125 return self
.fsi
['DRN'].asint(msb0
=True)
128 def DRN(self
, value
):
129 self
.fsi
['DRN'].eq(value
)
133 return self
.fsi
['FX'].asint(msb0
=True)
137 self
.fsi
['FX'].eq(value
)
141 return self
.fsi
['FEX'].asint(msb0
=True)
144 def FEX(self
, value
):
145 self
.fsi
['FEX'].eq(value
)
149 return self
.fsi
['VX'].asint(msb0
=True)
153 self
.fsi
['VX'].eq(value
)
157 return self
.fsi
['OX'].asint(msb0
=True)
161 self
.fsi
['OX'].eq(value
)
165 return self
.fsi
['UX'].asint(msb0
=True)
169 self
.fsi
['UX'].eq(value
)
173 return self
.fsi
['ZX'].asint(msb0
=True)
177 self
.fsi
['ZX'].eq(value
)
181 return self
.fsi
['XX'].asint(msb0
=True)
185 self
.fsi
['XX'].eq(value
)
189 return self
.fsi
['VXSNAN'].asint(msb0
=True)
192 def VXSNAN(self
, value
):
193 self
.fsi
['VXSNAN'].eq(value
)
197 return self
.fsi
['VXISI'].asint(msb0
=True)
200 def VXISI(self
, value
):
201 self
.fsi
['VXISI'].eq(value
)
205 return self
.fsi
['VXIDI'].asint(msb0
=True)
208 def VXIDI(self
, value
):
209 self
.fsi
['VXIDI'].eq(value
)
213 return self
.fsi
['VXZDZ'].asint(msb0
=True)
216 def VXZDZ(self
, value
):
217 self
.fsi
['VXZDZ'].eq(value
)
221 return self
.fsi
['VXIMZ'].asint(msb0
=True)
224 def VXIMZ(self
, value
):
225 self
.fsi
['VXIMZ'].eq(value
)
229 return self
.fsi
['VXVC'].asint(msb0
=True)
232 def VXVC(self
, value
):
233 self
.fsi
['VXVC'].eq(value
)
237 return self
.fsi
['FR'].asint(msb0
=True)
241 self
.fsi
['FR'].eq(value
)
245 return self
.fsi
['FI'].asint(msb0
=True)
249 self
.fsi
['FI'].eq(value
)
253 return self
.fsi
['FPRF'].asint(msb0
=True)
256 def FPRF(self
, value
):
257 self
.fsi
['FPRF'].eq(value
)
261 return self
.fsi
['C'].asint(msb0
=True)
265 self
.fsi
['C'].eq(value
)
269 return self
.fsi
['FPCC'].asint(msb0
=True)
272 def FPCC(self
, value
):
273 self
.fsi
['FPCC'].eq(value
)
277 return self
.fsi
['FL'].asint(msb0
=True)
281 self
.fsi
['FL'].eq(value
)
285 return self
.fsi
['FG'].asint(msb0
=True)
289 self
.fsi
['FG'].eq(value
)
293 return self
.fsi
['FE'].asint(msb0
=True)
297 self
.fsi
['FE'].eq(value
)
301 return self
.fsi
['FU'].asint(msb0
=True)
305 self
.fsi
['FU'].eq(value
)
309 return self
.fsi
['VXSOFT'].asint(msb0
=True)
312 def VXSOFT(self
, value
):
313 self
.fsi
['VXSOFT'].eq(value
)
317 return self
.fsi
['VXSQRT'].asint(msb0
=True)
320 def VXSQRT(self
, value
):
321 self
.fsi
['VXSQRT'].eq(value
)
325 return self
.fsi
['VXCVI'].asint(msb0
=True)
328 def VXCVI(self
, value
):
329 self
.fsi
['VXCVI'].eq(value
)
333 return self
.fsi
['VE'].asint(msb0
=True)
337 self
.fsi
['VE'].eq(value
)
341 return self
.fsi
['OE'].asint(msb0
=True)
345 self
.fsi
['OE'].eq(value
)
349 return self
.fsi
['UE'].asint(msb0
=True)
353 self
.fsi
['UE'].eq(value
)
357 return self
.fsi
['ZE'].asint(msb0
=True)
361 self
.fsi
['ZE'].eq(value
)
365 return self
.fsi
['XE'].asint(msb0
=True)
369 self
.fsi
['XE'].eq(value
)
373 return self
.fsi
['NI'].asint(msb0
=True)
377 self
.fsi
['NI'].eq(value
)
381 return self
.fsi
['RN'].asint(msb0
=True)
385 self
.fsi
['RN'].eq(value
)
388 if __name__
== "__main__":
389 from pprint
import pprint
390 print("FPSCRRecord.layout:")
391 pprint(FPSCRRecord
.layout
)
392 print("FPSCRState.fsi:")
393 pprint(FPSCRState().fsi
)
395 # quick test of setter/getters
398 print (fpscr
.FPCC
, fpscr
.FL
, fpscr
.FG
, fpscr
.FE
, fpscr
.FU
)
400 print (fpscr
.FPCC
, fpscr
.FL
, fpscr
.FG
, fpscr
.FE
, fpscr
.FU
)
402 print (fpscr
.FPRF
, fpscr
.C
)