summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorJack Koenig2020-10-19 11:48:46 -0700
committerGitHub2020-10-19 18:48:46 +0000
commitfef0b68a465875ab74b2b1339b29254c762d3c53 (patch)
tree4bcca91460d12dccc6879094fcc34079a54c433b /core
parentac641fb183e3a8866e6bd72123801cfb04a0c893 (diff)
Change prefix stack to List[String] (#1617)
This allows for sharing of the prefix stacks between Data, and removes a boxing per prefix stack element that is no longer necessary. Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Diffstat (limited to 'core')
-rw-r--r--core/src/main/scala/chisel3/internal/Builder.scala39
1 files changed, 18 insertions, 21 deletions
diff --git a/core/src/main/scala/chisel3/internal/Builder.scala b/core/src/main/scala/chisel3/internal/Builder.scala
index d6a44708..ffa99913 100644
--- a/core/src/main/scala/chisel3/internal/Builder.scala
+++ b/core/src/main/scala/chisel3/internal/Builder.scala
@@ -99,7 +99,7 @@ private[chisel3] trait HasId extends InstanceId {
private val construction_prefix: Prefix = Builder.getPrefix()
// Prefix when the latest [[suggestSeed]] or [[autoSeed]] is called
- private var prefix_seed: Prefix = List.empty[Either[String, Data]]
+ private var prefix_seed: Prefix = Nil
// Post-seed hooks called to carry the suggested seeds to other candidates as needed
private val suggest_postseed_hooks = scala.collection.mutable.ListBuffer.empty[String=>Unit]
@@ -156,21 +156,18 @@ private[chisel3] trait HasId extends InstanceId {
*/
def buildName(seed: String, prefix: Prefix): String = {
val builder = new StringBuilder()
- prefix.foreach {
- case Left(s: String) => builder ++= s + "_"
- case other => Builder.exception(s"Only Strings should exist in Prefixes, got $other")
- }
+ prefix.foreach(builder ++= _ + "_")
builder ++= seed
builder.toString
}
if (hasSeed) {
- Some(buildName(seedOpt.get, prefix_seed))
+ Some(buildName(seedOpt.get, prefix_seed.reverse))
} else {
defaultSeed.map { default =>
defaultPrefix match {
- case Some(p) => buildName(default, Left(p) +: construction_prefix)
- case None => buildName(default, construction_prefix)
+ case Some(p) => buildName(default, p :: construction_prefix.reverse)
+ case None => buildName(default, construction_prefix.reverse)
}
}
}
@@ -295,7 +292,7 @@ private[chisel3] class ChiselContext() {
val bundleStack: ArrayBuffer[(Bundle, String, String, Int)] = ArrayBuffer()
// Records the different prefixes which have been scoped at this point in time
- val prefixStack: ArrayBuffer[Either[String, HasId]] = ArrayBuffer()
+ var prefixStack: Prefix = Nil
}
private[chisel3] class DynamicContext() {
@@ -322,7 +319,7 @@ private[chisel3] class DynamicContext() {
private[chisel3] object Builder {
// Represents the current state of the prefixes given
- type Prefix = List[Either[String, Data]]
+ type Prefix = List[String]
// All global mutable state must be referenced via dynamicContextVar!!
private val dynamicContextVar = new DynamicVariable[Option[DynamicContext]](None)
@@ -361,7 +358,8 @@ private[chisel3] object Builder {
// Puts a prefix string onto the prefix stack
def pushPrefix(d: String): Unit = {
- chiselContext.get().prefixStack += Left(d)
+ val context = chiselContext.get()
+ context.prefixStack = d :: context.prefixStack
}
/** Pushes the current name of a data onto the prefix stack
@@ -399,31 +397,30 @@ private[chisel3] object Builder {
}
}
buildAggName(d).map { name =>
- chiselContext.get().prefixStack += Left(name)
+ pushPrefix(name)
}.isDefined
}
// Remove a prefix from top of the stack
- def popPrefix(): Either[String, HasId] = {
- val ps = chiselContext.get().prefixStack
- ps.remove(ps.size - 1)
+ def popPrefix(): List[String] = {
+ val context = chiselContext.get()
+ val tail = context.prefixStack.tail
+ context.prefixStack = tail
+ tail
}
// Removes all prefixes from the prefix stack
def clearPrefix(): Unit = {
- val ps = chiselContext.get().prefixStack
- ps.clear()
+ chiselContext.get().prefixStack = Nil
}
// Clears existing prefixes and sets to new prefix stack
def setPrefix(prefix: Prefix): Unit = {
- val ps = chiselContext.get().prefixStack
- clearPrefix()
- ps.insertAll(0, prefix)
+ chiselContext.get().prefixStack = prefix
}
// Returns the prefix stack at this moment
- def getPrefix(): Prefix = chiselContext.get().prefixStack.toList.asInstanceOf[Prefix]
+ def getPrefix(): Prefix = chiselContext.get().prefixStack
def currentModule: Option[BaseModule] = dynamicContextVar.value match {
case Some(dyanmicContext) => dynamicContext.currentModule