1 from openpower
.decoder
.selectable_int
import (FieldSelectableInt
, SelectableInt
,
3 from openpower
.decoder
.isa
.remapyield
import iterate_indices
4 from openpower
.decoder
.isa
.remap_fft_yield
import iterate_butterfly_indices
5 from openpower
.decoder
.isa
.remap_dct_yield
import (
6 iterate_dct_inner_butterfly_indices
,
7 iterate_dct_inner_costable_indices
,
8 iterate_dct_outer_butterfly_indices
,
9 iterate_dct_inner_halfswap_loadstore
)
10 from openpower
.sv
.svp64
import SVP64SHAPE
12 from copy
import deepcopy
13 from openpower
.util
import log
16 class SVSHAPE(SelectableInt
):
17 def __init__(self
, value
):
18 SelectableInt
.__init
__(self
, value
, 32)
20 # set up sub-fields from Record layout
22 l
= deepcopy(SVP64SHAPE
.layout
)
24 for field
, width
in l
:
26 fs
= tuple(range(offs
, end
))
27 v
= FieldSelectableInt(self
, fs
)
29 log("SVSHAPE setup field", field
, offs
, end
)
34 return self
.fsi
['permute'].asint(msb0
=True)
37 def submode2(self
, value
):
38 self
.fsi
['permute'].eq(value
)
42 permute
= self
.fsi
['permute'].asint(msb0
=True)
43 return SVP64SHAPE
.order(permute
)
46 def order(self
, value
):
47 rorder
= SVP64SHAPE
.rorder(value
)
48 self
.fsi
['permute'].eq(rorder
)
52 return self
.fsi
['xdimsz'].asint(msb0
=True)+1
55 def xdimsz(self
, value
):
56 self
.fsi
['xdimsz'].eq(value
-1)
60 return self
.fsi
['ydimsz'].asint(msb0
=True)+1
63 def ydimsz(self
, value
):
64 self
.fsi
['ydimsz'].eq(value
-1)
68 return self
.fsi
['zdimsz'].asint(msb0
=True)+1
71 def zdimsz(self
, value
):
72 self
.fsi
['zdimsz'].eq(value
-1)
76 return [self
.xdimsz
, self
.ydimsz
, self
.zdimsz
]
79 def lims(self
, value
):
80 self
.xdimsz
= value
[0]
81 self
.ydimsz
= value
[1]
82 self
.zdimsz
= value
[2]
86 inv
= self
.fsi
['invxyz'].asint(msb0
=True)
87 return [(inv
& 0b1), (inv
& 0b10) >> 1, (inv
& 0b100) >> 2]
90 def invxyz(self
, value
):
91 self
.fsi
['invxyz'].eq(value
[0] |
(value
[1]<<1) |
(value
[2]<<2))
95 return self
.fsi
['mode'].asint(msb0
=True)
98 def mode(self
, value
):
99 self
.fsi
['mode'].eq(value
)
103 return self
.fsi
['skip'].asint(msb0
=True)
106 def skip(self
, value
):
107 self
.fsi
['skip'].eq(value
)
111 return self
.fsi
['offset'].asint(msb0
=True)
114 def offset(self
, value
):
115 self
.fsi
['offset'].eq(value
)
117 def get_iterator(self
):
118 log ("SVSHAPE get_iterator", self
.mode
, self
.ydimsz
)
119 if self
.mode
== 0b00:
120 iterate_fn
= iterate_indices
121 elif self
.mode
== 0b01:
122 # further sub-selection
124 iterate_fn
= iterate_butterfly_indices
125 elif self
.ydimsz
in [2, 4]:
126 iterate_fn
= iterate_dct_inner_butterfly_indices
127 elif self
.ydimsz
== 3:
128 iterate_fn
= iterate_dct_outer_butterfly_indices
129 elif self
.ydimsz
== 5:
130 iterate_fn
= iterate_dct_inner_costable_indices
131 elif self
.ydimsz
== 6:
132 iterate_fn
= iterate_dct_inner_halfswap_loadstore
133 # create a **NEW** iterator each time this is called
134 return iterate_fn(deepcopy(self
))
137 if __name__
== '__main__':
138 os
.environ
['SILENCELOG'] = "1"
142 SVSHAPE0
= SVSHAPE(0)
143 SVSHAPE0
.lims
= [xdim
, ydim
, zdim
]
144 SVSHAPE0
.order
= [1,0,2] # experiment with different permutations, here
147 SVSHAPE0
.offset
= 0 # experiment with different offset, here
148 SVSHAPE0
.invxyz
= [0,0,0] # inversion if desired
150 VL
= xdim
* ydim
* zdim
152 print ("Matrix Mode")
153 for idx
, new_idx
in enumerate(SVSHAPE0
.get_iterator()):
156 print ("%d->%d" % (idx
, new_idx
))
161 # set the dimension sizes here
163 ydim
= 0 # not needed
164 zdim
= 0 # again, not needed
166 # set total. err don't know how to calculate how many there are...
167 # do it manually for now
174 tablestep
= n
// size
175 for i
in range(0, n
, size
):
176 for j
in range(i
, i
+ halfsize
):
181 SVSHAPE0
= SVSHAPE(0)
182 SVSHAPE0
.lims
= [xdim
, ydim
, zdim
]
183 SVSHAPE0
.order
= [0,1,2] # experiment with different permutations, here
185 SVSHAPE0
.offset
= 0 # experiment with different offset, here
186 SVSHAPE0
.invxyz
= [0,0,0] # inversion if desired
187 # j+halfstep schedule
188 SVSHAPE1
= SVSHAPE(0)
189 SVSHAPE1
.lims
= [xdim
, ydim
, zdim
]
190 SVSHAPE1
.order
= [0,1,2] # experiment with different permutations, here
192 SVSHAPE1
.offset
= 0 # experiment with different offset, here
193 SVSHAPE1
.invxyz
= [0,0,0] # inversion if desired
195 SVSHAPE2
= SVSHAPE(0)
196 SVSHAPE2
.lims
= [xdim
, ydim
, zdim
]
197 SVSHAPE2
.order
= [0,1,2] # experiment with different permutations, here
199 SVSHAPE2
.offset
= 0 # experiment with different offset, here
200 SVSHAPE2
.invxyz
= [0,0,0] # inversion if desired
202 # enumerate over the iterator function, getting new indices
204 for idx
, (jl
, jh
, k
) in enumerate(zip(iterate_indices(SVSHAPE0
),
205 iterate_indices(SVSHAPE1
),
206 iterate_indices(SVSHAPE2
))):
209 schedule
.append((jl
, jh
, k
))
211 # ok now pretty-print the results, with some debug output
216 tablestep
= n
// size
217 print ("size %d halfsize %d tablestep %d" % \
218 (size
, halfsize
, tablestep
))
219 for i
in range(0, n
, size
):
220 prefix
= "i %d\t" % i
222 for j
in range(i
, i
+ halfsize
):
223 jl
, jh
, ks
= schedule
[idx
]
224 print (" %-3d\t%s j=%-2d jh=%-2d k=%-2d -> "
225 "j[jl=%-2d] j[jh=%-2d] exptable[k=%d]" % \
226 (idx
, prefix
, j
, j
+halfsize
, k
,