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
6 For full spec see https://libre-soc.org/openpower/sv/
9 from nmigen
import Record
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.
17 https://libre-soc.org/openpower/sv/svp64/
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 |
29 def __init__(self
, name
=None):
30 Record
.__init
__(self
, layout
=[("mode" , 5),
36 ("mmode" , 1)], name
=name
)
39 return [self
.mmode
, self
.mask
, self
.elwidth
, self
.ewsrc
,
40 self
.subvl
, self
.extra
, self
.mode
]
43 options
= {0b000: (0,1,2),
50 for k
, v
in options
.items():
54 # in nMigen, Record begins at the LSB and fills upwards
55 # however in OpenPOWER, numbering is MSB0. sigh.
56 class SVP64SHAPE(Record
):
66 """SVP64 SHAPE Record.
68 https://libre-soc.org/openpower/sv/remap/
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 |
81 def __init__(self
, name
=None):
82 Record
.__init
__(self
, layout
=self
.layout
, name
=name
)
86 return options
[permute
]
90 return roptions
[tuple(order
)]
93 return [self
.mode
, self
.skip
, self
.offset
, self
.invxyz
, self
.permute
,
94 self
.zdimsz
, self
.ydimsz
, self
.xdimsz
]
97 # in nMigen, Record begins at the LSB and fills upwards
98 # however in OpenPOWER, numbering is MSB0. sigh.
99 class SVP64REMAP(Record
):
110 """SVP64 REMAP Record.
112 https://libre-soc.org/openpower/sv/remap/
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 |
124 def __init__(self
, name
=None):
125 Record
.__init
__(self
, layout
=self
.layout
, name
=name
)
129 return options
[permute
]
133 return roptions
[tuple(order
)]
136 return [self
.mi0
, self
.mi1
, self
.mi2
,