1package xiangshan.backend.issue 2 3import chisel3._ 4import chisel3.util._ 5import fudian.utils.SignExt 6import xiangshan.SelImm 7import xiangshan.backend.decode.ImmUnion 8import xiangshan.backend.datapath.DataConfig._ 9 10class ImmExtractorIO(dataBits: Int) extends Bundle { 11 val in = Input(new Bundle { 12 val imm = UInt(64.W) 13 val immType = SelImm() 14 }) 15 val out = Output(new Bundle { 16 val imm = UInt(dataBits.W) 17 }) 18} 19 20class ImmExtractor(dataBits: Int, immTypeSet: Set[BigInt]) extends Module { 21 val io = IO(new ImmExtractorIO(dataBits)) 22 23 val extractMap = Map( 24 SelImm.IMM_I.litValue -> SignExt(ImmUnion.I.toImm32(io.in.imm), IntData().dataWidth), 25 SelImm.IMM_S.litValue -> SignExt(ImmUnion.S.toImm32(io.in.imm), IntData().dataWidth), 26 SelImm.IMM_SB.litValue -> SignExt(ImmUnion.B.toImm32(io.in.imm), IntData().dataWidth), 27 SelImm.IMM_U.litValue -> SignExt(ImmUnion.U.toImm32(io.in.imm), IntData().dataWidth), 28 SelImm.IMM_UJ.litValue -> SignExt(ImmUnion.J.toImm32(io.in.imm), IntData().dataWidth), 29 SelImm.IMM_Z.litValue -> SignExt(ImmUnion.Z.toImm32(io.in.imm), IntData().dataWidth), 30 SelImm.IMM_B6.litValue -> SignExt(ImmUnion.B6.toImm32(io.in.imm),IntData().dataWidth), 31 SelImm.IMM_VSETVLI.litValue -> SignExt(ImmUnion.VSETVLI.toImm32(io.in.imm),IntData().dataWidth), 32 SelImm.IMM_VSETIVLI.litValue -> SignExt(ImmUnion.VSETIVLI.toImm32(io.in.imm),IntData().dataWidth), 33 ) 34 35 val usedMap: Map[BigInt, UInt] = extractMap.filterKeys(x => immTypeSet.contains(x)) 36 println(usedMap) 37 38 io.out.imm := MuxLookup(io.in.immType, 0.U, usedMap.map { case (k, v) => (k.U, v) }.toSeq ) 39} 40 41object ImmExtractor { 42 def apply(imm: UInt, immType: UInt, dataBits: Int, immTypeSet: Set[BigInt]): UInt = { 43 val mod = Module(new ImmExtractor(dataBits, immTypeSet)) 44 mod.io.in.imm := imm 45 mod.io.in.immType := immType 46 mod.io.out.imm 47 } 48} 49