From: Dmitry Selyutin Date: Sat, 10 Jun 2023 20:08:15 +0000 (+0300) Subject: insndb/core: switch Fields to Dict class X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=708cf4085609d127161c62f4102e70525ecaff83;p=openpower-isa.git insndb/core: switch Fields to Dict class --- diff --git a/src/openpower/insndb/core.py b/src/openpower/insndb/core.py index b9f681b6..3c0e68bf 100644 --- a/src/openpower/insndb/core.py +++ b/src/openpower/insndb/core.py @@ -781,7 +781,7 @@ class Fields(Dict, datatype=type("Bits", (Tuple,), {}, datatype=int)): yield from self.__mapping.items() -class Operands: +class Operands(Dict, datatype=object): __GPR_PAIRS = ( _Reg.RTp, _Reg.RSp, @@ -839,10 +839,10 @@ class Operands: if "=" in operand: (name, value) = operand.split("=") - mapping[name] = (StaticOperand, { - "name": name, - "value": int(value), - }) + mapping[name] = (StaticOperand, ( + ("name", name), + ("value", int(value)), + )) else: name = operand if name.endswith(")"): @@ -876,48 +876,37 @@ class Operands: cls = CR5Operand if imm_name is not None: - mapping[imm_name] = (imm_cls, {"name": imm_name}) - mapping[name] = (cls, {"name": name}) - - static = [] - dynamic = [] - for (name, (cls, kwargs)) in mapping.items(): - kwargs = dict(kwargs) - kwargs["name"] = name - if issubclass(cls, StaticOperand): - static.append((cls, kwargs)) - elif issubclass(cls, DynamicOperand): - dynamic.append((cls, kwargs)) - else: - raise ValueError(name) + mapping[imm_name] = (imm_cls, (("name", imm_name),)) + mapping[name] = (cls, (("name", name),)) - self.__mapping = mapping - self.__static = tuple(static) - self.__dynamic = tuple(dynamic) + return super().__init__(mapping) - return super().__init__() + @walkmethod + def walk(clsself, match=None): + for (key, (cls, pairs)) in clsself.items(): + yield ("/".join((key, "class")), cls.__name__) + for (subkey, value) in pairs: + if subkey == "name": + continue + path = "/".join((key, subkey)) + yield (path, value) def __iter__(self): - for (_, items) in self.__mapping.items(): + for (key, items) in self.items(): (cls, kwargs) = items - yield (cls, kwargs) - - def __repr__(self): - return self.__mapping.__repr__() - - def __contains__(self, key): - return self.__mapping.__contains__(key) + yield (cls, dict(kwargs)) - def __getitem__(self, key): - return self.__mapping.__getitem__(key) + @staticmethod + def filter(cls): + return lambda pair: isinstance(pair[0], cls) - @property + @cached_property def static(self): - return self.__static + return filter(self.__class__.filter(StaticOperand), self) @property def dynamic(self): - return self.__dynamic + return filter(self.__class__.filter(DynamicOperand), self) class Arguments(tuple):