summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authormergify[bot]2022-06-11 00:13:36 +0000
committerGitHub2022-06-11 00:13:36 +0000
commit4b8981d627fc307161ff39b78836e37212803756 (patch)
tree670693fcbe7315a1a4380c7a43167d9188e7b0d9 /src/main
parenta689c7c0dd336fe0b9db6171786993b190a700f8 (diff)
Micro-optimize BitPat.rawString (#2577) (#2578)
BitPat.rawString is called a lot when decoding and is used for certain BitPat operations. We should use it less but this is at least a bandaid. (cherry picked from commit c11af20fe5b211ec72ba00f3ce0880d7933e566b) Co-authored-by: Jack Koenig <koenig@sifive.com>
Diffstat (limited to 'src/main')
-rw-r--r--src/main/scala/chisel3/util/BitPat.scala30
1 files changed, 22 insertions, 8 deletions
diff --git a/src/main/scala/chisel3/util/BitPat.scala b/src/main/scala/chisel3/util/BitPat.scala
index d27fee14..33dd5b2b 100644
--- a/src/main/scala/chisel3/util/BitPat.scala
+++ b/src/main/scala/chisel3/util/BitPat.scala
@@ -348,15 +348,29 @@ sealed class BitPat(val value: BigInt, val mask: BigInt, val width: Int)
override def isEmpty: Boolean = false
/** Generate raw string of a [[BitPat]]. */
- def rawString: String = Seq
- .tabulate(width) { i =>
- (value.testBit(width - i - 1), mask.testBit(width - i - 1)) match {
- case (true, true) => "1"
- case (false, true) => "0"
- case (_, false) => "?"
- }
+ def rawString: String = _rawString
+
+ // This is micro-optimized and memoized because it is used for lots of BitPat operations
+ private lazy val _rawString: String = {
+ val sb = new StringBuilder(width)
+ var i = 0
+ while (i < width) {
+ val bitIdx = width - i - 1
+ val char =
+ if (mask.testBit(bitIdx)) {
+ if (value.testBit(bitIdx)) {
+ '1'
+ } else {
+ '0'
+ }
+ } else {
+ '?'
+ }
+ sb += char
+ i += 1
}
- .mkString
+ sb.result()
+ }
override def toString = s"BitPat($rawString)"
}