From 64762d2e064917233b24d193e487fc6a03f11ad2 Mon Sep 17 00:00:00 2001 From: Schuyler Eldridge Date: Fri, 7 Feb 2020 14:57:51 -0500 Subject: 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 --- .../annotations/transforms/EliminateTargetPaths.scala | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src') 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) } } -- cgit v1.2.3