diff options
| author | Andrew Waterman | 2015-07-31 04:37:16 -0700 |
|---|---|---|
| committer | Andrew Waterman | 2015-07-31 04:37:16 -0700 |
| commit | 311059b32639deb20d13e03d8e31182b364716cc (patch) | |
| tree | d574e895065bed0df3ec915d20554605d5b5acb2 /src/main/scala/Chisel/Namespace.scala | |
| parent | 3ea058aff4eef3fc7ed928fcaf848eb9dff7f702 (diff) | |
Open heart surgery on IDs/naming
This commit institutes a more structured system for managing namespaces.
It fixes a handful of namespace collision bugs, and also improves
performance by abandoning ungainly string-based IDs.
Diffstat (limited to 'src/main/scala/Chisel/Namespace.scala')
| -rw-r--r-- | src/main/scala/Chisel/Namespace.scala | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/main/scala/Chisel/Namespace.scala b/src/main/scala/Chisel/Namespace.scala new file mode 100644 index 00000000..9d867bdd --- /dev/null +++ b/src/main/scala/Chisel/Namespace.scala @@ -0,0 +1,35 @@ +package Chisel + +abstract class Namespace { + final def name(n: String): String = { + if (nameExists(n)) name(rename(n)) + else { + names += n + n + } + } + + def nameExists(n: String): Boolean + + protected final def nameExistsHere(n: String): Boolean = + names contains n + + private def rename(n: String): String = { + i += 1 + s"${n}_${i}" + } + + private var i = 0L + protected val names = collection.mutable.HashSet[String]() +} + +class RootNamespace(initialNames: String*) extends Namespace { + names ++= initialNames + def nameExists(n: String) = nameExistsHere(n) +} + +class ChildNamespace(parent: Namespace) extends Namespace { + def nameExists(n: String) = nameExistsHere(n) || parent.nameExists(n) +} + +class FIRRTLNamespace extends RootNamespace("mem", "node", "wire", "reg", "inst") |
