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():
53 # in nMigen, Record begins at the LSB and fills upwards
54 # however in OpenPOWER, numbering is MSB0. sigh.
55 class SVP64REMAP(Record
):
65 """SVP64 SHAPE (REMAP) Record.
67 https://libre-soc.org/openpower/sv/remap/
69 | Field Name | Field bits | Description |
70 |------------|------------|----------------------------------------|
71 | XDIMSZ | `0:5` | X Dimension size |
72 | YDIMSZ | `6:11` | Y Dimension size |
73 | ZDIMSZ | `12:17` | Z Dimension size |
74 | PERMUTE | `18:20` | Permutation order (XYZ, XZY, YXZ...) |
75 | INVXYZ | `21:23` | Invert order of X or Y or Z |
76 | OFFSET | `24:27` | Adds to index after REMAP (offsets) |
77 | SKIP | `28:29` | Skips dimension numbered SKIP |
78 | MODE | `30:31` | Selects Mode: Matrix, FFT, DCT |
80 def __init__(self
, name
=None):
81 Record
.__init
__(self
, layout
=self
.layout
, name
=name
)
85 return options
[permute
]
89 return roptions
[tuple(order
)]
92 return [self
.mode
, self
.skip
, self
.offset
, self
.invxyz
, self
.permute
,
93 self
.zdimsz
, self
.ydimsz
, self
.xdimsz
]