From 479e63c1ce56854496ee7c1c88f20d9ffab5a9a2 Mon Sep 17 00:00:00 2001 From: John Wright Date: Mon, 12 Jul 2021 00:44:51 -0700 Subject: [PATCH] Fix bug that prunes InstanceTargets out of the AnnotationSeq in ReParentCircuit --- .../tapeout/transforms/ReParentCircuit.scala | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/tapeout/src/main/scala/barstools/tapeout/transforms/ReParentCircuit.scala b/tapeout/src/main/scala/barstools/tapeout/transforms/ReParentCircuit.scala index 10356176..9043e0b1 100644 --- a/tapeout/src/main/scala/barstools/tapeout/transforms/ReParentCircuit.scala +++ b/tapeout/src/main/scala/barstools/tapeout/transforms/ReParentCircuit.scala @@ -7,6 +7,7 @@ import firrtl.annotations._ import firrtl.options.Dependency import firrtl.stage.Forms import firrtl.stage.TransformManager.TransformDependency +import firrtl.annotations.TargetToken.{Instance, OfModule} case class ReParentCircuitAnnotation(target: ModuleTarget) extends SingleTargetAnnotation[ModuleTarget] { def duplicate(n: ModuleTarget) = this.copy(n) @@ -32,6 +33,27 @@ class ReParentCircuit extends Transform with DependencyAPIMigration { rmap.record(CircuitTarget(c.main), CircuitTarget(s)) rmap } - state.copy(circuit = newCircuit, renames = mainRename) + + val newAnnotations = newTopName.map({ topName => + // Update InstanceTargets + def updateInstanceTarget(t: InstanceTarget): Option[InstanceTarget] = { + val idx = t.path.lastIndexWhere(_._2.value == topName) + if (idx == -1) Some(t.copy(circuit=topName)) else Some(t.copy(circuit=topName, module=topName, path=t.path.drop(idx+1))) + } + + AnnotationSeq(state.annotations.toSeq.map({ + case x: SingleTargetAnnotation[InstanceTarget] if x.target.isInstanceOf[InstanceTarget] => + updateInstanceTarget(x.target).map(y => x.duplicate(y)) + case x: MultiTargetAnnotation => + val newTargets: Seq[Seq[Option[Target]]] = x.targets.map(_.map({ + case y: InstanceTarget => updateInstanceTarget(y) + case y => Some(y) + })) + if (newTargets.flatten.forall(_.isDefined)) Some(x.duplicate(newTargets.map(_.map(_.get)))) else None + case x => Some(x) + }).filter(_.isDefined).map(_.get)) + }).getOrElse(state.annotations) + + state.copy(circuit = newCircuit, renames = mainRename, annotations = newAnnotations) } }