diff options
Diffstat (limited to 'src/main/scala/firrtl/Namespace.scala')
| -rw-r--r-- | src/main/scala/firrtl/Namespace.scala | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/main/scala/firrtl/Namespace.scala b/src/main/scala/firrtl/Namespace.scala new file mode 100644 index 00000000..01cc59fd --- /dev/null +++ b/src/main/scala/firrtl/Namespace.scala @@ -0,0 +1,87 @@ +/* +Copyright (c) 2014 - 2016 The Regents of the University of +California (Regents). All Rights Reserved. Redistribution and use in +source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + * Redistributions of source code must retain the above + copyright notice, this list of conditions and the following + two paragraphs of disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + two paragraphs of disclaimer in the documentation and/or other materials + provided with the distribution. + * Neither the name of the Regents nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. +IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, +SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF +REGENTS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF +ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION +TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +MODIFICATIONS. +*/ + +package firrtl + +import scala.collection.mutable.HashSet +import Mappers._ + +class Namespace private { + private val tempNamePrefix: String = "GEN" + // Begin with a tempNamePrefix in namespace so we always have a number suffix + private val namespace = HashSet[String](tempNamePrefix) + private var n = 0L + + def tryName(value: String): Boolean = { + if (!namespace.contains(value)) { + namespace += value + true + } else { + false + } + } + def newName(value: String): String = { + var str = value + while (!tryName(str)) { + str = s"${value}_$n" + n += 1 + } + str + } + def newTemp: String = newName(tempNamePrefix) +} + +object Namespace { + def apply(): Namespace = new Namespace + + // Initializes a namespace from a Module + def apply(m: Module): Namespace = { + val namespace = new Namespace + + def buildNamespaceStmt(s: Stmt): Stmt = + s map buildNamespaceStmt match { + case dec: IsDeclaration => + namespace.namespace += dec.name + dec + case x => x + } + def buildNamespacePort(p: Port): Port = p match { + case dec: IsDeclaration => + namespace.namespace += dec.name + dec + case x => x + } + m.ports map buildNamespacePort + m match { + case in: InModule => buildNamespaceStmt(in.body) + case _ => // Do nothing + } + + namespace + } +} + |
