mem-ruby: Move protocol files to subdir

Move all generated protocol-specific files to a subdirectory with the
protocol's name.

This change also updates SLICC to have separate variables for the
filename, c identifier and python identifier instead of just using
variations of the c identifier.

Change-Id: I62f69a4606b030ee23cb2d96493f3257a6923748
Signed-off-by: Jason Lowe-Power <jason@lowepower.com>
This commit is contained in:
Jason Lowe-Power
2022-03-23 17:46:06 -07:00
committed by Bobby R. Bruce
parent 3a4465d908
commit feb45c9cb9
9 changed files with 93 additions and 51 deletions

View File

@@ -41,7 +41,7 @@
#include <algorithm>
#include <vector>
#include "mem/ruby/protocol/MiscNode_TBE.hh"
#include "mem/ruby/protocol/CHI/MiscNode_TBE.hh"
#include "mem/ruby/structures/TBETable.hh"
namespace gem5

View File

@@ -50,6 +50,8 @@ class EnumDeclAST(DeclAST):
ident = f"{parent}_{self.type_ast.ident}"
else:
ident = self.type_ast.ident
if not self.shared:
ident = f"{self.slicc.protocol}/{ident}"
s = {f"{ident}.hh", f"{ident}.cc"}
return s

View File

@@ -45,12 +45,13 @@ class MachineAST(DeclAST):
return f"[Machine: {self.ident!r}]"
def files(self, parent=None):
file_prefix = f"{self.slicc.protocol}/{self.ident}"
s = {
f"{self.ident}_Controller.cc",
f"{self.ident}_Controller.hh",
f"{self.ident}_Controller.py",
f"{self.ident}_Transitions.cc",
f"{self.ident}_Wakeup.cc",
f"{file_prefix}_Controller.cc",
f"{file_prefix}_Controller.hh",
f"{file_prefix}_Controller.py",
f"{file_prefix}_Transitions.cc",
f"{file_prefix}_Wakeup.cc",
}
s |= self.decls.files(self.ident)

View File

@@ -49,6 +49,8 @@ class StateDeclAST(DeclAST):
ident = f"{parent}_{self.type_ast.ident}"
else:
ident = self.type_ast.ident
if not self.shared:
ident = f"{self.slicc.protocol}/{ident}"
s = {f"{ident}.hh", f"{ident}.cc"}
return s

View File

@@ -47,6 +47,8 @@ class TypeDeclAST(DeclAST):
ident = f"{parent}_{self.type_ast.ident}"
else:
ident = self.type_ast.ident
if not self.shared:
ident = f"{self.slicc.protocol}/{ident}"
return {f"{ident}.hh", f"{ident}.cc"}
def generate(self):

View File

@@ -109,7 +109,7 @@ class SLICC(Grammar):
self.symtab.writeHTMLFiles(html_path)
def files(self):
f = {"Types.hh"}
f = {os.path.join(self.protocol, "Types.hh")}
f |= self.decl_list.files()

View File

