diff options
| author | mergify[bot] | 2022-06-11 00:13:36 +0000 |
|---|---|---|
| committer | GitHub | 2022-06-11 00:13:36 +0000 |
| commit | 4b8981d627fc307161ff39b78836e37212803756 (patch) | |
| tree | 670693fcbe7315a1a4380c7a43167d9188e7b0d9 /src/main/scala/chisel3/util | |
| parent | a689c7c0dd336fe0b9db6171786993b190a700f8 (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/scala/chisel3/util')
| -rw-r--r-- | src/main/scala/chisel3/util/BitPat.scala | 30 |
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)" } |
