Jason Lowe-Power has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/58432 )

Change subject: mem-ruby: Use namespaces for protocol types
......................................................................

mem-ruby: Use namespaces for protocol types

Wrap all protocol-specific types in `namespace <protocol>`. This will
facilitate compiling multiple protocols into one binary.

There is a one-time hack to the generated `MachineType.cc` file to use
the namespace for the protocol until we generalize the machine types.

Change-Id: I5947e8ac69afe6f7ed257d7c5980ad65e9338acf
Signed-off-by: Jason Lowe-Power <ja...@lowepower.com>
---
M src/mem/slicc/symbols/StateMachine.py
M src/mem/slicc/symbols/Type.py
2 files changed, 127 insertions(+), 4 deletions(-)



diff --git a/src/mem/slicc/symbols/StateMachine.py b/src/mem/slicc/symbols/StateMachine.py
index a9f7373..e220731 100644
--- a/src/mem/slicc/symbols/StateMachine.py
+++ b/src/mem/slicc/symbols/StateMachine.py
@@ -246,7 +246,7 @@
 class $py_ident(RubyController):
     type = '$py_ident'
     cxx_header = 'mem/ruby/protocol/${c_ident}.hh'
-    cxx_class = 'gem5::ruby::$py_ident'
+    cxx_class = 'gem5::ruby::$protocol::$py_ident'
 ''')
         code.indent()
         for param in self.config_parameters:
@@ -306,6 +306,9 @@
 namespace ruby
 {

+namespace ${protocol}
+{
+
 extern std::stringstream ${ident}_transitionComment;

 class $c_ident : public AbstractController
@@ -463,6 +466,7 @@
         code('''
 };

+} // namespace ${protocol}
 } // namespace ruby
 } // namespace gem5

@@ -550,6 +554,9 @@
 namespace ruby
 {

+namespace ${protocol}
+{
+
 int $c_ident::m_num_controllers = 0;
 std::vector<statistics::Vector *>  $c_ident::eventVec;
 std::vector<std::vector<statistics::Vector *> >  $c_ident::transVec;
@@ -827,7 +834,7 @@
     AbstractController::regStats();

     // For each type of controllers, one controller of that type is picked
-    // to aggregate stats of all controllers of that type.
+    // to aggregate stats of all controllers of that type.
     if (m_version == 0) {

         Profiler *profiler = params().ruby_system->getProfiler();
@@ -1221,6 +1228,7 @@
     return read;
 }

+} // namespace ${protocol}
 } // namespace ruby
 } // namespace gem5
 ''')
@@ -1282,6 +1290,9 @@
 namespace ruby
 {

+namespace ${protocol}
+{
+
 void
 ${ident}_Controller::wakeup()
 {
@@ -1357,6 +1368,7 @@
     }
 }

+} // namespace ${protocol}
 } // namespace ruby
 } // namespace gem5
 ''')
