xref: /XiangShan/src/main/scala/xiangshan/backend/datapath/WbConfig.scala (revision 39c59369af6e7d78fa72e13aae3735f1a6e98f5c)
1730cfbc0SXuan Hupackage xiangshan.backend.datapath
2730cfbc0SXuan Hu
3730cfbc0SXuan Huimport chisel3.util.log2Up
4*39c59369SXuan Huimport xiangshan.backend.BackendParams
5730cfbc0SXuan Huimport xiangshan.backend.datapath.DataConfig._
6730cfbc0SXuan Hu
7730cfbc0SXuan Huobject WbConfig {
8730cfbc0SXuan Hu  sealed abstract class WbConfig() {
9730cfbc0SXuan Hu    val port: Int
10730cfbc0SXuan Hu    def dataCfg: DataConfig
11730cfbc0SXuan Hu    def dataWidth: Int = dataCfg.dataWidth
12730cfbc0SXuan Hu
13730cfbc0SXuan Hu    def writeInt = dataCfg == IntData()
14730cfbc0SXuan Hu    def writeFp = dataCfg == FpData()
15730cfbc0SXuan Hu    def writeVec = dataCfg == VecData()
160655b1a0SXuan Hu
170655b1a0SXuan Hu    override def toString: String = {
18*39c59369SXuan Hu      var res = this match {
19*39c59369SXuan Hu        case _: IntWB => "INT"
20*39c59369SXuan Hu        case _: VfWB => "VF"
21*39c59369SXuan Hu        case _: NoWB => "NO"
22*39c59369SXuan Hu        case _ => "??"
230655b1a0SXuan Hu      }
240655b1a0SXuan Hu      res += s"($port)"
250655b1a0SXuan Hu      res
260655b1a0SXuan Hu    }
27730cfbc0SXuan Hu  }
28730cfbc0SXuan Hu
29730cfbc0SXuan Hu  sealed abstract class ExuWB extends WbConfig
30730cfbc0SXuan Hu
31730cfbc0SXuan Hu  sealed abstract class PregWB extends ExuWB {
32730cfbc0SXuan Hu    val priority: Int
33*39c59369SXuan Hu
34*39c59369SXuan Hu    def numPreg(backendParams: BackendParams): Int
35*39c59369SXuan Hu
36*39c59369SXuan Hu    def pregIdxWidth(backendParams: BackendParams) = log2Up(numPreg(backendParams))
37730cfbc0SXuan Hu  }
38730cfbc0SXuan Hu
39730cfbc0SXuan Hu  case class IntWB(
40730cfbc0SXuan Hu    port    : Int = -1,
41730cfbc0SXuan Hu    priority: Int = Int.MaxValue,
42730cfbc0SXuan Hu  ) extends PregWB {
43*39c59369SXuan Hu
44730cfbc0SXuan Hu    def dataCfg: DataConfig = IntData()
45*39c59369SXuan Hu
46*39c59369SXuan Hu    def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(IntData()).numEntries
47730cfbc0SXuan Hu  }
48730cfbc0SXuan Hu
490162f462Sczw  case class VfWB(
50730cfbc0SXuan Hu    port    : Int = -1,
51730cfbc0SXuan Hu    priority: Int = Int.MaxValue,
52730cfbc0SXuan Hu  ) extends PregWB {
53*39c59369SXuan Hu
54730cfbc0SXuan Hu    def dataCfg: DataConfig = VecData()
55*39c59369SXuan Hu
56*39c59369SXuan Hu    def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(VecData()).numEntries
57730cfbc0SXuan Hu  }
58730cfbc0SXuan Hu
59*39c59369SXuan Hu  case class NoWB(
602e0a7dc5Sfdy    port    : Int = -1,
612e0a7dc5Sfdy    priority: Int = Int.MaxValue,
622e0a7dc5Sfdy  ) extends PregWB {
632e0a7dc5Sfdy
64*39c59369SXuan Hu    override def dataCfg: DataConfig = NoData()
65*39c59369SXuan Hu
66*39c59369SXuan Hu    override def numPreg(backendParams: BackendParams): Int = 0
672e0a7dc5Sfdy  }
682e0a7dc5Sfdy
69730cfbc0SXuan Hu  case class CtrlWB(
70730cfbc0SXuan Hu    port: Int = -1,
71730cfbc0SXuan Hu  ) extends WbConfig {
72730cfbc0SXuan Hu    val priority: Int = Int.MaxValue
73730cfbc0SXuan Hu    override def dataCfg: DataConfig = NoData()
74730cfbc0SXuan Hu  }
75730cfbc0SXuan Hu}
76730cfbc0SXuan Hu
77