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