微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

boolean Scala / Chisel的选项方法

如何解决boolean Scala / Chisel的选项方法

我试图了解 RocketChipAsyncQueue 的实现,并且对布尔数据类型(不是 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 &窄。我的问题是这个选项是在哪里定义的?我已经查看了布尔值的 scala docs。我不认为选项是布尔类的成员。有人可以解释一下吗?

解决方法

这里定义了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)

,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?