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