add test_caller_trap.py which stunningly actually works reasonably well
[openpower-isa.git] / src / openpower / xer.py
1 # SPDX-License-Identifier: LGPLv3+
2 # Funded by NLnet https://nlnet.nl/
3
4 # XXX TODO: get this into openpower/consts.py instead.
5 # create the layout from an auto-created Enum XERb
6 """ Record for XER as defined in
7 Power ISA v3.1B Book I section 3.2.2 page 49(75)
8
9 XER fields in MSB0:
10
11 | Bits | Mnemonic | Description |
12 |-------|----------|------------------|
13 | 0:31 |   | Reserved |
14 | 32 | SO | Summary Overflow |
15 | 33 | OV | Overflow |
16 | 34 | CA | Carry |
17 | 35:43 |   | Reserved |
18 | 44 | OV32 | Overflow32 |
19 | 45 | CA32 | Carry32 |
20 | 46:56 |   | Reserved |
21 | 57:63 |   | Reserved |
22 """
23
24 from nmigen import Record
25 from copy import deepcopy
26 from openpower.util import log
27 from openpower.decoder.selectable_int import (
28 FieldSelectableInt, SelectableInt)
29
30
31 class XERRecord(Record):
32 layout = [("Reserved1", 18),
33 ("CA32", 1),
34 ("OV32", 1),
35 ("Reserved2", 9),
36 ("CA", 1),
37 ("OV", 1),
38 ("SO", 1),
39 ("Reserved3", 32),
40 ]
41
42 def __init__(self, name=None):
43 super().__init__(name=name, layout=XERRecord.layout)
44
45
46 class XERState(SelectableInt):
47 def __init__(self, value=0):
48 SelectableInt.__init__(self, value, 64)
49 self.fsi = {}
50 offs = 0
51 # set up sub-fields from Record layout
52 self.fsi = {}
53 l = deepcopy(XERRecord.layout)
54 l.reverse()
55 for field, width in l:
56 end = offs+width
57 fs = tuple(range(offs, end))
58 v = FieldSelectableInt(self, fs)
59 self.fsi[field] = v
60 offs = end
61
62 @property
63 def SO(self):
64 return self.fsi['SO']
65
66 @SO.setter
67 def SO(self, value):
68 self.fsi['SO'].eq(value)
69
70 @property
71 def OV(self):
72 return self.fsi['OV']
73
74 @OV.setter
75 def OV(self, value):
76 self.fsi['OV'].eq(value)
77
78 @property
79 def CA(self):
80 return self.fsi['CA']
81
82 @CA.setter
83 def CA(self, value):
84 self.fsi['CA'].eq(value)
85
86 @property
87 def OV32(self):
88 return self.fsi['OV32']
89
90 @OV32.setter
91 def OV32(self, value):
92 self.fsi['OV32'].eq(value)
93
94 @property
95 def CA32(self):
96 return self.fsi['CA32']
97
98 @CA32.setter
99 def CA32(self, value):
100 self.fsi['CA32'].eq(value)
101
102
103 if __name__ == "__main__":
104 from pprint import pprint
105 print("XERRecord.layout:")
106 pprint(XERRecord.layout)
107 print("XERState.fsi:")
108 pprint(XERState().fsi)