summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Waterman2016-03-30 22:09:13 -0700
committerAndrew Waterman2016-04-01 16:34:40 -0700
commit151317048e06c98bc5b91614ae039ae909ae0361 (patch)
tree918002f4090cbbe5c16e9164c5c2467f72a20264 /src
parent001aab20b38861067f413bd6b828d7d4c40050ad (diff)
Make ArbiterCtrl private; make O(n), not O(n^2)
It was never meant to be a public API, and the implementation left something to be desired.
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/Chisel/util/Arbiter.scala8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/main/scala/Chisel/util/Arbiter.scala b/src/main/scala/Chisel/util/Arbiter.scala
index 2747640f..3e59ffa9 100644
--- a/src/main/scala/Chisel/util/Arbiter.scala
+++ b/src/main/scala/Chisel/util/Arbiter.scala
@@ -13,10 +13,12 @@ class ArbiterIO[T <: Data](gen: T, n: Int) extends Bundle {
}
/** Arbiter Control determining which producer has access */
-object ArbiterCtrl
+private object ArbiterCtrl
{
- def apply(request: Seq[Bool]): Seq[Bool] = {
- Bool(true) +: (1 until request.length).map(i => !request.slice(0, i).foldLeft(Bool(false))(_ || _))
+ def apply(request: Seq[Bool]): Seq[Bool] = request.length match {
+ case 0 => Seq()
+ case 1 => Seq(Bool(true))
+ case _ => Bool(true) +: request.tail.init.scanLeft(request.head)(_ || _).map(!_)
}
}