diff options
| author | Schuyler Eldridge | 2020-02-07 14:57:51 -0500 |
|---|---|---|
| committer | Schuyler Eldridge | 2020-02-10 12:57:50 -0500 |
| commit | 64762d2e064917233b24d193e487fc6a03f11ad2 (patch) | |
| tree | c01fbfb8347184f3acd940b261618dfab8d37a98 /src | |
| parent | 72427067ebb870d021b748d55fe09aa9761f6410 (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.scala | 13 |
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) } } |
