pysvp64db: fix traversal
[openpower-isa.git] / src / openpower / sv / svp64.py
1 # SPDX-License-Identifier: LGPLv3+
2 # Copyright (C) 2021 Luke Kenneth Casson Leighton <lkcl@lkcl.net>
3 # Funded by NLnet http://nlnet.nl
4 """SVP64 Data Structures
5
6 For full spec see https://libre-soc.org/openpower/sv/
7 """
8
9 from nmigen import Record
10
11
12 # in nMigen, Record begins at the LSB and fills upwards
13 # however in OpenPOWER, numbering is MSB0. sigh.
14 class SVP64Rec(Record):
15 """SVP64 RM (Remap) Record.
16
17 https://libre-soc.org/openpower/sv/svp64/
18
19 | Field Name | Field bits | Description |
20 |-------------|------------|----------------------------------------|
21 | MASKMODE | `0` | Execution (predication) Mask Kind |
22 | MASK | `1:3` | Execution Mask |
23 | ELWIDTH | `4:5` | Element Width |
24 | ELWIDTH_SRC | `6:7` | Element Width for Source |
25 | SUBVL | `8:9` | Sub-vector length |
26 | EXTRA | `10:18` | context-dependent extra |
27 | MODE | `19:23` | changes Vector behaviour |
28 """
29 def __init__(self, name=None):
30 Record.__init__(self, layout=[("mode" , 5),
31 ("extra" , 9),
32 ("subvl" , 2),
33 ("ewsrc" , 2),
34 ("elwidth" , 2),
35 ("mask" , 3),
36 ("mmode" , 1)], name=name)
37
38 def ports(self):
39 return [self.mmode, self.mask, self.elwidth, self.ewsrc,
40 self.subvl, self.extra, self.mode]
41
42
43 options = {0b000: (0,1,2),
44 0b001: (0,2,1),
45 0b010: (1,0,2),
46 0b011: (1,2,0),
47 0b100: (2,0,1),
48 0b101: (2,1,0)}
49 roptions = {}
50 for k, v in options.items():
51 roptions[v] = k
52
53
54 # in nMigen, Record begins at the LSB and fills upwards
55 # however in OpenPOWER, numbering is MSB0. sigh.
56 class SVP64SHAPE(Record):
57 layout=[("mode" , 2),
58 ("skip" , 2),
59 ("offset" , 4),
60 ("invxyz" , 3),
61 ("permute" , 3),
62 ("zdimsz" , 6),
63 ("ydimsz" , 6),
64 ("xdimsz" , 6)]
65
66 """SVP64 SHAPE Record.
67
68 https://libre-soc.org/openpower/sv/remap/
69
70 | Field Name | Field bits | Description |
71 |------------|------------|----------------------------------------|
72 | XDIMSZ | `0:5` | X Dimension size |
73 | YDIMSZ | `6:11` | Y Dimension size |
74 | ZDIMSZ | `12:17` | Z Dimension size |
75 | PERMUTE | `18:20` | Permutation order (XYZ, XZY, YXZ...) |
76 | INVXYZ | `21:23` | Invert order of X or Y or Z |
77 | OFFSET | `24:27` | Adds to index after REMAP (offsets) |
78 | SKIP | `28:29` | Skips dimension numbered SKIP |
79 | MODE | `30:31` | Selects Mode: Matrix, FFT, DCT |
80 """
81 def __init__(self, name=None):
82 Record.__init__(self, layout=self.layout, name=name)
83
84 @staticmethod
85 def order(permute):
86 return options[permute]
87
88 @staticmethod
89 def rorder(order):
90 return roptions[tuple(order)]
91
92 def ports(self):
93 return [self.mode, self.skip, self.offset, self.invxyz, self.permute,
94 self.zdimsz, self.ydimsz, self.xdimsz]
95
96
97 # in nMigen, Record begins at the LSB and fills upwards
98 # however in OpenPOWER, numbering is MSB0. sigh.
99 class SVP64REMAP(Record):
100 layout=[
101 ("rsvd" , 9),
102 ("men" , 5),
103 ("mo1" , 2),
104 ("mo0" , 2),
105 ("mi2" , 2),
106 ("mi1" , 2),
107 ("mi0" , 2),
108 ]
109
110 """SVP64 REMAP Record, for Context Propagation
111
112 https://libre-soc.org/openpower/sv/propagation/
113
114 | Field Name | Field bits | Description |
115 |------------|------------|----------------------------------------|
116 | MI0 | `0:1` | 1st input register SVSHAPE(0-3) index |
117 | MI1 | `2:3` | 2nd input register SVSHAPE(0-3) index |
118 | MI2 | `4:5` | 3rd input register SVSHAPE(0-3) index |
119 | MO0 | `6:7` | 1st output register SVSHAPE(0-3) index |
120 | MO1 | `8:9` | 2nd output register SVSHAPE(0-3) index |
121 | MEN | `10:14` | enables MI0..MO1 |
122 | RESERVED | `15:23` | reserved |
123 """
124 def __init__(self, name=None):
125 Record.__init__(self, layout=self.layout, name=name)
126
127 @staticmethod
128 def order(permute):
129 return options[permute]
130
131 @staticmethod
132 def rorder(order):
133 return roptions[tuple(order)]
134
135 def ports(self):
136 return [self.mi0, self.mi1, self.mi2,
137 self.mo0, self.m02,
138 self.men, self.rsvd
139 ]
140