subsystem: more buswrapper coupling methods
This commit is contained in:
		| @@ -17,29 +17,32 @@ class FrontBus(params: FrontBusParams, val crossing: SubsystemClockCrossing = Sy | ||||
|     with HasTLXbarPhy | ||||
|     with HasCrossing { | ||||
|  | ||||
|   def fromPort[D,U,E,B <: Data]( | ||||
|         name: Option[String] = None, | ||||
|         buffers: Int = 1) | ||||
|       (gen: => NodeHandle[D,U,E,B,TLClientPortParameters,TLManagerPortParameters,TLEdgeOut,TLBundle]): InwardNodeHandle[D,U,E,B] = { | ||||
|   def fromPort[D,U,E,B <: Data] | ||||
|       (name: Option[String] = None, buffers: Int = 1) | ||||
|       (gen: => NodeHandle[D,U,E,B,TLClientPortParameters,TLManagerPortParameters,TLEdgeOut,TLBundle] = | ||||
|         TLIdentity.gen): InwardNodeHandle[D,U,E,B] = { | ||||
|     from("port" named name) { | ||||
|       val nodes = TLFIFOFixer(TLFIFOFixer.all) +: TLBuffer.chain(buffers) | ||||
|       inwardNode :=* nodes.reduce(_ :=* _) :=* gen | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   def fromMaster(name: Option[String] = None, buffers: Int = 1) | ||||
|                 (gen: => TLNode): TLInwardNode = { | ||||
|     from("master" named name) { | ||||
|       inwardNode :=* TLBuffer.chain(buffers).reduce(_ :=* _) :=* gen | ||||
|   def fromMasterNode( name: Option[String] = None, buffers: Int = 1)(gen: TLOutwardNode) {  | ||||
|     from("master" named name) { bufferFrom(buffers) :=* gen } | ||||
|   } | ||||
|  | ||||
|   def fromMaster[D,U,E,B <: Data] | ||||
|       (name: Option[String] = None, buffers: Int = 1) | ||||
|       (gen: => NodeHandle[D,U,E,B,TLClientPortParameters,TLManagerPortParameters,TLEdgeOut,TLBundle] = | ||||
|         TLIdentity.gen): InwardNodeHandle[D,U,E,B] = { | ||||
|     from("master" named name) { bufferFrom(buffers) :=* gen } | ||||
|   } | ||||
|  | ||||
|   def fromCoherentChip(gen: => TLNode): TLInwardNode = { | ||||
|     from("coherent_subsystem") { inwardNode :=* gen } | ||||
|   } | ||||
|  | ||||
|   def toSystemBus(buffer: BufferParams = BufferParams.none) | ||||
|                  (gen: => TLInwardNode) { | ||||
|   def toSystemBus(buffer: BufferParams = BufferParams.none)(gen: => TLInwardNode) { | ||||
|     to("sbus") { gen :=* TLBuffer(buffer) :=* outwardNode } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -44,33 +44,34 @@ case object MemoryBusKey extends Field[MemoryBusParams] | ||||
| class MemoryBus(params: MemoryBusParams)(implicit p: Parameters) extends TLBusWrapper(params, "memory_bus")(p) | ||||
|     with HasTLXbarPhy { | ||||
|  | ||||
|   private def bufferTo(buffer: BufferParams): TLOutwardNode = | ||||
|     TLBuffer(buffer) :*= delayNode :*= outwardNode | ||||
|  | ||||
|   def fromCoherenceManager( | ||||
|         name: Option[String] = None, | ||||
|         buffer: BufferParams = BufferParams.none) | ||||
|       (gen: => TLNode): TLInwardNode = { | ||||
|     from("coherence_manager" named name) { | ||||
|       inwardNode :*= TLBuffer(buffer) :*= gen | ||||
|       inwardNode := TLBuffer(buffer) := gen | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   def toDRAMController[D,U,E,B <: Data]( | ||||
|         name: Option[String] = None, | ||||
|         buffer: BufferParams = BufferParams.none) | ||||
|       (gen: => NodeHandle[ | ||||
|                 TLClientPortParameters,TLManagerPortParameters,TLEdgeIn,TLBundle, | ||||
|                 D,U,E,B] = TLIdentity.gen): OutwardNodeHandle[D,U,E,B] = { | ||||
|   def toDRAMController[D,U,E,B <: Data] | ||||
|       (name: Option[String] = None, buffer: BufferParams = BufferParams.none) | ||||
|       (gen: => NodeHandle[ TLClientPortParameters,TLManagerPortParameters,TLEdgeIn,TLBundle, D,U,E,B] = | ||||
|         TLIdentity.gen): OutwardNodeHandle[D,U,E,B] = { | ||||
|     to("memory_controller" named name) { gen := bufferTo(buffer) } | ||||
|   } | ||||
|  | ||||
|   def toVariableWidthSlave( | ||||
|         name: Option[String] = None, | ||||
|         buffer: BufferParams = BufferParams.none) | ||||
|       (gen: => TLNode): TLOutwardNode = { | ||||
|     to("slave" named name) { | ||||
|       gen :*= TLFragmenter(params.beatBytes, params.blockBytes) :*= bufferTo(buffer) | ||||
|   def toVariableWidthSlave[D,U,E,B <: Data] | ||||
|       (name: Option[String] = None, buffer: BufferParams = BufferParams.none) | ||||
|       (gen: => NodeHandle[TLClientPortParameters,TLManagerPortParameters,TLEdgeIn,TLBundle,D,U,E,B] = | ||||
|         TLIdentity.gen): OutwardNodeHandle[D,U,E,B] = { | ||||
|     to("slave" named name) { gen :*= fragmentTo(buffer) } | ||||
|   } | ||||
|  | ||||
|   def toFixedWidthSlave[D,U,E,B <: Data] | ||||
|       (name: Option[String] = None, buffer: BufferParams = BufferParams.none) | ||||
|       (gen: => NodeHandle[TLClientPortParameters,TLManagerPortParameters,TLEdgeIn,TLBundle,D,U,E,B] = | ||||
|         TLIdentity.gen): OutwardNodeHandle[D,U,E,B] = { | ||||
|     to("slave" named name) { gen :*= fixedWidthTo(buffer) } | ||||
|   } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -21,18 +21,6 @@ class PeripheryBus(params: PeripheryBusParams, val crossing: SubsystemClockCross | ||||
|     with HasTLXbarPhy | ||||
|     with HasCrossing { | ||||
|  | ||||
|   private def bufferTo(buffer: BufferParams): TLOutwardNode = | ||||
|     TLBuffer(buffer) :*= delayNode :*= outwardNode | ||||
|  | ||||
|   private def bufferTo(buffers: Int): TLOutwardNode = | ||||
|     TLBuffer.chain(buffers).foldRight(delayNode)(_ :*= _) :*= outwardNode | ||||
|  | ||||
|   private def fragmentTo(minSize: Int, maxSize: Int, buffer: BufferParams): TLOutwardNode = | ||||
|     TLFragmenter(minSize, maxSize) :*= bufferTo(buffer) | ||||
|  | ||||
|   private def fixedWidthTo(buffer: BufferParams): TLOutwardNode = | ||||
|     TLWidthWidget(params.beatBytes) :*= bufferTo(buffer) | ||||
|  | ||||
|   def toSlave[D,U,E,B <: Data]( | ||||
|         name: Option[String] = None, | ||||
|         buffer: BufferParams = BufferParams.none) | ||||
| @@ -42,6 +30,15 @@ class PeripheryBus(params: PeripheryBusParams, val crossing: SubsystemClockCross | ||||
|     to("slave" named name) { gen :*= bufferTo(buffer) } | ||||
|   } | ||||
|  | ||||
|   def toVariableWidthSlaveNode( | ||||
|         name: Option[String] = None, | ||||
|         buffer: BufferParams = BufferParams.none) | ||||
|       (gen: TLInwardNode) { | ||||
|     to("slave" named name) { | ||||
|       gen :*= fragmentTo(params.beatBytes, params.blockBytes, buffer) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   def toVariableWidthSlave[D,U,E,B <: Data]( | ||||
|         name: Option[String] = None, | ||||
|         buffer: BufferParams = BufferParams.none) | ||||
| @@ -53,6 +50,13 @@ class PeripheryBus(params: PeripheryBusParams, val crossing: SubsystemClockCross | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   def toFixedWidthSlaveNode( | ||||
|         name: Option[String] = None, | ||||
|         buffer: BufferParams = BufferParams.none) | ||||
|       (gen: TLInwardNode) { | ||||
|     to("slave" named name) { gen :*= fixedWidthTo(buffer) } | ||||
|   } | ||||
|  | ||||
|   def toFixedWidthSlave[D,U,E,B <: Data]( | ||||
|         name: Option[String] = None, | ||||
|         buffer: BufferParams = BufferParams.none) | ||||
| @@ -62,6 +66,16 @@ class PeripheryBus(params: PeripheryBusParams, val crossing: SubsystemClockCross | ||||
|     to("slave" named name) { gen :*= fixedWidthTo(buffer) } | ||||
|   } | ||||
|  | ||||
|   def toFixedWidthSingleBeatSlaveNode( | ||||
|         widthBytes: Int, | ||||
|         name: Option[String] = None, | ||||
|         buffer: BufferParams = BufferParams.none) | ||||
|       (gen: TLInwardNode) { | ||||
|     to("slave" named name) { | ||||
|       gen :*= TLFragmenter(widthBytes, params.blockBytes) :*= fixedWidthTo(buffer) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   def toFixedWidthSingleBeatSlave[D,U,E,B <: Data]( | ||||
|         widthBytes: Int, | ||||
|         name: Option[String] = None, | ||||
| @@ -108,7 +122,7 @@ class PeripheryBus(params: PeripheryBusParams, val crossing: SubsystemClockCross | ||||
|         name: Option[String] = None, | ||||
|         buffer: BufferParams = BufferParams.none) | ||||
|       (gen: => TLNode): TLInwardNode = { | ||||
|     from("master" named name) { inwardNode :*= TLBuffer(buffer) :*= gen } | ||||
|     from("master" named name) { bufferFrom(buffer) :=* gen } | ||||
|   } | ||||
|  | ||||
|  | ||||
| @@ -116,10 +130,8 @@ class PeripheryBus(params: PeripheryBusParams, val crossing: SubsystemClockCross | ||||
|         name: Option[String] = None, | ||||
|         buffers: Int = 0) | ||||
|       (gen: => TLNode): TLOutwardNode = { | ||||
|     to("tile" named name) { | ||||
|       FlipRendering { implicit p => | ||||
|     to("tile" named name) { FlipRendering { implicit p => | ||||
|       gen :*= bufferTo(buffers) | ||||
|       } | ||||
|     } | ||||
|     }} | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -20,12 +20,6 @@ class SystemBus(params: SystemBusParams)(implicit p: Parameters) extends TLBusWr | ||||
|  | ||||
|   def busView = master_splitter.node.edges.in.head | ||||
|  | ||||
|   private def bufferTo(buffer: BufferParams): TLOutwardNode = | ||||
|     TLBuffer(buffer) :*= delayNode :*= outwardNode | ||||
|  | ||||
|   private def fixedWidthTo(buffer: BufferParams): TLOutwardNode = | ||||
|     TLWidthWidget(params.beatBytes) :*= bufferTo(buffer) | ||||
|  | ||||
|   def toPeripheryBus(buffer: BufferParams = BufferParams.none) | ||||
|                     (gen: => TLNode): TLOutwardNode = { | ||||
|     to("pbus") { | ||||
| @@ -37,30 +31,34 @@ class SystemBus(params: SystemBusParams)(implicit p: Parameters) extends TLBusWr | ||||
|   } | ||||
|  | ||||
|   def toMemoryBus(gen: => TLInwardNode) { | ||||
|     to("mbus") { gen :*= delayNode :*= outwardNode } | ||||
|     to("mbus") { gen := delayNode := outwardNode } | ||||
|   } | ||||
|  | ||||
|   def toSlave(name: Option[String] = None, buffer: BufferParams = BufferParams.default) | ||||
|              (gen: => TLNode): TLOutwardNode = { | ||||
|   def toSlave[D,U,E,B <: Data] | ||||
|       (name: Option[String] = None, buffer: BufferParams = BufferParams.default) | ||||
|       (gen: => NodeHandle[TLClientPortParameters,TLManagerPortParameters,TLEdgeIn,TLBundle,D,U,E,B] = | ||||
|         TLIdentity.gen): OutwardNodeHandle[D,U,E,B] = { | ||||
|     to("slave" named name) { gen :*= bufferTo(buffer) } | ||||
|   } | ||||
|   | ||||
|   def toSplitSlave(name: Option[String] = None) | ||||
|                   (gen: => TLNode): TLOutwardNode = { | ||||
|   def toSplitSlave[D,U,E,B <: Data] | ||||
|       (name: Option[String] = None) | ||||
|       (gen: => NodeHandle[TLClientPortParameters,TLManagerPortParameters,TLEdgeIn,TLBundle,D,U,E,B] = | ||||
|         TLIdentity.gen): OutwardNodeHandle[D,U,E,B] = { | ||||
|     to("slave" named name) { gen :=* master_splitter.node } | ||||
|   } | ||||
|  | ||||
|   def toFixedWidthSlave( | ||||
|         name: Option[String] = None, | ||||
|         buffer: BufferParams = BufferParams.none) | ||||
|       (gen: => TLNode): TLOutwardNode = { | ||||
|   def toFixedWidthSlave[D,U,E,B <: Data] | ||||
|       (name: Option[String] = None, buffer: BufferParams = BufferParams.none) | ||||
|       (gen: =>  NodeHandle[TLClientPortParameters,TLManagerPortParameters,TLEdgeIn,TLBundle,D,U,E,B] = | ||||
|         TLIdentity.gen): OutwardNodeHandle[D,U,E,B] = { | ||||
|     to("slave" named name) { gen :*= fixedWidthTo(buffer) } | ||||
|   } | ||||
|  | ||||
|   def toVariableWidthSlave( | ||||
|         name: Option[String] = None, | ||||
|         buffer: BufferParams = BufferParams.default) | ||||
|       (gen: => TLNode): TLOutwardNode = { | ||||
|   def toVariableWidthSlave[D,U,E,B <: Data] | ||||
|       (name: Option[String] = None, buffer: BufferParams = BufferParams.default) | ||||
|       (gen: => NodeHandle[TLClientPortParameters,TLManagerPortParameters,TLEdgeIn,TLBundle,D,U,E,B] = | ||||
|         TLIdentity.gen): OutwardNodeHandle[D,U,E,B] = { | ||||
|     to("slave" named name) { | ||||
|       gen :*= TLFragmenter(params.beatBytes, params.blockBytes) :*= bufferTo(buffer) | ||||
|     } | ||||
| @@ -70,10 +68,8 @@ class SystemBus(params: SystemBusParams)(implicit p: Parameters) extends TLBusWr | ||||
|     from("front_bus") { master_splitter.node :=* gen } | ||||
|   } | ||||
|  | ||||
|   def fromTile( | ||||
|         name: Option[String], | ||||
|         buffers: Int = 0, | ||||
|         cork: Option[Boolean] = None) | ||||
|   def fromTile | ||||
|       (name: Option[String], buffers: Int = 0, cork: Option[Boolean] = None) | ||||
|       (gen: => TLNode): TLInwardNode = { | ||||
|     from("tile" named name) { | ||||
|       (List(master_splitter.node, TLFIFOFixer(TLFIFOFixer.allUncacheable)) ++ TLBuffer.chain(buffers)) | ||||
| @@ -81,17 +77,17 @@ class SystemBus(params: SystemBusParams)(implicit p: Parameters) extends TLBusWr | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   def toFixedWidthPort[D,U,E,B <: Data]( | ||||
|         name: Option[String] = None, | ||||
|         buffer: BufferParams = BufferParams.default) | ||||
|       (gen: => NodeHandle[TLClientPortParameters,TLManagerPortParameters,TLEdgeIn,TLBundle,D,U,E,B]): OutwardNodeHandle[D,U,E,B] = { | ||||
|   def toFixedWidthPort[D,U,E,B <: Data] | ||||
|       (name: Option[String] = None, buffer: BufferParams = BufferParams.default) | ||||
|       (gen: => NodeHandle[TLClientPortParameters,TLManagerPortParameters,TLEdgeIn,TLBundle,D,U,E,B] = | ||||
|         TLIdentity.gen): OutwardNodeHandle[D,U,E,B] = { | ||||
|     to("port" named name) { gen := fixedWidthTo(buffer) } | ||||
|   } | ||||
|  | ||||
|   def fromPort[D,U,E,B <: Data]( | ||||
|         name: Option[String] = None, | ||||
|         buffers: Int = 0) | ||||
|       (gen: => NodeHandle[D,U,E,B,TLClientPortParameters,TLManagerPortParameters,TLEdgeOut,TLBundle]): InwardNodeHandle[D,U,E,B] = { | ||||
|   def fromPort[D,U,E,B <: Data] | ||||
|       (name: Option[String] = None, buffers: Int = 0) | ||||
|       (gen: => NodeHandle[D,U,E,B,TLClientPortParameters,TLManagerPortParameters,TLEdgeOut,TLBundle] = | ||||
|         TLIdentity.gen): InwardNodeHandle[D,U,E,B] = { | ||||
|     from("port" named name) { | ||||
|       (List( | ||||
|         master_splitter.node, | ||||
| @@ -100,22 +96,21 @@ class SystemBus(params: SystemBusParams)(implicit p: Parameters) extends TLBusWr | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   def fromCoherentMaster( | ||||
|         name: Option[String] = None, | ||||
|         buffers: Int = 0) | ||||
|       (gen: => TLNode): TLInwardNode = { | ||||
|   def fromCoherentMaster[D,U,E,B <: Data] | ||||
|       (name: Option[String] = None, buffers: Int = 0) | ||||
|       (gen: => NodeHandle[D,U,E,B,TLClientPortParameters,TLManagerPortParameters,TLEdgeOut,TLBundle] = | ||||
|         TLIdentity.gen): InwardNodeHandle[D,U,E,B] = { | ||||
|     from("coherent_master" named name) { | ||||
|       (inwardNode | ||||
|         :=* TLFIFOFixer(TLFIFOFixer.all) | ||||
|         :=* TLBuffer.chain(buffers).reduce(_ :=* _) | ||||
|         :=* TLBuffer.chain(buffers).foldLeft(TLFIFOFixer(TLFIFOFixer.all))(_ :=* _) | ||||
|         :=* gen) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   def fromMaster( | ||||
|         name: Option[String] = None, | ||||
|         buffers: Int = 0) | ||||
|       (gen: => TLNode): TLInwardNode = { | ||||
|   def fromMaster[D,U,E,B <: Data] | ||||
|       (name: Option[String] = None, buffers: Int = 0) | ||||
|       (gen: => NodeHandle[D,U,E,B,TLClientPortParameters,TLManagerPortParameters,TLEdgeOut,TLBundle] = | ||||
|         TLIdentity.gen): InwardNodeHandle[D,U,E,B] = { | ||||
|     from("master" named name) { | ||||
|       (master_splitter.node | ||||
|         :=* TLFIFOFixer(TLFIFOFixer.all) | ||||
|   | ||||
| @@ -29,6 +29,28 @@ abstract class TLBusWrapper(params: HasTLBusParams, val busName: String)(implici | ||||
|   protected def inwardNode: TLInwardNode | ||||
|   protected def outwardNode: TLOutwardNode | ||||
|  | ||||
|   protected def bufferFrom(buffer: BufferParams): TLInwardNode = | ||||
|     inwardNode :=* TLBuffer(buffer) | ||||
|  | ||||
|   protected def bufferFrom(buffers: Int): TLInwardNode = | ||||
|     TLBuffer.chain(buffers).foldLeft(inwardNode)(_ :=* _) | ||||
|  | ||||
|   protected def bufferTo(buffer: BufferParams): TLOutwardNode = | ||||
|     TLBuffer(buffer) :*= delayNode :*= outwardNode | ||||
|  | ||||
|   protected def bufferTo(buffers: Int): TLOutwardNode = | ||||
|     TLBuffer.chain(buffers).foldRight(delayNode)(_ :*= _) :*= outwardNode | ||||
|  | ||||
|   protected def fixedWidthTo(buffer: BufferParams): TLOutwardNode = | ||||
|     TLWidthWidget(beatBytes) :*= bufferTo(buffer) | ||||
|  | ||||
|   protected def fragmentTo(buffer: BufferParams): TLOutwardNode = | ||||
|     TLFragmenter(beatBytes, blockBytes) :*= bufferTo(buffer) | ||||
|  | ||||
|   protected def fragmentTo(minSize: Int, maxSize: Int, buffer: BufferParams): TLOutwardNode = | ||||
|     TLFragmenter(minSize, maxSize) :*= bufferTo(buffer) | ||||
|  | ||||
|  | ||||
|   protected def delayNode(implicit p: Parameters): TLNode = { | ||||
|     val delayProb = p(TLBusDelayProbability) | ||||
|     if (delayProb > 0.0) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user