import random
from openpower.consts import FastRegsEnum, StateRegsEnum
from openpower.decoder.power_enums import SPRfull as SPR, spr_dict
+from functools import lru_cache
# note that we can get away with using SPRfull here because the values
# (numerical values) are what is used for lookup.
spr_to_fast = {
- SPR.LR: FastRegsEnum.LR,
- SPR.CTR: FastRegsEnum.CTR,
- SPR.SRR0: FastRegsEnum.SRR0,
- SPR.SRR1: FastRegsEnum.SRR1,
- SPR.HSRR0: FastRegsEnum.HSRR0,
- SPR.HSRR1: FastRegsEnum.HSRR1,
- SPR.SPRG0_priv: FastRegsEnum.SPRG0,
- SPR.SPRG1_priv: FastRegsEnum.SPRG1,
- SPR.SPRG2_priv: FastRegsEnum.SPRG2,
- SPR.SPRG3: FastRegsEnum.SPRG3,
- SPR.HSPRG0: FastRegsEnum.HSPRG0,
- SPR.HSPRG1: FastRegsEnum.HSPRG1,
- SPR.XER: FastRegsEnum.XER,
- SPR.TAR: FastRegsEnum.TAR,
- SPR.SVSRR0: FastRegsEnum.SVSRR0,
- }
-
-spr_to_state = { SPR.DEC: StateRegsEnum.DEC,
- SPR.TB: StateRegsEnum.TB,
- }
+ SPR.LR: FastRegsEnum.LR,
+ SPR.CTR: FastRegsEnum.CTR,
+ SPR.SRR0: FastRegsEnum.SRR0,
+ SPR.SRR1: FastRegsEnum.SRR1,
+ SPR.HSRR0: FastRegsEnum.HSRR0,
+ SPR.HSRR1: FastRegsEnum.HSRR1,
+ SPR.SPRG0_priv: FastRegsEnum.SPRG0,
+ SPR.SPRG1_priv: FastRegsEnum.SPRG1,
+ SPR.SPRG2_priv: FastRegsEnum.SPRG2,
+ SPR.SPRG3: FastRegsEnum.SPRG3,
+ SPR.HSPRG0: FastRegsEnum.HSPRG0,
+ SPR.HSPRG1: FastRegsEnum.HSPRG1,
+ SPR.XER: FastRegsEnum.XER,
+ SPR.TAR: FastRegsEnum.TAR,
+ SPR.SVSRR0: FastRegsEnum.SVSRR0,
+}
+
+spr_to_state = {SPR.DEC: StateRegsEnum.DEC,
+ SPR.TB: StateRegsEnum.TB,
+ }
sprstr_to_state = {}
state_to_spr = {}
sprstr_to_state[k.name] = v
state_to_spr[v] = k
+
def state_reg_to_spr(spr_num):
return state_to_spr[spr_num].value
sprstr_to_fast[k.name] = v
fast_to_spr[v] = k
+
def fast_reg_to_spr(spr_num):
return fast_to_spr[spr_num].value
# TODO: make this a util routine (somewhere)
def mask_extend(x, nbits, repeat):
res = 0
- extended = (1<<repeat)-1
+ extended = (1 << repeat)-1
for i in range(nbits):
- if x & (1<<i):
+ if x & (1 << i):
res |= extended << (i*repeat)
return res
SkipCase = "skip_case"
-def parse_log_env_vars():
- silencelog = os.environ.get("SILENCELOG", None)
- if silencelog is None:
+@lru_cache(typed=True)
+def __parse_log_env_var(silencelog_raw):
+ if silencelog_raw is None:
return {k: False for k in LogKind}
+ silencelog = os.environ.decodevalue(silencelog_raw)
silencelog = silencelog.lower().split(",")
for i, v in enumerate(silencelog):
silencelog[i] = v.strip()
retval[k] = silenced
assert matches, (f"SILENCELOG: {v!r} did not match any known LogKind: "
f"LogKinds: {' '.join(i.value for i in LogKind)}")
- for k, v in retval.items():
- print(repr(k), "silenced" if v else "active")
+ # for k, v in retval.items():
+ # print(repr(k), "silenced" if v else "active")
return retval
-LOG_KINDS_SILENCED = parse_log_env_vars()
+__ENCODED_SILENCELOG = os.environ.encodekey("SILENCELOG")
def log(*args, kind=LogKind.Default, **kwargs):
"""verbose printing, can be disabled by setting env var "SILENCELOG".
"""
- # look up in a dict rather than os.environ so we don't
- # trigger breakpoints on raising exceptions.
- if LOG_KINDS_SILENCED[kind]:
+ # look up in os.environ._data since it is a dict and hence won't raise
+ # internal exceptions to avoid triggering breakpoints on raised exceptions.
+ env_var = os.environ._data.get(__ENCODED_SILENCELOG, None)
+ silenced = __parse_log_env_var(env_var)
+ if silenced[kind]:
return
print(*args, **kwargs)