@@ -1395,6 +1407,9 @@
 namespace ruby
 {

+namespace ${protocol}
+{
+
 TransitionResult
 ${ident}_Controller::doTransition(${ident}_Event event,
 ''')
@@ -1623,6 +1638,7 @@
     return TransitionResult_Valid;
 }

+} // namespace ${protocol}
 } // namespace ruby
 } // namespace gem5
 ''')
diff --git a/src/mem/slicc/symbols/Type.py b/src/mem/slicc/symbols/Type.py
index a9c5303..bb8ff0c 100644
--- a/src/mem/slicc/symbols/Type.py
+++ b/src/mem/slicc/symbols/Type.py
@@ -228,6 +228,16 @@

 namespace ruby
 {
+''')
+        # For protocol-specific types, wrap in the protocol namespace
+        if not self.shared:
+            code('''
+
+namespace ${{protocol}}
+{
+''')
+
+        code('''

 $klass ${{self.c_ident}}$parent
 {
@@ -394,7 +404,15 @@
     out << ::std::flush;
     return out;
 }
+''')
+        # For protocol-specific types, close the protocol namespace
+        if not self.shared:
+            code('''

+} // namespace ${{protocol}}
+''')
+
+        code('''
 } // namespace ruby
 } // namespace gem5

@@ -418,6 +436,16 @@

 namespace ruby
 {
+''')
+        # For protocol-specific types, wrap in the protocol namespace
+        if not self.shared:
+            code('''
+
+namespace ${{protocol}}
+{
+''')
+
+        code('''

 /** \\brief Print the state of this object */
 void
@@ -446,6 +474,13 @@
         for item in self.methods:
             code(self.methods[item].generateCode())

+        # For protocol-specific types, close the protocol namespace
+        if not self.shared:
+            code('''
+
+} // namespace ${{protocol}}
+''')
+
         code('''
 } // namespace ruby
 } // namespace gem5
@@ -480,6 +515,13 @@
 {

 ''')
+        # For protocol-specific types, wrap in the protocol namespace
+        if not self.shared:
+            code('''
+
+namespace ${{protocol}}
+{
+''')

         if self.isMachineType:
             code('struct MachineID;')
@@ -545,7 +587,16 @@

 ::std::ostream&
 operator<<(::std::ostream& out, const ${{self.c_ident}}& obj);
+''')

+        # For protocol-specific types, close the protocol namespace
+        if not self.shared:
+            code('''
+
+} // namespace ${{protocol}}
+''')
+
+        code('''
 } // namespace ruby
 } // namespace gem5
 ''')
@@ -594,6 +645,16 @@

 namespace ruby
 {
+''')
+            # For protocol-specific types, wrap in the protocol namespace
+            if not self.shared:
+                code('''
+
+namespace ${{protocol}}
+{
+''')
+
+            code('''

 // Code to convert the current state to an access permission
AccessPermission ${{self.c_ident}}_to_permission(const ${{self.c_ident}}& obj)
@@ -613,6 +674,16 @@
     // Appease the compiler since this function has a return value
     return AccessPermission_Invalid;
 }
+''')
+
+            # For protocol-specific types, close the protocol namespace
+            if not self.shared:
+                code('''
+
+} // namespace ${{protocol}}
+''')
+
+            code('''

 } // namespace ruby
 } // namespace gem5
@@ -632,6 +703,15 @@

 namespace ruby
 {
+''')
+        # For protocol-specific types, wrap in the protocol namespace
+        if not self.shared:
+            code('''
+
+namespace ${{protocol}}
+{
+''')
+        code('''

 // Code for output operator
 ::std::ostream&
@@ -772,7 +852,9 @@
             for enum in reversed(list(self.enums.values())):
                 # Check if there is a defined machine with this type
                 if enum.primary:
- code(' base += ${{enum.ident}}_Controller::getNumControllers();')
+                    code('''
+    base += ${{protocol}}::${{enum.ident}}_Controller::getNumControllers();
+''')
                 else:
                     code('    base += 0;')
                 code('    [[fallthrough]];')
@@ -801,7 +883,9 @@
             for enum in self.enums.values():
                 code('case ${{self.c_ident}}_${{enum.ident}}:')
                 if enum.primary:
- code('return ${{enum.ident}}_Controller::getNumControllers();')
+                    code('''
+    return ${{protocol}}::${{enum.ident}}_Controller::getNumControllers();
+''')
                 else:
                     code('return 0;')

@@ -827,6 +911,13 @@
 }
 ''')

+        # For protocol-specific types, close the protocol namespace
+        if not self.shared:
+            code('''
+
+} // namespace ${{protocol}}
+''')
+
         code('''
 } // namespace ruby
 } // namespace gem5

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/58432
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: I5947e8ac69afe6f7ed257d7c5980ad65e9338acf
Gerrit-Change-Number: 58432
Gerrit-PatchSet: 1
Gerrit-Owner: Jason Lowe-Power <power...@gmail.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to