Gabe Black has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/49452 )

Change subject: python,util: Pull enum hh|cc generation out of the MetaEnum class.
......................................................................

python,util: Pull enum hh|cc generation out of the MetaEnum class.

Change-Id: Ibfcc2d6916318ffef806f74e57e3f8360489efb6
---
M src/python/m5/params.py
M util/bld/enum_cc.py
M util/bld/enum_hh.py
3 files changed, 144 insertions(+), 144 deletions(-)



diff --git a/src/python/m5/params.py b/src/python/m5/params.py
index 8db8e6a..64f6854 100644
--- a/src/python/m5/params.py
+++ b/src/python/m5/params.py
@@ -1323,146 +1323,6 @@

         super(MetaEnum, cls).__init__(name, bases, init_dict)

-    # Generate C++ class declaration for this enum type.
-    # Note that we wrap the enum in a class/struct to act as a namespace,
-    # so that the enum strings can be brief w/o worrying about collisions.
-    def cxx_decl(cls, code):
-        wrapper_name = cls.wrapper_name
-        wrapper = 'struct' if cls.wrapper_is_struct else 'namespace'
-        name = cls.__name__ if cls.enum_name is None else cls.enum_name
-        idem_macro = '__ENUM__%s__%s__' % (wrapper_name, name)
-
-        code('''\
-#ifndef $idem_macro
-#define $idem_macro
-
-namespace gem5
-{
-''')
-        if cls.is_class:
-            code('''\
-enum class $name
-{
-''')
-        else:
-            code('''\
-$wrapper $wrapper_name {
-    enum $name
-    {
-''')
-            code.indent(1)
-        code.indent(1)
-        for val in cls.vals:
-            code('$val = ${{cls.map[val]}},')
-        code('Num_$name = ${{len(cls.vals)}}')
-        code.dedent(1)
-        code('};')
-
-        if cls.is_class:
-            code('''\
-extern const char *${name}Strings[static_cast<int>(${name}::Num_${name})];
-''')
-        elif cls.wrapper_is_struct:
-            code('static const char *${name}Strings[Num_${name}];')
-        else:
-            code('extern const char *${name}Strings[Num_${name}];')
-
-        if not cls.is_class:
-            code.dedent(1)
-            code('}; // $wrapper_name')
-
-        code()
-        code('} // namespace gem5')
-
-        code()
-        code('#endif // $idem_macro')
-
-    def cxx_def(cls, code):
-        wrapper_name = cls.wrapper_name
-        file_name = cls.__name__
-        name = cls.__name__ if cls.enum_name is None else cls.enum_name
-
-        code('#include "base/compiler.hh"')
-        code('#include "enums/$file_name.hh"')
-
-        code()
-        code('namespace gem5')
-        code('{')
-        code()
-
-        if cls.wrapper_is_struct:
-            code('const char *${wrapper_name}::${name}Strings'
-                '[Num_${name}] =')
-        else:
-            if cls.is_class:
-                code('''\
-const char *${name}Strings[static_cast<int>(${name}::Num_${name})] =
-''')
-            else:
-                code('''GEM5_DEPRECATED_NAMESPACE(Enums, enums);
-namespace enums
-{''')
-                code.indent(1)
-                code('const char *${name}Strings[Num_${name}] =')
-
-        code('{')
-        code.indent(1)
-        for val in cls.vals:
-            code('"$val",')
-        code.dedent(1)
-        code('};')
-
-        if not cls.wrapper_is_struct and not cls.is_class:
-            code.dedent(1)
-            code('} // namespace enums')
-
-        code('} // namespace gem5')
-
-
-    def pybind_def(cls, code):
-        name = cls.__name__
- enum_name = cls.__name__ if cls.enum_name is None else cls.enum_name
-        wrapper_name = enum_name if cls.is_class else cls.wrapper_name
-
-        code('''#include "pybind11/pybind11.h"
-#include "pybind11/stl.h"
-
-#include <sim/init.hh>
-
-namespace py = pybind11;
-
-namespace gem5
-{
-
-static void
-module_init(py::module_ &m_internal)
-{
-    py::module_ m = m_internal.def_submodule("enum_${name}");
-
-''')
-        if cls.is_class:
-            code('py::enum_<${enum_name}>(m, "enum_${name}")')
-        else:
- code('py::enum_<${wrapper_name}::${enum_name}>(m, "enum_${name}")')
-
-        code.indent()
-        code.indent()
-        for val in cls.vals:
-            code('.value("${val}", ${wrapper_name}::${val})')
-        code('.value("Num_${name}", ${wrapper_name}::Num_${enum_name})')
-        if not cls.is_class:
-            code('.export_values()')
-        code(';')
-        code.dedent()
-
-        code('}')
-        code.dedent()
-        code()
- code('static EmbeddedPyBind embed_enum("enum_${name}", module_init);')
-        code()
-        code('} // namespace gem5')
-
-
 # Base class for enum types.
 class Enum(ParamValue, metaclass=MetaEnum):
     vals = []
