diff options
| author | Henry Cook | 2015-08-13 02:22:25 -0700 |
|---|---|---|
| committer | Henry Cook | 2015-08-13 02:22:25 -0700 |
| commit | d2b902380492ad0678234f7119f02f23f57a2b2b (patch) | |
| tree | f9460969b8348bdafcd6df88b0477522d11af96a /src/main | |
| parent | 976ff1439f51afc08c61ff39ecf0ad2e71a88e2a (diff) | |
refactor Namespace
Diffstat (limited to 'src/main')
| -rw-r--r-- | src/main/scala/Chisel/Builder.scala | 4 | ||||
| -rw-r--r-- | src/main/scala/Chisel/Core.scala | 4 | ||||
| -rw-r--r-- | src/main/scala/Chisel/Namespace.scala | 42 |
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"))) |
