summaryrefslogtreecommitdiff
path: root/chiselFrontend/src/main
diff options
context:
space:
mode:
authorAndrew Waterman2016-06-15 10:54:15 -0700
committerGitHub2016-06-15 10:54:15 -0700
commitb5a534914795d9d17f4dfe623525f1b804e4c60f (patch)
treefa36344015f7868238fc8c5b0b9d09120cf48f5c /chiselFrontend/src/main
parent07fa5622ccc995f925d6d967d2a386540c9064cc (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.
Diffstat (limited to 'chiselFrontend/src/main')
-rw-r--r--chiselFrontend/src/main/scala/chisel/internal/Builder.scala19
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
}
}