Зубило перевернутое Vec[Bool] однолинейное

#chisel

Вопрос:

Есть ли однострочный, который берет Vec[Bool] и создает его перевернутую версию?

Вот пример того, как взять 37 битов, инвертировать их, а затем выполнить сокращение ИЛИ по всем из них. Есть ли однострочный, который может заменить присвоение inv_a?

 class MyModule extends Module {
  val io = IO(new Bundle {
    val a = Input(Vec(37, Bool()))
    val b = Output(Bool())
  })

  val inv_a = Wire(Vec(37, Bool()))
  for (i <- 0 until 37) {
    inv_a(i) := ~io.a(i)
  }

  io.b := inv_a.reduce((a, b) => (a | b))
}
 

Ответ №1:

Я думаю, это делает то, что ты хочешь.

 val inv_a = (~ io.a.asUInt).asBools()
 

Ответ №2:

В качестве альтернативы вы могли map бы на входе Vec инвертировать каждый элемент:

 val inv_a = io.a.map(!_)
 

Пример в Скасти (с использованием долота v3.4.4): https://scastie.scala-lang.org/bcQIihPMThelC9h4jDfyxQ

Обратите внимание, что тип inv_a -это a Seq[Bool] , который вы все еще reduce можете использовать, но если вам нужна Vec[Bool] спина, вам нужно будет обернуть результат в VecInit(...) :

 val inv_a: Vec[Bool] = VecInit(io.a.map(!_))