xref: /XiangShan/src/main/scala/xiangshan/backend/datapath/WbConfig.scala (revision 2aa3a76140dbd5875aa34625a2e1495c0cd33d92)
1package xiangshan.backend.datapath
2
3import chisel3.util.log2Up
4import xiangshan.backend.BackendParams
5import xiangshan.backend.datapath.DataConfig._
6
7object WbConfig {
8  sealed abstract class WbConfig() {
9    val port: Int
10    def dataCfg: DataConfig
11    def dataWidth: Int = dataCfg.dataWidth
12
13    def writeInt = dataCfg == IntData()
14    def writeFp = dataCfg == FpData()
15    def writeVec = dataCfg == VecData()
16
17    override def toString: String = {
18      var res = this match {
19        case _: IntWB => "INT"
20        case _: FpWB => "FP"
21        case _: VfWB => "VF"
22        case _: NoWB => "NO"
23        case _ => "??"
24      }
25      res += s"($port)"
26      res
27    }
28  }
29
30  sealed abstract class ExuWB extends WbConfig
31
32  sealed abstract class PregWB extends ExuWB {
33    val priority: Int
34
35    def numPreg(backendParams: BackendParams): Int
36
37    def pregIdxWidth(backendParams: BackendParams) = log2Up(numPreg(backendParams))
38  }
39
40  case class IntWB(
41    port    : Int = -1,
42    priority: Int = Int.MaxValue,
43  ) extends PregWB {
44
45    def dataCfg: DataConfig = IntData()
46
47    def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(IntData()).numEntries
48  }
49
50  case class FpWB(
51    port: Int = -1,
52    priority: Int = Int.MaxValue,
53  ) extends PregWB {
54
55    def dataCfg: DataConfig = FpData()
56
57    def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(FpData()).numEntries
58  }
59
60  case class VfWB(
61    port    : Int = -1,
62    priority: Int = Int.MaxValue,
63  ) extends PregWB {
64
65    def dataCfg: DataConfig = VecData()
66
67    def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(VecData()).numEntries
68  }
69
70  case class V0WB(
71    port    : Int = -1,
72    priority: Int = Int.MaxValue,
73  ) extends PregWB {
74
75    def dataCfg: DataConfig = MaskSrcData()
76
77    def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(MaskSrcData()).numEntries
78  }
79
80  case class VlWB(
81    port    : Int = -1,
82    priority: Int = Int.MaxValue,
83  ) extends PregWB {
84
85    def dataCfg: DataConfig = VConfigData()
86
87    def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(VConfigData()).numEntries
88  }
89
90  case class NoWB(
91    port    : Int = -1,
92    priority: Int = Int.MaxValue,
93  ) extends PregWB {
94
95    override def dataCfg: DataConfig = NoData()
96
97    override def numPreg(backendParams: BackendParams): Int = 0
98  }
99
100  case class CtrlWB(
101    port: Int = -1,
102  ) extends WbConfig {
103    val priority: Int = Int.MaxValue
104    override def dataCfg: DataConfig = NoData()
105  }
106
107  case class FakeIntWB(
108    port    : Int = -1,
109    priority: Int = Int.MaxValue,
110  ) extends PregWB {
111
112    def dataCfg: DataConfig = FakeIntData()
113
114    def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(FakeIntData()).numEntries
115  }
116}
117