make only one PowerDecoder2, share it with
[openpower-isa.git] / src / openpower / util.py
1 import os
2 import random
3 from openpower.consts import FastRegsEnum
4 from openpower.decoder.power_enums import SPRfull as SPR, spr_dict
5
6 # note that we can get away with using SPRfull here because the values
7 # (numerical values) are what is used for lookup.
8 spr_to_fast = { SPR.CTR: FastRegsEnum.CTR,
9 SPR.LR: FastRegsEnum.LR,
10 SPR.TAR: FastRegsEnum.TAR,
11 SPR.SRR0: FastRegsEnum.SRR0,
12 SPR.SRR1: FastRegsEnum.SRR1,
13 SPR.XER: FastRegsEnum.XER,
14 SPR.DEC: FastRegsEnum.DEC,
15 SPR.TB: FastRegsEnum.TB,
16 SPR.SVSRR0: FastRegsEnum.SVSRR0,
17 }
18
19 sprstr_to_fast = {}
20 fast_to_spr = {}
21 for (k, v) in spr_to_fast.items():
22 sprstr_to_fast[k.name] = v
23 fast_to_spr[v] = k
24
25 def fast_reg_to_spr(spr_num):
26 return fast_to_spr[spr_num].value
27
28
29 def spr_to_fast_reg(spr_num):
30 if not isinstance(spr_num, str):
31 spr_num = spr_dict[spr_num].SPR
32 return sprstr_to_fast.get(spr_num, None)
33
34
35 def slow_reg_to_spr(slow_reg):
36 for i, x in enumerate(SPR):
37 if slow_reg == i:
38 return x.value
39
40
41 def spr_to_slow_reg(spr_num):
42 for i, x in enumerate(SPR):
43 if spr_num == x.value:
44 return i
45
46
47 # TODO: make this a util routine (somewhere)
48 def mask_extend(x, nbits, repeat):
49 res = 0
50 extended = (1<<repeat)-1
51 for i in range(nbits):
52 if x & (1<<i):
53 res |= extended << (i*repeat)
54 return res
55
56
57 # makes a logarithmically-skewed random number
58 def log_rand(n, min_val=1):
59 logrange = random.randint(1, n)
60 return random.randint(min_val, (1 << logrange)-1)
61
62
63 def log(*args, **kwargs):
64 """verbose printing, disabled if an ENV VAR "SILENCELOG" exists.
65 """
66 if 'SILENCELOG' in os.environ:
67 return
68 print(*args, **kwargs)
69