summaryrefslogtreecommitdiff
path: root/core/src/main/scala/chisel3/internal
diff options
context:
space:
mode:
authormergify[bot]2022-05-12 17:31:59 +0000
committerGitHub2022-05-12 17:31:59 +0000
commit1ee9adbec48bc8393e1c3d0ed86a548f8510d13f (patch)
treeca16061fd438b2866f37a80d9ab74636491d8382 /core/src/main/scala/chisel3/internal
parentd5a964f6e7beea1f38f9623224fc65e2397e1fe7 (diff)
Support separately elaborating definition and instance in ChiselStage (backport #2512) (#2520)
* Support separately elaborating definition and instance in ChiselStage (#2512) (cherry picked from commit a0aa4d1550e3fbde199a98529cffeb176fb4bed8) # Conflicts: # core/src/main/scala/chisel3/experimental/hierarchy/Definition.scala # core/src/main/scala/chisel3/experimental/hierarchy/Instance.scala # core/src/main/scala/chisel3/internal/Builder.scala * fixing imports (#2522) Co-authored-by: Deborah Soung <debs@sifive.com>
Diffstat (limited to 'core/src/main/scala/chisel3/internal')
-rw-r--r--core/src/main/scala/chisel3/internal/Builder.scala19
1 files changed, 18 insertions, 1 deletions
diff --git a/core/src/main/scala/chisel3/internal/Builder.scala b/core/src/main/scala/chisel3/internal/Builder.scala
index 4180f580..69455455 100644
--- a/core/src/main/scala/chisel3/internal/Builder.scala
+++ b/core/src/main/scala/chisel3/internal/Builder.scala
@@ -6,7 +6,7 @@ import scala.util.DynamicVariable
import scala.collection.mutable.ArrayBuffer
import chisel3._
import chisel3.experimental._
-import chisel3.experimental.hierarchy.{Clone, Instance}
+import chisel3.experimental.hierarchy.{Clone, ImportDefinitionAnnotation, Instance}
import chisel3.internal.firrtl._
import chisel3.internal.naming._
import _root_.firrtl.annotations.{CircuitName, ComponentName, IsMember, ModuleName, Named, ReferenceTarget}
@@ -364,7 +364,24 @@ private[chisel3] class ChiselContext() {
}
private[chisel3] class DynamicContext(val annotationSeq: AnnotationSeq, val throwOnFirstError: Boolean) {
+ val importDefinitionAnnos = annotationSeq.collect { case a: ImportDefinitionAnnotation[_] => a }
+
+ // Ensure there are no repeated names for imported Definitions
+ val importDefinitionNames = importDefinitionAnnos.map { a => a.definition.proto.name }
+ if (importDefinitionNames.distinct.length < importDefinitionNames.length) {
+ val duplicates = importDefinitionNames.diff(importDefinitionNames.distinct).mkString(", ")
+ throwException(s"Expected distinct imported Definition names but found duplicates for: $duplicates")
+ }
+
val globalNamespace = Namespace.empty
+
+ // Ensure imported Definitions emit as ExtModules with the correct name so
+ // that instantiations will also use the correct name and prevent any name
+ // conflicts with Modules/Definitions in this elaboration
+ importDefinitionNames.foreach { importDefName =>
+ globalNamespace.name(importDefName)
+ }
+
val components = ArrayBuffer[Component]()
val annotations = ArrayBuffer[ChiselAnnotation]()
var currentModule: Option[BaseModule] = None