2016-11-27 16:16:37 -08:00
|
|
|
// See LICENSE.SiFive for license details.
|
|
|
|
|
2016-09-27 21:27:07 -07:00
|
|
|
import Chisel._
|
|
|
|
|
|
|
|
package object util {
|
|
|
|
implicit class UIntIsOneOf(val x: UInt) extends AnyVal {
|
|
|
|
def isOneOf(s: Seq[UInt]): Bool = s.map(x === _).reduce(_||_)
|
|
|
|
|
|
|
|
def isOneOf(u1: UInt, u2: UInt*): Bool = isOneOf(u1 +: u2.toSeq)
|
|
|
|
}
|
|
|
|
|
|
|
|
implicit class SeqToAugmentedSeq[T <: Data](val x: Seq[T]) extends AnyVal {
|
|
|
|
def apply(idx: UInt): T = {
|
|
|
|
if (x.size == 1) {
|
|
|
|
x.head
|
|
|
|
} else {
|
|
|
|
val half = 1 << (log2Ceil(x.size) - 1)
|
|
|
|
val newIdx = idx & UInt(half - 1)
|
|
|
|
Mux(idx >= UInt(half), x.drop(half)(newIdx), x.take(half)(newIdx))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
def asUInt(): UInt = Cat(x.map(_.asUInt).reverse)
|
|
|
|
}
|
|
|
|
|
2017-02-25 02:54:42 -08:00
|
|
|
implicit class DataToAugmentedData[T <: Data](val x: T) extends AnyVal {
|
|
|
|
def holdUnless(enable: Bool): T = Mux(enable, x, RegEnable(x, enable))
|
|
|
|
}
|
|
|
|
|
|
|
|
implicit class SeqMemToAugmentedSeqMem[T <: Data](val x: SeqMem[T]) extends AnyVal {
|
|
|
|
def readAndHold(addr: UInt, enable: Bool): T = x.read(addr, enable) holdUnless RegNext(enable)
|
|
|
|
}
|
|
|
|
|
2016-09-27 21:27:07 -07:00
|
|
|
implicit def uintToBitPat(x: UInt): BitPat = BitPat(x)
|
|
|
|
implicit def wcToUInt(c: WideCounter): UInt = c.value
|
|
|
|
|
|
|
|
implicit class UIntToAugmentedUInt(val x: UInt) extends AnyVal {
|
|
|
|
def sextTo(n: Int): UInt =
|
|
|
|
if (x.getWidth == n) x
|
|
|
|
else Cat(Fill(n - x.getWidth, x(x.getWidth-1)), x)
|
|
|
|
|
|
|
|
def extract(hi: Int, lo: Int): UInt = {
|
|
|
|
if (hi == lo-1) UInt(0)
|
|
|
|
else x(hi, lo)
|
|
|
|
}
|
2017-03-09 00:28:19 -08:00
|
|
|
|
|
|
|
def inRange(base: UInt, bounds: UInt) = x >= base && x < bounds
|
2016-09-27 21:27:07 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
implicit class BooleanToAugmentedBoolean(val x: Boolean) extends AnyVal {
|
|
|
|
def toInt: Int = if (x) 1 else 0
|
|
|
|
|
|
|
|
// this one's snagged from scalaz
|
|
|
|
def option[T](z: => T): Option[T] = if (x) Some(z) else None
|
|
|
|
}
|
2016-10-06 09:41:46 -07:00
|
|
|
|
|
|
|
object PopCountAtLeast {
|
|
|
|
private def two(x: UInt): (Bool, Bool) = x.getWidth match {
|
2016-10-07 21:20:40 -07:00
|
|
|
case 1 => (x.toBool, Bool(false))
|
2016-10-06 09:41:46 -07:00
|
|
|
case n =>
|
|
|
|
val half = x.getWidth / 2
|
|
|
|
val (leftOne, leftTwo) = two(x(half - 1, 0))
|
|
|
|
val (rightOne, rightTwo) = two(x(x.getWidth - 1, half))
|
|
|
|
(leftOne || rightOne, leftTwo || rightTwo || (leftOne && rightOne))
|
|
|
|
}
|
|
|
|
def apply(x: UInt, n: Int): Bool = n match {
|
|
|
|
case 0 => Bool(true)
|
|
|
|
case 1 => x.orR
|
|
|
|
case 2 => two(x)._2
|
|
|
|
case 3 => PopCount(x) >= UInt(n)
|
|
|
|
}
|
|
|
|
}
|
2016-09-27 21:27:07 -07:00
|
|
|
}
|