sv_binutils: add missing include directives
[openpower-isa.git] / src / openpower / sv / sv_binutils.py
index 99346891873fc7ea5a1ef6e10497691486439c98..9cce744d3da9963afcc0453e68b193811ba3602b 100644 (file)
@@ -31,7 +31,7 @@ def indent(strings):
     return map(lambda string: ("    " + string), strings)
 
 
-class Field:
+class CType:
     @classmethod
     @_abc.abstractmethod
     def c_decl(self, name):
@@ -47,7 +47,7 @@ class Field:
         pass
 
 
-class Enum(Field, _enum.Enum):
+class Enum(CType, _enum.Enum):
     @classmethod
     def c_decl(cls):
         c_tag = f"svp64_{cls.__name__.lower()}"
@@ -78,7 +78,7 @@ SVEType = Enum("SVEType", {item.name:item.value for item in _SVEtype})
 SVEXTRA = Enum("SVEXTRA", {item.name:item.value for item in _SVEXTRA})
 
 
-class Opcode(Field):
+class Opcode(CType):
     def __init__(self, value, mask, bits):
         self.__value = value
         self.__mask = mask
@@ -149,7 +149,7 @@ class PatternOpcode(Opcode):
         return super().__init__(value=value, mask=mask, bits=bits)
 
 
-class Name(Field, str):
+class Name(CType, str):
     def __repr__(self):
         escaped = self.replace("\"", "\\\"")
         return f"\"{escaped}\""
@@ -163,7 +163,7 @@ class Name(Field, str):
 
 
 @_dataclasses.dataclass(eq=True, frozen=True)
-class Entry(Field):
+class Entry(CType):
     name: Name
     opcode: Opcode
     in1: In1Sel
@@ -243,6 +243,9 @@ class Codegen(_enum.Enum):
             yield f"#define {self.name}"
             yield ""
 
+            yield "#include <stdint.h>"
+            yield ""
+
             yield from Opcode.c_decl()
             yield ""
 
@@ -258,11 +261,26 @@ class Codegen(_enum.Enum):
             yield from Entry.c_decl()
             yield ""
 
+            yield "extern const struct svp64_entry svp64_entries[];"
+            yield "extern const unsigned int svp64_num_entries;"
+            yield ""
+
             yield f"#endif /* {self.name} */"
             yield ""
 
         def ppc_opc_svp64_c(entries):
-            yield from ()
+            yield from DISCLAIMER
+            yield ""
+
+            yield "#include \"ppc-opc-svp64.h\""
+            yield ""
+
+            yield "const struct svp64_entry svp64_entries[] = {{"
+            for (index, entry) in enumerate(entries):
+                yield from indent(entry.c_value(prefix=f"[{index}] = ", suffix=","))
+            yield f"}};"
+            yield f"const unsigned int svp64_num_entries = {len(entries)};"
+            yield ""
 
         return {
             Codegen.PPC_OPC_SVP64_H: ppc_opc_svp64_h,
@@ -367,7 +385,7 @@ def main(codegen):
     }
     for (path, opcode_cls) in table.items():
         entries.extend(parse(path, opcode_cls))
-    entries = sorted(entries)
+    entries = sorted(frozenset(entries))
 
     for line in codegen.generate(entries):
         print(line)