【问题标题】:option method of boolean Scala / Chisel布尔 Scala / Chisel 的选项方法
【发布时间】:2021-05-10 07:15:46
【问题描述】:

我试图了解 RocketChip 中的 AsyncQueue 的实现,并且对在布尔数据类型(而不是 Option)上使用 option 方法感到非常困惑。 在代码中我们有一个参数类:

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 的布尔值。我不认为选项是布尔类的成员。有人可以解释一下吗?

【问题讨论】:

    标签: scala chisel rocket-chip


    【解决方案1】:

    这里定义https://github.com/chipsalliance/rocket-chip/blob/86a2f2cca699f149bcc082ef2828654a0a4e3f4b/src/main/scala/util/package.scala#L221

    这种模式在 scala 库中通常称为“扩展”或“语法”,您可以在其中定义您不拥有或不想将方法与核心数据结构耦合的类型的方法。在较早的文献中,您可能还会发现“XRich”或“XOps”具有相同的含义。

    在 scala 2 中,执行此操作的机制是通过 implicit class。当您的代码中有someBoolean.option(...) 时,编译器将在Boolean 中搜索方法,如果没有找到,它将尝试在所有其他可以将Boolean 转换为的类中进行搜索。在这种情况下,范围内存在从BooleanBooleanToAugmentedBoolean 的隐式转换,编译器在那里找到了option 方法。

    请注意,隐式类只是普通类和隐式转换的语法糖,即

    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)
    
    

    【讨论】:

      【解决方案2】:

      你有作为进口(见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
        }
      

      【讨论】:

        猜你喜欢
        • 2021-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-10
        相关资源
        最近更新 更多