xref: /XiangShan/src/main/scala/xiangshan/backend/issue/ImmExtractor.scala (revision fe73ba60e994e61c99093735fde726b4c3be7629)
1730cfbc0SXuan Hupackage xiangshan.backend.issue
2730cfbc0SXuan Hu
3730cfbc0SXuan Huimport chisel3._
4730cfbc0SXuan Huimport chisel3.util._
5730cfbc0SXuan Huimport fudian.utils.SignExt
6730cfbc0SXuan Huimport xiangshan.SelImm
7730cfbc0SXuan Huimport xiangshan.backend.decode.ImmUnion
8730cfbc0SXuan Huimport xiangshan.backend.datapath.DataConfig._
9730cfbc0SXuan Hu
1083ba63b3SXuan Huimport scala.collection.MapView
1183ba63b3SXuan Hu
12730cfbc0SXuan Huclass ImmExtractorIO(dataBits: Int) extends Bundle {
13730cfbc0SXuan Hu  val in = Input(new Bundle {
14520f7dacSsinsanction    val imm = UInt(32.W)
15730cfbc0SXuan Hu    val immType = SelImm()
16730cfbc0SXuan Hu  })
17730cfbc0SXuan Hu  val out = Output(new Bundle {
18730cfbc0SXuan Hu    val imm = UInt(dataBits.W)
19730cfbc0SXuan Hu  })
20730cfbc0SXuan Hu}
21730cfbc0SXuan Hu
22730cfbc0SXuan Huclass ImmExtractor(dataBits: Int, immTypeSet: Set[BigInt]) extends Module {
23730cfbc0SXuan Hu  val io = IO(new ImmExtractorIO(dataBits))
24730cfbc0SXuan Hu
25730cfbc0SXuan Hu  val extractMap = Map(
26730cfbc0SXuan Hu    SelImm.IMM_I        .litValue -> SignExt(ImmUnion.I       .toImm32(io.in.imm), IntData().dataWidth),
27730cfbc0SXuan Hu    SelImm.IMM_S        .litValue -> SignExt(ImmUnion.S       .toImm32(io.in.imm), IntData().dataWidth),
28730cfbc0SXuan Hu    SelImm.IMM_SB       .litValue -> SignExt(ImmUnion.B       .toImm32(io.in.imm), IntData().dataWidth),
29730cfbc0SXuan Hu    SelImm.IMM_U        .litValue -> SignExt(ImmUnion.U       .toImm32(io.in.imm), IntData().dataWidth),
30730cfbc0SXuan Hu    SelImm.IMM_UJ       .litValue -> SignExt(ImmUnion.J       .toImm32(io.in.imm), IntData().dataWidth),
31730cfbc0SXuan Hu    SelImm.IMM_Z        .litValue -> SignExt(ImmUnion.Z       .toImm32(io.in.imm), IntData().dataWidth),
32730cfbc0SXuan Hu    SelImm.IMM_B6       .litValue -> SignExt(ImmUnion.B6      .toImm32(io.in.imm), IntData().dataWidth),
33d91483a6Sfdy    SelImm.IMM_VSETVLI  .litValue -> SignExt(ImmUnion.VSETVLI .toImm32(io.in.imm), IntData().dataWidth),
34d91483a6Sfdy    SelImm.IMM_VSETIVLI .litValue -> SignExt(ImmUnion.VSETIVLI.toImm32(io.in.imm), IntData().dataWidth),
35da778e6fSXuan Hu    SelImm.IMM_OPIVIS   .litValue -> SignExt(ImmUnion.OPIVIS  .toImm32(io.in.imm), IntData().dataWidth),
36da778e6fSXuan Hu    SelImm.IMM_OPIVIU   .litValue -> SignExt(ImmUnion.OPIVIU  .toImm32(io.in.imm), IntData().dataWidth),
37fe528fd6Ssinsanction    SelImm.IMM_LUI32    .litValue -> SignExt(ImmUnion.LUI32   .toImm32(io.in.imm), IntData().dataWidth),
387e30d16cSZhaoyang You    SelImm.IMM_VRORVI   .litValue -> SignExt(ImmUnion.VRORVI  .toImm32(io.in.imm), IntData().dataWidth),
39730cfbc0SXuan Hu  )
40730cfbc0SXuan Hu
41*fe73ba60SYangyu Chen  val usedMap: Seq[(BigInt, UInt)] = extractMap.view.filterKeys(x => immTypeSet.contains(x)).toSeq.sortWith(_._1 < _._1)
42730cfbc0SXuan Hu  println(usedMap)
43730cfbc0SXuan Hu
4483ba63b3SXuan Hu  io.out.imm := MuxLookup(io.in.immType, 0.U)(usedMap.map { case (k, v) => (k.U, v) }.toSeq)
45730cfbc0SXuan Hu}
46730cfbc0SXuan Hu
47730cfbc0SXuan Huobject ImmExtractor {
48730cfbc0SXuan Hu  def apply(imm: UInt, immType: UInt, dataBits: Int, immTypeSet: Set[BigInt]): UInt = {
49730cfbc0SXuan Hu    val mod = Module(new ImmExtractor(dataBits, immTypeSet))
50730cfbc0SXuan Hu    mod.io.in.imm := imm
51730cfbc0SXuan Hu    mod.io.in.immType := immType
52730cfbc0SXuan Hu    mod.io.out.imm
53730cfbc0SXuan Hu  }
54730cfbc0SXuan Hu}
55