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