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