debug of SVP64 REMAP
[openpower-isa.git] / src / openpower / decoder / isa / svshape.py
1 from openpower.decoder.isa.remapyield import iterate_indices
2 from openpower.decoder.selectable_int import (FieldSelectableInt, SelectableInt,
3 selectconcat)
4 from openpower.sv.svp64 import SVP64REMAP
5 import os
6 from copy import deepcopy
7
8
9 class SVSHAPE(SelectableInt):
10 def __init__(self, value):
11 SelectableInt.__init__(self, value, 32)
12 offs = 0
13 # set up sub-fields from Record layout
14 self.fsi = {}
15 l = deepcopy(SVP64REMAP.layout)
16 l.reverse()
17 for field, width in l:
18 v = FieldSelectableInt(self, tuple(range(offs, offs+width)))
19 self.fsi[field] = v
20 offs += width
21
22 @property
23 def order(self):
24 permute = self.fsi['permute'].asint(msb0=True)
25 return SVP64REMAP.order(permute)
26
27 @order.setter
28 def order(self, value):
29 rorder = SVP64REMAP.rorder(value)
30 self.fsi['permute'].eq(rorder)
31
32 @property
33 def xdimsz(self):
34 return self.fsi['xdimsz'].asint(msb0=True)+1
35
36 @xdimsz.setter
37 def xdimsz(self, value):
38 self.fsi['xdimsz'].eq(value-1)
39
40 @property
41 def ydimsz(self):
42 return self.fsi['ydimsz'].asint(msb0=True)+1
43
44 @ydimsz.setter
45 def ydimsz(self, value):
46 self.fsi['ydimsz'].eq(value-1)
47
48 @property
49 def zdimsz(self):
50 return self.fsi['zdimsz'].asint(msb0=True)+1
51
52 @zdimsz.setter
53 def zdimsz(self, value):
54 self.fsi['zdimsz'].eq(value-1)
55
56 @property
57 def lims(self):
58 return [self.xdimsz, self.ydimsz, self.zdimsz]
59
60 @lims.setter
61 def lims(self, value):
62 self.xdimsz = value[0]
63 self.ydimsz = value[1]
64 self.zdimsz = value[2]
65
66 @property
67 def invxyz(self):
68 inv = self.fsi['invxyz'].asint(msb0=True)
69 return [(inv & 0b1), (inv & 0b10) >> 1, (inv & 0b100) >> 2]
70
71 @invxyz.setter
72 def invxyz(self, value):
73 self.fsi['invxyz'].eq(value[0] | (value[1]<<1) | (value[2]<<2))
74
75 @property
76 def mode(self):
77 return self.fsi['mode'].asint(msb0=True)
78
79 @mode.setter
80 def mode(self, value):
81 self.fsi['mode'].eq(value)
82
83 @property
84 def skip(self):
85 return self.fsi['skip'].asint(msb0=True)
86
87 @skip.setter
88 def skip(self, value):
89 self.fsi['skip'].eq(value)
90
91 @property
92 def offset(self):
93 return self.fsi['offset'].asint(msb0=True)
94
95 @offset.setter
96 def offset(self, value):
97 self.fsi['offset'].eq(value)
98
99 def get_iterator(self):
100 # create a **NEW** iterator each time this is called
101 return iterate_indices(deepcopy(self))
102
103
104 if __name__ == '__main__':
105 os.environ['SILENCELOG'] = "1"
106 xdim = 3
107 ydim = 2
108 zdim = 1
109 SVSHAPE0 = SVSHAPE(0)
110 SVSHAPE0.lims = [xdim, ydim, zdim]
111 SVSHAPE0.order = [1,0,2] # experiment with different permutations, here
112 SVSHAPE0.mode = 0b00
113 SVSHAPE0.skip = 0b00
114 SVSHAPE0.offset = 0 # experiment with different offset, here
115 SVSHAPE0.invxyz = [0,0,0] # inversion if desired
116
117 VL = xdim * ydim * zdim
118
119 for idx, new_idx in enumerate(SVSHAPE0.get_iterator()):
120 if idx >= VL:
121 break
122 print ("%d->%d" % (idx, new_idx))
123