summaryrefslogtreecommitdiff
path: root/src/main/scala/Chisel/Namespace.scala
diff options
context:
space:
mode:
authorHenry Cook2015-08-13 02:22:25 -0700
committerHenry Cook2015-08-13 02:22:25 -0700
commitd2b902380492ad0678234f7119f02f23f57a2b2b (patch)
treef9460969b8348bdafcd6df88b0477522d11af96a /src/main/scala/Chisel/Namespace.scala
parent976ff1439f51afc08c61ff39ecf0ad2e71a88e2a (diff)
refactor Namespace
Diffstat (limited to 'src/main/scala/Chisel/Namespace.scala')
-rw-r--r--src/main/scala/Chisel/Namespace.scala42
1 files changed, 16 insertions, 26 deletions
diff --git a/src/main/scala/Chisel/Namespace.scala b/src/main/scala/Chisel/Namespace.scala
index 9d867bdd..adcd9259 100644
--- a/src/main/scala/Chisel/Namespace.scala
+++ b/src/main/scala/Chisel/Namespace.scala
@@ -1,35 +1,25 @@
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
+private class Namespace(parent: Option[Namespace], keywords: Option[Set[String]]) {
+ private var i = 0L
+ private val names = collection.mutable.HashSet[String]()
+ def forbidden = keywords.getOrElse(Set()) ++ names
- protected final def nameExistsHere(n: String): Boolean =
- names contains n
+ private def rename(n: String) = { i += 1; s"${n}_${i}" }
- private def rename(n: String): String = {
- i += 1
- s"${n}_${i}"
+ def contains(elem: String): Boolean = {
+ forbidden.contains(elem) ||
+ parent.map(_ contains elem).getOrElse(false)
}
- 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)
-}
+ def name(elem: String): String = {
+ val res = if(forbidden contains elem) rename(elem) else elem
+ names += res
+ res
+ }
-class ChildNamespace(parent: Namespace) extends Namespace {
- def nameExists(n: String) = nameExistsHere(n) || parent.nameExists(n)
+ def child(ks: Option[Set[String]]): Namespace = new Namespace(Some(this), ks)
+ def child: Namespace = new Namespace(Some(this), None)
}
-class FIRRTLNamespace extends RootNamespace("mem", "node", "wire", "reg", "inst")
+private class FIRRTLNamespace extends Namespace(None, Some(Set("mem", "node", "wire", "reg", "inst")))