add (untested) TestRunner based on soc test_runner.py
[openpower-isa.git] / src / openpower / decoder / isa / svshape.py
index 8b13393588a93bda1837fbb5495e41f094b5604b..4d4cb1d23b99da11a1793a90183cd6266843f538 100644 (file)
@@ -1,9 +1,16 @@
-from openpower.decoder.isa.remapyield import iterate_indices
 from openpower.decoder.selectable_int import (FieldSelectableInt, SelectableInt,
                                         selectconcat)
-from openpower.sv.svp64 import SVP64REMAP
+from openpower.decoder.isa.remapyield import iterate_indices
+from openpower.decoder.isa.remap_fft_yield import iterate_butterfly_indices
+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):
@@ -12,19 +19,32 @@ class SVSHAPE(SelectableInt):
         offs = 0
         # set up sub-fields from Record layout
         self.fsi = {}
-        for field, width in SVP64REMAP.layout:
-            v = FieldSelectableInt(self, tuple(range(offs, offs+width)))
+        l = deepcopy(SVP64SHAPE.layout)
+        l.reverse()
+        for field, width in l:
+            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
@@ -95,8 +115,23 @@ 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 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_indices(deepcopy(self))
+        return iterate_fn(deepcopy(self))
 
 
 if __name__ == '__main__':
@@ -114,8 +149,83 @@ if __name__ == '__main__':
 
     VL = xdim * ydim * zdim
 
+    print ("Matrix Mode")
     for idx, new_idx in enumerate(SVSHAPE0.get_iterator()):
         if idx >= VL:
             break
         print ("%d->%d" % (idx, new_idx))
 
+    print ("")
+    print ("FFT Mode")
+
+    # set the dimension sizes here
+    xdim = 8
+    ydim = 0 # not needed
+    zdim = 0 # again, not needed
+
+    # set total. err don't know how to calculate how many there are...
+    # do it manually for now
+
+    VL = 0
+    size = 2
+    n = xdim
+    while size <= n:
+        halfsize = size // 2
+        tablestep = n // size
+        for i in range(0, n, size):
+            for j in range(i, i + halfsize):
+                VL += 1
+        size *= 2
+
+    # j schedule
+    SVSHAPE0 = SVSHAPE(0)
+    SVSHAPE0.lims = [xdim, ydim, zdim]
+    SVSHAPE0.order = [0,1,2]  # experiment with different permutations, here
+    SVSHAPE0.mode = 0b00
+    SVSHAPE0.offset = 0       # experiment with different offset, here
+    SVSHAPE0.invxyz = [0,0,0] # inversion if desired
+    # j+halfstep schedule
+    SVSHAPE1 = SVSHAPE(0)
+    SVSHAPE1.lims = [xdim, ydim, zdim]
+    SVSHAPE1.order = [0,1,2]  # experiment with different permutations, here
+    SVSHAPE1.mode = 0b01
+    SVSHAPE1.offset = 0       # experiment with different offset, here
+    SVSHAPE1.invxyz = [0,0,0] # inversion if desired
+    # k schedule
+    SVSHAPE2 = SVSHAPE(0)
+    SVSHAPE2.lims = [xdim, ydim, zdim]
+    SVSHAPE2.order = [0,1,2]  # experiment with different permutations, here
+    SVSHAPE2.mode = 0b10
+    SVSHAPE2.offset = 0       # experiment with different offset, here
+    SVSHAPE2.invxyz = [0,0,0] # inversion if desired
+
+    # enumerate over the iterator function, getting new indices
+    schedule = []
+    for idx, (jl, jh, k) in enumerate(zip(iterate_indices(SVSHAPE0),
+                                          iterate_indices(SVSHAPE1),
+                                          iterate_indices(SVSHAPE2))):
+        if idx >= VL:
+            break
+        schedule.append((jl, jh, k))
+
+    # ok now pretty-print the results, with some debug output
+    size = 2
+    idx = 0
+    while size <= n:
+        halfsize = size // 2
+        tablestep = n // size
+        print ("size %d halfsize %d tablestep %d" % \
+                (size, halfsize, tablestep))
+        for i in range(0, n, size):
+            prefix = "i %d\t" % i
+            k = 0
+            for j in range(i, i + halfsize):
+                jl, jh, ks = schedule[idx]
+                print ("  %-3d\t%s j=%-2d jh=%-2d k=%-2d -> "
+                        "j[jl=%-2d] j[jh=%-2d] exptable[k=%d]" % \
+                                (idx, prefix, j, j+halfsize, k,
+                                      jl, jh, ks))
+                k += tablestep
+                idx += 1
+        size *= 2
+