diff options
| author | Andrew Waterman | 2016-06-15 10:54:15 -0700 |
|---|---|---|
| committer | GitHub | 2016-06-15 10:54:15 -0700 |
| commit | b5a534914795d9d17f4dfe623525f1b804e4c60f (patch) | |
| tree | fa36344015f7868238fc8c5b0b9d09120cf48f5c | |
| parent | 07fa5622ccc995f925d6d967d2a386540c9064cc (diff) | |
Generate better node names when names collide (#221)
Rather than using a global counter, memoize the last returned value for
colliding names to generate smaller sequence numbers.
| -rw-r--r-- | chiselFrontend/src/main/scala/chisel/internal/Builder.scala | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/chiselFrontend/src/main/scala/chisel/internal/Builder.scala b/chiselFrontend/src/main/scala/chisel/internal/Builder.scala index 9c0a3514..01628105 100644 --- a/chiselFrontend/src/main/scala/chisel/internal/Builder.scala +++ b/chiselFrontend/src/main/scala/chisel/internal/Builder.scala @@ -10,21 +10,26 @@ import core._ import firrtl._ private[chisel] class Namespace(parent: Option[Namespace], keywords: Set[String]) { - private var i = 0L - private val names = collection.mutable.HashSet[String]() - - private def rename(n: String) = { i += 1; s"${n}_${i}" } + private val names = collection.mutable.HashMap[String, Long]() + for (keyword <- keywords) + names(keyword) = 1 + + private def rename(n: String): String = { + val index = names.getOrElse(n, 1L) + val tryName = s"${n}_${index}" + names(n) = index + 1 + if (this contains tryName) rename(n) else tryName + } def contains(elem: String): Boolean = { - keywords.contains(elem) || names.contains(elem) || - parent.map(_ contains elem).getOrElse(false) + names.contains(elem) || parent.map(_ contains elem).getOrElse(false) } def name(elem: String): String = { if (this contains elem) { name(rename(elem)) } else { - names += elem + names(elem) = 1 elem } } |
