1package xiangshan.backend.datapath 2 3import chipsalliance.rocketchip.config.Parameters 4import chisel3._ 5import chisel3.util._ 6import xiangshan.backend.Bundles.IssueQueueWakeUpBundle 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.isEmpty, 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(implicit p: Parameters): ValidIO[IssueQueueWakeUpBundle] = { 24 ValidIO(new IssueQueueWakeUpBundle(name)) 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(source: String, sink: String): WakeUpConfig = new WakeUpConfig(source, sink) 46 47 def apply(pair: (String, String)): WakeUpConfig = new WakeUpConfig(pair) 48} 49