-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):
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
def xdimsz(self):
- return self.fsi['xdimsz'].asint(msb0=True)
+ return self.fsi['xdimsz'].asint(msb0=True)+1
@xdimsz.setter
def xdimsz(self, value):
- self.fsi['xdimsz'].eq(value)
+ self.fsi['xdimsz'].eq(value-1)
@property
def ydimsz(self):
- return self.fsi['ydimsz'].asint(msb0=True)
+ return self.fsi['ydimsz'].asint(msb0=True)+1
@ydimsz.setter
def ydimsz(self, value):
- self.fsi['ydimsz'].eq(value)
+ self.fsi['ydimsz'].eq(value-1)
@property
def zdimsz(self):
- return self.fsi['zdimsz'].asint(msb0=True)
+ return self.fsi['zdimsz'].asint(msb0=True)+1
@zdimsz.setter
def zdimsz(self, value):
- self.fsi['zdimsz'].eq(value)
+ self.fsi['zdimsz'].eq(value-1)
@property
def lims(self):
self.xdimsz = value[0]
self.ydimsz = value[1]
self.zdimsz = value[2]
-
+
+ @property
+ def invxyz(self):
+ inv = self.fsi['invxyz'].asint(msb0=True)
+ return [(inv & 0b1), (inv & 0b10) >> 1, (inv & 0b100) >> 2]
+
+ @invxyz.setter
+ def invxyz(self, value):
+ self.fsi['invxyz'].eq(value[0] | (value[1]<<1) | (value[2]<<2))
+
@property
def mode(self):
return self.fsi['mode'].asint(msb0=True)
def mode(self, value):
self.fsi['mode'].eq(value)
+ @property
+ def skip(self):
+ return self.fsi['skip'].asint(msb0=True)
+
+ @skip.setter
+ def skip(self, value):
+ self.fsi['skip'].eq(value)
+
@property
def offset(self):
return self.fsi['offset'].asint(msb0=True)
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__':
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
+