From 151317048e06c98bc5b91614ae039ae909ae0361 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Wed, 30 Mar 2016 22:09:13 -0700 Subject: 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. --- src/main/scala/Chisel/util/Arbiter.scala | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src') 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(!_) } } -- cgit v1.2.3