power_enums: introduce base enum class
authorDmitry Selyutin <ghostmansd@gmail.com>
Tue, 2 Aug 2022 11:06:39 +0000 (14:06 +0300)
committerDmitry Selyutin <ghostmansd@gmail.com>
Sun, 14 Aug 2022 19:07:43 +0000 (22:07 +0300)
src/openpower/decoder/power_enums.py

index d5ffffab88179f805ef65015216fe6f799a00773..f006b962c5c0a0e8675d7ca1776de0385d13025e 100644 (file)
@@ -14,7 +14,10 @@ regfile size in HDL.  this is SPRreduced and the supported list is in
 get_spr_enum
 """
 
-from enum import Enum, unique
+from enum import (
+    Enum as _Enum,
+    unique,
+)
 import csv
 import os
 from os.path import dirname, join
@@ -63,6 +66,26 @@ def get_signal_name(name):
         name = "is_" + name
     return name.lower().replace(' ', '_')
 
+
+class Enum(_Enum):
+    @classmethod
+    def _missing_(cls, value):
+        if isinstance(value, str):
+            try:
+                if value == "":
+                    value = 0
+                else:
+                    value = int(value, 0)
+            except ValueError:
+                pass
+        keys = {item.name:item for item in cls}
+        values = {item.value:item for item in cls}
+        item = keys.get(value, values.get(value))
+        if item is None:
+            raise ValueError(value)
+        return item
+
+
 # this corresponds to which Function Unit (pipeline-with-Reservation-Stations)
 # is to process and guard the operation.  they are roughly divided by having
 # the same register input/output signature (X-Form, etc.)