xref: /XiangShan/src/main/scala/xiangshan/backend/datapath/WbConfig.scala (revision 45d40ce719a8202e16a540541c72fd4de6dfde60)
1730cfbc0SXuan Hupackage xiangshan.backend.datapath
2730cfbc0SXuan Hu
3730cfbc0SXuan Huimport chisel3.util.log2Up
439c59369SXuan 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()
16*45d40ce7Ssinsanction    def writeV0 = dataCfg == V0Data()
17*45d40ce7Ssinsanction    def writeVl = dataCfg == VlData()
180655b1a0SXuan Hu
190655b1a0SXuan Hu    override def toString: String = {
2039c59369SXuan Hu      var res = this match {
2139c59369SXuan Hu        case _: IntWB => "INT"
2260f0c5aeSxiaofeibao        case _: FpWB => "FP"
2339c59369SXuan Hu        case _: VfWB => "VF"
24*45d40ce7Ssinsanction        case _: V0WB => "V0"
25*45d40ce7Ssinsanction        case _: VlWB => "VL"
2639c59369SXuan Hu        case _: NoWB => "NO"
2739c59369SXuan Hu        case _ => "??"
280655b1a0SXuan Hu      }
290655b1a0SXuan Hu      res += s"($port)"
300655b1a0SXuan Hu      res
310655b1a0SXuan Hu    }
32730cfbc0SXuan Hu  }
33730cfbc0SXuan Hu
34730cfbc0SXuan Hu  sealed abstract class ExuWB extends WbConfig
35730cfbc0SXuan Hu
36730cfbc0SXuan Hu  sealed abstract class PregWB extends ExuWB {
37730cfbc0SXuan Hu    val priority: Int
3839c59369SXuan Hu
3939c59369SXuan Hu    def numPreg(backendParams: BackendParams): Int
4039c59369SXuan Hu
4139c59369SXuan Hu    def pregIdxWidth(backendParams: BackendParams) = log2Up(numPreg(backendParams))
42730cfbc0SXuan Hu  }
43730cfbc0SXuan Hu
44730cfbc0SXuan Hu  case class IntWB(
45730cfbc0SXuan Hu    port    : Int = -1,
46730cfbc0SXuan Hu    priority: Int = Int.MaxValue,
47730cfbc0SXuan Hu  ) extends PregWB {
4839c59369SXuan Hu
49730cfbc0SXuan Hu    def dataCfg: DataConfig = IntData()
5039c59369SXuan Hu
5139c59369SXuan Hu    def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(IntData()).numEntries
52730cfbc0SXuan Hu  }
53730cfbc0SXuan Hu
5460f0c5aeSxiaofeibao  case class FpWB(
5560f0c5aeSxiaofeibao    port: Int = -1,
5660f0c5aeSxiaofeibao    priority: Int = Int.MaxValue,
5760f0c5aeSxiaofeibao  ) extends PregWB {
5860f0c5aeSxiaofeibao
5960f0c5aeSxiaofeibao    def dataCfg: DataConfig = FpData()
6060f0c5aeSxiaofeibao
6160f0c5aeSxiaofeibao    def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(FpData()).numEntries
6260f0c5aeSxiaofeibao  }
6360f0c5aeSxiaofeibao
640162f462Sczw  case class VfWB(
65730cfbc0SXuan Hu    port    : Int = -1,
66730cfbc0SXuan Hu    priority: Int = Int.MaxValue,
67730cfbc0SXuan Hu  ) extends PregWB {
6839c59369SXuan Hu
69730cfbc0SXuan Hu    def dataCfg: DataConfig = VecData()
7039c59369SXuan Hu
7139c59369SXuan Hu    def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(VecData()).numEntries
72730cfbc0SXuan Hu  }
73730cfbc0SXuan Hu
742aa3a761Ssinsanction  case class V0WB(
752aa3a761Ssinsanction    port    : Int = -1,
762aa3a761Ssinsanction    priority: Int = Int.MaxValue,
772aa3a761Ssinsanction  ) extends PregWB {
782aa3a761Ssinsanction
7907b5cc60Sxiaofeibao    def dataCfg: DataConfig = V0Data()
802aa3a761Ssinsanction
8107b5cc60Sxiaofeibao    def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(V0Data()).numEntries
822aa3a761Ssinsanction  }
832aa3a761Ssinsanction
842aa3a761Ssinsanction  case class VlWB(
852aa3a761Ssinsanction    port    : Int = -1,
862aa3a761Ssinsanction    priority: Int = Int.MaxValue,
872aa3a761Ssinsanction  ) extends PregWB {
882aa3a761Ssinsanction
8907b5cc60Sxiaofeibao    def dataCfg: DataConfig = VlData()
902aa3a761Ssinsanction
9107b5cc60Sxiaofeibao    def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(VlData()).numEntries
922aa3a761Ssinsanction  }
932aa3a761Ssinsanction
9439c59369SXuan Hu  case class NoWB(
952e0a7dc5Sfdy    port    : Int = -1,
962e0a7dc5Sfdy    priority: Int = Int.MaxValue,
972e0a7dc5Sfdy  ) extends PregWB {
982e0a7dc5Sfdy
9939c59369SXuan Hu    override def dataCfg: DataConfig = NoData()
10039c59369SXuan Hu
10139c59369SXuan Hu    override def numPreg(backendParams: BackendParams): Int = 0
1022e0a7dc5Sfdy  }
1032e0a7dc5Sfdy
104730cfbc0SXuan Hu  case class CtrlWB(
105730cfbc0SXuan Hu    port: Int = -1,
106730cfbc0SXuan Hu  ) extends WbConfig {
107730cfbc0SXuan Hu    val priority: Int = Int.MaxValue
108730cfbc0SXuan Hu    override def dataCfg: DataConfig = NoData()
109730cfbc0SXuan Hu  }
110730cfbc0SXuan Hu
1115edcc45fSHaojin Tang  case class FakeIntWB(
1125edcc45fSHaojin Tang    port    : Int = -1,
1135edcc45fSHaojin Tang    priority: Int = Int.MaxValue,
1145edcc45fSHaojin Tang  ) extends PregWB {
1155edcc45fSHaojin Tang
1165edcc45fSHaojin Tang    def dataCfg: DataConfig = FakeIntData()
1175edcc45fSHaojin Tang
1185edcc45fSHaojin Tang    def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(FakeIntData()).numEntries
1195edcc45fSHaojin Tang  }
1205edcc45fSHaojin Tang}
121