xref: /XiangShan/src/main/scala/xiangshan/backend/fu/vector/Utils.scala (revision 6639e9a467468f4e1b05a25a5de4500772aedeb1)
1package xiangshan.backend.fu.vector
2
3import chisel3._
4import chisel3.util.BitPat.bitPatToUInt
5import chisel3.util.{BitPat, Mux1H}
6import xiangshan.backend.fu.vector.Bundles.VSew
7
8object Utils {
9  def VecDataToMaskDataVec(vecData: UInt, vsew: UInt): Vec[UInt] = {
10    val maskWidth = vecData.getWidth / 8
11    val maskDataVec = Wire(Vec(8, UInt(maskWidth.W)))
12    require(8 * maskWidth == vecData.getWidth, "can not split this vector data into mask data vec")
13    for ((maskData, i) <- maskDataVec.zipWithIndex) {
14      maskData := Mux1H(Seq(
15        (vsew === VSew.e8)  -> vecData((i + 1) * maskWidth     - 1, i * maskWidth    ),
16        (vsew === VSew.e16) -> vecData((i + 1) * maskWidth / 2 - 1, i * maskWidth / 2),
17        (vsew === VSew.e32) -> vecData((i + 1) * maskWidth / 4 - 1, i * maskWidth / 4),
18        (vsew === VSew.e64) -> vecData((i + 1) * maskWidth / 8 - 1, i * maskWidth / 8),
19      ))
20    }
21    maskDataVec
22  }
23
24  def NOnes(n: Int): UInt = bitPatToUInt(BitPat.Y(n))
25
26  def NZeros(n: Int): UInt = bitPatToUInt(BitPat.N(n))
27}
28