Gabriel B. has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/67669?usp=email )
Change subject: mem-ruby: Better support of external types in SLICC
......................................................................
mem-ruby: Better support of external types in SLICC
It is now possible to import external C++ types to SLICC without
enforcing name matching between the SLICC type, the C++ type and the
header name/location. Also, struct members can now be defaulted
(assignment, as currently supported) or constructed.
Change-Id: I2230dbf4293c7b3747eef937d98a29f93630f07b
---
M src/mem/slicc/symbols/SymbolTable.py
M src/mem/slicc/symbols/Type.py
2 files changed, 59 insertions(+), 28 deletions(-)
diff --git a/src/mem/slicc/symbols/SymbolTable.py
b/src/mem/slicc/symbols/SymbolTable.py
index 4b06be5..a332a44 100644
--- a/src/mem/slicc/symbols/SymbolTable.py
+++ b/src/mem/slicc/symbols/SymbolTable.py
@@ -143,7 +143,10 @@
for symbol in self.sym_vec:
if isinstance(symbol, Type) and not symbol.isPrimitive:
- code('#include "mem/ruby/protocol/${{symbol.c_ident}}.hh"')
+ if 'header' in symbol:
+ code(f'#include "{symbol["header"]}"')
+ else:
+
code('#include "mem/ruby/protocol/${{symbol.c_ident}}.hh"')
code.write(path, "Types.hh")
diff --git a/src/mem/slicc/symbols/Type.py b/src/mem/slicc/symbols/Type.py
index d4c1cbe..a8735a7 100644
--- a/src/mem/slicc/symbols/Type.py
+++ b/src/mem/slicc/symbols/Type.py
@@ -50,7 +50,11 @@
):
super().__init__(symtab, ident, location, type, code, pairs,
machine)
self.init_code = init_code
- self.real_c_type = self.type.c_ident
+ self.real_c_type = (
+ self.type.c_ident
+ if "external_name" not in self.type
+ else self.type["external_name"]
+ )
if "template" in pairs:
self.real_c_type += pairs["template"]
@@ -65,7 +69,9 @@
class Type(Symbol):
def __init__(self, table, ident, location, pairs, machine=None):
super().__init__(table, ident, location, pairs)
- self.c_ident = ident
+ self.c_ident = (
+ ident if "external_name" not in pairs else
pairs["external_name"]
+ )
self.abstract_ident = ""
if machine:
if self.isExternal or self.isPrimitive:
@@ -234,7 +240,9 @@
)
for dm in self.data_members.values():
- if not dm.type.isPrimitive:
+ if "header" in dm.type:
+ code(f'#include "{dm.type["header"]}"')
+ elif not dm.type.isPrimitive:
code('#include "mem/ruby/protocol/$0.hh"', dm.type.c_ident)
parent = ""
@@ -259,29 +267,33 @@
)
if self.isMessage:
- code("(Tick curTime) : %s(curTime) {" % self["interface"])
+ code("\t(Tick curTime): %s(curTime)" % self["interface"])
+ firstInitChar = ","
else:
- code("()\n\t\t{")
+ code("\t()")
+ firstInitChar = ":"
code.indent()
- if not self.isGlobal:
- code.indent()
+ if not self.isGlobal and self.data_members:
+ init = []
for dm in self.data_members.values():
ident = dm.ident
if "default" in dm:
# look for default value
- code(
- 'm_$ident = ${{dm["default"]}}; // default for
this field'
- )
+ init.append(f'm_{ident}{{{dm["default"]}}}')
elif "default" in dm.type:
# Look for the type default
- tid = dm.real_c_type
- code('m_$ident = ${{dm.type["default"]}};')
- code(" // default value of $tid")
+ init.append(f'm_{ident}{{{dm.type["default"]}}}')
+ elif "constructor" in dm:
+ init.append(f'm_{ident}{{{dm["constructor"]}}}')
+ elif "constructor" in dm.type:
+ init.append(f'm_{ident}{{{dm.type["constructor"]}}}')
else:
- code("// m_$ident has no default")
+ init.append(f"m_{ident}{{}}")
+ code.indent()
+ code(firstInitChar + ",\n".join(init) + "\n")
code.dedent()
- code("}")
+ code("{}")
# ******** Copy constructor ********
code("${{self.c_ident}}(const ${{self.c_ident}}&) = default;")
@@ -297,27 +309,29 @@
"const %s& local_%s" % (dm.real_c_type, dm.ident)
for dm in self.data_members.values()
]
- params = ", ".join(params)
-
if self.isMessage:
- params = "const Tick curTime, " + params
+ params.insert(0, "const Tick curTime")
+ params = ", ".join(params)
code("${{self.c_ident}}($params)")
- # Call superclass constructor
+ members = [dm.ident for dm in self.data_members.values()]
+ init = [f"m_{member}{{local_{member}}}" for member in members]
if "interface" in self:
if self.isMessage:
- code(' : ${{self["interface"]}}(curTime)')
+ init.insert(0, f'{self["interface"]}(curTime)')
else:
- code(' : ${{self["interface"]}}()')
+ init.insert(0, f'{self["interface"]}()')
+ init = ",\n".join(init)
- code("{")
- code.indent()
- for dm in self.data_members.values():
- code("m_${{dm.ident}} = local_${{dm.ident}};")
+ # Call superclass constructor
- code.dedent()
- code("}")
+ if init:
+ code(":")
+ code.indent()
+ code(init)
+ code.dedent()
+ code("{}")
# create a clone member
if self.isMessage:
--
To view, visit
https://gem5-review.googlesource.com/c/public/gem5/+/67669?usp=email
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: I2230dbf4293c7b3747eef937d98a29f93630f07b
Gerrit-Change-Number: 67669
Gerrit-PatchSet: 1
Gerrit-Owner: Gabriel B. <gabriel.bus...@arteris.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org