3 from openpower
.consts
import FastRegsEnum
, StateRegsEnum
4 from openpower
.decoder
.power_enums
import SPRfull
as SPR
, spr_dict
7 # note that we can get away with using SPRfull here because the values
8 # (numerical values) are what is used for lookup.
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
,
27 spr_to_state
= { SPR
.DEC
: StateRegsEnum
.DEC
,
28 SPR
.TB
: StateRegsEnum
.TB
,
33 for (k
, v
) in spr_to_state
.items():
34 sprstr_to_state
[k
.name
] = v
37 def state_reg_to_spr(spr_num
):
38 return state_to_spr
[spr_num
].value
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)
49 for (k
, v
) in spr_to_fast
.items():
50 sprstr_to_fast
[k
.name
] = v
53 def fast_reg_to_spr(spr_num
):
54 return fast_to_spr
[spr_num
].value
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)
63 def slow_reg_to_spr(slow_reg
):
64 for i
, x
in enumerate(SPR
):
69 def spr_to_slow_reg(spr_num
):
70 for i
, x
in enumerate(SPR
):
71 if spr_num
== x
.value
:
75 # TODO: make this a util routine (somewhere)
76 def mask_extend(x
, nbits
, repeat
):
78 extended
= (1<<repeat
)-1
79 for i
in range(nbits
):
81 res |
= extended
<< (i
*repeat
)
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)
91 def log(*args
, **kwargs
):
92 """verbose printing, disabled if an ENV VAR "SILENCELOG" exists.
94 if 'SILENCELOG' in os
.environ
:
96 print(*args
, **kwargs
)