diff --git a/util/bld/enum_cc.py b/util/bld/enum_cc.py
index 8a82147..84e6c9b 100644
--- a/util/bld/enum_cc.py
+++ b/util/bld/enum_cc.py
@@ -46,7 +46,94 @@
 enum = getattr(module, enum_name)

 code = code_formatter()
-enum.cxx_def(code)
-if use_python:
-    enum.pybind_def(code)
+
+wrapper_name = enum.wrapper_name
+file_name = enum.__name__
+name = enum.__name__ if enum.enum_name is None else enum.enum_name
+
+code('''#include "base/compiler.hh"
+#include "enums/$file_name.hh"
+
+namespace gem5
+{
+
+''')
+
+if enum.wrapper_is_struct:
+    code('const char *${wrapper_name}::${name}Strings'
+        '[Num_${name}] =')
+else:
+    if enum.is_class:
+        code('''\
+const char *${name}Strings[static_cast<int>(${name}::Num_${name})] =
+''')
+    else:
+        code('''GEM5_DEPRECATED_NAMESPACE(Enums, enums);
+namespace enums
+{''')
+        code.indent(1)
+        code('const char *${name}Strings[Num_${name}] =')
+
+code('{')
+code.indent(1)
+for val in enum.vals:
+    code('"$val",')
+code.dedent(1)
+code('};')
+
+if not enum.wrapper_is_struct and not enum.is_class:
+    code.dedent(1)
+    code('} // namespace enums')
+
+code('} // namespace gem5')
+
+
+if not use_python:
+    code.write(cc)
+    exit(0)
+
+
+name = enum.__name__
+enum_name = enum.__name__ if enum.enum_name is None else enum.enum_name
+wrapper_name = enum_name if enum.is_class else enum.wrapper_name
+
+code('''#include "pybind11/pybind11.h"
+#include "pybind11/stl.h"
+
+#include <sim/init.hh>
+
+namespace py = pybind11;
+
+namespace gem5
+{
+
+static void
+module_init(py::module_ &m_internal)
+{
+    py::module_ m = m_internal.def_submodule("enum_${name}");
+
+''')
+if enum.is_class:
+    code('py::enum_<${enum_name}>(m, "enum_${name}")')
+else:
+    code('py::enum_<${wrapper_name}::${enum_name}>(m, "enum_${name}")')
+
+code.indent()
+code.indent()
+for val in enum.vals:
+    code('.value("${val}", ${wrapper_name}::${val})')
+code('.value("Num_${name}", ${wrapper_name}::Num_${enum_name})')
+if not enum.is_class:
+    code('.export_values()')
+code(';')
+code.dedent()
+
+code('}')
+code.dedent()
+code('''
+static EmbeddedPyBind embed_enum("enum_${name}", module_init);
+
+} // namespace gem5
+''')
+
 code.write(cc)
diff --git a/util/bld/enum_hh.py b/util/bld/enum_hh.py
index 11e7a65..2e54a89 100644
--- a/util/bld/enum_hh.py
+++ b/util/bld/enum_hh.py
@@ -45,5 +45,58 @@
 enum = getattr(module, enum_name)

 code = code_formatter()
-enum.cxx_decl(code)
+
+# Generate C++ class declaration for this enum type.
+# Note that we wrap the enum in a class/struct to act as a namespace,
+# so that the enum strings can be brief w/o worrying about collisions.
+wrapper_name = enum.wrapper_name
+wrapper = 'struct' if enum.wrapper_is_struct else 'namespace'
+name = enum.__name__ if enum.enum_name is None else enum.enum_name
+idem_macro = '__ENUM__%s__%s__' % (wrapper_name, name)
+
+code('''\
+#ifndef $idem_macro
+#define $idem_macro
+
+namespace gem5
+{
+''')
+if enum.is_class:
+    code('''\
+enum class $name
+{
+''')
+else:
+    code('''\
+$wrapper $wrapper_name {
+enum $name
+{
+''')
+    code.indent(1)
+code.indent(1)
+for val in enum.vals:
+    code('$val = ${{enum.map[val]}},')
+code('Num_$name = ${{len(enum.vals)}}')
+code.dedent(1)
+code('};')
+
+if enum.is_class:
+    code('''\
+extern const char *${name}Strings[static_cast<int>(${name}::Num_${name})];
+''')
+elif enum.wrapper_is_struct:
+    code('static const char *${name}Strings[Num_${name}];')
+else:
+    code('extern const char *${name}Strings[Num_${name}];')
+
+if not enum.is_class:
+    code.dedent(1)
+    code('}; // $wrapper_name')
+
+code()
+code('} // namespace gem5')
+
+code()
+code('#endif // $idem_macro')
+
 code.write(hh)

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/49452
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: Ibfcc2d6916318ffef806f74e57e3f8360489efb6
Gerrit-Change-Number: 49452
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to