summaryrefslogtreecommitdiff
path: root/core/src/main/scala/chisel3/internal
diff options
context:
space:
mode:
authorJack Koenig2021-06-28 17:20:50 -0700
committerGitHub2021-06-28 17:20:50 -0700
commit79ed2c22558edf3ae03cc8f9aa1ac67e82f8d128 (patch)
treec34ccf144e5ff3926a2e8a9316ff3444a3508f17 /core/src/main/scala/chisel3/internal
parent6a806918b15d78613638c8d860538adbef9425b1 (diff)
parentb87107ad41e948de9da9c349505de414b1a9db7f (diff)
Merge pull request #1974 from chipsalliance/fix-clonemoduleasrecord-totarget
Fix CloneModuleAsRecord support for .toTarget
Diffstat (limited to 'core/src/main/scala/chisel3/internal')
-rw-r--r--core/src/main/scala/chisel3/internal/Builder.scala2
-rw-r--r--core/src/main/scala/chisel3/internal/firrtl/Converter.scala19
-rw-r--r--core/src/main/scala/chisel3/internal/firrtl/IR.scala19
3 files changed, 33 insertions, 7 deletions
diff --git a/core/src/main/scala/chisel3/internal/Builder.scala b/core/src/main/scala/chisel3/internal/Builder.scala
index e1e4d460..35c4bdf9 100644
--- a/core/src/main/scala/chisel3/internal/Builder.scala
+++ b/core/src/main/scala/chisel3/internal/Builder.scala
@@ -84,7 +84,7 @@ trait InstanceId {
private[chisel3] trait HasId extends InstanceId {
private[chisel3] def _onModuleClose: Unit = {}
- private[chisel3] val _parent: Option[BaseModule] = Builder.currentModule
+ private[chisel3] var _parent: Option[BaseModule] = Builder.currentModule
private[chisel3] val _id: Long = Builder.idGen.next
diff --git a/core/src/main/scala/chisel3/internal/firrtl/Converter.scala b/core/src/main/scala/chisel3/internal/firrtl/Converter.scala
index 40d3691c..093d4848 100644
--- a/core/src/main/scala/chisel3/internal/firrtl/Converter.scala
+++ b/core/src/main/scala/chisel3/internal/firrtl/Converter.scala
@@ -24,16 +24,24 @@ private[chisel3] object Converter {
case Percent => ("%%", List.empty)
}
+ private def reportInternalError(msg: String): Nothing = {
+ val link = "https://github.com/chipsalliance/chisel3/issues/new"
+ val fullMsg = s"Internal Error! $msg This is a bug in Chisel, please file an issue at '$link'"
+ throwException(fullMsg)
+ }
+
def getRef(id: HasId, sourceInfo: SourceInfo): Arg =
id.getOptionRef.getOrElse {
val module = id._parent.map(m => s" '$id' was defined in module '$m'.").getOrElse("")
val loc = sourceInfo.makeMessage(" " + _)
- val link = "https://github.com/chipsalliance/chisel3/issues/new"
- val msg = s"Internal error! Could not get ref for '$id'$loc!$module " +
- s"This is a bug in Chisel, please file an issue at '$link'."
- throwException(msg)
+ reportInternalError(s"Could not get ref for '$id'$loc!$module")
}
+ private def clonedModuleIOError(mod: BaseModule, name: String, sourceInfo: SourceInfo): Nothing = {
+ val loc = sourceInfo.makeMessage(" " + _)
+ reportInternalError(s"Trying to convert a cloned IO of $mod inside of $mod itself$loc!")
+ }
+
def convert(info: SourceInfo): fir.Info = info match {
case _: NoSourceInfo => fir.NoInfo
case SourceLine(fn, line, col) => fir.FileInfo(fir.StringLit(s"$fn $line:$col"))
@@ -65,6 +73,9 @@ private[chisel3] object Converter {
case ModuleIO(mod, name) =>
if (mod eq ctx.id) fir.Reference(name, fir.UnknownType)
else fir.SubField(fir.Reference(getRef(mod, info).name, fir.UnknownType), name, fir.UnknownType)
+ case ModuleCloneIO(mod, name) =>
+ if (mod eq ctx.id) clonedModuleIOError(mod, name, info)
+ else fir.Reference(name)
case u @ ULit(n, UnknownWidth()) =>
fir.UIntLiteral(n, fir.IntWidth(u.minWidth))
case ULit(n, w) =>
diff --git a/core/src/main/scala/chisel3/internal/firrtl/IR.scala b/core/src/main/scala/chisel3/internal/firrtl/IR.scala
index 5dc72a43..a4f6d26d 100644
--- a/core/src/main/scala/chisel3/internal/firrtl/IR.scala
+++ b/core/src/main/scala/chisel3/internal/firrtl/IR.scala
@@ -161,13 +161,28 @@ case class IntervalLit(n: BigInt, w: Width, binaryPoint: BinaryPoint) extends Li
}
case class Ref(name: String) extends Arg
+/** Arg for ports of Modules
+ * @param mod the module this port belongs to
+ * @param name the name of the port
+ */
case class ModuleIO(mod: BaseModule, name: String) extends Arg {
override def fullName(ctx: Component): String =
if (mod eq ctx.id) name else s"${mod.getRef.name}.$name"
}
-case class Slot(imm: Node, name: String) extends Arg {
+/** Ports of cloned modules (CloneModuleAsRecord)
+ * @param mod The original module for which these ports are a clone
+ * @param name the name of the module instance
+ */
+case class ModuleCloneIO(mod: BaseModule, name: String) extends Arg {
override def fullName(ctx: Component): String =
- if (imm.fullName(ctx).isEmpty) name else s"${imm.fullName(ctx)}.${name}"
+ // NOTE: mod eq ctx.id only occurs in Target and Named-related APIs
+ if (mod eq ctx.id) "" else name
+}
+case class Slot(imm: Node, name: String) extends Arg {
+ override def fullName(ctx: Component): String = {
+ val immName = imm.fullName(ctx)
+ if (immName.isEmpty) name else s"$immName.$name"
+ }
}
case class Index(imm: Arg, value: Arg) extends Arg {
def name: String = s"[$value]"