insn/core: introduce visitable extra
authorDmitry Selyutin <ghostmansd@gmail.com>
Sun, 4 Jun 2023 10:27:31 +0000 (13:27 +0300)
committerDmitry Selyutin <ghostmansd@gmail.com>
Sun, 4 Jun 2023 10:27:31 +0000 (13:27 +0300)
src/openpower/insndb/core.py

index 13f3a62f10f504daef4070cfe876f668e859db5b..859852b9b47fba4bca2a92ece1ecf5d166ca2f01 100644 (file)
@@ -9,6 +9,7 @@ import operator as _operator
 import pathlib as _pathlib
 import re as _re
 import types as _types
+import typing as _typing
 
 try:
     from functools import cached_property
@@ -64,6 +65,10 @@ class Visitor:
     def record(self, record):
         yield record
 
+    @_contextlib.contextmanager
+    def extra(self, extra):
+        yield extra
+
 
 @_functools.total_ordering
 class Style(_enum.Enum):
@@ -818,6 +823,23 @@ class MarkdownRecord:
     operands: Operands
 
 
+@_dataclasses.dataclass(eq=True, frozen=True)
+class VisitableExtra:
+    name: str
+    sel: _typing.Union[
+        _In1Sel, _In2Sel, _In3Sel, _CRInSel, _CRIn2Sel,
+        _OutSel, _CROutSel,
+    ]
+    reg: _Reg
+    seltype: _SelType
+    idx: _SVExtra
+
+    def visit(self, visitor):
+        with visitor.extra(extra=self) as extra:
+            pass
+
+
+
 @_functools.total_ordering
 @_dataclasses.dataclass(eq=True, frozen=True)
 class Record:
@@ -830,11 +852,16 @@ class Record:
 
     def visit(self, visitor):
         with visitor.record(record=self) as record:
-            pass
+            for (name, fields) in record.extras.items():
+                extra = VisitableExtra(name=name, **fields)
+                extra.visit(visitor=visitor)
 
     @property
     def extras(self):
-        return self.svp64.extras
+        if self.svp64 is not None:
+            return self.svp64.extras
+        else:
+            return _types.MappingProxyType({})
 
     @property
     def pcode(self):