sv_binutils: introduce Integer class
[openpower-isa.git] / src / openpower / util.py
1 import os
2 import random
3 from openpower.consts import FastRegsEnum, StateRegsEnum
4 from openpower.decoder.power_enums import SPRfull as SPR, spr_dict
5
6
7 # note that we can get away with using SPRfull here because the values
8 # (numerical values) are what is used for lookup.
9 spr_to_fast = {
10 SPR.LR: FastRegsEnum.LR,
11 SPR.CTR: FastRegsEnum.CTR,
12 SPR.SRR0: FastRegsEnum.SRR0,
13 SPR.SRR1: FastRegsEnum.SRR1,
14 SPR.HSRR0: FastRegsEnum.HSRR0,
15 SPR.HSRR1: FastRegsEnum.HSRR1,
16 SPR.SPRG0_priv: FastRegsEnum.SPRG0,
17 SPR.SPRG1_priv: FastRegsEnum.SPRG1,
18 SPR.SPRG2_priv: FastRegsEnum.SPRG2,
19 SPR.SPRG3: FastRegsEnum.SPRG3,
20 SPR.HSPRG0: FastRegsEnum.HSPRG0,
21 SPR.HSPRG1: FastRegsEnum.HSPRG1,
22 SPR.XER: FastRegsEnum.XER,
23 SPR.TAR: FastRegsEnum.TAR,
24 SPR.SVSRR0: FastRegsEnum.SVSRR0,
25 }
26
27 spr_to_state = { SPR.DEC: StateRegsEnum.DEC,
28 SPR.TB: StateRegsEnum.TB,
29 }
30
31 sprstr_to_state = {}
32 state_to_spr = {}
33 for (k, v) in spr_to_state.items():
34 sprstr_to_state[k.name] = v
35 state_to_spr[v] = k
36
37 def state_reg_to_spr(spr_num):
38 return state_to_spr[spr_num].value
39
40
41 def spr_to_state_reg(spr_num):
42 if not isinstance(spr_num, str):
43 spr_num = spr_dict[spr_num].SPR
44 return sprstr_to_state.get(spr_num, None)
45
46
47 sprstr_to_fast = {}
48 fast_to_spr = {}
49 for (k, v) in spr_to_fast.items():
50 sprstr_to_fast[k.name] = v
51 fast_to_spr[v] = k
52
53 def fast_reg_to_spr(spr_num):
54 return fast_to_spr[spr_num].value
55
56
57 def spr_to_fast_reg(spr_num):
58 if not isinstance(spr_num, str):
59 spr_num = spr_dict[spr_num].SPR
60 return sprstr_to_fast.get(spr_num, None)
61
62
63 def slow_reg_to_spr(slow_reg):
64 for i, x in enumerate(SPR):
65 if slow_reg == i:
66 return x.value
67
68
69 def spr_to_slow_reg(spr_num):
70 for i, x in enumerate(SPR):
71 if spr_num == x.value:
72 return i
73
74
75 # TODO: make this a util routine (somewhere)
76 def mask_extend(x, nbits, repeat):
77 res = 0
78 extended = (1<<repeat)-1
79 for i in range(nbits):
80 if x & (1<<i):
81 res |= extended << (i*repeat)
82 return res
83
84
85 # makes a logarithmically-skewed random number
86 def log_rand(n, min_val=1):
87 logrange = random.randint(1, n)
88 return random.randint(min_val, (1 << logrange)-1)
89
90
91 def log(*args, **kwargs):
92 """verbose printing, disabled if an ENV VAR "SILENCELOG" exists.
93 """
94 if 'SILENCELOG' in os.environ:
95 return
96 print(*args, **kwargs)
97