Search code examples
scalaforeachchisel

scala foreach of a 2-D List/Array in chisel with types issue


Can "foreach" can be used for each element of the 2-D List/Array? I tried the code:

val n_vec = (0 to 2).map(i=>
              (0 to 2).map(j=>
                Wire(UInt(3.W))
              )
            ) 
n_vec.foreach((i:Int)=>(
  n_vec(i).foreach((j:Int)=>{
    n_vec(i)(j) := i.U + j.U
  })
))

the error message is

top.scala:24: error: type mismatch;
 found   : Int => Unit
 required: chisel3.core.UInt => ?
      n_vec(i).foreach((j:Int)=>{
                              ^

Could you enlight me whether it can be used in such a way, even how?


Solution

  • It would be cleaner to write like this:

    n_vec.foreach { i=>
      i.foreach { j=>
        j := x.U + y.U
        y = y + 1
      }
      y = 0
      x = x + 1
    }
    

    But you don't need to increment x and y manually, just iterate over indices instead:

    n_vec.indices.foreach { x =>
      n_vec(x).indices.foreach { y =>
        n_vec(x)(y) := x.U + y.U
      }
    }
    

    or better (and this translates exactly to the above)

    for { 
      x <- n_vec.indices
      y <- n_vec(x).indices
    } {
      n_vec(x)(y) := x.U + y.U
    }