add SVP64REMAP Record
[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 # in nMigen, Record begins at the LSB and fills upwards
44 # however in OpenPOWER, numbering is MSB0. sigh.
45 class SVP64REMAP(Record):
46 """SVP64 SHAPE (REMAP) Record.
47
48 https://libre-soc.org/openpower/sv/remap/
49
50 | Field Name | Field bits | Description |
51 |-------------|------------|----------------------------------------|
52 | XDIMSZ | `0:5` | X Dimension size |
53 | YDIMSZ | `6:11` | Y Dimension size |
54 | ZDIMSZ | `12:17` | Z Dimension size |
55 | PERMUTE | `18:20` | Permutation order (XYZ, XZY, YXZ...) |
56 | INVXYZ | `21:23` | Invert order of X or Y or Z |
57 | OFFSET | `24:29` | Adds to index before modulo |
58 | APPLYDIM | `30:31` | how many dimensions in use |
59 """
60 def __init__(self, name=None):
61 Record.__init__(self, layout=[("applydim" , 2),
62 ("offset" , 6),
63 ("invxyz" , 3),
64 ("permute" , 3),
65 ("zdimsz" , 6),
66 ("ydimsz" , 6),
67 ("xdimsz" , 6)], name=name)
68
69 def ports(self):
70 return [self.applydim, self.offset, self.invxyz, self.permute,
71 self.zdimsz, self.ydimsz, self.xdimsz]
72