@@ -265,8 +265,10 @@ class StateMachine(Symbol):
code = self.symtab.codeFormatter()
ident = self.ident
protocol = self.symtab.slicc.protocol
py_ident = f"{ident}_Controller"
c_ident = f"{self.ident}_Controller"
gen_filename = f"{protocol}/{py_ident}"
code(
"""
@@ -276,8 +278,8 @@ from m5.objects.Controller import RubyController
class $py_ident(RubyController):
type = '$py_ident'
cxx_header = 'mem/ruby/protocol/${c_ident}.hh'
cxx_class = 'gem5::ruby::$protocol::$py_ident'
cxx_header = 'mem/ruby/protocol/${protocol}/${c_ident}.hh'
cxx_class = 'gem5::ruby::$protocol::$c_ident'
"""
)
code.indent()
@@ -302,20 +304,22 @@ class $py_ident(RubyController):
)
code.dedent()
code.write(path, f"{py_ident}.py")
code.write(path, f"{gen_filename}.py")
def printControllerHH(self, path):
"""Output the method declarations for the class declaration"""
code = self.symtab.codeFormatter()
ident = self.ident
c_ident = f"{self.ident}_Controller"
header_string = self.symtab.slicc.protocol + '_' + self.ident
gen_filename = f"{self.symtab.slicc.protocol}/{c_ident}"
code(
"""
// Created by slicc definition of Module "${{self.short}}"
#ifndef __${ident}_CONTROLLER_HH__
#define __${ident}_CONTROLLER_HH__
#ifndef __${header_string}_CONTROLLER_HH__
#define __${header_string}_CONTROLLER_HH__
#include <iostream>
#include <sstream>
@@ -323,7 +327,7 @@ class $py_ident(RubyController):
#include "mem/ruby/common/Consumer.hh"
#include "mem/ruby/protocol/TransitionResult.hh"
#include "mem/ruby/protocol/Types.hh"
#include "mem/ruby/protocol/${protocol}/Types.hh"
#include "mem/ruby/slicc_interface/AbstractController.hh"
#include "params/$c_ident.hh"
@@ -333,7 +337,14 @@ class $py_ident(RubyController):
seen_types = set()
for var in self.objects:
if var.type.ident not in seen_types and not var.type.isPrimitive:
code('#include "mem/ruby/protocol/${{var.type.c_ident}}.hh"')
if var.type.shared or var.type.isExternal:
code('''
#include "mem/ruby/protocol/${{var.type.c_ident}}.hh"
''')
else:
code('''
#include "mem/ruby/protocol/${{protocol}}/${{var.type.c_ident}}.hh"
''')
seen_types.add(var.type.ident)
# for adding information to the protocol debug trace
@@ -537,11 +548,11 @@ void unset_tbe(${{self.TBEType.c_ident}}*& m_tbe_ptr);
} // namespace ruby
} // namespace gem5
#endif // __${ident}_CONTROLLER_H__
#endif // __${header_string}_CONTROLLER_H__
"""
)
code.write(path, f"{c_ident}.hh")
code.write(path, f"{gen_filename}.hh")
def printControllerCC(self, path, includes):
"""Output the actions for performing the actions"""
@@ -549,6 +560,7 @@ void unset_tbe(${{self.TBEType.c_ident}}*& m_tbe_ptr);
code = self.symtab.codeFormatter()
ident = self.ident
c_ident = f"{self.ident}_Controller"
gen_filename = f"{self.symtab.slicc.protocol}/{self.ident}"
# Unfortunately, clang compilers will throw a "call to function ...
# that is neither visible in the template definition nor found by
@@ -599,10 +611,10 @@ void unset_tbe(${{self.TBEType.c_ident}}*& m_tbe_ptr);
code(
"""
#include "mem/ruby/network/Network.hh"
#include "mem/ruby/protocol/${ident}_Controller.hh"
#include "mem/ruby/protocol/${ident}_Event.hh"
#include "mem/ruby/protocol/${ident}_State.hh"
#include "mem/ruby/protocol/Types.hh"
#include "mem/ruby/protocol/${gen_filename}_Controller.hh"
#include "mem/ruby/protocol/${gen_filename}_Event.hh"
#include "mem/ruby/protocol/${gen_filename}_State.hh"
#include "mem/ruby/protocol/${protocol}/Types.hh"
#include "mem/ruby/system/RubySystem.hh"
"""
@@ -614,7 +626,14 @@ void unset_tbe(${{self.TBEType.c_ident}}*& m_tbe_ptr);
seen_types = set()
for var in self.objects:
if var.type.ident not in seen_types and not var.type.isPrimitive:
code('#include "mem/ruby/protocol/${{var.type.c_ident}}.hh"')
if var.type.shared or var.type.isExternal:
code('''
#include "mem/ruby/protocol/${{var.type.c_ident}}.hh"
''')
else:
code('''
#include "mem/ruby/protocol/${{protocol}}/${{var.type.c_ident}}.hh"
''')
seen_types.add(var.type.ident)
num_in_ports = len(self.in_ports)
@@ -1413,13 +1432,14 @@ $c_ident::functionalReadBuffers(PacketPtr& pkt, WriteMask &mask)
"""
)
code.write(path, f"{c_ident}.cc")
code.write(path, f"{gen_filename}_Controller.cc")
def printCWakeup(self, path, includes):
"""Output the wakeup loop for the events"""
code = self.symtab.codeFormatter()
ident = self.ident
gen_filename = f"{self.symtab.slicc.protocol}/{self.ident}"
outputRequest_types = True
if len(self.request_types) == 0:
@@ -1445,19 +1465,21 @@ $c_ident::functionalReadBuffers(PacketPtr& pkt, WriteMask &mask)
code('#include "debug/${{f}}.hh"')
code(
"""
#include "mem/ruby/protocol/${ident}_Controller.hh"
#include "mem/ruby/protocol/${ident}_Event.hh"
#include "mem/ruby/protocol/${ident}_State.hh"
#include "mem/ruby/protocol/${gen_filename}_Controller.hh"
#include "mem/ruby/protocol/${gen_filename}_Event.hh"
#include "mem/ruby/protocol/${gen_filename}_State.hh"
"""
)
if outputRequest_types:
code('''#include "mem/ruby/protocol/${ident}_RequestType.hh"''')
code('''
#include "mem/ruby/protocol/${protocol}/${ident}_RequestType.hh"
''')
code(
"""
#include "mem/ruby/protocol/Types.hh"
#include "mem/ruby/protocol/${protocol}/Types.hh"
#include "mem/ruby/system/RubySystem.hh"
"""
@@ -1568,13 +1590,14 @@ ${ident}_Controller::wakeup()
"""
)
code.write(path, f"{self.ident}_Wakeup.cc")
code.write(path, f"{gen_filename}_Wakeup.cc")
def printCSwitch(self, path):
"""Output switch statement for transition table"""
code = self.symtab.codeFormatter()
ident = self.ident
gen_filename = f"{self.symtab.slicc.protocol}/{self.ident}"
code(
"""
@@ -1586,10 +1609,10 @@ ${ident}_Controller::wakeup()
#include "base/trace.hh"
#include "debug/ProtocolTrace.hh"
#include "debug/RubyGenerated.hh"
#include "mem/ruby/protocol/${ident}_Controller.hh"
#include "mem/ruby/protocol/${ident}_Event.hh"
#include "mem/ruby/protocol/${ident}_State.hh"
#include "mem/ruby/protocol/Types.hh"
#include "mem/ruby/protocol/${gen_filename}_Controller.hh"
#include "mem/ruby/protocol/${gen_filename}_Event.hh"
#include "mem/ruby/protocol/${gen_filename}_State.hh"
#include "mem/ruby/protocol/${protocol}/Types.hh"
#include "mem/ruby/system/RubySystem.hh"
#define HASH_FUN(state, event) ((int(state)*${ident}_Event_NUM)+int(event))
@@ -1884,7 +1907,7 @@ if (!checkResourceAvailable({}_RequestType_{}, addr)) {{
} // namespace gem5
"""
)
code.write(path, f"{self.ident}_Transitions.cc")
code.write(path, f"{gen_filename}_Transitions.cc")
# **************************
# ******* HTML Files *******

