2 from fnmatch
import fnmatchcase
5 from openpower
.consts
import FastRegsEnum
, StateRegsEnum
6 from openpower
.decoder
.power_enums
import SPRfull
as SPR
, spr_dict
7 from functools
import lru_cache
10 # note that we can get away with using SPRfull here because the values
11 # (numerical values) are what is used for lookup.
13 SPR
.LR
: FastRegsEnum
.LR
,
14 SPR
.CTR
: FastRegsEnum
.CTR
,
15 SPR
.SRR0
: FastRegsEnum
.SRR0
,
16 SPR
.SRR1
: FastRegsEnum
.SRR1
,
17 SPR
.HSRR0
: FastRegsEnum
.HSRR0
,
18 SPR
.HSRR1
: FastRegsEnum
.HSRR1
,
19 SPR
.SPRG0_priv
: FastRegsEnum
.SPRG0
,
20 SPR
.SPRG1_priv
: FastRegsEnum
.SPRG1
,
21 SPR
.SPRG2_priv
: FastRegsEnum
.SPRG2
,
22 SPR
.SPRG3
: FastRegsEnum
.SPRG3
,
23 SPR
.HSPRG0
: FastRegsEnum
.HSPRG0
,
24 SPR
.HSPRG1
: FastRegsEnum
.HSPRG1
,
25 SPR
.XER
: FastRegsEnum
.XER
,
26 SPR
.TAR
: FastRegsEnum
.TAR
,
27 SPR
.SVSRR0
: FastRegsEnum
.SVSRR0
,
30 spr_to_state
= {SPR
.DEC
: StateRegsEnum
.DEC
,
31 SPR
.TB
: StateRegsEnum
.TB
,
36 for (k
, v
) in spr_to_state
.items():
37 sprstr_to_state
[k
.name
] = v
41 def state_reg_to_spr(spr_num
):
42 return state_to_spr
[spr_num
].value
45 def spr_to_state_reg(spr_num
):
46 if not isinstance(spr_num
, str):
47 spr_num
= spr_dict
[spr_num
].SPR
48 return sprstr_to_state
.get(spr_num
, None)
53 for (k
, v
) in spr_to_fast
.items():
54 sprstr_to_fast
[k
.name
] = v
58 def fast_reg_to_spr(spr_num
):
59 return fast_to_spr
[spr_num
].value
62 def spr_to_fast_reg(spr_num
):
63 if not isinstance(spr_num
, str):
64 spr_num
= spr_dict
[spr_num
].SPR
65 return sprstr_to_fast
.get(spr_num
, None)
68 def slow_reg_to_spr(slow_reg
):
69 for i
, x
in enumerate(SPR
):
74 def spr_to_slow_reg(spr_num
):
75 for i
, x
in enumerate(SPR
):
76 if spr_num
== x
.value
:
80 # TODO: make this a util routine (somewhere)
81 def mask_extend(x
, nbits
, repeat
):
83 extended
= (1 << repeat
)-1
84 for i
in range(nbits
):
86 res |
= extended
<< (i
*repeat
)
90 # makes a logarithmically-skewed random number
91 def log_rand(n
, min_val
=1):
92 logrange
= random
.randint(1, n
)
93 return random
.randint(min_val
, (1 << logrange
)-1)
98 InstrInOuts
= "instr_in_outs"
99 SkipCase
= "skip_case"
102 @lru_cache(typed
=True)
103 def __parse_log_env_var(silencelog_raw
):
104 if silencelog_raw
is None:
105 return {k
: False for k
in LogKind
}
106 silencelog
= os
.environ
.decodevalue(silencelog_raw
)
107 silencelog
= silencelog
.lower().split(",")
108 for i
, v
in enumerate(silencelog
):
109 silencelog
[i
] = v
.strip()
110 retval
= {k
: True for k
in LogKind
}
111 if len(silencelog
) > 1 and silencelog
[-1] == "":
112 # allow trailing comma
114 if len(silencelog
) == 1:
115 if silencelog
[0] in ("0", "false"):
119 if silencelog
[0] in ("1", "true", ""):
123 if v
.startswith("!"):
128 if fnmatchcase(k
.value
, v
):
131 assert matches
, (f
"SILENCELOG: {v!r} did not match any known LogKind: "
132 f
"LogKinds: {' '.join(i.value for i in LogKind)}")
133 # for k, v in retval.items():
134 # print(repr(k), "silenced" if v else "active")
138 __ENCODED_SILENCELOG
= os
.environ
.encodekey("SILENCELOG")
141 def log(*args
, kind
=LogKind
.Default
, **kwargs
):
142 """verbose printing, can be disabled by setting env var "SILENCELOG".
144 # look up in os.environ._data since it is a dict and hence won't raise
145 # internal exceptions to avoid triggering breakpoints on raised exceptions.
146 env_var
= os
.environ
._data
.get(__ENCODED_SILENCELOG
, None)
147 silenced
= __parse_log_env_var(env_var
)
150 print(*args
, **kwargs
)