Fix bug that prunes InstanceTargets out of the AnnotationSeq in ReParentCircuit
This commit is contained in:
@@ -7,6 +7,7 @@ import firrtl.annotations._
|
|||||||
import firrtl.options.Dependency
|
import firrtl.options.Dependency
|
||||||
import firrtl.stage.Forms
|
import firrtl.stage.Forms
|
||||||
import firrtl.stage.TransformManager.TransformDependency
|
import firrtl.stage.TransformManager.TransformDependency
|
||||||
|
import firrtl.annotations.TargetToken.{Instance, OfModule}
|
||||||
|
|
||||||
case class ReParentCircuitAnnotation(target: ModuleTarget) extends SingleTargetAnnotation[ModuleTarget] {
|
case class ReParentCircuitAnnotation(target: ModuleTarget) extends SingleTargetAnnotation[ModuleTarget] {
|
||||||
def duplicate(n: ModuleTarget) = this.copy(n)
|
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.record(CircuitTarget(c.main), CircuitTarget(s))
|
||||||
rmap
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user