diff options
| author | Henry Cook | 2015-08-13 12:34:36 -0700 |
|---|---|---|
| committer | Henry Cook | 2015-08-13 12:34:36 -0700 |
| commit | 91a01936c79a6c529c48c8ea4a1dd1ff4d43b649 (patch) | |
| tree | b6f591213a2211d1a98a0889a53794f82a752876 /src/main/scala | |
| parent | 0b4dc5457433659e52a8c36f043435762be94309 (diff) | |
fix recusion bug in Namespace
Diffstat (limited to 'src/main/scala')
| -rw-r--r-- | src/main/scala/Chisel/Builder.scala | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/main/scala/Chisel/Builder.scala b/src/main/scala/Chisel/Builder.scala index cbc94e93..fb3d600e 100644 --- a/src/main/scala/Chisel/Builder.scala +++ b/src/main/scala/Chisel/Builder.scala @@ -2,25 +2,26 @@ package Chisel import scala.util.DynamicVariable import scala.collection.mutable.{ArrayBuffer, HashMap} -private class Namespace(parent: Option[Namespace], keywords: Option[Set[String]]) { +class Namespace(parent: Option[Namespace], kws: Option[Set[String]]) { private var i = 0L private val names = collection.mutable.HashSet[String]() - def forbidden = keywords.getOrElse(Set()) ++ names + private val keywords = kws.getOrElse(Set()) private def rename(n: String) = { i += 1; s"${n}_${i}" } def contains(elem: String): Boolean = { - forbidden.contains(elem) || - parent.map(_ contains elem).getOrElse(false) + keywords.contains(elem) || + names.contains(elem) || + parent.map(_ contains elem).getOrElse(false) } def name(elem: String): String = { - val res = if(forbidden contains elem) rename(elem) else elem + val res = if(this contains elem) rename(elem) else elem names += res res } - def child(ks: Option[Set[String]]): Namespace = new Namespace(Some(this), ks) + def child(kws: Option[Set[String]]): Namespace = new Namespace(Some(this), kws) def child: Namespace = new Namespace(Some(this), None) } @@ -38,7 +39,8 @@ trait HasId { private[Chisel] val _id = Builder.idGen.next def setRef() = Builder.globalRefMap.setRef(this, s"T_${_id}") def setRef(imm: Immediate) = Builder.globalRefMap.setRef(this, imm) - def setRef(name: String) = Builder.globalRefMap.setRef(this, name) + def setRef(name: String)(implicit namespace: Namespace = Builder.globalNamespace) = + Builder.globalRefMap.setRef(this, name)(namespace) def setRef(parent: HasId, name: String) = Builder.globalRefMap.setField(parent, this, name) def setRef(parent: HasId, index: Int) = Builder.globalRefMap.setIndex(parent, this, index) } @@ -49,9 +51,9 @@ class RefMap { def setRef(id: HasId, ref: Immediate): Unit = _refmap(id._id) = ref - def setRef(id: HasId, name: String): Unit = + def setRef(id: HasId, name: String)(implicit namespace: Namespace = Builder.globalNamespace): Unit = if (!_refmap.contains(id._id)) - setRef(id, Ref(Builder.globalNamespace.name(name))) + setRef(id, Ref(namespace.name(name))) def setField(parentid: HasId, id: HasId, name: String): Unit = { _refmap(id._id) = Slot(Alias(parentid), name) |
