summaryrefslogtreecommitdiff
path: root/core/src/main/scala/chisel3/experimental
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main/scala/chisel3/experimental')
-rw-r--r--core/src/main/scala/chisel3/experimental/dataview/package.scala2
-rw-r--r--core/src/main/scala/chisel3/experimental/hierarchy/Definition.scala14
-rw-r--r--core/src/main/scala/chisel3/experimental/hierarchy/Instance.scala36
-rw-r--r--core/src/main/scala/chisel3/experimental/hierarchy/Lookupable.scala2
-rw-r--r--core/src/main/scala/chisel3/experimental/package.scala34
5 files changed, 83 insertions, 5 deletions
diff --git a/core/src/main/scala/chisel3/experimental/dataview/package.scala b/core/src/main/scala/chisel3/experimental/dataview/package.scala
index c583c516..71ae2d8f 100644
--- a/core/src/main/scala/chisel3/experimental/dataview/package.scala
+++ b/core/src/main/scala/chisel3/experimental/dataview/package.scala
@@ -33,7 +33,7 @@ package object dataview {
// The names of views do not matter except for when a view is annotated. For Views that correspond
// To a single Data, we just forward the name of the Target. For Views that correspond to more
// than one Data, we return this assigned name but rename it in the Convert stage
- result.forceName(None, "view", Builder.viewNamespace)
+ result.forceName("view", Builder.viewNamespace)
result
}
}
diff --git a/core/src/main/scala/chisel3/experimental/hierarchy/Definition.scala b/core/src/main/scala/chisel3/experimental/hierarchy/Definition.scala
index 59b4c692..36bf6f87 100644
--- a/core/src/main/scala/chisel3/experimental/hierarchy/Definition.scala
+++ b/core/src/main/scala/chisel3/experimental/hierarchy/Definition.scala
@@ -11,6 +11,7 @@ import chisel3.internal.sourceinfo.{DefinitionTransform, DefinitionWrapTransform
import chisel3.experimental.BaseModule
import chisel3.internal.BaseModule.IsClone
import firrtl.annotations.{IsModule, ModuleTarget}
+import firrtl.annotations.{IsModule, ModuleTarget, NoTargetAnnotation}
/** User-facing Definition type.
* Represents a definition of an object of type [[A]] which are marked as @instantiable
@@ -100,7 +101,10 @@ object Definition extends SourceInfoDoc {
implicit sourceInfo: SourceInfo,
compileOptions: CompileOptions
): Definition[T] = {
- val dynamicContext = new DynamicContext(Nil, Builder.captureContext().throwOnFirstError)
+ val dynamicContext = {
+ val context = Builder.captureContext()
+ new DynamicContext(Nil, context.throwOnFirstError, context.warnReflectiveNaming)
+ }
Builder.globalNamespace.copyTo(dynamicContext.globalNamespace)
dynamicContext.inDefinition = true
val (ir, module) = Builder.build(Module(proto), dynamicContext, false)
@@ -112,3 +116,11 @@ object Definition extends SourceInfoDoc {
}
}
+
+/** Stores a [[Definition]] that is imported so that its Instances can be
+ * compiled separately.
+ */
+case class ImportDefinitionAnnotation[T <: BaseModule with IsInstantiable](
+ definition: Definition[T],
+ overrideDefName: Option[String] = None)
+ extends NoTargetAnnotation
diff --git a/core/src/main/scala/chisel3/experimental/hierarchy/Instance.scala b/core/src/main/scala/chisel3/experimental/hierarchy/Instance.scala
index cc926771..861023a1 100644
--- a/core/src/main/scala/chisel3/experimental/hierarchy/Instance.scala
+++ b/core/src/main/scala/chisel3/experimental/hierarchy/Instance.scala
@@ -2,13 +2,15 @@
package chisel3.experimental.hierarchy
-import scala.collection.mutable.{ArrayBuffer, HashMap}
import scala.language.experimental.macros
import chisel3._
import chisel3.internal.BaseModule.{InstantiableClone, IsClone, ModuleClone}
+import chisel3.internal.Builder
import chisel3.internal.sourceinfo.{InstanceTransform, SourceInfo}
-import chisel3.experimental.BaseModule
+import chisel3.experimental.{BaseModule, ExtModule}
+import chisel3.internal.firrtl.{Component, DefBlackBox, DefModule, Port}
import firrtl.annotations.IsModule
+import chisel3.internal.throwException
/** User-facing Instance type.
* Represents a unique instance of type [[A]] which are marked as @instantiable
@@ -107,9 +109,39 @@ object Instance extends SourceInfoDoc {
implicit sourceInfo: SourceInfo,
compileOptions: CompileOptions
): Instance[T] = {
+ // Check to see if the module is already defined internally or externally
+ val existingMod = Builder.components.map {
+ case c: DefModule if c.id == definition.proto => Some(c)
+ case c: DefBlackBox if c.name == definition.proto.name => Some(c)
+ case _ => None
+ }.flatten
+
+ if (existingMod.isEmpty) {
+ // Add a Definition that will get emitted as an ExtModule so that FIRRTL
+ // does not complain about a missing element
+ val extModName = Builder.importDefinitionMap.getOrElse(
+ definition.proto.name,
+ throwException(
+ "Imported Definition information not found - possibly forgot to add ImportDefinition annotation?"
+ )
+ )
+ class EmptyExtModule extends ExtModule {
+ override def desiredName: String = extModName
+ override def generateComponent(): Option[Component] = {
+ require(!_closed, s"Can't generate $desiredName module more than once")
+ _closed = true
+ val firrtlPorts = definition.proto.getModulePorts.map { port => Port(port, port.specifiedDirection) }
+ val component = DefBlackBox(this, definition.proto.name, firrtlPorts, SpecifiedDirection.Unspecified, params)
+ Some(component)
+ }
+ }
+ Definition(new EmptyExtModule() {})
+ }
+
val ports = experimental.CloneModuleAsRecord(definition.proto)
val clone = ports._parent.get.asInstanceOf[ModuleClone[T]]
clone._madeFromDefinition = true
+
new Instance(Clone(clone))
}
diff --git a/core/src/main/scala/chisel3/experimental/hierarchy/Lookupable.scala b/core/src/main/scala/chisel3/experimental/hierarchy/Lookupable.scala
index 46a38e7c..c83479b0 100644
--- a/core/src/main/scala/chisel3/experimental/hierarchy/Lookupable.scala
+++ b/core/src/main/scala/chisel3/experimental/hierarchy/Lookupable.scala
@@ -218,7 +218,7 @@ object Lookupable {
result.bind(newBinding)
result.setAllParents(Some(ViewParent))
- result.forceName(None, "view", Builder.viewNamespace)
+ result.forceName("view", Builder.viewNamespace)
result
}
diff --git a/core/src/main/scala/chisel3/experimental/package.scala b/core/src/main/scala/chisel3/experimental/package.scala
index 9b9c83f4..b1d9cae4 100644
--- a/core/src/main/scala/chisel3/experimental/package.scala
+++ b/core/src/main/scala/chisel3/experimental/package.scala
@@ -160,8 +160,42 @@ package object experimental {
* }
* }}}
*/
+ @deprecated(
+ "@chiselName and NoChiselNamePrefix have been replaced by the compiler plugin and AffectsChiselPrefix. Use these instead",
+ "Chisel 3.5"
+ )
trait NoChiselNamePrefix
+ /** Generate prefixes from values of this type in the Chisel compiler plugin
+ *
+ * Users can mixin this trait to tell the Chisel compiler plugin to include the names of
+ * vals of this type when generating prefixes for naming `Data` and `Mem` instances.
+ * This is generally useful whenever creating a `class` that contains `Data`, `Mem`,
+ * or `Module` instances but does not itself extend `Data` or `Module`.
+ *
+ * @see See [[https://www.chisel-lang.org/chisel3/docs/explanations/naming.html the compiler plugin documentation]] for more information on this process.
+ *
+ * @example {{{
+ * import chisel3._
+ * import chisel3.experimental.AffectsChiselPrefix
+ *
+ * class MyModule extends Module {
+ * // Note: This contains a Data but is not a named component itself
+ * class NotAData extends AffectsChiselPrefix {
+ * val value = Wire(Bool())
+ * }
+ *
+ * // Name with AffectsChiselPrefix: "nonData_value"
+ * // Name without AffectsChiselPrefix: "value"
+ * val nonData = new NotAData
+ *
+ * // Name with AffectsChiselPrefix: "nonData2_value"
+ * // Name without AffectsChiselPrefix: "value_1"
+ * val nonData2 = new NotAData
+ * }
+ */
+ trait AffectsChiselPrefix
+
object BundleLiterals {
implicit class AddBundleLiteralConstructor[T <: Record](x: T) {
def Lit(elems: (T => (Data, Data))*)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): T = {