diff options
| author | Henry Cook | 2015-08-13 11:37:11 -0700 |
|---|---|---|
| committer | Henry Cook | 2015-08-13 11:37:11 -0700 |
| commit | 0b4dc5457433659e52a8c36f043435762be94309 (patch) | |
| tree | 7b0e38edfffe7779d01cb97f78b35092c6877074 /src/main/scala/Chisel/Builder.scala | |
| parent | d2b902380492ad0678234f7119f02f23f57a2b2b (diff) | |
clean up Id and Builder.globalRefMap
Diffstat (limited to 'src/main/scala/Chisel/Builder.scala')
| -rw-r--r-- | src/main/scala/Chisel/Builder.scala | 45 |
1 files changed, 39 insertions, 6 deletions
diff --git a/src/main/scala/Chisel/Builder.scala b/src/main/scala/Chisel/Builder.scala index 723470d0..cbc94e93 100644 --- a/src/main/scala/Chisel/Builder.scala +++ b/src/main/scala/Chisel/Builder.scala @@ -2,6 +2,30 @@ package Chisel import scala.util.DynamicVariable import scala.collection.mutable.{ArrayBuffer, HashMap} +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 + + private def rename(n: String) = { i += 1; s"${n}_${i}" } + + def contains(elem: String): Boolean = { + forbidden.contains(elem) || + parent.map(_ contains elem).getOrElse(false) + } + + def name(elem: String): String = { + val res = if(forbidden contains elem) rename(elem) else elem + names += res + res + } + + def child(ks: Option[Set[String]]): Namespace = new Namespace(Some(this), ks) + def child: Namespace = new Namespace(Some(this), None) +} + +private class FIRRTLNamespace extends Namespace(None, Some(Set("mem", "node", "wire", "reg", "inst"))) + private class IdGen { private var counter = -1L def next: Long = { @@ -10,24 +34,33 @@ private class IdGen { } } +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(parent: HasId, name: String) = Builder.globalRefMap.setField(parent, this, name) + def setRef(parent: HasId, index: Int) = Builder.globalRefMap.setIndex(parent, this, index) +} + class RefMap { private val _refmap = new HashMap[Long,Immediate]() - def setRef(id: Id, ref: Immediate): Unit = + def setRef(id: HasId, ref: Immediate): Unit = _refmap(id._id) = ref - def setRefForId(id: Id, name: String): Unit = + def setRef(id: HasId, name: String): Unit = if (!_refmap.contains(id._id)) setRef(id, Ref(Builder.globalNamespace.name(name))) - def setFieldForId(parentid: Id, id: Id, name: String): Unit = { + def setField(parentid: HasId, id: HasId, name: String): Unit = { _refmap(id._id) = Slot(Alias(parentid), name) } - def setIndexForId(parentid: Id, id: Id, index: Int): Unit = + def setIndex(parentid: HasId, id: HasId, index: Int): Unit = _refmap(id._id) = Index(Alias(parentid), index) - def apply(id: Id): Immediate = _refmap(id._id) + def apply(id: HasId): Immediate = _refmap(id._id) } private class DynamicContext { @@ -76,7 +109,7 @@ private object Builder { def build[T <: Module](f: => T): Circuit = { dynamicContextVar.withValue(Some(new DynamicContext)) { val mod = f - globalRefMap.setRefForId(mod, mod.name) + mod.setRef(mod.name) Circuit(components.last.name, components, globalRefMap, parameterDump) } } |
