aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorSchuyler Eldridge2020-08-12 23:02:04 -0400
committerGitHub2020-08-13 03:02:04 +0000
commite1d3a0c64a48b4c9999ad59f15922db7c155c361 (patch)
treeef073449b902ffe8b729b78b1bfc828fe1aca9e6 /src/main
parent8bcea45b66b2bc191ab2e25ace340202c0aa2aec (diff)
Cleanup Named Targets (#1311)
* Add CleanupNamedTargets Transform Adds a new transform, CleanupNamedTargets, that will convert ReferenceTargets to InstanceTargets if any ReferenceTargets are found to be actually pointing at instances. This fixes an issue where a ComponentName pointing at an instance will be converted to a ReferenceTarget. Later on, this ReferenceTarget will not be properly renamed by other transforms, e.g., EliminateTargetPaths. Signed-off-by: Schuyler Eldridge <schuyler.eldridge@ibm.com> * Update ScalaTests Co-authored-by: Jack Koenig <koenig@sifive.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Diffstat (limited to 'src/main')
-rw-r--r--src/main/scala/firrtl/annotations/transforms/CleanupNamedTargets.scala66
-rw-r--r--src/main/scala/firrtl/stage/Forms.scala3
2 files changed, 68 insertions, 1 deletions
diff --git a/src/main/scala/firrtl/annotations/transforms/CleanupNamedTargets.scala b/src/main/scala/firrtl/annotations/transforms/CleanupNamedTargets.scala
new file mode 100644
index 00000000..a4219a03
--- /dev/null
+++ b/src/main/scala/firrtl/annotations/transforms/CleanupNamedTargets.scala
@@ -0,0 +1,66 @@
+// See LICENSE for license details.
+
+package firrtl.annotations.transforms
+
+import firrtl._
+import firrtl.annotations.{CircuitTarget, ModuleTarget, MultiTargetAnnotation, ReferenceTarget, SingleTargetAnnotation}
+import firrtl.ir
+import firrtl.options.{Dependency, PreservesAll}
+import firrtl.traversals.Foreachers._
+
+import scala.collection.immutable.{Set => ISet}
+
+/** Replaces all [[firrtl.annotations.ReferenceTarget ReferenceTargets]] pointing at instances with
+ * [[firrtl.annotations.InstanceTarget InstanceTargets]].
+ *
+ * @note This exists because of [[firrtl.annotations.Named Named]] where a [[firrtl.annotations.ComponentName
+ * ComponentName]] is the only way to refer to an instance, but this is resolved incorrectly to a
+ * [[firrtl.annotations.ReferenceTarget ReferenceTarget]].
+ */
+class CleanupNamedTargets extends Transform with DependencyAPIMigration {
+
+ override def prerequisites = Seq(Dependency(passes.RemoveCHIRRTL))
+
+ override def optionalPrerequisites = Seq.empty
+
+ override def optionalPrerequisiteOf = Seq.empty
+
+ override def invalidates(a: Transform) = false
+
+ private def onStatement(statement: ir.Statement)
+ (implicit references: ISet[ReferenceTarget],
+ renameMap: RenameMap,
+ module: ModuleTarget): Unit = statement match {
+ case ir.DefInstance(_, a, b, _) if references(module.instOf(a, b).asReference) =>
+ renameMap.record(module.instOf(a, b).asReference, module.instOf(a, b))
+ case a => statement.foreach(onStatement)
+ }
+
+ private def onModule(module: ir.DefModule)
+ (implicit references: ISet[ReferenceTarget],
+ renameMap: RenameMap,
+ circuit: CircuitTarget): Unit = {
+ implicit val mTarget = circuit.module(module.name)
+ module.foreach(onStatement)
+ }
+
+ override protected def execute(state: CircuitState): CircuitState = {
+
+ implicit val rTargets: ISet[ReferenceTarget] = state.annotations.flatMap {
+ case a: SingleTargetAnnotation[_] => Some(a.target)
+ case a: MultiTargetAnnotation => a.targets.flatten
+ case _ => None
+ }.collect {
+ case a: ReferenceTarget => a
+ }.toSet
+
+ implicit val renameMap = RenameMap()
+
+ implicit val cTarget = CircuitTarget(state.circuit.main)
+
+ state.circuit.foreach(onModule)
+
+ state.copy(renames = Some(renameMap))
+ }
+
+}
diff --git a/src/main/scala/firrtl/stage/Forms.scala b/src/main/scala/firrtl/stage/Forms.scala
index 55292fc5..636d0609 100644
--- a/src/main/scala/firrtl/stage/Forms.scala
+++ b/src/main/scala/firrtl/stage/Forms.scala
@@ -20,7 +20,8 @@ object Forms {
Seq( Dependency(passes.CheckChirrtl),
Dependency(passes.CInferTypes),
Dependency(passes.CInferMDir),
- Dependency(passes.RemoveCHIRRTL) )
+ Dependency(passes.RemoveCHIRRTL),
+ Dependency[annotations.transforms.CleanupNamedTargets] )
val WorkingIR: Seq[TransformDependency] = MinimalHighForm :+ Dependency(passes.ToWorkingIR)