add grevlut.py demo code
[libreriscv.git] / openpower / sv / grevlut.py
1 def lut2(imm, a, b):
2 idx = b << 1 | a
3 return (imm>>idx) & 1
4
5 def dorow(imm8, step_i, chunk_size):
6 step_o = 0
7 for j in range(64):
8 if (j&chunk_size) == 0:
9 imm = (imm8 & 0b1111)
10 else:
11 imm = (imm8>>4)
12 a = (step_i>>j)&1
13 b = (step_i>>(j ^ chunk_size))&1
14 res = lut2(imm, a, b)
15 #print(j, bin(imm), a, b, res)
16 step_o |= (res<<j)
17 #print (" ", chunk_size, bin(step_o))
18 return step_o
19
20 def grevlut64(RA, RB, imm, iv):
21 x = RA
22 if (iv): x = ~x;
23 shamt = RB & 63;
24 #print (bin(shamt), bin(63))
25 for i in range(6):
26 step = 1<<i
27 if (shamt & step):
28 x = dorow(imm, x, step)
29 return x & ((1<<64)-1)
30
31
32 if __name__ == '__main__':
33 # answer: 8888888...
34 RA = 0x5555555555555555
35 RB = 0b0010
36 imm = 0b11000110
37 x = grevlut64(RA, RB, imm, 1)
38 print ("grevlut", hex(RA), bin(RB), bin(imm), hex(x), "\n", bin(x))
39
40 # answer: 80808080...
41 RB = 0b00110
42 imm = 0b11000110
43 x = grevlut64(RA, RB, imm, 1)
44 print ("grevlut", hex(RA), bin(RB), bin(imm), hex(x), "\n", bin(x))
45
46 # answer: 80008000...
47 RB = 0b01110
48 imm = 0b11000110
49 x = grevlut64(RA, RB, imm, 1)
50 print ("grevlut", hex(RA), bin(RB), bin(imm), hex(x), "\n", bin(x))
51 print()
52
53 # answer: 01010101...
54 RB = 0b00110
55 imm = 0b01101100
56 x = grevlut64(RA, RB, imm, 0)
57 print ("grevlut", hex(RA), bin(RB), bin(imm), hex(x), "\n", bin(x))
58
59 # answer: 00010001...
60 RB = 0b01110
61 imm = 0b01101100
62 x = grevlut64(RA, RB, imm, 0)
63 print ("grevlut", hex(RA), bin(RB), bin(imm), hex(x), "\n", bin(x))
64 print()
65
66 for RB in range(64):
67 RA = 0x5555555555555555
68 imm = 0b11000110
69 x = grevlut64(RA, RB, imm, 1)
70 print ("grevlut", hex(RA), bin(RB), bin(imm), hex(x), "\n", bin(x))
71 # answer: 8888888...