xref: /XiangShan/src/main/scala/xiangshan/backend/datapath/WakeUpConfig.scala (revision dd473fffdbc9bcdbae062bfc5210e67b6e848a47)
1package xiangshan.backend.datapath
2
3import chipsalliance.rocketchip.config.Parameters
4import chisel3._
5import chisel3.util._
6import xiangshan.backend.BackendParams
7import xiangshan.backend.Bundles.IssueQueueWakeUpBundle
8import xiangshan.backend.exu.ExeUnitParams
9
10import scala.language.higherKinds
11
12trait WakeUpPoint {
13  val name: String
14
15  def getExuParam(exus: Seq[ExeUnitParams]) : ExeUnitParams = {
16    val filteredExus = exus.filter(_.name == this.name)
17    require(filteredExus.isEmpty, s"No exu named $name")
18    require(filteredExus.size > 1, s"Exu $name should be unique")
19    filteredExus.head
20  }
21}
22
23class WakeUpSource(val name: String) extends WakeUpPoint {
24  def genIQWakeUpValidBundle(backendParam: BackendParams): ValidIO[IssueQueueWakeUpBundle] = {
25    ValidIO(new IssueQueueWakeUpBundle(name, backendParam))
26  }
27}
28
29class WakeUpSink(val name: String) extends WakeUpPoint
30
31class WakeUpConfig (val source: WakeUpSource, val sink: WakeUpSink) {
32  def this(pair: (String, String)) = {
33    this(new WakeUpSource(pair._1), new WakeUpSink(pair._2))
34  }
35
36  def this(source: String, sink: String) = {
37    this(new WakeUpSource(source), new WakeUpSink(sink))
38  }
39
40  override def toString: String = {
41    s"WakeUp(${source.name}->${sink.name})"
42  }
43}
44
45object WakeUpConfig {
46  def apply(source: String, sink: String): WakeUpConfig = new WakeUpConfig(source, sink)
47
48  def apply(pair: (String, String)): WakeUpConfig = new WakeUpConfig(pair)
49}
50