add (untested) TestRunner based on soc test_runner.py
[openpower-isa.git] / src / openpower / decoder / isa / svshape.py
index 03dbbb0b1513e86ffca786434c2a584d32387688..4d4cb1d23b99da11a1793a90183cd6266843f538 100644 (file)
@@ -2,9 +2,15 @@ from openpower.decoder.selectable_int import (FieldSelectableInt, SelectableInt,
                                         selectconcat)
 from openpower.decoder.isa.remapyield import iterate_indices
 from openpower.decoder.isa.remap_fft_yield import iterate_butterfly_indices
-from openpower.sv.svp64 import SVP64REMAP
+from openpower.decoder.isa.remap_dct_yield import (
+                                iterate_dct_inner_butterfly_indices,
+                                iterate_dct_inner_costable_indices,
+                                iterate_dct_outer_butterfly_indices,
+                                iterate_dct_inner_halfswap_loadstore)
+from openpower.sv.svp64 import SVP64SHAPE
 import os
 from copy import deepcopy
+from openpower.util import log
 
 
 class SVSHAPE(SelectableInt):
@@ -13,21 +19,32 @@ class SVSHAPE(SelectableInt):
         offs = 0
         # set up sub-fields from Record layout
         self.fsi = {}
-        l = deepcopy(SVP64REMAP.layout)
+        l = deepcopy(SVP64SHAPE.layout)
         l.reverse()
         for field, width in l:
-            v = FieldSelectableInt(self, tuple(range(offs, offs+width)))
+            end =  offs+width
+            fs = tuple(range(offs, end))
+            v = FieldSelectableInt(self, fs)
             self.fsi[field] = v
-            offs += width
+            log("SVSHAPE setup field", field, offs, end)
+            offs = end
+
+    @property
+    def submode2(self):
+        return self.fsi['permute'].asint(msb0=True)
+
+    @submode2.setter
+    def submode2(self, value):
+        self.fsi['permute'].eq(value)
 
     @property
     def order(self):
         permute = self.fsi['permute'].asint(msb0=True)
-        return SVP64REMAP.order(permute)
+        return SVP64SHAPE.order(permute)
 
     @order.setter
     def order(self, value):
-        rorder = SVP64REMAP.rorder(value)
+        rorder = SVP64SHAPE.rorder(value)
         self.fsi['permute'].eq(rorder)
 
     @property
@@ -98,10 +115,21 @@ class SVSHAPE(SelectableInt):
         self.fsi['offset'].eq(value)
 
     def get_iterator(self):
+        log ("SVSHAPE get_iterator", self.mode, self.ydimsz)
         if self.mode == 0b00:
             iterate_fn = iterate_indices
-        elif self.mode == 0b01:
-            iterate_fn = iterate_butterfly_indices
+        elif self.mode in [0b01, 0b11]:
+            # further sub-selection
+            if self.ydimsz == 1:
+                iterate_fn = iterate_butterfly_indices
+            elif self.ydimsz in [2, 4]:
+                iterate_fn = iterate_dct_inner_butterfly_indices
+            elif self.ydimsz == 3:
+                iterate_fn = iterate_dct_outer_butterfly_indices
+            elif self.ydimsz in [5, 13]:
+                iterate_fn = iterate_dct_inner_costable_indices
+            elif self.ydimsz in [6, 14, 15]:
+                iterate_fn = iterate_dct_inner_halfswap_loadstore
         # create a **NEW** iterator each time this is called
         return iterate_fn(deepcopy(self))