coreplex: leverage improved := composition
This commit is contained in:
		@@ -24,9 +24,7 @@ trait HasCrossingHelper extends LazyScope
 | 
				
			|||||||
    val out = x.node.parentsOut.exists(_ eq this) // is the crossing exiting the wrapper?
 | 
					    val out = x.node.parentsOut.exists(_ eq this) // is the crossing exiting the wrapper?
 | 
				
			||||||
    crossing match {
 | 
					    crossing match {
 | 
				
			||||||
      case SynchronousCrossing(params) => {
 | 
					      case SynchronousCrossing(params) => {
 | 
				
			||||||
        // !!! Why does star resolution fail for tile with no slave devices?
 | 
					        this { TLBuffer(params)(x.node) }
 | 
				
			||||||
        // this { TLBuffer(params)(x.node) }
 | 
					 | 
				
			||||||
        x.node
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      case RationalCrossing(direction) => {
 | 
					      case RationalCrossing(direction) => {
 | 
				
			||||||
        def sourceGen = LazyModule(new TLRationalCrossingSource)
 | 
					        def sourceGen = LazyModule(new TLRationalCrossingSource)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,15 +37,12 @@ class PeripheryBus(params: PeripheryBusParams)(implicit p: Parameters) extends T
 | 
				
			|||||||
    atomics.node
 | 
					    atomics.node
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def toTile(
 | 
					  def toTile(name: Option[String] = None)(gen: Parameters => TLInwardNode) {
 | 
				
			||||||
      adapt: TLOutwardNode => TLOutwardNode,
 | 
					 | 
				
			||||||
      to: TLInwardNode,
 | 
					 | 
				
			||||||
      name: Option[String] = None) {
 | 
					 | 
				
			||||||
    this {
 | 
					    this {
 | 
				
			||||||
      LazyScope(s"${busName}ToTile${name.getOrElse("")}") {
 | 
					      LazyScope(s"${busName}ToTile${name.getOrElse("")}") {
 | 
				
			||||||
        SinkCardinality { implicit p =>
 | 
					        SinkCardinality { implicit p =>
 | 
				
			||||||
          FlipRendering { implicit p =>
 | 
					          FlipRendering { implicit p =>
 | 
				
			||||||
            to :*= adapt(outwardNode)
 | 
					            gen(p) :*= outwardNode
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,18 +28,11 @@ case class TileMasterPortParams(
 | 
				
			|||||||
        .map(BasicBusBlockerParams(_, coreplex.pbus.beatBytes, coreplex.sbus.beatBytes, deadlock = true))
 | 
					        .map(BasicBusBlockerParams(_, coreplex.pbus.beatBytes, coreplex.sbus.beatBytes, deadlock = true))
 | 
				
			||||||
        .map(bp => LazyModule(new BasicBusBlocker(bp)))
 | 
					        .map(bp => LazyModule(new BasicBusBlocker(bp)))
 | 
				
			||||||
    val tile_master_fixer = LazyModule(new TLFIFOFixer(TLFIFOFixer.allUncacheable))
 | 
					    val tile_master_fixer = LazyModule(new TLFIFOFixer(TLFIFOFixer.allUncacheable))
 | 
				
			||||||
    val tile_master_buffer = LazyModule(new TLBufferChain(addBuffers))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    val node: Option[TLNode] = TLNodeChain(List(
 | 
					 | 
				
			||||||
      Some(tile_master_buffer.node),
 | 
					 | 
				
			||||||
      Some(tile_master_fixer.node),
 | 
					 | 
				
			||||||
      tile_master_blocker.map(_.node),
 | 
					 | 
				
			||||||
      tile_master_cork.map(_.node)).flatten)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tile_master_blocker.foreach { _.controlNode := coreplex.pbus.toVariableWidthSlaves }
 | 
					    tile_master_blocker.foreach { _.controlNode := coreplex.pbus.toVariableWidthSlaves }
 | 
				
			||||||
    node.foreach { _ :=* masterNode }
 | 
					    (Seq(tile_master_fixer.node) ++ TLBuffer.chain(addBuffers)
 | 
				
			||||||
 | 
					     ++ tile_master_blocker.map(_.node) ++ tile_master_cork.map(_.node))
 | 
				
			||||||
    node.getOrElse(masterNode)
 | 
					     .foldRight(masterNode)(_ :=* _)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -48,22 +41,16 @@ case class TileSlavePortParams(
 | 
				
			|||||||
    blockerCtrlAddr: Option[BigInt] = None) {
 | 
					    blockerCtrlAddr: Option[BigInt] = None) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def adapt(coreplex: HasPeripheryBus)
 | 
					  def adapt(coreplex: HasPeripheryBus)
 | 
				
			||||||
           (masterNode: TLOutwardNode)
 | 
					           (slaveNode: TLInwardNode)
 | 
				
			||||||
           (implicit p: Parameters, sourceInfo: SourceInfo): TLOutwardNode = {
 | 
					           (implicit p: Parameters, sourceInfo: SourceInfo): TLInwardNode = {
 | 
				
			||||||
    val tile_slave_blocker =
 | 
					    val tile_slave_blocker =
 | 
				
			||||||
      blockerCtrlAddr
 | 
					      blockerCtrlAddr
 | 
				
			||||||
        .map(BasicBusBlockerParams(_, coreplex.pbus.beatBytes, coreplex.sbus.beatBytes))
 | 
					        .map(BasicBusBlockerParams(_, coreplex.pbus.beatBytes, coreplex.sbus.beatBytes))
 | 
				
			||||||
        .map(bp => LazyModule(new BasicBusBlocker(bp)))
 | 
					        .map(bp => LazyModule(new BasicBusBlocker(bp)))
 | 
				
			||||||
    val tile_slave_buffer = LazyModule(new TLBufferChain(addBuffers))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    val node: Option[TLNode] = TLNodeChain(List(
 | 
					 | 
				
			||||||
      Some(tile_slave_buffer.node),
 | 
					 | 
				
			||||||
      tile_slave_blocker.map(_.node)).flatten)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tile_slave_blocker.foreach { _.controlNode := coreplex.pbus.toVariableWidthSlaves }
 | 
					    tile_slave_blocker.foreach { _.controlNode := coreplex.pbus.toVariableWidthSlaves }
 | 
				
			||||||
    node.foreach { _ :*= masterNode }
 | 
					    (TLBuffer.chain(addBuffers) ++ tile_slave_blocker.map(_.node))
 | 
				
			||||||
 | 
					    .foldLeft(slaveNode)(_ :*= _)
 | 
				
			||||||
    node.getOrElse(masterNode)
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -116,18 +103,10 @@ trait HasRocketTiles extends HasTiles
 | 
				
			|||||||
    ).suggestName(tp.name)
 | 
					    ).suggestName(tp.name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Connect the master ports of the tile to the system bus
 | 
					    // Connect the master ports of the tile to the system bus
 | 
				
			||||||
    sbus.fromTile(
 | 
					    sbus.fromTile(tp.name) { implicit p => crossing.master.adapt(this)(wrapper.cross(wrapper.masterNode)) }
 | 
				
			||||||
      adapt = {x: TLOutwardNode => wrapper.cross(x) } andThen
 | 
					 | 
				
			||||||
        crossing.master.adapt(this) _,
 | 
					 | 
				
			||||||
      from = wrapper.masterNode,
 | 
					 | 
				
			||||||
      name = tp.name)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Connect the slave ports of the tile to the periphery bus
 | 
					    // Connect the slave ports of the tile to the periphery bus
 | 
				
			||||||
    pbus.toTile(
 | 
					    pbus.toTile(tp.name) { implicit p => crossing.slave.adapt(this)(wrapper.slaveNode) } // !!! wrapper.cross
 | 
				
			||||||
      adapt = {x: TLOutwardNode => wrapper.cross(x) } compose
 | 
					 | 
				
			||||||
        crossing.slave.adapt(this) _,
 | 
					 | 
				
			||||||
      to = wrapper.slaveNode,
 | 
					 | 
				
			||||||
      name = tp.name)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Handle all the different types of interrupts crossing to or from the tile:
 | 
					    // Handle all the different types of interrupts crossing to or from the tile:
 | 
				
			||||||
    // 1. Debug interrupt is definitely asynchronous in all cases.
 | 
					    // 1. Debug interrupt is definitely asynchronous in all cases.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,14 +52,11 @@ class SystemBus(params: SystemBusParams)(implicit p: Parameters) extends TLBusWr
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  def fromFrontBus: TLInwardNode = master_splitter.node
 | 
					  def fromFrontBus: TLInwardNode = master_splitter.node
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def fromTile(
 | 
					  def fromTile(name: Option[String])(gen: Parameters => TLOutwardNode) {
 | 
				
			||||||
      adapt: TLOutwardNode => TLOutwardNode,
 | 
					 | 
				
			||||||
      from: TLOutwardNode,
 | 
					 | 
				
			||||||
      name: Option[String] = None) {
 | 
					 | 
				
			||||||
    this {
 | 
					    this {
 | 
				
			||||||
      LazyScope(s"${busName}FromTile${name.getOrElse("")}") {
 | 
					      LazyScope(s"${busName}FromTile${name.getOrElse("")}") {
 | 
				
			||||||
        SourceCardinality { implicit p =>
 | 
					        SourceCardinality { implicit p =>
 | 
				
			||||||
          master_splitter.node :=* adapt(from)
 | 
					          master_splitter.node :=* gen(p)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,9 +26,7 @@ class GroundTestCoreplex(implicit p: Parameters) extends BaseCoreplex
 | 
				
			|||||||
  )}
 | 
					  )}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  tiles.flatMap(_.dcacheOpt).foreach { dc =>
 | 
					  tiles.flatMap(_.dcacheOpt).foreach { dc =>
 | 
				
			||||||
    sbus.fromTile(
 | 
					    sbus.fromTile(None) { implicit p => TileMasterPortParams(addBuffers = 1).adapt(this)(dc.node) }
 | 
				
			||||||
      adapt = TileMasterPortParams(addBuffers = 1).adapt(this) _,
 | 
					 | 
				
			||||||
      from = dc.node)
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  val pbusRAM = LazyModule(new TLRAM(AddressSet(testRamAddr, 0xffff), true, false, pbus.beatBytes))
 | 
					  val pbusRAM = LazyModule(new TLRAM(AddressSet(testRamAddr, 0xffff), true, false, pbus.beatBytes))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -79,18 +79,9 @@ object TLBuffer
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
object TLNodeChain {
 | 
					 | 
				
			||||||
  def apply(nodes: Seq[TLNode])(implicit p: Parameters): Option[TLNode] = if(nodes.size > 0) {
 | 
					 | 
				
			||||||
    (nodes.init zip nodes.tail) foreach { case (prev, next) => next :=? prev }
 | 
					 | 
				
			||||||
    Some(NodeHandle(nodes.head, nodes.last))
 | 
					 | 
				
			||||||
  } else {
 | 
					 | 
				
			||||||
    None
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class TLBufferChain(depth: Int)(implicit p: Parameters) extends SimpleLazyModule {
 | 
					class TLBufferChain(depth: Int)(implicit p: Parameters) extends SimpleLazyModule {
 | 
				
			||||||
  val buf_chain = List.fill(depth)(LazyModule(new TLBuffer(BufferParams.default)))
 | 
					  val buf_chain = List.fill(depth)(LazyModule(new TLBuffer(BufferParams.default)))
 | 
				
			||||||
  val node = TLNodeChain(buf_chain.map(_.node)).getOrElse(TLIdentityNode())
 | 
					  val node = buf_chain.map(_.node:TLNode).reduceOption(_ :=? _).getOrElse(TLIdentityNode())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
object TLBufferChain
 | 
					object TLBufferChain
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user