xref: /XiangShan/src/main/scala/xiangshan/backend/fu/vector/Utils.scala (revision 2e82e6d89a8fbc2b9ef522b4527579f746a439d9)
135d005dfSXuan Hupackage xiangshan.backend.fu.vector
235d005dfSXuan Hu
335d005dfSXuan Huimport chisel3._
4*2e82e6d8SXuan Huimport chisel3.util.BitPat.bitPatToUInt
5*2e82e6d8SXuan Huimport chisel3.util.{BitPat, Mux1H}
62559805fSXuan Huimport xiangshan.backend.fu.vector.Bundles.VSew
735d005dfSXuan Hu
835d005dfSXuan Huobject Utils {
92559805fSXuan Hu  def VecDataToMaskDataVec(vecData: UInt, vsew: UInt): Vec[UInt] = {
102559805fSXuan Hu    val maskWidth = vecData.getWidth / 8
112559805fSXuan Hu    val maskDataVec = Wire(Vec(8, UInt(maskWidth.W)))
122559805fSXuan Hu    require(8 * maskWidth == vecData.getWidth, "can not split this vector data into mask data vec")
1335d005dfSXuan Hu    for ((maskData, i) <- maskDataVec.zipWithIndex) {
142559805fSXuan Hu      maskData := Mux1H(Seq(
152559805fSXuan Hu        (vsew === VSew.e8)  -> vecData((i + 1) * maskWidth     - 1, i * maskWidth    ),
162559805fSXuan Hu        (vsew === VSew.e16) -> vecData((i + 1) * maskWidth / 2 - 1, i * maskWidth / 2),
172559805fSXuan Hu        (vsew === VSew.e32) -> vecData((i + 1) * maskWidth / 4 - 1, i * maskWidth / 4),
182559805fSXuan Hu        (vsew === VSew.e64) -> vecData((i + 1) * maskWidth / 8 - 1, i * maskWidth / 8),
192559805fSXuan Hu      ))
2035d005dfSXuan Hu    }
2135d005dfSXuan Hu    maskDataVec
2235d005dfSXuan Hu  }
23*2e82e6d8SXuan Hu
24*2e82e6d8SXuan Hu  def NOnes(n: Int): UInt = bitPatToUInt(BitPat.Y(n))
25*2e82e6d8SXuan Hu
26*2e82e6d8SXuan Hu  def NZeros(n: Int): UInt = bitPatToUInt(BitPat.N(n))
2735d005dfSXuan Hu}
28