return map(lambda string: (" " + string), strings)
-class CType:
- @classmethod
+class CTypeMeta(type):
@_abc.abstractmethod
- def c_decl(self, name):
+ def c_decl(cls):
pass
@_abc.abstractmethod
- def c_value(self, prefix="", suffix=""):
+ def c_var(cls, name):
pass
- @classmethod
+
+class CType(metaclass=CTypeMeta):
@_abc.abstractmethod
- def c_var(self, name):
+ def c_value(self, prefix="", suffix=""):
pass
-class EnumMeta(_enum.EnumMeta):
+class EnumMeta(_enum.EnumMeta, CTypeMeta):
def __call__(metacls, name, entries, tag=None, **kwargs):
if isinstance(entries, type) and issubclass(entries, _enum.Enum):
entries = dict(entries.__members__)
Mode = Constant("Mode", _SVP64MODE)
+class StructMeta(CTypeMeta):
+ def __new__(metacls, name, bases, attrs, tag=None):
+ if tag is None:
+ tag = f"svp64_{name.lower()}"
+
+ cls = super().__new__(metacls, name, bases, attrs)
+ cls.__tag = tag
+
+ return cls
+
+ @property
+ def c_tag(cls):
+ return cls.__tag
+
+ def c_decl(cls):
+ yield f"struct {cls.c_tag} {{"
+ for field in _dataclasses.fields(cls):
+ yield from indent(field.type.c_var(name=f"{field.name};"))
+ yield f"}};"
+
+ def c_var(cls, name):
+ yield f"struct {cls.c_tag} {name}"
+
+
+@_dataclasses.dataclass(eq=True, frozen=True)
+class Struct(CType, metaclass=StructMeta):
+ def c_value(self, prefix="", suffix=""):
+ yield f"{prefix}{{"
+ for field in _dataclasses.fields(self):
+ name = field.name
+ attr = getattr(self, name)
+ yield from indent(attr.c_value(prefix=f".{name} = ", suffix=","))
+ yield f"}}{suffix}"
+
+
+class IntegerMeta(CTypeMeta):
+ def __new__(metacls, name, bases, attrs, typedef=None):
+ cls = super().__new__(metacls, name, bases, attrs)
+ cls.__typedef = typedef
+
+ return cls
+
+ @property
+ def c_typedef(cls):
+ return cls.__typedef
+
+ def c_decl(cls):
+ yield "#include <stdint.h>"
+
+ def c_var(cls, name):
+ yield f"{cls.c_typedef} {name}"
+
+
+class Integer(CType, int, metaclass=IntegerMeta):
+ def c_value(self, prefix="", suffix=""):
+ yield f"{prefix}{self}{suffix}"
+
+
class Opcode(CType):
def __init__(self, value, mask, bits):
self.__value = value
@_dataclasses.dataclass(eq=True, frozen=True)
-class Record(CType):
+class Record(Struct):
in1: In1Sel
in2: In2Sel
in3: In3Sel
yield from indent([f"uint64_t : {bits_rsvd};"])
yield f"}};"
- def c_value(self, prefix="", suffix=""):
- yield f"{prefix}{{"
- for field in _dataclasses.fields(self):
- name = field.name
- attr = getattr(self, name)
- yield from indent(attr.c_value(prefix=f".{name} = ", suffix=","))
- yield f"}}{suffix}"
-
- @classmethod
- def c_var(cls, name):
- yield f"struct svp64_record {name}"
-
@_dataclasses.dataclass(eq=True, frozen=True)
-class Entry(CType):
+class Entry(Struct):
name: Name
record: Record
return self.name < other.name
- @classmethod
- def c_decl(cls):
- yield f"struct svp64_entry {{"
- for field in _dataclasses.fields(cls):
- yield from indent(field.type.c_var(name=f"{field.name};"))
- yield f"}};"
-
- def c_value(self, prefix="", suffix=""):
- yield f"{prefix}{{"
- for field in _dataclasses.fields(self):
- name = field.name
- attr = getattr(self, name)
- yield from indent(attr.c_value(prefix=f".{name} = ", suffix=","))
- yield f"}}{suffix}"
-
- @classmethod
- def c_var(cls, name):
- yield f"struct svp64_entry {name}"
-
class Codegen(_enum.Enum):
PPC_SVP64_H = _enum.auto()