diff options
| author | Andrew Waterman | 2016-03-30 22:09:13 -0700 |
|---|---|---|
| committer | Andrew Waterman | 2016-04-01 16:34:40 -0700 |
| commit | 151317048e06c98bc5b91614ae039ae909ae0361 (patch) | |
| tree | 918002f4090cbbe5c16e9164c5c2467f72a20264 /src | |
| parent | 001aab20b38861067f413bd6b828d7d4c40050ad (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.scala | 8 |
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(!_) } } |
