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