use the CSV "CR out" column to compute which mode to use for Rc=1
[openpower-isa.git] / src / openpower / util.py
index 059dc253a8ee4691f4b712c47d45b88cc9b8b91b..c5a5ee14e937ddede8d8bc37f9ddeafbf55916a4 100644 (file)
@@ -4,31 +4,32 @@ import os
 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 = {}
@@ -36,6 +37,7 @@ for (k, v) in spr_to_state.items():
     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
 
@@ -52,6 +54,7 @@ for (k, v) in spr_to_fast.items():
     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
 
@@ -77,9 +80,9 @@ def spr_to_slow_reg(spr_num):
 # 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
 
@@ -96,10 +99,11 @@ class LogKind(Enum):
     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()
@@ -126,19 +130,21 @@ def parse_log_env_vars():
                 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)