nodes: grab a name on construction
This commit is contained in:
parent
3656e975a1
commit
d89ee9d9d4
@ -25,23 +25,24 @@ object AHBImp extends NodeImp[AHBMasterPortParameters, AHBSlavePortParameters, A
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Nodes implemented inside modules
|
// Nodes implemented inside modules
|
||||||
case class AHBIdentityNode() extends IdentityNode(AHBImp)
|
case class AHBIdentityNode()(implicit valName: ValName) extends IdentityNode(AHBImp)
|
||||||
case class AHBMasterNode(portParams: Seq[AHBMasterPortParameters]) extends SourceNode(AHBImp)(portParams)
|
case class AHBMasterNode(portParams: Seq[AHBMasterPortParameters])(implicit valName: ValName) extends SourceNode(AHBImp)(portParams)
|
||||||
case class AHBSlaveNode(portParams: Seq[AHBSlavePortParameters]) extends SinkNode(AHBImp)(portParams)
|
case class AHBSlaveNode(portParams: Seq[AHBSlavePortParameters])(implicit valName: ValName) extends SinkNode(AHBImp)(portParams)
|
||||||
case class AHBNexusNode(
|
case class AHBNexusNode(
|
||||||
masterFn: Seq[AHBMasterPortParameters] => AHBMasterPortParameters,
|
masterFn: Seq[AHBMasterPortParameters] => AHBMasterPortParameters,
|
||||||
slaveFn: Seq[AHBSlavePortParameters] => AHBSlavePortParameters,
|
slaveFn: Seq[AHBSlavePortParameters] => AHBSlavePortParameters,
|
||||||
numMasterPorts: Range.Inclusive = 1 to 999,
|
numMasterPorts: Range.Inclusive = 1 to 999,
|
||||||
numSlavePorts: Range.Inclusive = 1 to 999)
|
numSlavePorts: Range.Inclusive = 1 to 999)(
|
||||||
|
implicit valName: ValName)
|
||||||
extends NexusNode(AHBImp)(masterFn, slaveFn, numMasterPorts, numSlavePorts)
|
extends NexusNode(AHBImp)(masterFn, slaveFn, numMasterPorts, numSlavePorts)
|
||||||
|
|
||||||
// Nodes passed from an inner module
|
// Nodes passed from an inner module
|
||||||
case class AHBOutputNode() extends OutputNode(AHBImp)
|
case class AHBOutputNode()(implicit valName: ValName) extends OutputNode(AHBImp)
|
||||||
case class AHBInputNode() extends InputNode(AHBImp)
|
case class AHBInputNode()(implicit valName: ValName) extends InputNode(AHBImp)
|
||||||
|
|
||||||
// Nodes used for external ports
|
// Nodes used for external ports
|
||||||
case class AHBBlindOutputNode(portParams: Seq[AHBSlavePortParameters]) extends BlindOutputNode(AHBImp)(portParams)
|
case class AHBBlindOutputNode(portParams: Seq[AHBSlavePortParameters])(implicit valName: ValName) extends BlindOutputNode(AHBImp)(portParams)
|
||||||
case class AHBBlindInputNode(portParams: Seq[AHBMasterPortParameters]) extends BlindInputNode(AHBImp)(portParams)
|
case class AHBBlindInputNode(portParams: Seq[AHBMasterPortParameters])(implicit valName: ValName) extends BlindInputNode(AHBImp)(portParams)
|
||||||
|
|
||||||
case class AHBInternalOutputNode(portParams: Seq[AHBSlavePortParameters]) extends InternalOutputNode(AHBImp)(portParams)
|
case class AHBInternalOutputNode(portParams: Seq[AHBSlavePortParameters])(implicit valName: ValName) extends InternalOutputNode(AHBImp)(portParams)
|
||||||
case class AHBInternalInputNode(portParams: Seq[AHBMasterPortParameters]) extends InternalInputNode(AHBImp)(portParams)
|
case class AHBInternalInputNode(portParams: Seq[AHBMasterPortParameters])(implicit valName: ValName) extends InternalInputNode(AHBImp)(portParams)
|
||||||
|
@ -10,8 +10,8 @@ import freechips.rocketchip.tilelink.{IntSourceNode, IntSourcePortSimple}
|
|||||||
import freechips.rocketchip.util.{HeterogeneousBag, MaskGen}
|
import freechips.rocketchip.util.{HeterogeneousBag, MaskGen}
|
||||||
import scala.math.{min,max}
|
import scala.math.{min,max}
|
||||||
|
|
||||||
class AHBRegisterNode(address: AddressSet, concurrency: Int = 0, beatBytes: Int = 4, undefZero: Boolean = true, executable: Boolean = false)
|
case class AHBRegisterNode(address: AddressSet, concurrency: Int = 0, beatBytes: Int = 4, undefZero: Boolean = true, executable: Boolean = false)(implicit valName: ValName)
|
||||||
extends AHBSlaveNode(Seq(AHBSlavePortParameters(
|
extends SinkNode(AHBImp)(Seq(AHBSlavePortParameters(
|
||||||
Seq(AHBSlaveParameters(
|
Seq(AHBSlaveParameters(
|
||||||
address = Seq(address),
|
address = Seq(address),
|
||||||
executable = executable,
|
executable = executable,
|
||||||
@ -67,12 +67,6 @@ class AHBRegisterNode(address: AddressSet, concurrency: Int = 0, beatBytes: Int
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object AHBRegisterNode
|
|
||||||
{
|
|
||||||
def apply(address: AddressSet, concurrency: Int = 0, beatBytes: Int = 4, undefZero: Boolean = true, executable: Boolean = false) =
|
|
||||||
new AHBRegisterNode(address, concurrency, beatBytes, undefZero, executable)
|
|
||||||
}
|
|
||||||
|
|
||||||
// These convenience methods below combine to make it possible to create a AHB
|
// These convenience methods below combine to make it possible to create a AHB
|
||||||
// register mapped device from a totally abstract register mapped device.
|
// register mapped device from a totally abstract register mapped device.
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ import freechips.rocketchip.diplomacy._
|
|||||||
import freechips.rocketchip.tilelink._
|
import freechips.rocketchip.tilelink._
|
||||||
import freechips.rocketchip.util.MaskGen
|
import freechips.rocketchip.util.MaskGen
|
||||||
|
|
||||||
case class AHBToTLNode() extends MixedAdapterNode(AHBImp, TLImp)(
|
case class AHBToTLNode()(implicit valName: ValName) extends MixedAdapterNode(AHBImp, TLImp)(
|
||||||
dFn = { case AHBMasterPortParameters(masters) =>
|
dFn = { case AHBMasterPortParameters(masters) =>
|
||||||
TLClientPortParameters(clients = masters.map { m =>
|
TLClientPortParameters(clients = masters.map { m =>
|
||||||
TLClientParameters(name = m.name, nodePath = m.nodePath)
|
TLClientParameters(name = m.name, nodePath = m.nodePath)
|
||||||
|
@ -26,23 +26,24 @@ object APBImp extends NodeImp[APBMasterPortParameters, APBSlavePortParameters, A
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Nodes implemented inside modules
|
// Nodes implemented inside modules
|
||||||
case class APBIdentityNode() extends IdentityNode(APBImp)
|
case class APBIdentityNode()(implicit valName: ValName) extends IdentityNode(APBImp)
|
||||||
case class APBMasterNode(portParams: Seq[APBMasterPortParameters]) extends SourceNode(APBImp)(portParams)
|
case class APBMasterNode(portParams: Seq[APBMasterPortParameters])(implicit valName: ValName) extends SourceNode(APBImp)(portParams)
|
||||||
case class APBSlaveNode(portParams: Seq[APBSlavePortParameters]) extends SinkNode(APBImp)(portParams)
|
case class APBSlaveNode(portParams: Seq[APBSlavePortParameters])(implicit valName: ValName) extends SinkNode(APBImp)(portParams)
|
||||||
case class APBNexusNode(
|
case class APBNexusNode(
|
||||||
masterFn: Seq[APBMasterPortParameters] => APBMasterPortParameters,
|
masterFn: Seq[APBMasterPortParameters] => APBMasterPortParameters,
|
||||||
slaveFn: Seq[APBSlavePortParameters] => APBSlavePortParameters,
|
slaveFn: Seq[APBSlavePortParameters] => APBSlavePortParameters,
|
||||||
numMasterPorts: Range.Inclusive = 1 to 1,
|
numMasterPorts: Range.Inclusive = 1 to 1,
|
||||||
numSlavePorts: Range.Inclusive = 1 to 1)
|
numSlavePorts: Range.Inclusive = 1 to 1)(
|
||||||
|
implicit valName: ValName)
|
||||||
extends NexusNode(APBImp)(masterFn, slaveFn, numMasterPorts, numSlavePorts)
|
extends NexusNode(APBImp)(masterFn, slaveFn, numMasterPorts, numSlavePorts)
|
||||||
|
|
||||||
// Nodes passed from an inner module
|
// Nodes passed from an inner module
|
||||||
case class APBOutputNode() extends OutputNode(APBImp)
|
case class APBOutputNode()(implicit valName: ValName) extends OutputNode(APBImp)
|
||||||
case class APBInputNode() extends InputNode(APBImp)
|
case class APBInputNode()(implicit valName: ValName) extends InputNode(APBImp)
|
||||||
|
|
||||||
// Nodes used for external ports
|
// Nodes used for external ports
|
||||||
case class APBBlindOutputNode(portParams: Seq[APBSlavePortParameters]) extends BlindOutputNode(APBImp)(portParams)
|
case class APBBlindOutputNode(portParams: Seq[APBSlavePortParameters])(implicit valName: ValName) extends BlindOutputNode(APBImp)(portParams)
|
||||||
case class APBBlindInputNode(portParams: Seq[APBMasterPortParameters]) extends BlindInputNode(APBImp)(portParams)
|
case class APBBlindInputNode(portParams: Seq[APBMasterPortParameters])(implicit valName: ValName) extends BlindInputNode(APBImp)(portParams)
|
||||||
|
|
||||||
case class APBInternalOutputNode(portParams: Seq[APBSlavePortParameters]) extends InternalOutputNode(APBImp)(portParams)
|
case class APBInternalOutputNode(portParams: Seq[APBSlavePortParameters])(implicit valName: ValName) extends InternalOutputNode(APBImp)(portParams)
|
||||||
case class APBInternalInputNode(portParams: Seq[APBMasterPortParameters]) extends InternalInputNode(APBImp)(portParams)
|
case class APBInternalInputNode(portParams: Seq[APBMasterPortParameters])(implicit valName: ValName) extends InternalInputNode(APBImp)(portParams)
|
||||||
|
@ -10,8 +10,8 @@ import freechips.rocketchip.tilelink.{IntSourceNode, IntSourcePortSimple}
|
|||||||
import freechips.rocketchip.util.HeterogeneousBag
|
import freechips.rocketchip.util.HeterogeneousBag
|
||||||
import scala.math.{min,max}
|
import scala.math.{min,max}
|
||||||
|
|
||||||
class APBRegisterNode(address: AddressSet, concurrency: Int = 0, beatBytes: Int = 4, undefZero: Boolean = true, executable: Boolean = false)
|
case class APBRegisterNode(address: AddressSet, concurrency: Int = 0, beatBytes: Int = 4, undefZero: Boolean = true, executable: Boolean = false)(implicit valName: ValName)
|
||||||
extends APBSlaveNode(Seq(APBSlavePortParameters(
|
extends SinkNode(APBImp)(Seq(APBSlavePortParameters(
|
||||||
Seq(APBSlaveParameters(
|
Seq(APBSlaveParameters(
|
||||||
address = Seq(address),
|
address = Seq(address),
|
||||||
executable = executable,
|
executable = executable,
|
||||||
@ -51,12 +51,6 @@ class APBRegisterNode(address: AddressSet, concurrency: Int = 0, beatBytes: Int
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object APBRegisterNode
|
|
||||||
{
|
|
||||||
def apply(address: AddressSet, concurrency: Int = 0, beatBytes: Int = 4, undefZero: Boolean = true, executable: Boolean = false) =
|
|
||||||
new APBRegisterNode(address, concurrency, beatBytes, undefZero, executable)
|
|
||||||
}
|
|
||||||
|
|
||||||
// These convenience methods below combine to make it possible to create a APB
|
// These convenience methods below combine to make it possible to create a APB
|
||||||
// register mapped device from a totally abstract register mapped device.
|
// register mapped device from a totally abstract register mapped device.
|
||||||
|
|
||||||
|
@ -26,22 +26,23 @@ object AXI4Imp extends NodeImp[AXI4MasterPortParameters, AXI4SlavePortParameters
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Nodes implemented inside modules
|
// Nodes implemented inside modules
|
||||||
case class AXI4IdentityNode() extends IdentityNode(AXI4Imp)
|
case class AXI4IdentityNode()(implicit valName: ValName) extends IdentityNode(AXI4Imp)
|
||||||
case class AXI4MasterNode(portParams: Seq[AXI4MasterPortParameters]) extends SourceNode(AXI4Imp)(portParams)
|
case class AXI4MasterNode(portParams: Seq[AXI4MasterPortParameters])(implicit valName: ValName) extends SourceNode(AXI4Imp)(portParams)
|
||||||
case class AXI4SlaveNode(portParams: Seq[AXI4SlavePortParameters]) extends SinkNode(AXI4Imp)(portParams)
|
case class AXI4SlaveNode(portParams: Seq[AXI4SlavePortParameters])(implicit valName: ValName) extends SinkNode(AXI4Imp)(portParams)
|
||||||
case class AXI4AdapterNode(
|
case class AXI4AdapterNode(
|
||||||
masterFn: AXI4MasterPortParameters => AXI4MasterPortParameters,
|
masterFn: AXI4MasterPortParameters => AXI4MasterPortParameters,
|
||||||
slaveFn: AXI4SlavePortParameters => AXI4SlavePortParameters,
|
slaveFn: AXI4SlavePortParameters => AXI4SlavePortParameters,
|
||||||
numPorts: Range.Inclusive = 0 to 999)
|
numPorts: Range.Inclusive = 0 to 999)(
|
||||||
|
implicit valName: ValName)
|
||||||
extends AdapterNode(AXI4Imp)(masterFn, slaveFn, numPorts)
|
extends AdapterNode(AXI4Imp)(masterFn, slaveFn, numPorts)
|
||||||
|
|
||||||
// Nodes passed from an inner module
|
// Nodes passed from an inner module
|
||||||
case class AXI4OutputNode() extends OutputNode(AXI4Imp)
|
case class AXI4OutputNode()(implicit valName: ValName) extends OutputNode(AXI4Imp)
|
||||||
case class AXI4InputNode() extends InputNode(AXI4Imp)
|
case class AXI4InputNode()(implicit valName: ValName) extends InputNode(AXI4Imp)
|
||||||
|
|
||||||
// Nodes used for external ports
|
// Nodes used for external ports
|
||||||
case class AXI4BlindOutputNode(portParams: Seq[AXI4SlavePortParameters]) extends BlindOutputNode(AXI4Imp)(portParams)
|
case class AXI4BlindOutputNode(portParams: Seq[AXI4SlavePortParameters])(implicit valName: ValName) extends BlindOutputNode(AXI4Imp)(portParams)
|
||||||
case class AXI4BlindInputNode(portParams: Seq[AXI4MasterPortParameters]) extends BlindInputNode(AXI4Imp)(portParams)
|
case class AXI4BlindInputNode(portParams: Seq[AXI4MasterPortParameters])(implicit valName: ValName) extends BlindInputNode(AXI4Imp)(portParams)
|
||||||
|
|
||||||
case class AXI4InternalOutputNode(portParams: Seq[AXI4SlavePortParameters]) extends InternalOutputNode(AXI4Imp)(portParams)
|
case class AXI4InternalOutputNode(portParams: Seq[AXI4SlavePortParameters])(implicit valName: ValName) extends InternalOutputNode(AXI4Imp)(portParams)
|
||||||
case class AXI4InternalInputNode(portParams: Seq[AXI4MasterPortParameters]) extends InternalInputNode(AXI4Imp)(portParams)
|
case class AXI4InternalInputNode(portParams: Seq[AXI4MasterPortParameters])(implicit valName: ValName) extends InternalInputNode(AXI4Imp)(portParams)
|
||||||
|
@ -10,8 +10,8 @@ import freechips.rocketchip.tilelink.{IntSourceNode, IntSourcePortSimple}
|
|||||||
import freechips.rocketchip.util.{HeterogeneousBag, MaskGen}
|
import freechips.rocketchip.util.{HeterogeneousBag, MaskGen}
|
||||||
import scala.math.{min,max}
|
import scala.math.{min,max}
|
||||||
|
|
||||||
class AXI4RegisterNode(address: AddressSet, concurrency: Int = 0, beatBytes: Int = 4, undefZero: Boolean = true, executable: Boolean = false)
|
case class AXI4RegisterNode(address: AddressSet, concurrency: Int = 0, beatBytes: Int = 4, undefZero: Boolean = true, executable: Boolean = false)(implicit valName: ValName)
|
||||||
extends AXI4SlaveNode(Seq(AXI4SlavePortParameters(
|
extends SinkNode(AXI4Imp)(Seq(AXI4SlavePortParameters(
|
||||||
Seq(AXI4SlaveParameters(
|
Seq(AXI4SlaveParameters(
|
||||||
address = Seq(address),
|
address = Seq(address),
|
||||||
executable = executable,
|
executable = executable,
|
||||||
@ -77,12 +77,6 @@ class AXI4RegisterNode(address: AddressSet, concurrency: Int = 0, beatBytes: Int
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object AXI4RegisterNode
|
|
||||||
{
|
|
||||||
def apply(address: AddressSet, concurrency: Int = 0, beatBytes: Int = 4, undefZero: Boolean = true, executable: Boolean = false) =
|
|
||||||
new AXI4RegisterNode(address, concurrency, beatBytes, undefZero, executable)
|
|
||||||
}
|
|
||||||
|
|
||||||
// These convenience methods below combine to make it possible to create a AXI4
|
// These convenience methods below combine to make it possible to create a AXI4
|
||||||
// register mapped device from a totally abstract register mapped device.
|
// register mapped device from a totally abstract register mapped device.
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ import freechips.rocketchip.diplomacy._
|
|||||||
import freechips.rocketchip.tilelink._
|
import freechips.rocketchip.tilelink._
|
||||||
import freechips.rocketchip.util._
|
import freechips.rocketchip.util._
|
||||||
|
|
||||||
case class AXI4ToTLNode() extends MixedAdapterNode(AXI4Imp, TLImp)(
|
case class AXI4ToTLNode()(implicit valName: ValName) extends MixedAdapterNode(AXI4Imp, TLImp)(
|
||||||
dFn = { case AXI4MasterPortParameters(masters, userBits) =>
|
dFn = { case AXI4MasterPortParameters(masters, userBits) =>
|
||||||
masters.foreach { m => require (m.maxFlight.isDefined, "AXI4 must include a transaction maximum per ID to convert to TL") }
|
masters.foreach { m => require (m.maxFlight.isDefined, "AXI4 must include a transaction maximum per ID to convert to TL") }
|
||||||
val maxFlight = masters.map(_.maxFlight.get).max
|
val maxFlight = masters.map(_.maxFlight.get).max
|
||||||
|
@ -67,7 +67,7 @@ trait OutwardNodeImp[DO, UO, EO, BO <: Data]
|
|||||||
abstract class NodeImp[D, U, EO, EI, B <: Data]
|
abstract class NodeImp[D, U, EO, EI, B <: Data]
|
||||||
extends Object with InwardNodeImp[D, U, EI, B] with OutwardNodeImp[D, U, EO, B]
|
extends Object with InwardNodeImp[D, U, EI, B] with OutwardNodeImp[D, U, EO, B]
|
||||||
|
|
||||||
abstract class BaseNode
|
abstract class BaseNode(implicit val valName: ValName)
|
||||||
{
|
{
|
||||||
require (!LazyModule.stack.isEmpty, "You cannot create a node outside a LazyModule!")
|
require (!LazyModule.stack.isEmpty, "You cannot create a node outside a LazyModule!")
|
||||||
|
|
||||||
@ -178,7 +178,8 @@ abstract class MixedNode[DI, UI, EI, BI <: Data, DO, UO, EO, BO <: Data](
|
|||||||
inner: InwardNodeImp [DI, UI, EI, BI],
|
inner: InwardNodeImp [DI, UI, EI, BI],
|
||||||
outer: OutwardNodeImp[DO, UO, EO, BO])(
|
outer: OutwardNodeImp[DO, UO, EO, BO])(
|
||||||
protected[diplomacy] val numPO: Range.Inclusive,
|
protected[diplomacy] val numPO: Range.Inclusive,
|
||||||
protected[diplomacy] val numPI: Range.Inclusive)
|
protected[diplomacy] val numPI: Range.Inclusive)(
|
||||||
|
implicit valName: ValName)
|
||||||
extends BaseNode with InwardNode[DI, UI, BI] with OutwardNode[DO, UO, BO]
|
extends BaseNode with InwardNode[DI, UI, BI] with OutwardNode[DO, UO, BO]
|
||||||
{
|
{
|
||||||
protected[diplomacy] def resolveStar(iKnown: Int, oKnown: Int, iStar: Int, oStar: Int): (Int, Int)
|
protected[diplomacy] def resolveStar(iKnown: Int, oKnown: Int, iStar: Int, oStar: Int): (Int, Int)
|
||||||
@ -308,7 +309,8 @@ abstract class MixedCustomNode[DI, UI, EI, BI <: Data, DO, UO, EO, BO <: Data](
|
|||||||
inner: InwardNodeImp [DI, UI, EI, BI],
|
inner: InwardNodeImp [DI, UI, EI, BI],
|
||||||
outer: OutwardNodeImp[DO, UO, EO, BO])(
|
outer: OutwardNodeImp[DO, UO, EO, BO])(
|
||||||
numPO: Range.Inclusive,
|
numPO: Range.Inclusive,
|
||||||
numPI: Range.Inclusive)
|
numPI: Range.Inclusive)(
|
||||||
|
implicit valName: ValName)
|
||||||
extends MixedNode(inner, outer)(numPO, numPI)
|
extends MixedNode(inner, outer)(numPO, numPI)
|
||||||
{
|
{
|
||||||
def resolveStar(iKnown: Int, oKnown: Int, iStars: Int, oStars: Int): (Int, Int)
|
def resolveStar(iKnown: Int, oKnown: Int, iStars: Int, oStars: Int): (Int, Int)
|
||||||
@ -318,7 +320,8 @@ abstract class MixedCustomNode[DI, UI, EI, BI <: Data, DO, UO, EO, BO <: Data](
|
|||||||
|
|
||||||
abstract class CustomNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(
|
abstract class CustomNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(
|
||||||
numPO: Range.Inclusive,
|
numPO: Range.Inclusive,
|
||||||
numPI: Range.Inclusive)
|
numPI: Range.Inclusive)(
|
||||||
|
implicit valName: ValName)
|
||||||
extends MixedCustomNode(imp, imp)(numPO, numPI)
|
extends MixedCustomNode(imp, imp)(numPO, numPI)
|
||||||
|
|
||||||
class MixedAdapterNode[DI, UI, EI, BI <: Data, DO, UO, EO, BO <: Data](
|
class MixedAdapterNode[DI, UI, EI, BI <: Data, DO, UO, EO, BO <: Data](
|
||||||
@ -326,7 +329,8 @@ class MixedAdapterNode[DI, UI, EI, BI <: Data, DO, UO, EO, BO <: Data](
|
|||||||
outer: OutwardNodeImp[DO, UO, EO, BO])(
|
outer: OutwardNodeImp[DO, UO, EO, BO])(
|
||||||
dFn: DI => DO,
|
dFn: DI => DO,
|
||||||
uFn: UO => UI,
|
uFn: UO => UI,
|
||||||
num: Range.Inclusive = 0 to 999)
|
num: Range.Inclusive = 0 to 999)(
|
||||||
|
implicit valName: ValName)
|
||||||
extends MixedNode(inner, outer)(num, num)
|
extends MixedNode(inner, outer)(num, num)
|
||||||
{
|
{
|
||||||
val externalIn: Boolean = true
|
val externalIn: Boolean = true
|
||||||
@ -358,7 +362,8 @@ class MixedNexusNode[DI, UI, EI, BI <: Data, DO, UO, EO, BO <: Data](
|
|||||||
dFn: Seq[DI] => DO,
|
dFn: Seq[DI] => DO,
|
||||||
uFn: Seq[UO] => UI,
|
uFn: Seq[UO] => UI,
|
||||||
numPO: Range.Inclusive = 1 to 999,
|
numPO: Range.Inclusive = 1 to 999,
|
||||||
numPI: Range.Inclusive = 1 to 999)
|
numPI: Range.Inclusive = 1 to 999)(
|
||||||
|
implicit valName: ValName)
|
||||||
extends MixedNode(inner, outer)(numPO, numPI)
|
extends MixedNode(inner, outer)(numPO, numPI)
|
||||||
{
|
{
|
||||||
// require (numPO.end >= 1, s"${name} does not accept outputs${lazyModule.line}")
|
// require (numPO.end >= 1, s"${name} does not accept outputs${lazyModule.line}")
|
||||||
@ -379,14 +384,16 @@ class MixedNexusNode[DI, UI, EI, BI <: Data, DO, UO, EO, BO <: Data](
|
|||||||
class AdapterNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(
|
class AdapterNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(
|
||||||
dFn: D => D,
|
dFn: D => D,
|
||||||
uFn: U => U,
|
uFn: U => U,
|
||||||
num: Range.Inclusive = 0 to 999)
|
num: Range.Inclusive = 0 to 999)(
|
||||||
|
implicit valName: ValName)
|
||||||
extends MixedAdapterNode[D, U, EI, B, D, U, EO, B](imp, imp)(dFn, uFn, num)
|
extends MixedAdapterNode[D, U, EI, B, D, U, EO, B](imp, imp)(dFn, uFn, num)
|
||||||
|
|
||||||
class NexusNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(
|
class NexusNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(
|
||||||
dFn: Seq[D] => D,
|
dFn: Seq[D] => D,
|
||||||
uFn: Seq[U] => U,
|
uFn: Seq[U] => U,
|
||||||
numPO: Range.Inclusive = 1 to 999,
|
numPO: Range.Inclusive = 1 to 999,
|
||||||
numPI: Range.Inclusive = 1 to 999)
|
numPI: Range.Inclusive = 1 to 999)(
|
||||||
|
implicit valName: ValName)
|
||||||
extends MixedNexusNode[D, U, EI, B, D, U, EO, B](imp, imp)(dFn, uFn, numPO, numPI)
|
extends MixedNexusNode[D, U, EI, B, D, U, EO, B](imp, imp)(dFn, uFn, numPO, numPI)
|
||||||
|
|
||||||
case class SplitterArg[T](newSize: Int, ports: Seq[T])
|
case class SplitterArg[T](newSize: Int, ports: Seq[T])
|
||||||
@ -396,7 +403,8 @@ class MixedSplitterNode[DI, UI, EI, BI <: Data, DO, UO, EO, BO <: Data](
|
|||||||
dFn: SplitterArg[DI] => Seq[DO],
|
dFn: SplitterArg[DI] => Seq[DO],
|
||||||
uFn: SplitterArg[UO] => Seq[UI],
|
uFn: SplitterArg[UO] => Seq[UI],
|
||||||
numPO: Range.Inclusive = 1 to 999,
|
numPO: Range.Inclusive = 1 to 999,
|
||||||
numPI: Range.Inclusive = 1 to 999)
|
numPI: Range.Inclusive = 1 to 999)(
|
||||||
|
implicit valName: ValName)
|
||||||
extends MixedNode(inner, outer)(numPO, numPI)
|
extends MixedNode(inner, outer)(numPO, numPI)
|
||||||
{
|
{
|
||||||
override val externalIn: Boolean = true
|
override val externalIn: Boolean = true
|
||||||
@ -425,20 +433,21 @@ class SplitterNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(
|
|||||||
dFn: SplitterArg[D] => Seq[D],
|
dFn: SplitterArg[D] => Seq[D],
|
||||||
uFn: SplitterArg[U] => Seq[U],
|
uFn: SplitterArg[U] => Seq[U],
|
||||||
numPO: Range.Inclusive = 1 to 999,
|
numPO: Range.Inclusive = 1 to 999,
|
||||||
numPI: Range.Inclusive = 1 to 999)
|
numPI: Range.Inclusive = 1 to 999)(
|
||||||
|
implicit valName: ValName)
|
||||||
extends MixedSplitterNode[D, U, EI, B, D, U, EO, B](imp, imp)(dFn, uFn, numPO, numPI)
|
extends MixedSplitterNode[D, U, EI, B, D, U, EO, B](imp, imp)(dFn, uFn, numPO, numPI)
|
||||||
|
|
||||||
class IdentityNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])
|
class IdentityNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(implicit valName: ValName)
|
||||||
extends AdapterNode(imp)({s => s}, {s => s})
|
extends AdapterNode(imp)({s => s}, {s => s})
|
||||||
|
|
||||||
class OutputNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B]) extends IdentityNode(imp)
|
class OutputNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(implicit valName: ValName) extends IdentityNode(imp)
|
||||||
{
|
{
|
||||||
override val externalIn: Boolean = false
|
override val externalIn: Boolean = false
|
||||||
override val externalOut: Boolean = true
|
override val externalOut: Boolean = true
|
||||||
override lazy val bundleIn = bundleOut
|
override lazy val bundleIn = bundleOut
|
||||||
}
|
}
|
||||||
|
|
||||||
class InputNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B]) extends IdentityNode(imp)
|
class InputNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(implicit valName: ValName) extends IdentityNode(imp)
|
||||||
{
|
{
|
||||||
override val externalIn: Boolean = true
|
override val externalIn: Boolean = true
|
||||||
override val externalOut: Boolean = false
|
override val externalOut: Boolean = false
|
||||||
@ -446,7 +455,7 @@ class InputNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B]) extends
|
|||||||
override lazy val bundleOut = bundleIn
|
override lazy val bundleOut = bundleIn
|
||||||
}
|
}
|
||||||
|
|
||||||
class SourceNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(po: Seq[D])
|
class SourceNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(po: Seq[D])(implicit valName: ValName)
|
||||||
extends MixedNode(imp, imp)(po.size to po.size, 0 to 0)
|
extends MixedNode(imp, imp)(po.size to po.size, 0 to 0)
|
||||||
{
|
{
|
||||||
override val externalIn: Boolean = false
|
override val externalIn: Boolean = false
|
||||||
@ -465,7 +474,7 @@ class SourceNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(po: Seq
|
|||||||
override lazy val bundleIn = { require(false, s"${name} has no bundleIn; try bundleOut?"); bundleOut }
|
override lazy val bundleIn = { require(false, s"${name} has no bundleIn; try bundleOut?"); bundleOut }
|
||||||
}
|
}
|
||||||
|
|
||||||
class SinkNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(pi: Seq[U])
|
class SinkNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(pi: Seq[U])(implicit valName: ValName)
|
||||||
extends MixedNode(imp, imp)(0 to 0, pi.size to pi.size)
|
extends MixedNode(imp, imp)(0 to 0, pi.size to pi.size)
|
||||||
{
|
{
|
||||||
override val externalIn: Boolean = true
|
override val externalIn: Boolean = true
|
||||||
@ -484,7 +493,7 @@ class SinkNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(pi: Seq[U
|
|||||||
override lazy val bundleOut = { require(false, s"${name} has no bundleOut; try bundleIn?"); bundleIn }
|
override lazy val bundleOut = { require(false, s"${name} has no bundleOut; try bundleIn?"); bundleIn }
|
||||||
}
|
}
|
||||||
|
|
||||||
class BlindOutputNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(pi: Seq[U])
|
class BlindOutputNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(pi: Seq[U])(implicit valName: ValName)
|
||||||
extends SinkNode(imp)(pi)
|
extends SinkNode(imp)(pi)
|
||||||
{
|
{
|
||||||
override val externalIn: Boolean = false
|
override val externalIn: Boolean = false
|
||||||
@ -492,7 +501,7 @@ class BlindOutputNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(pi
|
|||||||
override lazy val bundleOut = bundleIn
|
override lazy val bundleOut = bundleIn
|
||||||
}
|
}
|
||||||
|
|
||||||
class BlindInputNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(po: Seq[D])
|
class BlindInputNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(po: Seq[D])(implicit valName: ValName)
|
||||||
extends SourceNode(imp)(po)
|
extends SourceNode(imp)(po)
|
||||||
{
|
{
|
||||||
override val externalOut: Boolean = false
|
override val externalOut: Boolean = false
|
||||||
@ -500,7 +509,7 @@ class BlindInputNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(po:
|
|||||||
override lazy val bundleIn = bundleOut
|
override lazy val bundleIn = bundleOut
|
||||||
}
|
}
|
||||||
|
|
||||||
class InternalOutputNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(pi: Seq[U])
|
class InternalOutputNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(pi: Seq[U])(implicit valName: ValName)
|
||||||
extends SinkNode(imp)(pi)
|
extends SinkNode(imp)(pi)
|
||||||
{
|
{
|
||||||
override val externalIn: Boolean = false
|
override val externalIn: Boolean = false
|
||||||
@ -509,7 +518,7 @@ class InternalOutputNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])
|
|||||||
override lazy val bundleOut = bundleIn
|
override lazy val bundleOut = bundleIn
|
||||||
}
|
}
|
||||||
|
|
||||||
class InternalInputNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(po: Seq[D])
|
class InternalInputNode[D, U, EO, EI, B <: Data](imp: NodeImp[D, U, EO, EI, B])(po: Seq[D])(implicit valName: ValName)
|
||||||
extends SourceNode(imp)(po)
|
extends SourceNode(imp)(po)
|
||||||
{
|
{
|
||||||
override val externalIn: Boolean = false
|
override val externalIn: Boolean = false
|
||||||
|
@ -244,7 +244,7 @@ class SyncRocketTile(rtp: RocketTileParams, hartid: Int)(implicit p: Parameters)
|
|||||||
val masterNode = TLOutputNode()
|
val masterNode = TLOutputNode()
|
||||||
masterNode :=* optionalMasterBuffer(rocket.masterNode)
|
masterNode :=* optionalMasterBuffer(rocket.masterNode)
|
||||||
|
|
||||||
val slaveNode = new TLInputNode() { override def reverse = true }
|
val slaveNode = new TLInputNode()(ValName("slave")) { override def reverse = true }
|
||||||
DisableMonitors { implicit p => rocket.slaveNode :*= optionalSlaveBuffer(slaveNode) }
|
DisableMonitors { implicit p => rocket.slaveNode :*= optionalSlaveBuffer(slaveNode) }
|
||||||
|
|
||||||
// Fully async interrupts need synchronizers.
|
// Fully async interrupts need synchronizers.
|
||||||
@ -265,7 +265,7 @@ class AsyncRocketTile(rtp: RocketTileParams, hartid: Int)(implicit p: Parameters
|
|||||||
source.node :=* rocket.masterNode
|
source.node :=* rocket.masterNode
|
||||||
masterNode :=* source.node
|
masterNode :=* source.node
|
||||||
|
|
||||||
val slaveNode = new TLAsyncInputNode() { override def reverse = true }
|
val slaveNode = new TLAsyncInputNode()(ValName("slave")) { override def reverse = true }
|
||||||
val sink = LazyModule(new TLAsyncCrossingSink)
|
val sink = LazyModule(new TLAsyncCrossingSink)
|
||||||
|
|
||||||
DisableMonitors { implicit p =>
|
DisableMonitors { implicit p =>
|
||||||
@ -294,7 +294,7 @@ class RationalRocketTile(rtp: RocketTileParams, hartid: Int)(implicit p: Paramet
|
|||||||
source.node :=* optionalMasterBuffer(rocket.masterNode)
|
source.node :=* optionalMasterBuffer(rocket.masterNode)
|
||||||
masterNode :=* source.node
|
masterNode :=* source.node
|
||||||
|
|
||||||
val slaveNode = new TLRationalInputNode() { override def reverse = true }
|
val slaveNode = new TLRationalInputNode()(ValName("slave")) { override def reverse = true }
|
||||||
val sink = LazyModule(new TLRationalCrossingSink(SlowToFast))
|
val sink = LazyModule(new TLRationalCrossingSink(SlowToFast))
|
||||||
|
|
||||||
DisableMonitors { implicit p =>
|
DisableMonitors { implicit p =>
|
||||||
|
@ -13,7 +13,7 @@ class TLBufferNode (
|
|||||||
b: BufferParams,
|
b: BufferParams,
|
||||||
c: BufferParams,
|
c: BufferParams,
|
||||||
d: BufferParams,
|
d: BufferParams,
|
||||||
e: BufferParams)(implicit p: Parameters) extends TLAdapterNode(
|
e: BufferParams)(implicit valName: ValName) extends TLAdapterNode(
|
||||||
clientFn = { p => p.copy(minLatency = p.minLatency + b.latency + c.latency) },
|
clientFn = { p => p.copy(minLatency = p.minLatency + b.latency + c.latency) },
|
||||||
managerFn = { p => p.copy(minLatency = p.minLatency + a.latency + d.latency) }
|
managerFn = { p => p.copy(minLatency = p.minLatency + a.latency + d.latency) }
|
||||||
) {
|
) {
|
||||||
|
@ -88,25 +88,26 @@ object IntImp extends NodeImp[IntSourcePortParameters, IntSinkPortParameters, In
|
|||||||
pu.copy(sinks = pu.sinks.map { s => s.copy (nodePath = node +: s.nodePath) })
|
pu.copy(sinks = pu.sinks.map { s => s.copy (nodePath = node +: s.nodePath) })
|
||||||
}
|
}
|
||||||
|
|
||||||
case class IntIdentityNode() extends IdentityNode(IntImp)
|
case class IntIdentityNode()(implicit valName: ValName) extends IdentityNode(IntImp)
|
||||||
case class IntSourceNode(portParams: Seq[IntSourcePortParameters]) extends SourceNode(IntImp)(portParams)
|
case class IntSourceNode(portParams: Seq[IntSourcePortParameters])(implicit valName: ValName) extends SourceNode(IntImp)(portParams)
|
||||||
case class IntSinkNode(portParams: Seq[IntSinkPortParameters]) extends SinkNode(IntImp)(portParams)
|
case class IntSinkNode(portParams: Seq[IntSinkPortParameters])(implicit valName: ValName) extends SinkNode(IntImp)(portParams)
|
||||||
|
|
||||||
case class IntNexusNode(
|
case class IntNexusNode(
|
||||||
sourceFn: Seq[IntSourcePortParameters] => IntSourcePortParameters,
|
sourceFn: Seq[IntSourcePortParameters] => IntSourcePortParameters,
|
||||||
sinkFn: Seq[IntSinkPortParameters] => IntSinkPortParameters,
|
sinkFn: Seq[IntSinkPortParameters] => IntSinkPortParameters,
|
||||||
numSourcePorts: Range.Inclusive = 0 to 128,
|
numSourcePorts: Range.Inclusive = 0 to 128,
|
||||||
numSinkPorts: Range.Inclusive = 0 to 128)
|
numSinkPorts: Range.Inclusive = 0 to 128)(
|
||||||
|
implicit valName: ValName)
|
||||||
extends NexusNode(IntImp)(sourceFn, sinkFn, numSourcePorts, numSinkPorts)
|
extends NexusNode(IntImp)(sourceFn, sinkFn, numSourcePorts, numSinkPorts)
|
||||||
|
|
||||||
case class IntOutputNode() extends OutputNode(IntImp)
|
case class IntOutputNode()(implicit valName: ValName) extends OutputNode(IntImp)
|
||||||
case class IntInputNode() extends InputNode(IntImp)
|
case class IntInputNode()(implicit valName: ValName) extends InputNode(IntImp)
|
||||||
|
|
||||||
case class IntBlindOutputNode(portParams: Seq[IntSinkPortParameters]) extends BlindOutputNode(IntImp)(portParams)
|
case class IntBlindOutputNode(portParams: Seq[IntSinkPortParameters])(implicit valName: ValName) extends BlindOutputNode(IntImp)(portParams)
|
||||||
case class IntBlindInputNode(portParams: Seq[IntSourcePortParameters]) extends BlindInputNode(IntImp)(portParams)
|
case class IntBlindInputNode(portParams: Seq[IntSourcePortParameters])(implicit valName: ValName) extends BlindInputNode(IntImp)(portParams)
|
||||||
|
|
||||||
case class IntInternalOutputNode(portParams: Seq[IntSinkPortParameters]) extends InternalOutputNode(IntImp)(portParams)
|
case class IntInternalOutputNode(portParams: Seq[IntSinkPortParameters])(implicit valName: ValName) extends InternalOutputNode(IntImp)(portParams)
|
||||||
case class IntInternalInputNode(portParams: Seq[IntSourcePortParameters]) extends InternalInputNode(IntImp)(portParams)
|
case class IntInternalInputNode(portParams: Seq[IntSourcePortParameters])(implicit valName: ValName) extends InternalInputNode(IntImp)(portParams)
|
||||||
|
|
||||||
class IntXbar()(implicit p: Parameters) extends LazyModule
|
class IntXbar()(implicit p: Parameters) extends LazyModule
|
||||||
{
|
{
|
||||||
|
@ -7,7 +7,7 @@ import chisel3.internal.sourceinfo.SourceInfo
|
|||||||
import freechips.rocketchip.config.Parameters
|
import freechips.rocketchip.config.Parameters
|
||||||
import freechips.rocketchip.diplomacy._
|
import freechips.rocketchip.diplomacy._
|
||||||
|
|
||||||
case class TLNodeNumbererNode(nodeAddressOffset: Option[Int] = None) extends TLCustomNode(0 to 999, 0 to 999)
|
case class TLNodeNumbererNode(nodeAddressOffset: Option[Int] = None)(implicit valName: ValName) extends TLCustomNode(0 to 999, 0 to 999)
|
||||||
{
|
{
|
||||||
val externalIn = true
|
val externalIn = true
|
||||||
val externalOut = true
|
val externalOut = true
|
||||||
|
@ -64,57 +64,61 @@ object TLImp extends NodeImp[TLClientPortParameters, TLManagerPortParameters, TL
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Nodes implemented inside modules
|
// Nodes implemented inside modules
|
||||||
case class TLIdentityNode() extends IdentityNode(TLImp)
|
case class TLIdentityNode()(implicit valName: ValName) extends IdentityNode(TLImp)
|
||||||
case class TLClientNode(portParams: Seq[TLClientPortParameters]) extends SourceNode(TLImp)(portParams)
|
case class TLClientNode(portParams: Seq[TLClientPortParameters])(implicit valName: ValName) extends SourceNode(TLImp)(portParams)
|
||||||
case class TLManagerNode(portParams: Seq[TLManagerPortParameters]) extends SinkNode(TLImp)(portParams)
|
case class TLManagerNode(portParams: Seq[TLManagerPortParameters])(implicit valName: ValName) extends SinkNode(TLImp)(portParams)
|
||||||
|
|
||||||
object TLClientNode
|
object TLClientNode
|
||||||
{
|
{
|
||||||
def apply(params: TLClientParameters) =
|
def apply(params: TLClientParameters)(implicit valName: ValName) =
|
||||||
new TLClientNode(Seq(TLClientPortParameters(Seq(params))))
|
new TLClientNode(Seq(TLClientPortParameters(Seq(params))))
|
||||||
}
|
}
|
||||||
|
|
||||||
object TLManagerNode
|
object TLManagerNode
|
||||||
{
|
{
|
||||||
def apply(beatBytes: Int, params: TLManagerParameters) =
|
def apply(beatBytes: Int, params: TLManagerParameters)(implicit valName: ValName) =
|
||||||
new TLManagerNode(Seq(TLManagerPortParameters(Seq(params), beatBytes, minLatency = 0)))
|
new TLManagerNode(Seq(TLManagerPortParameters(Seq(params), beatBytes, minLatency = 0)))
|
||||||
}
|
}
|
||||||
|
|
||||||
case class TLAdapterNode(
|
case class TLAdapterNode(
|
||||||
clientFn: TLClientPortParameters => TLClientPortParameters,
|
clientFn: TLClientPortParameters => TLClientPortParameters,
|
||||||
managerFn: TLManagerPortParameters => TLManagerPortParameters,
|
managerFn: TLManagerPortParameters => TLManagerPortParameters,
|
||||||
num: Range.Inclusive = 0 to 999)
|
num: Range.Inclusive = 0 to 999)(
|
||||||
|
implicit valName: ValName)
|
||||||
extends AdapterNode(TLImp)(clientFn, managerFn, num)
|
extends AdapterNode(TLImp)(clientFn, managerFn, num)
|
||||||
|
|
||||||
case class TLNexusNode(
|
case class TLNexusNode(
|
||||||
clientFn: Seq[TLClientPortParameters] => TLClientPortParameters,
|
clientFn: Seq[TLClientPortParameters] => TLClientPortParameters,
|
||||||
managerFn: Seq[TLManagerPortParameters] => TLManagerPortParameters,
|
managerFn: Seq[TLManagerPortParameters] => TLManagerPortParameters,
|
||||||
numClientPorts: Range.Inclusive = 1 to 999,
|
numClientPorts: Range.Inclusive = 1 to 999,
|
||||||
numManagerPorts: Range.Inclusive = 1 to 999)
|
numManagerPorts: Range.Inclusive = 1 to 999)(
|
||||||
|
implicit valName: ValName)
|
||||||
extends NexusNode(TLImp)(clientFn, managerFn, numClientPorts, numManagerPorts)
|
extends NexusNode(TLImp)(clientFn, managerFn, numClientPorts, numManagerPorts)
|
||||||
|
|
||||||
case class TLSplitterNode(
|
case class TLSplitterNode(
|
||||||
clientFn: SplitterArg[TLClientPortParameters] => Seq[TLClientPortParameters],
|
clientFn: SplitterArg[TLClientPortParameters] => Seq[TLClientPortParameters],
|
||||||
managerFn: SplitterArg[TLManagerPortParameters] => Seq[TLManagerPortParameters],
|
managerFn: SplitterArg[TLManagerPortParameters] => Seq[TLManagerPortParameters],
|
||||||
numClientPorts: Range.Inclusive = 0 to 999,
|
numClientPorts: Range.Inclusive = 0 to 999,
|
||||||
numManagerPorts: Range.Inclusive = 0 to 999)
|
numManagerPorts: Range.Inclusive = 0 to 999)(
|
||||||
|
implicit valName: ValName)
|
||||||
extends SplitterNode(TLImp)(clientFn, managerFn, numClientPorts, numManagerPorts)
|
extends SplitterNode(TLImp)(clientFn, managerFn, numClientPorts, numManagerPorts)
|
||||||
|
|
||||||
abstract class TLCustomNode(
|
abstract class TLCustomNode(
|
||||||
numClientPorts: Range.Inclusive,
|
numClientPorts: Range.Inclusive,
|
||||||
numManagerPorts: Range.Inclusive)
|
numManagerPorts: Range.Inclusive)(
|
||||||
|
implicit valName: ValName)
|
||||||
extends CustomNode(TLImp)(numClientPorts, numManagerPorts)
|
extends CustomNode(TLImp)(numClientPorts, numManagerPorts)
|
||||||
|
|
||||||
// Nodes passed from an inner module
|
// Nodes passed from an inner module
|
||||||
case class TLOutputNode() extends OutputNode(TLImp)
|
case class TLOutputNode()(implicit valName: ValName) extends OutputNode(TLImp)
|
||||||
case class TLInputNode() extends InputNode(TLImp)
|
case class TLInputNode()(implicit valName: ValName) extends InputNode(TLImp)
|
||||||
|
|
||||||
// Nodes used for external ports
|
// Nodes used for external ports
|
||||||
case class TLBlindOutputNode(portParams: Seq[TLManagerPortParameters]) extends BlindOutputNode(TLImp)(portParams)
|
case class TLBlindOutputNode(portParams: Seq[TLManagerPortParameters])(implicit valName: ValName) extends BlindOutputNode(TLImp)(portParams)
|
||||||
case class TLBlindInputNode(portParams: Seq[TLClientPortParameters]) extends BlindInputNode(TLImp)(portParams)
|
case class TLBlindInputNode(portParams: Seq[TLClientPortParameters])(implicit valName: ValName) extends BlindInputNode(TLImp)(portParams)
|
||||||
|
|
||||||
case class TLInternalOutputNode(portParams: Seq[TLManagerPortParameters]) extends InternalOutputNode(TLImp)(portParams)
|
case class TLInternalOutputNode(portParams: Seq[TLManagerPortParameters])(implicit valName: ValName) extends InternalOutputNode(TLImp)(portParams)
|
||||||
case class TLInternalInputNode(portParams: Seq[TLClientPortParameters]) extends InternalInputNode(TLImp)(portParams)
|
case class TLInternalInputNode(portParams: Seq[TLClientPortParameters])(implicit valName: ValName) extends InternalInputNode(TLImp)(portParams)
|
||||||
|
|
||||||
/** Synthesizeable unit tests */
|
/** Synthesizeable unit tests */
|
||||||
import freechips.rocketchip.unittest._
|
import freechips.rocketchip.unittest._
|
||||||
@ -156,16 +160,16 @@ object TLAsyncImp extends NodeImp[TLAsyncClientPortParameters, TLAsyncManagerPor
|
|||||||
pu.copy(base = pu.base.copy(managers = pu.base.managers.map { m => m.copy (nodePath = node +: m.nodePath) }))
|
pu.copy(base = pu.base.copy(managers = pu.base.managers.map { m => m.copy (nodePath = node +: m.nodePath) }))
|
||||||
}
|
}
|
||||||
|
|
||||||
case class TLAsyncIdentityNode() extends IdentityNode(TLAsyncImp)
|
case class TLAsyncIdentityNode()(implicit valName: ValName) extends IdentityNode(TLAsyncImp)
|
||||||
case class TLAsyncOutputNode() extends OutputNode(TLAsyncImp)
|
case class TLAsyncOutputNode()(implicit valName: ValName) extends OutputNode(TLAsyncImp)
|
||||||
case class TLAsyncInputNode() extends InputNode(TLAsyncImp)
|
case class TLAsyncInputNode()(implicit valName: ValName) extends InputNode(TLAsyncImp)
|
||||||
|
|
||||||
case class TLAsyncSourceNode(sync: Int)
|
case class TLAsyncSourceNode(sync: Int)(implicit valName: ValName)
|
||||||
extends MixedAdapterNode(TLImp, TLAsyncImp)(
|
extends MixedAdapterNode(TLImp, TLAsyncImp)(
|
||||||
dFn = { p => TLAsyncClientPortParameters(p) },
|
dFn = { p => TLAsyncClientPortParameters(p) },
|
||||||
uFn = { p => p.base.copy(minLatency = sync+1) }) // discard cycles in other clock domain
|
uFn = { p => p.base.copy(minLatency = sync+1) }) // discard cycles in other clock domain
|
||||||
|
|
||||||
case class TLAsyncSinkNode(depth: Int, sync: Int)
|
case class TLAsyncSinkNode(depth: Int, sync: Int)(implicit valName: ValName)
|
||||||
extends MixedAdapterNode(TLAsyncImp, TLImp)(
|
extends MixedAdapterNode(TLAsyncImp, TLImp)(
|
||||||
dFn = { p => p.base.copy(minLatency = sync+1) },
|
dFn = { p => p.base.copy(minLatency = sync+1) },
|
||||||
uFn = { p => TLAsyncManagerPortParameters(depth, p) })
|
uFn = { p => TLAsyncManagerPortParameters(depth, p) })
|
||||||
@ -186,16 +190,16 @@ object TLRationalImp extends NodeImp[TLRationalClientPortParameters, TLRationalM
|
|||||||
pu.copy(base = pu.base.copy(managers = pu.base.managers.map { m => m.copy (nodePath = node +: m.nodePath) }))
|
pu.copy(base = pu.base.copy(managers = pu.base.managers.map { m => m.copy (nodePath = node +: m.nodePath) }))
|
||||||
}
|
}
|
||||||
|
|
||||||
case class TLRationalIdentityNode() extends IdentityNode(TLRationalImp)
|
case class TLRationalIdentityNode()(implicit valName: ValName) extends IdentityNode(TLRationalImp)
|
||||||
case class TLRationalOutputNode() extends OutputNode(TLRationalImp)
|
case class TLRationalOutputNode()(implicit valName: ValName) extends OutputNode(TLRationalImp)
|
||||||
case class TLRationalInputNode() extends InputNode(TLRationalImp)
|
case class TLRationalInputNode()(implicit valName: ValName) extends InputNode(TLRationalImp)
|
||||||
|
|
||||||
case class TLRationalSourceNode()
|
case class TLRationalSourceNode()(implicit valName: ValName)
|
||||||
extends MixedAdapterNode(TLImp, TLRationalImp)(
|
extends MixedAdapterNode(TLImp, TLRationalImp)(
|
||||||
dFn = { p => TLRationalClientPortParameters(p) },
|
dFn = { p => TLRationalClientPortParameters(p) },
|
||||||
uFn = { p => p.base.copy(minLatency = 1) }) // discard cycles from other clock domain
|
uFn = { p => p.base.copy(minLatency = 1) }) // discard cycles from other clock domain
|
||||||
|
|
||||||
case class TLRationalSinkNode(direction: RationalDirection)
|
case class TLRationalSinkNode(direction: RationalDirection)(implicit valName: ValName)
|
||||||
extends MixedAdapterNode(TLRationalImp, TLImp)(
|
extends MixedAdapterNode(TLRationalImp, TLImp)(
|
||||||
dFn = { p => p.base.copy(minLatency = 1) },
|
dFn = { p => p.base.copy(minLatency = 1) },
|
||||||
uFn = { p => TLRationalManagerPortParameters(direction, p) })
|
uFn = { p => TLRationalManagerPortParameters(direction, p) })
|
||||||
|
@ -9,15 +9,16 @@ import freechips.rocketchip.regmapper._
|
|||||||
import freechips.rocketchip.util.HeterogeneousBag
|
import freechips.rocketchip.util.HeterogeneousBag
|
||||||
import scala.math.{min,max}
|
import scala.math.{min,max}
|
||||||
|
|
||||||
class TLRegisterNode(
|
case class TLRegisterNode(
|
||||||
address: Seq[AddressSet],
|
address: Seq[AddressSet],
|
||||||
device: Device,
|
device: Device,
|
||||||
deviceKey: String = "reg/control",
|
deviceKey: String = "reg/control",
|
||||||
concurrency: Int = 0,
|
concurrency: Int = 0,
|
||||||
beatBytes: Int = 4,
|
beatBytes: Int = 4,
|
||||||
undefZero: Boolean = true,
|
undefZero: Boolean = true,
|
||||||
executable: Boolean = false)
|
executable: Boolean = false)(
|
||||||
extends TLManagerNode(Seq(TLManagerPortParameters(
|
implicit valName: ValName)
|
||||||
|
extends SinkNode(TLImp)(Seq(TLManagerPortParameters(
|
||||||
Seq(TLManagerParameters(
|
Seq(TLManagerParameters(
|
||||||
address = address,
|
address = address,
|
||||||
resources = Seq(Resource(device, deviceKey)),
|
resources = Seq(Resource(device, deviceKey)),
|
||||||
@ -81,20 +82,6 @@ class TLRegisterNode(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object TLRegisterNode
|
|
||||||
{
|
|
||||||
def apply(
|
|
||||||
address: Seq[AddressSet],
|
|
||||||
device: Device,
|
|
||||||
deviceKey: String = "reg/control",
|
|
||||||
concurrency: Int = 0,
|
|
||||||
beatBytes: Int = 4,
|
|
||||||
undefZero: Boolean = true,
|
|
||||||
executable: Boolean = false) =
|
|
||||||
new TLRegisterNode(address, device, deviceKey, concurrency, beatBytes, undefZero, executable)
|
|
||||||
}
|
|
||||||
|
|
||||||
// These convenience methods below combine to make it possible to create a TL2
|
|
||||||
// register mapped device from a totally abstract register mapped device.
|
// register mapped device from a totally abstract register mapped device.
|
||||||
// See GPIO.scala in this directory for an example
|
// See GPIO.scala in this directory for an example
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ import freechips.rocketchip.util._
|
|||||||
import scala.math.{min, max}
|
import scala.math.{min, max}
|
||||||
import AHBParameters._
|
import AHBParameters._
|
||||||
|
|
||||||
case class TLToAHBNode() extends MixedAdapterNode(TLImp, AHBImp)(
|
case class TLToAHBNode()(implicit valName: ValName) extends MixedAdapterNode(TLImp, AHBImp)(
|
||||||
dFn = { case TLClientPortParameters(clients, unsafeAtomics, minLatency) =>
|
dFn = { case TLClientPortParameters(clients, unsafeAtomics, minLatency) =>
|
||||||
val masters = clients.map { case c => AHBMasterParameters(name = c.name, nodePath = c.nodePath) }
|
val masters = clients.map { case c => AHBMasterParameters(name = c.name, nodePath = c.nodePath) }
|
||||||
AHBMasterPortParameters(masters)
|
AHBMasterPortParameters(masters)
|
||||||
|
@ -10,7 +10,7 @@ import freechips.rocketchip.amba.apb._
|
|||||||
import scala.math.{min, max}
|
import scala.math.{min, max}
|
||||||
import APBParameters._
|
import APBParameters._
|
||||||
|
|
||||||
case class TLToAPBNode() extends MixedAdapterNode(TLImp, APBImp)(
|
case class TLToAPBNode()(implicit valName: ValName) extends MixedAdapterNode(TLImp, APBImp)(
|
||||||
dFn = { case TLClientPortParameters(clients, unsafeAtomics, minLatency) =>
|
dFn = { case TLClientPortParameters(clients, unsafeAtomics, minLatency) =>
|
||||||
val masters = clients.map { case c => APBMasterParameters(name = c.name, nodePath = c.nodePath) }
|
val masters = clients.map { case c => APBMasterParameters(name = c.name, nodePath = c.nodePath) }
|
||||||
APBMasterPortParameters(masters)
|
APBMasterPortParameters(masters)
|
||||||
|
@ -10,7 +10,7 @@ import freechips.rocketchip.util._
|
|||||||
import freechips.rocketchip.amba.axi4._
|
import freechips.rocketchip.amba.axi4._
|
||||||
import scala.math.{min, max}
|
import scala.math.{min, max}
|
||||||
|
|
||||||
case class TLToAXI4Node(beatBytes: Int, stripBits: Int = 0) extends MixedAdapterNode(TLImp, AXI4Imp)(
|
case class TLToAXI4Node(beatBytes: Int, stripBits: Int = 0)(implicit valName: ValName) extends MixedAdapterNode(TLImp, AXI4Imp)(
|
||||||
dFn = { p =>
|
dFn = { p =>
|
||||||
p.clients.foreach { c =>
|
p.clients.foreach { c =>
|
||||||
require (c.sourceId.start % (1 << stripBits) == 0 &&
|
require (c.sourceId.start % (1 << stripBits) == 0 &&
|
||||||
|
Loading…
Reference in New Issue
Block a user