1 from openpower
.decoder
.isa
.remapyield
import iterate_indices
2 from openpower
.decoder
.selectable_int
import (FieldSelectableInt
, SelectableInt
,
4 from openpower
.sv
.svp64
import SVP64REMAP
6 from copy
import deepcopy
9 class SVSHAPE(SelectableInt
):
10 def __init__(self
, value
):
11 SelectableInt
.__init
__(self
, value
, 32)
13 # set up sub-fields from Record layout
15 l
= deepcopy(SVP64REMAP
.layout
)
17 for field
, width
in l
:
18 v
= FieldSelectableInt(self
, tuple(range(offs
, offs
+width
)))
24 permute
= self
.fsi
['permute'].asint(msb0
=True)
25 return SVP64REMAP
.order(permute
)
28 def order(self
, value
):
29 rorder
= SVP64REMAP
.rorder(value
)
30 self
.fsi
['permute'].eq(rorder
)
34 return self
.fsi
['xdimsz'].asint(msb0
=True)+1
37 def xdimsz(self
, value
):
38 self
.fsi
['xdimsz'].eq(value
-1)
42 return self
.fsi
['ydimsz'].asint(msb0
=True)+1
45 def ydimsz(self
, value
):
46 self
.fsi
['ydimsz'].eq(value
-1)
50 return self
.fsi
['zdimsz'].asint(msb0
=True)+1
53 def zdimsz(self
, value
):
54 self
.fsi
['zdimsz'].eq(value
-1)
58 return [self
.xdimsz
, self
.ydimsz
, self
.zdimsz
]
61 def lims(self
, value
):
62 self
.xdimsz
= value
[0]
63 self
.ydimsz
= value
[1]
64 self
.zdimsz
= value
[2]
68 inv
= self
.fsi
['invxyz'].asint(msb0
=True)
69 return [(inv
& 0b1), (inv
& 0b10) >> 1, (inv
& 0b100) >> 2]
72 def invxyz(self
, value
):
73 self
.fsi
['invxyz'].eq(value
[0] |
(value
[1]<<1) |
(value
[2]<<2))
77 return self
.fsi
['mode'].asint(msb0
=True)
80 def mode(self
, value
):
81 self
.fsi
['mode'].eq(value
)
85 return self
.fsi
['skip'].asint(msb0
=True)
88 def skip(self
, value
):
89 self
.fsi
['skip'].eq(value
)
93 return self
.fsi
['offset'].asint(msb0
=True)
96 def offset(self
, value
):
97 self
.fsi
['offset'].eq(value
)
99 def get_iterator(self
):
100 # create a **NEW** iterator each time this is called
101 return iterate_indices(deepcopy(self
))
104 if __name__
== '__main__':
105 os
.environ
['SILENCELOG'] = "1"
109 SVSHAPE0
= SVSHAPE(0)
110 SVSHAPE0
.lims
= [xdim
, ydim
, zdim
]
111 SVSHAPE0
.order
= [1,0,2] # experiment with different permutations, here
114 SVSHAPE0
.offset
= 0 # experiment with different offset, here
115 SVSHAPE0
.invxyz
= [0,0,0] # inversion if desired
117 VL
= xdim
* ydim
* zdim
119 for idx
, new_idx
in enumerate(SVSHAPE0
.get_iterator()):
122 print ("%d->%d" % (idx
, new_idx
))