From e1d3a0c64a48b4c9999ad59f15922db7c155c361 Mon Sep 17 00:00:00 2001 From: Schuyler Eldridge Date: Wed, 12 Aug 2020 23:02:04 -0400 Subject: 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 * Update ScalaTests Co-authored-by: Jack Koenig Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>--- .../transforms/CleanupNamedTargets.scala | 66 ++++++++++++++++++++++ src/main/scala/firrtl/stage/Forms.scala | 3 +- 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/main/scala/firrtl/annotations/transforms/CleanupNamedTargets.scala (limited to 'src/main') 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) -- cgit v1.2.3