View File

@@ -135,6 +135,7 @@ class SymbolTable:
def writeCodeFiles(self, path, includes):
makeDir(path)
makeDir(os.path.join(path, self.slicc.protocol))
code = self.codeFormatter()
@@ -143,9 +144,12 @@ class SymbolTable:
for symbol in self.sym_vec:
if isinstance(symbol, Type) and not symbol.isPrimitive:
code('#include "mem/ruby/protocol/${{symbol.c_ident}}.hh"')
ident = symbol.c_ident
if not symbol.shared and not symbol.isExternal:
ident = f"{self.slicc.protocol}/{ident}"
code('#include "mem/ruby/protocol/${{ident}}.hh"')
code.write(path, "Types.hh")
code.write(path, f"{self.slicc.protocol}/Types.hh")
for symbol in self.sym_vec:
symbol.writeCodeFiles(path, includes)

View File

@@ -76,7 +76,15 @@ class Type(Symbol):
self.c_ident = self["external_name"]
else:
# Append with machine name
self.c_ident = f"{machine}_{ident}"
self.c_ident = "%s_%s" % (machine, ident)
if shared or not table.slicc.protocol or self.isExternal:
self.protocol_specific = ""
self.gen_filename = self.c_ident
self.header_string = self.c_ident
else:
self.protocol_specific = table.slicc.protocol
self.gen_filename = self.protocol_specific + '/' + self.c_ident
self.header_string = self.protocol_specific + '_' + self.c_ident
self.pairs.setdefault("desc", "No description avaliable")
@@ -230,8 +238,8 @@ class Type(Symbol):
code = self.symtab.codeFormatter()
code(
"""
#ifndef __${{self.c_ident}}_HH__
#define __${{self.c_ident}}_HH__
#ifndef __${{self.header_string}}_HH__
#define __${{self.header_string}}_HH__
#include <iostream>
@@ -242,7 +250,7 @@ class Type(Symbol):
for dm in self.data_members.values():
if not dm.type.isPrimitive:
code('#include "mem/ruby/protocol/$0.hh"', dm.type.c_ident)
code('#include "mem/ruby/protocol/$0.hh"',dm.type.gen_filename)
parent = ""
if "interface" in self:
@@ -560,11 +568,11 @@ operator<<(::std::ostream& out, const ${{self.c_ident}}& obj)
} // namespace ruby
} // namespace gem5
#endif // __${{self.c_ident}}_HH__
#endif // __${{self.header_string}}_HH__
"""
)
code.write(path, f"{self.c_ident}.hh")
code.write(path, f"{self.gen_filename}.hh")
def printTypeCC(self, path):
code = self.symtab.codeFormatter()
@@ -574,7 +582,7 @@ operator<<(::std::ostream& out, const ${{self.c_ident}}& obj)
#include <iostream>
#include <memory>
#include "mem/ruby/protocol/${{self.c_ident}}.hh"
#include "mem/ruby/protocol/${{self.gen_filename}}.hh"
#include "mem/ruby/system/RubySystem.hh"
namespace gem5
@@ -640,14 +648,14 @@ out << "${{dm.ident}} = " << printAddress(m_${{dm.ident}}, block_size_bits) << "
"""
)
code.write(path, f"{self.c_ident}.cc")
code.write(path, f"{self.gen_filename}.cc")
def printEnumHH(self, path):
code = self.symtab.codeFormatter()
code(
"""
#ifndef __${{self.c_ident}}_HH__
#define __${{self.c_ident}}_HH__
#ifndef __${{self.header_string}}_HH__
#define __${{self.header_string}}_HH__
#include <iostream>
#include <string>
@@ -793,11 +801,11 @@ struct hash<gem5::ruby::MachineType>
# Trailer
code(
"""
#endif // __${{self.c_ident}}_HH__
#endif // __${{self.header_string}}_HH__
"""
)
code.write(path, f"{self.c_ident}.hh")
code.write(path, f"{self.gen_filename}.hh")
def printEnumCC(self, path):
code = self.symtab.codeFormatter()
@@ -808,7 +816,7 @@ struct hash<gem5::ruby::MachineType>
#include <string>
#include "base/logging.hh"
#include "mem/ruby/protocol/${{self.c_ident}}.hh"
#include "mem/ruby/protocol/${{self.gen_filename}}.hh"
"""
)
@@ -873,8 +881,8 @@ AccessPermission ${{self.c_ident}}_to_permission(const ${{self.c_ident}}& obj)
for enum in self.enums.values():
if enum.primary:
code(
'#include "mem/ruby/protocol/${{enum.ident}}'
'_Controller.hh"'
"#include \"mem/ruby/protocol/${{protocol}}/"
"${{enum.ident}}_Controller.hh\""
)
code('#include "mem/ruby/common/MachineID.hh"')
@@ -1124,7 +1132,7 @@ get${{enum.ident}}MachineID(NodeID RubyNode)
)
# Write the file
code.write(path, f"{self.c_ident}.cc")
code.write(path, f"{self.gen_filename}.cc")
__all__ = ["Type"]