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