布尔型 Scala / Chisel 的选项方法
option method of boolean Scala / Chisel
我试图了解 AsyncQueue 在 RocketChip 中的实现,并且对 Boolean 上的选项方法的使用感到非常困惑数据类型(不是选项)。
在代码中我们有一个参数 class :
case class AsyncQueueParams(
depth: Int = 8,
sync: Int = 3,
safe: Boolean = true,
narrow: Boolean = false)
{
require (depth > 0 && isPow2(depth))
require (sync >= 2)
val bits = log2Ceil(depth)
val wires = if (narrow) 1 else depth
}
那么在使用上面的时候:
class AsyncBundle[T <: Data](private val gen: T, val params: AsyncQueueParams = AsyncQueueParams()) extends Bundle {
val mem = Output(Vec(params.wires, gen))
val ridx = Input (UInt((params.bits+1).W))
val widx = Output(UInt((params.bits+1).W))
val index = params.narrow.option(Input(UInt(params.bits.W)))
// Signals used to self-stabilize a safe AsyncQueue
val safe = params.safe.option(new AsyncBundleSafety) // <--- Never seen use of option !!
}
现在,我可以猜出这里的意图是什么,以限制 val safe & narrow 的创建。我的问题是这个选项是在哪里定义的?我看过 scala docs 的布尔值。我没有将选项视为 class 布尔值的成员。有人可以解释一下吗?
你有作为进口(见here)
import chisel3.util._
在包对象here中,有一个扩展方法
implicit class BooleanToAugmentedBoolean(private 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
}
这种模式在 Scala 库中通常被称为“扩展”或“语法”,您可以在其中为您不拥有的类型定义方法,或者不想将方法与核心数据结构耦合。在较早的文献中,您可能还会发现“XRich”或“XOps”意思相同。
在 scala 2 中,通过 implicit class 实现的机制。当你的代码中有 someBoolean.option(...)
时,编译器将在 Boolean
中搜索方法,如果没有找到,它将尝试在所有其他 class 中搜索它可以转换为 [=13] 的方法=] 进入。在这种情况下,范围内存在从 Boolean
到 BooleanToAugmentedBoolean
的隐式转换,并且编译器在那里找到了 option
方法。
请注意,隐式 class 只是普通 class 和隐式转换的语法糖,即
implicit class BooleanToAugmentedBoolean(private val x: Boolean) extends AnyVal {
def toInt: Int = if (x) 1 else 0
def option[T](z: => T): Option[T] = if (x) Some(z) else None
}
是
的语法糖
class BooleanToAugmentedBoolean(private val x: Boolean) extends AnyVal {
def toInt: Int = if (x) 1 else 0
def option[T](z: => T): Option[T] = if (x) Some(z) else None
}
implicit def f(x: Boolean) = new BooleanToAugmentedBoolean(x)
我试图了解 AsyncQueue 在 RocketChip 中的实现,并且对 Boolean 上的选项方法的使用感到非常困惑数据类型(不是选项)。 在代码中我们有一个参数 class :
case class AsyncQueueParams(
depth: Int = 8,
sync: Int = 3,
safe: Boolean = true,
narrow: Boolean = false)
{
require (depth > 0 && isPow2(depth))
require (sync >= 2)
val bits = log2Ceil(depth)
val wires = if (narrow) 1 else depth
}
那么在使用上面的时候:
class AsyncBundle[T <: Data](private val gen: T, val params: AsyncQueueParams = AsyncQueueParams()) extends Bundle {
val mem = Output(Vec(params.wires, gen))
val ridx = Input (UInt((params.bits+1).W))
val widx = Output(UInt((params.bits+1).W))
val index = params.narrow.option(Input(UInt(params.bits.W)))
// Signals used to self-stabilize a safe AsyncQueue
val safe = params.safe.option(new AsyncBundleSafety) // <--- Never seen use of option !!
}
现在,我可以猜出这里的意图是什么,以限制 val safe & narrow 的创建。我的问题是这个选项是在哪里定义的?我看过 scala docs 的布尔值。我没有将选项视为 class 布尔值的成员。有人可以解释一下吗?
你有作为进口(见here)
import chisel3.util._
在包对象here中,有一个扩展方法
implicit class BooleanToAugmentedBoolean(private 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
}
这种模式在 Scala 库中通常被称为“扩展”或“语法”,您可以在其中为您不拥有的类型定义方法,或者不想将方法与核心数据结构耦合。在较早的文献中,您可能还会发现“XRich”或“XOps”意思相同。
在 scala 2 中,通过 implicit class 实现的机制。当你的代码中有 someBoolean.option(...)
时,编译器将在 Boolean
中搜索方法,如果没有找到,它将尝试在所有其他 class 中搜索它可以转换为 [=13] 的方法=] 进入。在这种情况下,范围内存在从 Boolean
到 BooleanToAugmentedBoolean
的隐式转换,并且编译器在那里找到了 option
方法。
请注意,隐式 class 只是普通 class 和隐式转换的语法糖,即
implicit class BooleanToAugmentedBoolean(private val x: Boolean) extends AnyVal {
def toInt: Int = if (x) 1 else 0
def option[T](z: => T): Option[T] = if (x) Some(z) else None
}
是
的语法糖class BooleanToAugmentedBoolean(private val x: Boolean) extends AnyVal {
def toInt: Int = if (x) 1 else 0
def option[T](z: => T): Option[T] = if (x) Some(z) else None
}
implicit def f(x: Boolean) = new BooleanToAugmentedBoolean(x)