summaryrefslogtreecommitdiff
path: root/src/main/scala/chisel3/experimental/util/algorithm/Bitwise.scala
diff options
context:
space:
mode:
authorJack2022-03-15 19:37:37 +0000
committerJack2022-03-15 19:37:37 +0000
commit2f21943ff772da2171df866d4cee71dfa8127bf8 (patch)
treed00c9059c9361920036e784425641288782515d5 /src/main/scala/chisel3/experimental/util/algorithm/Bitwise.scala
parent1876e740a48be2e5ff5bd4fd6c2018927f1dcec2 (diff)
parentf26df23bbe0ae9b7162ed70369f24b01d75a1493 (diff)
Merge branch '3.5.x' into 3.5-release
Diffstat (limited to 'src/main/scala/chisel3/experimental/util/algorithm/Bitwise.scala')
-rw-r--r--src/main/scala/chisel3/experimental/util/algorithm/Bitwise.scala48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/main/scala/chisel3/experimental/util/algorithm/Bitwise.scala b/src/main/scala/chisel3/experimental/util/algorithm/Bitwise.scala
new file mode 100644
index 00000000..6b4bb8f0
--- /dev/null
+++ b/src/main/scala/chisel3/experimental/util/algorithm/Bitwise.scala
@@ -0,0 +1,48 @@
+// SPDX-License-Identifier: Apache-2.0
+
+package chisel3.util
+
+import chisel3._
+
+/** Map each bit to the logical OR of itself and all bits with lower index
+ *
+ * Here `scanLeft` means "start from the left and iterate to the right, where left is the lowest index", a common operation on arrays and lists.
+ * @example {{{
+ * scanLeftOr("b00001000".U(8.W)) // Returns "b11111000".U
+ * scanLeftOr("b00010100".U(8.W)) // Returns "b11111100".U
+ * scanLeftOr("b00000000".U(8.W)) // Returns "b00000000".U
+ * }}}
+ */
+object scanLeftOr {
+ def apply(data: UInt): UInt = {
+ val width = data.widthOption match {
+ case Some(w) => w
+ case None => throw new IllegalArgumentException("Cannot call scanLeftOr on data with unknown width.")
+ }
+
+ def helper(s: Int, x: UInt): UInt =
+ if (s >= width) x else helper(s + s, x | (x << s)(width - 1, 0))
+ helper(1, data)(width - 1, 0)
+ }
+}
+
+/** Map each bit to the logical OR of itself and all bits with higher index
+ *
+ * Here `scanRight` means "start from the right and iterate to the left, where right is the highest index", a common operation on arrays and lists.
+ * @example {{{
+ * scanRightOr("b00001000".U) // Returns "b00001111".U
+ * scanRightOr("b00010100".U) // Returns "b00011111".U
+ * scanRightOr("b00000000".U) // Returns "b00000000".U
+ * }}}
+ */
+object scanRightOr {
+ def apply(data: UInt): UInt = {
+ val width = data.widthOption match {
+ case Some(w) => w
+ case None => throw new IllegalArgumentException("Cannot call scanRightOr on data with unknown width.")
+ }
+ def helper(s: Int, x: UInt): UInt =
+ if (s >= width) x else helper(s + s, x | (x >> s))
+ helper(1, data)(width - 1, 0)
+ }
+}