aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSchuyler Eldridge2020-02-07 14:57:51 -0500
committerSchuyler Eldridge2020-02-10 12:57:50 -0500
commit64762d2e064917233b24d193e487fc6a03f11ad2 (patch)
treec01fbfb8347184f3acd940b261618dfab8d37a98 /src
parent72427067ebb870d021b748d55fe09aa9761f6410 (diff)
Rename modules when duplicating instances
Change the behavior of EliminateTargetPaths to generate ModuleTarget renames when instances are duplicated. Previously, only InstanceTarget renames would be generated. In effect, annotations targeting a duplicated module when be duplicated to point at the original and duplicated module. Signed-off-by: Schuyler Eldridge <schuyler.eldridge@ibm.com>
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/firrtl/annotations/transforms/EliminateTargetPaths.scala13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/main/scala/firrtl/annotations/transforms/EliminateTargetPaths.scala b/src/main/scala/firrtl/annotations/transforms/EliminateTargetPaths.scala
index 2f20430b..e40b80f8 100644
--- a/src/main/scala/firrtl/annotations/transforms/EliminateTargetPaths.scala
+++ b/src/main/scala/firrtl/annotations/transforms/EliminateTargetPaths.scala
@@ -4,6 +4,7 @@ package firrtl.annotations.transforms
import firrtl.Mappers._
import firrtl.analyses.InstanceGraph
+import firrtl.annotations.ModuleTarget
import firrtl.annotations.TargetToken.{Instance, OfModule}
import firrtl.annotations.analysis.DuplicationHelper
import firrtl.annotations._
@@ -114,16 +115,26 @@ class EliminateTargetPaths extends Transform {
val finalModuleList = duplicatedModuleList.filter(m =>
newUsedOfModules.contains(m.name) || (!newUsedOfModules.contains(m.name) && !oldUsedOfModules.contains(m.name))
)
+ lazy val finalModuleSet = finalModuleList.map{ case a: DefModule => a.name }.toSet
// Records how targets have been renamed
val renameMap = RenameMap()
- // Foreach target, calculate the pathless version and only rename targets that are instantiated
+ /* Foreach target, calculate the pathless version and only rename targets that are instantiated. Additionally, rename
+ * module targets
+ */
targets.foreach { t =>
val newTsx = dupMap.makePathless(t)
val newTs = newTsx.filter(c => newUsedOfModules.contains(c.moduleOpt.get))
if(newTs.nonEmpty) {
renameMap.record(t, newTs)
+ val m = Target.referringModule(t)
+ val duplicatedModules = newTs.map(Target.referringModule)
+ val oldModule: Option[ModuleTarget] = m match {
+ case a: ModuleTarget if finalModuleSet(a.module) => Some(a)
+ case _ => None
+ }
+ renameMap.record(m, (duplicatedModules ++ oldModule).distinct)
}
}