Skip to content

Commit

Permalink
Merge pull request nasa#470 from jwest115/issue-349
Browse files Browse the repository at this point in the history
Make component instance names qualified in topology c++ code gen and JSON dictionary
  • Loading branch information
bocchino authored Aug 14, 2024
2 parents 2ab0edd + e6d9f24 commit 63a4a7e
Show file tree
Hide file tree
Showing 34 changed files with 736 additions and 409 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,9 @@ object CppDocCppWriter extends CppDocWriter {

override def visitNamespace(in: Input, namespace: CppDoc.Namespace) =
namespace.members.flatMap(visitNamespaceMember(in, _)) match {
// If the namespace has no members, then don't write it out.
// This can happen where a namespace member has members
// that write code to some cpp files and not others.
case Nil => Nil
case outputLines =>
val name = namespace.name
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ object CppDocHppWriter extends CppDocWriter {
val commentLines = CppDocWriter.writeDoxygenCommentOpt(c.comment)
val openLines = c.superclassDecls match {
case Some(d) => List(
line(s"class $name :"),
line(s"class $name :"),
indentIn(line(d)),
line("{")
)
Expand Down Expand Up @@ -170,12 +170,4 @@ object CppDocHppWriter extends CppDocWriter {
}
}

override def visitNamespace(in: Input, namespace: CppDoc.Namespace) = {
val name = namespace.name
val startLines = List(Line.blank, line(s"namespace $name {"))
val outputLines = namespace.members.map(visitNamespaceMember(in, _)).flatten
val endLines = List(Line.blank, line("}"))
startLines ++ outputLines.map(indentIn(_)) ++ endLines
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,14 @@ trait CppDocWriter extends CppDocVisitor with LineUtils {

type Output = List[Line]

override def visitNamespace(in: Input, namespace: CppDoc.Namespace) = {
val name = namespace.name
val startLines = List(Line.blank, line(s"namespace $name {"))
val outputLines = namespace.members.flatMap(visitNamespaceMember(in, _))
val endLines = List(Line.blank, line("}"))
startLines ++ outputLines.map(indentIn(_)) ++ endLines
}

}

object CppDocWriter extends LineUtils {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,15 @@ trait CppWriterUtils extends LineUtils {
def wrapInNamespace(namespace: String, ll: List[Line]): List[Line] =
wrapInScope(s"namespace $namespace {", ll, "}")

def wrapInNamespaceLines(
namespaceNames: List[String],
ll: List[Line]
): List[Line] = namespaceNames match {
case Nil => ll
case head :: tail =>
wrapInNamespace(head, wrapInNamespaceLines(tail, ll))
}

def wrapInNamedEnum(name: String, ll: List[Line]): List[Line] =
wrapInScope(s"enum $name {", ll, "};")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,42 +10,45 @@ case class TopComponentInstances(
aNode: Ast.Annotated[AstNode[Ast.DefTopology]]
) extends TopologyCppWriterUtils(s, aNode) {

private val bannerComment = "Component instances"
def getMembers: List[CppDoc.Member] = {
val instanceMembers = getInstanceMembers
List.concat(
guardedList (!instanceMembers.isEmpty) (List(getCommentMember)),
instanceMembers
)
}

def getHppLines: List[Line] = addBannerComment(
bannerComment,
getDeclLines
)
private val bannerComment = "Component instances"

def getCppLines: List[Line] = addBannerComment(
bannerComment,
getDefLines
private def getCommentMember = linesMember(
CppDocWriter.writeBannerComment(bannerComment),
CppDoc.Lines.Both
)

private def getDeclLines = {
def getCode(ci: ComponentInstance): List[Line] = {
private def getInstanceMembers = {
def getMembers(ci: ComponentInstance): List[CppDoc.Member] = {
val implType = getImplType(ci)
val instanceName = getNameAsIdent(ci.qualifiedName)
Line.addPrefixLine (line(s"//! $instanceName")) (
val instanceName = ci.getUnqualifiedName
val hppMember = linesMember(
lines(
s"extern $implType $instanceName;"
)
s"""|
|//! $instanceName
|extern $implType $instanceName;"""
),
CppDoc.Lines.Hpp
)
}
flattenWithBlankPrefix(instances.map(getCode))
}

private def getDefLines = {
def getCode(ci: ComponentInstance): List[Line] = {
val implType = getImplType(ci)
val instanceName = getNameAsIdent(ci.qualifiedName)
getCodeLinesForPhase (CppWriter.Phases.instances) (ci).getOrElse(
lines(
s"$implType $instanceName(FW_OPTIONAL_NAME($q$instanceName$q));"
val cppMember = {
val instLines = getCodeLinesForPhase (CppWriter.Phases.instances) (ci).getOrElse(
lines(
s"""|
|$implType $instanceName(FW_OPTIONAL_NAME($q$instanceName$q));"""
)
)
)
linesMember(instLines, CppDoc.Lines.Cpp)
}
wrapInNamespaces(ci.qualifiedName.qualifier, List(hppMember, cppMember))
}
flattenWithBlankPrefix(instances.map(getCode))
instances.flatMap(getMembers)
}

private def getImplType(ci: ComponentInstance) = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ case class TopConfigObjects(
flattenWithBlankPrefix(
pairs.map {
case (ci, code) => wrapInNamespace(
getNameAsIdent(ci.qualifiedName),
CppWriter.identFromQualifiedName(ci.qualifiedName),
code
)
}
Expand Down Expand Up @@ -77,7 +77,7 @@ case class TopConfigObjects(
flattenWithBlankPrefix(
pairs.map {
case (ci, code) => wrapInNamespace(
getNameAsIdent(ci.qualifiedName),
CppWriter.identFromQualifiedName(ci.qualifiedName),
code
)
}
Expand All @@ -99,7 +99,7 @@ case class TopConfigObjects(
// Entry for connected port
case Some(ci) =>
val name = ci.qualifiedName
val ident = getNameAsIdent(name)
val ident = CppWriter.identFromQualifiedName(name)
List(
s"PingEntries::$ident::WARN,",
s"PingEntries::$ident::FATAL,",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ case class TopConstants(
"ConfigConstants",
pairs.flatMap {
case (ci, code) => wrapInNamespace(
getNameAsIdent(ci.qualifiedName),
CppWriter.identFromQualifiedName(ci.qualifiedName),
lines(code)
)
}
Expand All @@ -62,7 +62,7 @@ case class TopConstants(
generateEnum(
"BaseIds",
ci => {
val name = getNameAsIdent(ci.qualifiedName)
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
val value = CppWriter.writeId(ci.baseId)
Some(s"$name = $value")
},
Expand All @@ -74,7 +74,7 @@ case class TopConstants(
"CPUs",
ci => ci.cpu.map(
cpu => {
val name = getNameAsIdent(ci.qualifiedName)
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
s"$name = $cpu"
}
)
Expand All @@ -84,7 +84,7 @@ case class TopConstants(
generateEnum(
"InstanceIds",
ci => {
val name = getNameAsIdent(ci.qualifiedName)
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
Some(s"$name")
}
)
Expand All @@ -94,7 +94,7 @@ case class TopConstants(
"Priorities",
ci => ci.priority.map(
priority => {
val name = getNameAsIdent(ci.qualifiedName)
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
s"$name = $priority"
}
)
Expand All @@ -105,7 +105,7 @@ case class TopConstants(
"QueueSizes",
ci => ci.queueSize.map(
queueSize => {
val name = getNameAsIdent(ci.qualifiedName)
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
s"$name = $queueSize"
}
)
Expand All @@ -116,7 +116,7 @@ case class TopConstants(
"StackSizes",
ci => ci.stackSize.map(
stackSize => {
val name = getNameAsIdent(ci.qualifiedName)
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
s"$name = $stackSize"
}
)
Expand All @@ -130,7 +130,7 @@ case class TopConstants(
val kind = c.aNode._2.data.kind
kind match {
case Ast.ComponentKind.Active =>
val name = getNameAsIdent(ci.qualifiedName)
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
Some(name.toString)
case _ => None
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,14 @@ case class TopHelperFns(

private def getInitComponentsFn = {
def getCode(ci: ComponentInstance): List[Line] = {
val name = getNameAsIdent(ci.qualifiedName)
val cppQualifiedName = CppWriter.writeQualifiedName(ci.qualifiedName)
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
getCodeLinesForPhase (CppWriter.Phases.initComponents) (ci).getOrElse(
ci.component.aNode._2.data.kind match {
case Ast.ComponentKind.Passive =>
lines(s"$name.init(InstanceIds::$name);")
lines(s"$cppQualifiedName.init(InstanceIds::$name);")
case _ =>
lines(s"$name.init(QueueSizes::$name, InstanceIds::$name);")
lines(s"$cppQualifiedName.init(QueueSizes::$name, InstanceIds::$name);")
}
)
}
Expand All @@ -73,7 +74,7 @@ case class TopHelperFns(

private def getConfigComponentsFn = {
def getCode(ci: ComponentInstance): List[Line] = {
val name = getNameAsIdent(ci.qualifiedName)
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
getCodeLinesForPhase (CppWriter.Phases.configComponents) (ci).getOrElse(Nil)
}
val name = "configComponents"
Expand All @@ -89,8 +90,9 @@ case class TopHelperFns(
private def getSetBaseIdsFn = {
val name = "setBaseIds"
val body = instancesByBaseId.map(ci => {
val name = getNameAsIdent(ci.qualifiedName)
line(s"$name.setIdBase(BaseIds::$name);")
val cppQualifiedName = CppWriter.writeQualifiedName(ci.qualifiedName)
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
line(s"$cppQualifiedName.setIdBase(BaseIds::$name);")
})
val memberOpt = getFnMemberOpt(
"Set component base Ids",
Expand All @@ -103,10 +105,10 @@ case class TopHelperFns(

private def getConnectComponentsFn = {
def getPortInfo(pii: PortInstanceIdentifier, c: Connection) = {
val instanceName = getNameAsIdent(pii.componentInstance.qualifiedName)
val cppQualifiedName = CppWriter.writeQualifiedName(pii.componentInstance.qualifiedName)
val portName = pii.portInstance.getUnqualifiedName
val portNumber = t.getPortNumber(pii.portInstance, c).get
(instanceName, portName, portNumber)
(cppQualifiedName, portName, portNumber)
}
def writeConnection(c: Connection) = {
val out = getPortInfo(c.from.port, c)
Expand Down Expand Up @@ -140,8 +142,8 @@ case class TopHelperFns(
def getCode(ci: ComponentInstance): List[Line] = {
getCodeLinesForPhase (CppWriter.Phases.regCommands) (ci).getOrElse(
if (hasCommands(ci)) {
val name = getNameAsIdent(ci.qualifiedName)
lines(s"$name.regCommands();")
val cppQualifiedName = CppWriter.writeQualifiedName(ci.qualifiedName)
lines(s"$cppQualifiedName.regCommands();")
}
else Nil
)
Expand Down Expand Up @@ -173,8 +175,8 @@ case class TopHelperFns(
def getCode(ci: ComponentInstance): List[Line] = {
getCodeLinesForPhase (CppWriter.Phases.loadParameters) (ci).getOrElse(
if (hasParams(ci)) {
val name = getNameAsIdent(ci.qualifiedName)
lines(s"$name.loadParameters();")
val cppQualifiedName = CppWriter.writeQualifiedName(ci.qualifiedName)
lines(s"$cppQualifiedName.loadParameters();")
}
else Nil
)
Expand All @@ -193,7 +195,8 @@ case class TopHelperFns(
def getCode(ci: ComponentInstance): List[Line] =
getCodeLinesForPhase (CppWriter.Phases.startTasks) (ci).getOrElse {
if (isActive(ci)) {
val name = getNameAsIdent(ci.qualifiedName)
val cppQualifiedName = CppWriter.writeQualifiedName(ci.qualifiedName)
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
val priority = ci.priority match {
case Some(_) => s"static_cast<Os::Task::ParamType>(Priorities::$name),"
case None => "Os::Task::TASK_DEFAULT, // Default priority"
Expand All @@ -207,7 +210,7 @@ case class TopHelperFns(
case None => "Os::Task::TASK_DEFAULT, // Default CPU"
}
wrapInScope(
s"$name.start(",
s"$cppQualifiedName.start(",
(
List(
priority,
Expand Down Expand Up @@ -235,8 +238,8 @@ case class TopHelperFns(
def getCode(ci: ComponentInstance): List[Line] =
getCodeLinesForPhase (CppWriter.Phases.stopTasks) (ci).getOrElse {
if (isActive(ci)) {
val name = getNameAsIdent(ci.qualifiedName)
lines(s"$name.exit();")
val cppQualifiedName = CppWriter.writeQualifiedName(ci.qualifiedName)
lines(s"$cppQualifiedName.exit();")
}
else Nil
}
Expand All @@ -254,8 +257,8 @@ case class TopHelperFns(
def getCode(ci: ComponentInstance): List[Line] =
getCodeLinesForPhase (CppWriter.Phases.freeThreads) (ci).getOrElse {
if (isActive(ci)) {
val name = getNameAsIdent(ci.qualifiedName)
lines(s"(void) $name.ActiveComponentBase::join();")
val cppQualifiedName = CppWriter.writeQualifiedName(ci.qualifiedName)
lines(s"(void) $cppQualifiedName.ActiveComponentBase::join();")
}
else Nil
}
Expand All @@ -271,7 +274,7 @@ case class TopHelperFns(

private def getTearDownComponentsFn = {
def getCode(ci: ComponentInstance): List[Line] = {
val name = getNameAsIdent(ci.qualifiedName)
val name = CppWriter.identFromQualifiedName(ci.qualifiedName)
getCodeLinesForPhase (CppWriter.Phases.tearDownComponents) (ci).getOrElse(Nil)
}
val name = "tearDownComponents"
Expand Down
Loading

0 comments on commit 63a4a7e

Please sign in to comment.