summaryrefslogtreecommitdiff
path: root/src/main
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
parent976ff1439f51afc08c61ff39ecf0ad2e71a88e2a (diff)
refactor Namespace
Diffstat (limited to 'src/main')
-rw-r--r--src/main/scala/Chisel/Builder.scala4
-rw-r--r--src/main/scala/Chisel/Core.scala4
-rw-r--r--src/main/scala/Chisel/Namespace.scala42
3 files changed, 20 insertions, 30 deletions
diff --git a/src/main/scala/Chisel/Builder.scala b/src/main/scala/Chisel/Builder.scala
index 511fea78..723470d0 100644
--- a/src/main/scala/Chisel/Builder.scala
+++ b/src/main/scala/Chisel/Builder.scala
@@ -16,9 +16,9 @@ class RefMap {
def setRef(id: Id, ref: Immediate): Unit =
_refmap(id._id) = ref
- def setRefForId(id: Id, name: String)(implicit namespace: Namespace = Builder.globalNamespace): Unit =
+ def setRefForId(id: Id, name: String): Unit =
if (!_refmap.contains(id._id))
- setRef(id, Ref(namespace.name(name)))
+ setRef(id, Ref(Builder.globalNamespace.name(name)))
def setFieldForId(parentid: Id, id: Id, name: String): Unit = {
_refmap(id._id) = Slot(Alias(parentid), name)
diff --git a/src/main/scala/Chisel/Core.scala b/src/main/scala/Chisel/Core.scala
index 7ef9c896..c30b2704 100644
--- a/src/main/scala/Chisel/Core.scala
+++ b/src/main/scala/Chisel/Core.scala
@@ -659,7 +659,7 @@ object Bundle {
}
class Bundle extends Aggregate(NO_DIR) {
- private implicit val _namespace = new ChildNamespace(Builder.globalNamespace)
+ private implicit val _namespace = Builder.globalNamespace.child
override def <> (that: Data): Unit = that match {
case _: Bundle => this bulkConnect that
@@ -732,7 +732,7 @@ object Module {
}
abstract class Module(_clock: Clock = null, _reset: Bool = null) extends Id {
- private implicit val _namespace = new ChildNamespace(Builder.globalNamespace)
+ private implicit val _namespace = Builder.globalNamespace.child
private[Chisel] val _commands = ArrayBuffer[Command]()
private[Chisel] val _nodes = ArrayBuffer[Data]()
private[Chisel] val _children = ArrayBuffer[Module]()
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")))