Skip to content

Commit 63a4a7e

Browse files
authored
Merge pull request #470 from jwest115/issue-349
Make component instance names qualified in topology c++ code gen and JSON dictionary
2 parents 2ab0edd + e6d9f24 commit 63a4a7e

34 files changed

+736
-409
lines changed

compiler/lib/src/main/scala/codegen/CppWriter/CppDocCppWriter.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,9 @@ object CppDocCppWriter extends CppDocWriter {
161161

162162
override def visitNamespace(in: Input, namespace: CppDoc.Namespace) =
163163
namespace.members.flatMap(visitNamespaceMember(in, _)) match {
164+
// If the namespace has no members, then don't write it out.
165+
// This can happen where a namespace member has members
166+
// that write code to some cpp files and not others.
164167
case Nil => Nil
165168
case outputLines =>
166169
val name = namespace.name

compiler/lib/src/main/scala/codegen/CppWriter/CppDocHppWriter.scala

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ object CppDocHppWriter extends CppDocWriter {
6262
val commentLines = CppDocWriter.writeDoxygenCommentOpt(c.comment)
6363
val openLines = c.superclassDecls match {
6464
case Some(d) => List(
65-
line(s"class $name :"),
65+
line(s"class $name :"),
6666
indentIn(line(d)),
6767
line("{")
6868
)
@@ -170,12 +170,4 @@ object CppDocHppWriter extends CppDocWriter {
170170
}
171171
}
172172

173-
override def visitNamespace(in: Input, namespace: CppDoc.Namespace) = {
174-
val name = namespace.name
175-
val startLines = List(Line.blank, line(s"namespace $name {"))
176-
val outputLines = namespace.members.map(visitNamespaceMember(in, _)).flatten
177-
val endLines = List(Line.blank, line("}"))
178-
startLines ++ outputLines.map(indentIn(_)) ++ endLines
179-
}
180-
181173
}

compiler/lib/src/main/scala/codegen/CppWriter/CppDocWriter.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@ trait CppDocWriter extends CppDocVisitor with LineUtils {
3434

3535
type Output = List[Line]
3636

37+
override def visitNamespace(in: Input, namespace: CppDoc.Namespace) = {
38+
val name = namespace.name
39+
val startLines = List(Line.blank, line(s"namespace $name {"))
40+
val outputLines = namespace.members.flatMap(visitNamespaceMember(in, _))
41+
val endLines = List(Line.blank, line("}"))
42+
startLines ++ outputLines.map(indentIn(_)) ++ endLines
43+
}
44+
3745
}
3846

3947
object CppDocWriter extends LineUtils {

compiler/lib/src/main/scala/codegen/CppWriter/CppWriterUtils.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,15 @@ trait CppWriterUtils extends LineUtils {
6363
def wrapInNamespace(namespace: String, ll: List[Line]): List[Line] =
6464
wrapInScope(s"namespace $namespace {", ll, "}")
6565

66+
def wrapInNamespaceLines(
67+
namespaceNames: List[String],
68+
ll: List[Line]
69+
): List[Line] = namespaceNames match {
70+
case Nil => ll
71+
case head :: tail =>
72+
wrapInNamespace(head, wrapInNamespaceLines(tail, ll))
73+
}
74+
6675
def wrapInNamedEnum(name: String, ll: List[Line]): List[Line] =
6776
wrapInScope(s"enum $name {", ll, "};")
6877

compiler/lib/src/main/scala/codegen/CppWriter/TopologyCppWriter/TopComponentInstances.scala

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,42 +10,45 @@ case class TopComponentInstances(
1010
aNode: Ast.Annotated[AstNode[Ast.DefTopology]]
1111
) extends TopologyCppWriterUtils(s, aNode) {
1212

13-
private val bannerComment = "Component instances"
13+
def getMembers: List[CppDoc.Member] = {
14+
val instanceMembers = getInstanceMembers
15+
List.concat(
16+
guardedList (!instanceMembers.isEmpty) (List(getCommentMember)),
17+
instanceMembers
18+
)
19+
}
1420

15-
def getHppLines: List[Line] = addBannerComment(
16-
bannerComment,
17-
getDeclLines
18-
)
21+
private val bannerComment = "Component instances"
1922

20-
def getCppLines: List[Line] = addBannerComment(
21-
bannerComment,
22-
getDefLines
23+
private def getCommentMember = linesMember(
24+
CppDocWriter.writeBannerComment(bannerComment),
25+
CppDoc.Lines.Both
2326
)
2427

25-
private def getDeclLines = {
26-
def getCode(ci: ComponentInstance): List[Line] = {
28+
private def getInstanceMembers = {
29+
def getMembers(ci: ComponentInstance): List[CppDoc.Member] = {
2730
val implType = getImplType(ci)
28-
val instanceName = getNameAsIdent(ci.qualifiedName)
29-
Line.addPrefixLine (line(s"//! $instanceName")) (
31+
val instanceName = ci.getUnqualifiedName
32+
val hppMember = linesMember(
3033
lines(
31-
s"extern $implType $instanceName;"
32-
)
34+
s"""|
35+
|//! $instanceName
36+
|extern $implType $instanceName;"""
37+
),
38+
CppDoc.Lines.Hpp
3339
)
34-
}
35-
flattenWithBlankPrefix(instances.map(getCode))
36-
}
37-
38-
private def getDefLines = {
39-
def getCode(ci: ComponentInstance): List[Line] = {
40-
val implType = getImplType(ci)
41-
val instanceName = getNameAsIdent(ci.qualifiedName)
42-
getCodeLinesForPhase (CppWriter.Phases.instances) (ci).getOrElse(
43-
lines(
44-
s"$implType $instanceName(FW_OPTIONAL_NAME($q$instanceName$q));"
40+
val cppMember = {
41+
val instLines = getCodeLinesForPhase (CppWriter.Phases.instances) (ci).getOrElse(
42+
lines(
43+
s"""|
44+
|$implType $instanceName(FW_OPTIONAL_NAME($q$instanceName$q));"""
45+
)
4546
)
46-
)
47+
linesMember(instLines, CppDoc.Lines.Cpp)
48+
}
49+
wrapInNamespaces(ci.qualifiedName.qualifier, List(hppMember, cppMember))
4750
}
48-
flattenWithBlankPrefix(instances.map(getCode))
51+
instances.flatMap(getMembers)
4952
}
5053

5154
private def getImplType(ci: ComponentInstance) = {

compiler/lib/src/main/scala/codegen/CppWriter/TopologyCppWriter/TopConfigObjects.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ case class TopConfigObjects(
4444
flattenWithBlankPrefix(
4545
pairs.map {
4646
case (ci, code) => wrapInNamespace(
47-
getNameAsIdent(ci.qualifiedName),
47+
CppWriter.identFromQualifiedName(ci.qualifiedName),
4848
code
4949
)
5050
}
@@ -77,7 +77,7 @@ case class TopConfigObjects(
7777
flattenWithBlankPrefix(
7878
pairs.map {
7979
case (ci, code) => wrapInNamespace(
80-
getNameAsIdent(ci.qualifiedName),
80+
CppWriter.identFromQualifiedName(ci.qualifiedName),
8181
code
8282
)
8383
}
@@ -99,7 +99,7 @@ case class TopConfigObjects(
9999
// Entry for connected port
100100
case Some(ci) =>
101101
val name = ci.qualifiedName
102-
val ident = getNameAsIdent(name)
102+
val ident = CppWriter.identFromQualifiedName(name)
103103
List(
104104
s"PingEntries::$ident::WARN,",
105105
s"PingEntries::$ident::FATAL,",

compiler/lib/src/main/scala/codegen/CppWriter/TopologyCppWriter/TopConstants.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ case class TopConstants(
3737
"ConfigConstants",
3838
pairs.flatMap {
3939
case (ci, code) => wrapInNamespace(
40-
getNameAsIdent(ci.qualifiedName),
40+
CppWriter.identFromQualifiedName(ci.qualifiedName),
4141
lines(code)
4242
)
4343
}
@@ -62,7 +62,7 @@ case class TopConstants(
6262
generateEnum(
6363
"BaseIds",
6464
ci => {
65-
val name = getNameAsIdent(ci.qualifiedName)
65+
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
6666
val value = CppWriter.writeId(ci.baseId)
6767
Some(s"$name = $value")
6868
},
@@ -74,7 +74,7 @@ case class TopConstants(
7474
"CPUs",
7575
ci => ci.cpu.map(
7676
cpu => {
77-
val name = getNameAsIdent(ci.qualifiedName)
77+
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
7878
s"$name = $cpu"
7979
}
8080
)
@@ -84,7 +84,7 @@ case class TopConstants(
8484
generateEnum(
8585
"InstanceIds",
8686
ci => {
87-
val name = getNameAsIdent(ci.qualifiedName)
87+
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
8888
Some(s"$name")
8989
}
9090
)
@@ -94,7 +94,7 @@ case class TopConstants(
9494
"Priorities",
9595
ci => ci.priority.map(
9696
priority => {
97-
val name = getNameAsIdent(ci.qualifiedName)
97+
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
9898
s"$name = $priority"
9999
}
100100
)
@@ -105,7 +105,7 @@ case class TopConstants(
105105
"QueueSizes",
106106
ci => ci.queueSize.map(
107107
queueSize => {
108-
val name = getNameAsIdent(ci.qualifiedName)
108+
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
109109
s"$name = $queueSize"
110110
}
111111
)
@@ -116,7 +116,7 @@ case class TopConstants(
116116
"StackSizes",
117117
ci => ci.stackSize.map(
118118
stackSize => {
119-
val name = getNameAsIdent(ci.qualifiedName)
119+
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
120120
s"$name = $stackSize"
121121
}
122122
)
@@ -130,7 +130,7 @@ case class TopConstants(
130130
val kind = c.aNode._2.data.kind
131131
kind match {
132132
case Ast.ComponentKind.Active =>
133-
val name = getNameAsIdent(ci.qualifiedName)
133+
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
134134
Some(name.toString)
135135
case _ => None
136136
}

compiler/lib/src/main/scala/codegen/CppWriter/TopologyCppWriter/TopHelperFns.scala

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,14 @@ case class TopHelperFns(
5151

5252
private def getInitComponentsFn = {
5353
def getCode(ci: ComponentInstance): List[Line] = {
54-
val name = getNameAsIdent(ci.qualifiedName)
54+
val cppQualifiedName = CppWriter.writeQualifiedName(ci.qualifiedName)
55+
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
5556
getCodeLinesForPhase (CppWriter.Phases.initComponents) (ci).getOrElse(
5657
ci.component.aNode._2.data.kind match {
5758
case Ast.ComponentKind.Passive =>
58-
lines(s"$name.init(InstanceIds::$name);")
59+
lines(s"$cppQualifiedName.init(InstanceIds::$name);")
5960
case _ =>
60-
lines(s"$name.init(QueueSizes::$name, InstanceIds::$name);")
61+
lines(s"$cppQualifiedName.init(QueueSizes::$name, InstanceIds::$name);")
6162
}
6263
)
6364
}
@@ -73,7 +74,7 @@ case class TopHelperFns(
7374

7475
private def getConfigComponentsFn = {
7576
def getCode(ci: ComponentInstance): List[Line] = {
76-
val name = getNameAsIdent(ci.qualifiedName)
77+
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
7778
getCodeLinesForPhase (CppWriter.Phases.configComponents) (ci).getOrElse(Nil)
7879
}
7980
val name = "configComponents"
@@ -89,8 +90,9 @@ case class TopHelperFns(
8990
private def getSetBaseIdsFn = {
9091
val name = "setBaseIds"
9192
val body = instancesByBaseId.map(ci => {
92-
val name = getNameAsIdent(ci.qualifiedName)
93-
line(s"$name.setIdBase(BaseIds::$name);")
93+
val cppQualifiedName = CppWriter.writeQualifiedName(ci.qualifiedName)
94+
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
95+
line(s"$cppQualifiedName.setIdBase(BaseIds::$name);")
9496
})
9597
val memberOpt = getFnMemberOpt(
9698
"Set component base Ids",
@@ -103,10 +105,10 @@ case class TopHelperFns(
103105

104106
private def getConnectComponentsFn = {
105107
def getPortInfo(pii: PortInstanceIdentifier, c: Connection) = {
106-
val instanceName = getNameAsIdent(pii.componentInstance.qualifiedName)
108+
val cppQualifiedName = CppWriter.writeQualifiedName(pii.componentInstance.qualifiedName)
107109
val portName = pii.portInstance.getUnqualifiedName
108110
val portNumber = t.getPortNumber(pii.portInstance, c).get
109-
(instanceName, portName, portNumber)
111+
(cppQualifiedName, portName, portNumber)
110112
}
111113
def writeConnection(c: Connection) = {
112114
val out = getPortInfo(c.from.port, c)
@@ -140,8 +142,8 @@ case class TopHelperFns(
140142
def getCode(ci: ComponentInstance): List[Line] = {
141143
getCodeLinesForPhase (CppWriter.Phases.regCommands) (ci).getOrElse(
142144
if (hasCommands(ci)) {
143-
val name = getNameAsIdent(ci.qualifiedName)
144-
lines(s"$name.regCommands();")
145+
val cppQualifiedName = CppWriter.writeQualifiedName(ci.qualifiedName)
146+
lines(s"$cppQualifiedName.regCommands();")
145147
}
146148
else Nil
147149
)
@@ -173,8 +175,8 @@ case class TopHelperFns(
173175
def getCode(ci: ComponentInstance): List[Line] = {
174176
getCodeLinesForPhase (CppWriter.Phases.loadParameters) (ci).getOrElse(
175177
if (hasParams(ci)) {
176-
val name = getNameAsIdent(ci.qualifiedName)
177-
lines(s"$name.loadParameters();")
178+
val cppQualifiedName = CppWriter.writeQualifiedName(ci.qualifiedName)
179+
lines(s"$cppQualifiedName.loadParameters();")
178180
}
179181
else Nil
180182
)
@@ -193,7 +195,8 @@ case class TopHelperFns(
193195
def getCode(ci: ComponentInstance): List[Line] =
194196
getCodeLinesForPhase (CppWriter.Phases.startTasks) (ci).getOrElse {
195197
if (isActive(ci)) {
196-
val name = getNameAsIdent(ci.qualifiedName)
198+
val cppQualifiedName = CppWriter.writeQualifiedName(ci.qualifiedName)
199+
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
197200
val priority = ci.priority match {
198201
case Some(_) => s"static_cast<Os::Task::ParamType>(Priorities::$name),"
199202
case None => "Os::Task::TASK_DEFAULT, // Default priority"
@@ -207,7 +210,7 @@ case class TopHelperFns(
207210
case None => "Os::Task::TASK_DEFAULT, // Default CPU"
208211
}
209212
wrapInScope(
210-
s"$name.start(",
213+
s"$cppQualifiedName.start(",
211214
(
212215
List(
213216
priority,
@@ -235,8 +238,8 @@ case class TopHelperFns(
235238
def getCode(ci: ComponentInstance): List[Line] =
236239
getCodeLinesForPhase (CppWriter.Phases.stopTasks) (ci).getOrElse {
237240
if (isActive(ci)) {
238-
val name = getNameAsIdent(ci.qualifiedName)
239-
lines(s"$name.exit();")
241+
val cppQualifiedName = CppWriter.writeQualifiedName(ci.qualifiedName)
242+
lines(s"$cppQualifiedName.exit();")
240243
}
241244
else Nil
242245
}
@@ -254,8 +257,8 @@ case class TopHelperFns(
254257
def getCode(ci: ComponentInstance): List[Line] =
255258
getCodeLinesForPhase (CppWriter.Phases.freeThreads) (ci).getOrElse {
256259
if (isActive(ci)) {
257-
val name = getNameAsIdent(ci.qualifiedName)
258-
lines(s"(void) $name.ActiveComponentBase::join();")
260+
val cppQualifiedName = CppWriter.writeQualifiedName(ci.qualifiedName)
261+
lines(s"(void) $cppQualifiedName.ActiveComponentBase::join();")
259262
}
260263
else Nil
261264
}
@@ -271,7 +274,7 @@ case class TopHelperFns(
271274

272275
private def getTearDownComponentsFn = {
273276
def getCode(ci: ComponentInstance): List[Line] = {
274-
val name = getNameAsIdent(ci.qualifiedName)
277+
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
275278
getCodeLinesForPhase (CppWriter.Phases.tearDownComponents) (ci).getOrElse(Nil)
276279
}
277280
val name = "tearDownComponents"

0 commit comments

Comments
 (0)