aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/passes
diff options
context:
space:
mode:
authorJack Koenig2021-05-18 14:54:59 -0700
committerGitHub2021-05-18 14:54:59 -0700
commite0844966cbd2eb44b66c8bf341fa26370e3b4f1c (patch)
treeae71ed0eb031e5b292c493c67aa01b1ec85afd3d /src/main/scala/firrtl/passes
parent97273bff5718cbcbce2673d57bce1a76ec909977 (diff)
Improve performance of RenameMap in LowerTypes (#2233)
LowerTypes creates a lot of mappings for the RenameMap. The built-in .distinct of renames becomes a performance program for designs with deeply nested Aggregates. Because LowerTypes does not create duplicate renames, it can safely eschew the safety of using .distinct via a private internal API.
Diffstat (limited to 'src/main/scala/firrtl/passes')
-rw-r--r--src/main/scala/firrtl/passes/LowerTypes.scala7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/main/scala/firrtl/passes/LowerTypes.scala b/src/main/scala/firrtl/passes/LowerTypes.scala
index 0bd44a8c..7ba320d0 100644
--- a/src/main/scala/firrtl/passes/LowerTypes.scala
+++ b/src/main/scala/firrtl/passes/LowerTypes.scala
@@ -75,7 +75,12 @@ object LowerTypes extends Transform with DependencyAPIMigration {
val memInitByModule = memInitAnnos.map(_.asInstanceOf[MemoryInitAnnotation]).groupBy(_.target.encapsulatingModule)
val c = CircuitTarget(state.circuit.main)
- val refRenameMap = RenameMap()
+ // By default, the RenameMap enforces a .distinct invariant for renames. This helps transform
+ // writers not mess up because violating that invariant can cause problems for transform
+ // writers. Unfortunately, when you have lots of renames, this is very expensive
+ // performance-wise. We use a private internal API that does not run .distinct to improve
+ // performance, but we must be careful to not insert any duplicates.
+ val refRenameMap = RenameMap.noDistinct()
val resultAndRenames =
state.circuit.modules.map(m => onModule(c, m, memInitByModule.getOrElse(m.name, Seq()), refRenameMap))
val result = state.circuit.copy(modules = resultAndRenames.map(_._1))