sv_binutils: add missing include directives
[openpower-isa.git] / src / openpower / sv / sv_binutils.py
index e29a01c18fa476bb3a506eab0e794039af68d1f7..9cce744d3da9963afcc0453e68b193811ba3602b 100644 (file)
@@ -1,12 +1,8 @@
 import abc as _abc
 import argparse as _argparse
-import codecs as _codecs
-import csv as _csv
 import dataclasses as _dataclasses
 import enum as _enum
-import pathlib as _pathlib
 import re as _re
-import sys as _sys
 
 from openpower.decoder.power_enums import (
     In1Sel as _In1Sel,
@@ -35,7 +31,7 @@ def indent(strings):
     return map(lambda string: ("    " + string), strings)
 
 
-class Field:
+class CType:
     @classmethod
     @_abc.abstractmethod
     def c_decl(self, name):
@@ -51,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()}"
@@ -67,7 +63,7 @@ class Enum(Field, _enum.Enum):
     @classmethod
     def c_var(cls, name):
         c_tag = f"svp64_{cls.__name__.lower()}"
-        yield f"enum {c_tag} {name};"
+        yield f"enum {c_tag} {name}"
 
 
 # Python forbids inheriting from enum unless it's empty.
@@ -82,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
@@ -125,7 +121,7 @@ class Opcode(Field):
 
     @classmethod
     def c_var(cls, name):
-        yield f"struct svp64_opcode {name};"
+        yield f"struct svp64_opcode {name}"
 
 
 class IntegerOpcode(Opcode):
@@ -153,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,11 +159,11 @@ class Name(Field, str):
 
     @classmethod
     def c_var(cls, name):
-        yield f"const char *{name};"
+        yield f"const char *{name}"
 
 
 @_dataclasses.dataclass(eq=True, frozen=True)
-class Entry:
+class Entry(CType):
     name: Name
     opcode: Opcode
     in1: In1Sel
@@ -187,6 +183,11 @@ class Entry:
     sv_cr_in: SVEXTRA
     sv_cr_out: SVEXTRA
 
+    def __lt__(self, other):
+        if not isinstance(other, self.__class__):
+            return NotImplemented
+        return self.name < other.name
+
     @classmethod
     def c_decl(cls):
         bits_all = 0
@@ -197,7 +198,7 @@ class Entry:
                 yield from indent([f"uint64_t {field.name} : {bits};"])
                 bits_all += bits
             else:
-                yield from indent(field.type.c_var(name=field.name))
+                yield from indent(field.type.c_var(name=f"{field.name};"))
         bits_rsvd = (64 - (bits_all % 64))
         if bits_rsvd:
             yield from indent([f"uint64_t : {bits_rsvd};"])
@@ -213,7 +214,7 @@ class Entry:
 
     @classmethod
     def c_var(cls, name):
-        yield f"struct svp64_entry {name};"
+        yield f"struct svp64_entry {name}"
 
 
 class Codegen(_enum.Enum):
@@ -242,6 +243,9 @@ class Codegen(_enum.Enum):
             yield f"#define {self.name}"
             yield ""
 
+            yield "#include <stdint.h>"
+            yield ""
+
             yield from Opcode.c_decl()
             yield ""
 
@@ -257,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,
@@ -366,6 +385,7 @@ def main(codegen):
     }
     for (path, opcode_cls) in table.items():
         entries.extend(parse(path, opcode_cls))
+    entries = sorted(frozenset(entries))
 
     for line in codegen.generate(entries):
         print(line)