Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
布尔Scala/凿子的选择方法_Scala_Chisel_Rocket Chip - Fatal编程技术网

布尔Scala/凿子的选择方法

布尔Scala/凿子的选择方法,scala,chisel,rocket-chip,Scala,Chisel,Rocket Chip,我试图理解RocketChip中AsyncQueue的实现,对布尔数据类型(而非option)上使用option方法感到非常困惑。 在代码中,我们有一个parametr类: case class AsyncQueueParams( depth: Int = 8, sync: Int = 3, safe: Boolean = true, narrow: Boolean = false) { require (depth > 0 &&

我试图理解RocketChipAsyncQueue的实现,对布尔数据类型(而非option)上使用option方法感到非常困惑。 在代码中,我们有一个parametr类:

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 !!
}
class-AsyncBundle[T作为导入(请参阅)

在包对象中,有一个扩展方法

  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中,当您有
someBoolean.option(…)时,执行此操作的机制是via
在您的代码中,编译器将在
Boolean
中搜索方法,如果没有找到,它将尝试在它可以将
Boolean
转换为的所有其他类中进行搜索。在这种情况下,在范围中存在从
Boolean
Boolean到ugmentedboolean
的隐式转换,编译器找到了
opti在那里的
方法上

注意,隐式类只是普通类的语法糖&隐式会话,即

隐式类BooleanToAugmentedBoolean(private val x:Boolean)扩展了AnyVal{
def toInt:Int=if(x)1其他0
定义选项[T](z:=>T):选项[T]=如果(x)某些(z)其他无
}
语法上的糖是什么

类BooleanToAugmentedBoolean(private val x:Boolean)扩展了AnyVal{
def toInt:Int=if(x)1其他0
定义选项[T](z:=>T):选项[T]=如果(x)某些(z)其他无
}
隐式定义f(x:Boolean)=新布尔值到增强布尔值(x)
  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
  }