diff options
| author | Schuyler Eldridge | 2020-08-12 23:02:04 -0400 |
|---|---|---|
| committer | GitHub | 2020-08-13 03:02:04 +0000 |
| commit | e1d3a0c64a48b4c9999ad59f15922db7c155c361 (patch) | |
| tree | ef073449b902ffe8b729b78b1bfc828fe1aca9e6 /src/main | |
| parent | 8bcea45b66b2bc191ab2e25ace340202c0aa2aec (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.scala | 66 | ||||
| -rw-r--r-- | src/main/scala/firrtl/stage/Forms.scala | 3 |
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) |
