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