summaryrefslogtreecommitdiff
path: root/src/main/scala/Chisel/Namespace.scala
blob: adcd9259cd89eb37c95c095c676ae07bed3bd95a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package Chisel

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")))