from nmigen import Record
+
# in nMigen, Record begins at the LSB and fills upwards
+# however in OpenPOWER, numbering is MSB0. sigh.
class SVP64Rec(Record):
"""SVP64 RM (Remap) Record.
def ports(self):
return [self.mmode, self.mask, self.elwidth, self.ewsrc,
- self.extra, self.mode]
+ self.subvl, self.extra, self.mode]
+
+
+# in nMigen, Record begins at the LSB and fills upwards
+# however in OpenPOWER, numbering is MSB0. sigh.
+class SVP64REMAP(Record):
+ """SVP64 SHAPE (REMAP) Record.
+
+ https://libre-soc.org/openpower/sv/remap/
+
+ | Field Name | Field bits | Description |
+ |-------------|------------|----------------------------------------|
+ | XDIMSZ | `0:5` | X Dimension size |
+ | YDIMSZ | `6:11` | Y Dimension size |
+ | ZDIMSZ | `12:17` | Z Dimension size |
+ | PERMUTE | `18:20` | Permutation order (XYZ, XZY, YXZ...) |
+ | INVXYZ | `21:23` | Invert order of X or Y or Z |
+ | OFFSET | `24:29` | Adds to index before modulo |
+ | APPLYDIM | `30:31` | how many dimensions in use |
+ """
+ def __init__(self, name=None):
+ Record.__init__(self, layout=[("applydim" , 2),
+ ("offset" , 6),
+ ("invxyz" , 3),
+ ("permute" , 3),
+ ("zdimsz" , 6),
+ ("ydimsz" , 6),
+ ("xdimsz" , 6)], name=name)
+
+ def ports(self):
+ return [self.applydim, self.offset, self.invxyz, self.permute,
+ self.zdimsz, self.ydimsz, self.xdimsz]