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