diplomacy: support zero-port Nodes
This commit is contained in:
parent
c0496fab29
commit
9dc7f180b6
@ -227,7 +227,6 @@ class SinkNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])(pi: P
|
|||||||
class BlindOutputNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])(pi: Seq[PI])
|
class BlindOutputNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])(pi: Seq[PI])
|
||||||
extends SimpleNode(imp)({case (0, _) => Seq()}, {case (_, Seq()) => pi}, 0 to 0, pi.size to pi.size)
|
extends SimpleNode(imp)({case (0, _) => Seq()}, {case (_, Seq()) => pi}, 0 to 0, pi.size to pi.size)
|
||||||
{
|
{
|
||||||
require (!pi.isEmpty)
|
|
||||||
override val flip = true
|
override val flip = true
|
||||||
override lazy val bundleOut = bundleIn
|
override lazy val bundleOut = bundleIn
|
||||||
}
|
}
|
||||||
@ -235,7 +234,6 @@ class BlindOutputNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B]
|
|||||||
class BlindInputNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])(po: Seq[PO])
|
class BlindInputNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])(po: Seq[PO])
|
||||||
extends SimpleNode(imp)({case (_, Seq()) => po}, {case (0, _) => Seq()}, po.size to po.size, 0 to 0)
|
extends SimpleNode(imp)({case (_, Seq()) => po}, {case (0, _) => Seq()}, po.size to po.size, 0 to 0)
|
||||||
{
|
{
|
||||||
require (!po.isEmpty)
|
|
||||||
override val flip = true
|
override val flip = true
|
||||||
override lazy val bundleIn = bundleOut
|
override lazy val bundleIn = bundleOut
|
||||||
}
|
}
|
||||||
@ -243,7 +241,6 @@ class BlindInputNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])
|
|||||||
class InternalOutputNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])(pi: Seq[PI])
|
class InternalOutputNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])(pi: Seq[PI])
|
||||||
extends SimpleNode(imp)({case (0, _) => Seq()}, {case (_, Seq()) => pi}, 0 to 0, pi.size to pi.size)
|
extends SimpleNode(imp)({case (0, _) => Seq()}, {case (_, Seq()) => pi}, 0 to 0, pi.size to pi.size)
|
||||||
{
|
{
|
||||||
require (!pi.isEmpty)
|
|
||||||
override val wire = true
|
override val wire = true
|
||||||
override lazy val bundleOut = bundleIn
|
override lazy val bundleOut = bundleIn
|
||||||
}
|
}
|
||||||
@ -251,7 +248,6 @@ class InternalOutputNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI,
|
|||||||
class InternalInputNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])(po: Seq[PO])
|
class InternalInputNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])(po: Seq[PO])
|
||||||
extends SimpleNode(imp)({case (_, Seq()) => po}, {case (0, _) => Seq()}, po.size to po.size, 0 to 0)
|
extends SimpleNode(imp)({case (_, Seq()) => po}, {case (0, _) => Seq()}, po.size to po.size, 0 to 0)
|
||||||
{
|
{
|
||||||
require (!po.isEmpty)
|
|
||||||
override val wire = true
|
override val wire = true
|
||||||
override lazy val bundleIn = bundleOut
|
override lazy val bundleIn = bundleOut
|
||||||
}
|
}
|
||||||
|
@ -11,14 +11,9 @@ object AHBImp extends NodeImp[AHBMasterPortParameters, AHBSlavePortParameters, A
|
|||||||
{
|
{
|
||||||
def edgeO(pd: AHBMasterPortParameters, pu: AHBSlavePortParameters): AHBEdgeParameters = AHBEdgeParameters(pd, pu)
|
def edgeO(pd: AHBMasterPortParameters, pu: AHBSlavePortParameters): AHBEdgeParameters = AHBEdgeParameters(pd, pu)
|
||||||
def edgeI(pd: AHBMasterPortParameters, pu: AHBSlavePortParameters): AHBEdgeParameters = AHBEdgeParameters(pd, pu)
|
def edgeI(pd: AHBMasterPortParameters, pu: AHBSlavePortParameters): AHBEdgeParameters = AHBEdgeParameters(pd, pu)
|
||||||
def bundleO(eo: Seq[AHBEdgeParameters]): Vec[AHBBundle] = {
|
|
||||||
require (!eo.isEmpty)
|
def bundleO(eo: Seq[AHBEdgeParameters]): Vec[AHBBundle] = Vec(eo.size, AHBBundle(AHBBundleParameters.union(eo.map(_.bundle))))
|
||||||
Vec(eo.size, AHBBundle(eo.map(_.bundle).reduce(_.union(_))))
|
def bundleI(ei: Seq[AHBEdgeParameters]): Vec[AHBBundle] = Vec(ei.size, AHBBundle(AHBBundleParameters.union(ei.map(_.bundle))))
|
||||||
}
|
|
||||||
def bundleI(ei: Seq[AHBEdgeParameters]): Vec[AHBBundle] = {
|
|
||||||
require (!ei.isEmpty)
|
|
||||||
Vec(ei.size, AHBBundle(ei.map(_.bundle).reduce(_.union(_))))
|
|
||||||
}
|
|
||||||
|
|
||||||
def colour = "#00ccff" // bluish
|
def colour = "#00ccff" // bluish
|
||||||
override def labelI(ei: AHBEdgeParameters) = (ei.slave.beatBytes * 8).toString
|
override def labelI(ei: AHBEdgeParameters) = (ei.slave.beatBytes * 8).toString
|
||||||
|
@ -85,6 +85,9 @@ case class AHBBundleParameters(
|
|||||||
|
|
||||||
object AHBBundleParameters
|
object AHBBundleParameters
|
||||||
{
|
{
|
||||||
|
val emptyBundleParams = AHBBundleParameters(addrBits = 1, dataBits = 8)
|
||||||
|
def union(x: Seq[AHBBundleParameters]) = x.foldLeft(emptyBundleParams)((x,y) => x.union(y))
|
||||||
|
|
||||||
def apply(master: AHBMasterPortParameters, slave: AHBSlavePortParameters) =
|
def apply(master: AHBMasterPortParameters, slave: AHBSlavePortParameters) =
|
||||||
new AHBBundleParameters(
|
new AHBBundleParameters(
|
||||||
addrBits = log2Up(slave.maxAddress+1),
|
addrBits = log2Up(slave.maxAddress+1),
|
||||||
|
@ -11,14 +11,9 @@ object APBImp extends NodeImp[APBMasterPortParameters, APBSlavePortParameters, A
|
|||||||
{
|
{
|
||||||
def edgeO(pd: APBMasterPortParameters, pu: APBSlavePortParameters): APBEdgeParameters = APBEdgeParameters(pd, pu)
|
def edgeO(pd: APBMasterPortParameters, pu: APBSlavePortParameters): APBEdgeParameters = APBEdgeParameters(pd, pu)
|
||||||
def edgeI(pd: APBMasterPortParameters, pu: APBSlavePortParameters): APBEdgeParameters = APBEdgeParameters(pd, pu)
|
def edgeI(pd: APBMasterPortParameters, pu: APBSlavePortParameters): APBEdgeParameters = APBEdgeParameters(pd, pu)
|
||||||
def bundleO(eo: Seq[APBEdgeParameters]): Vec[APBBundle] = {
|
|
||||||
require (!eo.isEmpty)
|
def bundleO(eo: Seq[APBEdgeParameters]): Vec[APBBundle] = Vec(eo.size, APBBundle(APBBundleParameters.union(eo.map(_.bundle))))
|
||||||
Vec(eo.size, APBBundle(eo.map(_.bundle).reduce(_.union(_))))
|
def bundleI(ei: Seq[APBEdgeParameters]): Vec[APBBundle] = Vec(ei.size, APBBundle(APBBundleParameters.union(ei.map(_.bundle))))
|
||||||
}
|
|
||||||
def bundleI(ei: Seq[APBEdgeParameters]): Vec[APBBundle] = {
|
|
||||||
require (!ei.isEmpty)
|
|
||||||
Vec(ei.size, APBBundle(ei.map(_.bundle).reduce(_.union(_))))
|
|
||||||
}
|
|
||||||
|
|
||||||
def colour = "#00ccff" // bluish
|
def colour = "#00ccff" // bluish
|
||||||
override def labelI(ei: APBEdgeParameters) = (ei.slave.beatBytes * 8).toString
|
override def labelI(ei: APBEdgeParameters) = (ei.slave.beatBytes * 8).toString
|
||||||
|
@ -72,6 +72,9 @@ case class APBBundleParameters(
|
|||||||
|
|
||||||
object APBBundleParameters
|
object APBBundleParameters
|
||||||
{
|
{
|
||||||
|
val emptyBundleParams = APBBundleParameters(addrBits = 1, dataBits = 8)
|
||||||
|
def union(x: Seq[APBBundleParameters]) = x.foldLeft(emptyBundleParams)((x,y) => x.union(y))
|
||||||
|
|
||||||
def apply(master: APBMasterPortParameters, slave: APBSlavePortParameters) =
|
def apply(master: APBMasterPortParameters, slave: APBSlavePortParameters) =
|
||||||
new APBBundleParameters(
|
new APBBundleParameters(
|
||||||
addrBits = log2Up(slave.maxAddress+1),
|
addrBits = log2Up(slave.maxAddress+1),
|
||||||
|
@ -11,14 +11,9 @@ object AXI4Imp extends NodeImp[AXI4MasterPortParameters, AXI4SlavePortParameters
|
|||||||
{
|
{
|
||||||
def edgeO(pd: AXI4MasterPortParameters, pu: AXI4SlavePortParameters): AXI4EdgeParameters = AXI4EdgeParameters(pd, pu)
|
def edgeO(pd: AXI4MasterPortParameters, pu: AXI4SlavePortParameters): AXI4EdgeParameters = AXI4EdgeParameters(pd, pu)
|
||||||
def edgeI(pd: AXI4MasterPortParameters, pu: AXI4SlavePortParameters): AXI4EdgeParameters = AXI4EdgeParameters(pd, pu)
|
def edgeI(pd: AXI4MasterPortParameters, pu: AXI4SlavePortParameters): AXI4EdgeParameters = AXI4EdgeParameters(pd, pu)
|
||||||
def bundleO(eo: Seq[AXI4EdgeParameters]): Vec[AXI4Bundle] = {
|
|
||||||
require (!eo.isEmpty)
|
def bundleO(eo: Seq[AXI4EdgeParameters]): Vec[AXI4Bundle] = Vec(eo.size, AXI4Bundle(AXI4BundleParameters.union(eo.map(_.bundle))))
|
||||||
Vec(eo.size, AXI4Bundle(eo.map(_.bundle).reduce(_.union(_))))
|
def bundleI(ei: Seq[AXI4EdgeParameters]): Vec[AXI4Bundle] = Vec(ei.size, AXI4Bundle(AXI4BundleParameters.union(ei.map(_.bundle))))
|
||||||
}
|
|
||||||
def bundleI(ei: Seq[AXI4EdgeParameters]): Vec[AXI4Bundle] = {
|
|
||||||
require (!ei.isEmpty)
|
|
||||||
Vec(ei.size, AXI4Bundle(ei.map(_.bundle).reduce(_.union(_))))
|
|
||||||
}
|
|
||||||
|
|
||||||
def colour = "#00ccff" // bluish
|
def colour = "#00ccff" // bluish
|
||||||
override def labelI(ei: AXI4EdgeParameters) = (ei.slave.beatBytes * 8).toString
|
override def labelI(ei: AXI4EdgeParameters) = (ei.slave.beatBytes * 8).toString
|
||||||
|
@ -101,6 +101,9 @@ case class AXI4BundleParameters(
|
|||||||
|
|
||||||
object AXI4BundleParameters
|
object AXI4BundleParameters
|
||||||
{
|
{
|
||||||
|
val emptyBundleParams = AXI4BundleParameters(addrBits=1, dataBits=8, idBits=1)
|
||||||
|
def union(x: Seq[AXI4BundleParameters]) = x.foldLeft(emptyBundleParams)((x,y) => x.union(y))
|
||||||
|
|
||||||
def apply(master: AXI4MasterPortParameters, slave: AXI4SlavePortParameters) =
|
def apply(master: AXI4MasterPortParameters, slave: AXI4SlavePortParameters) =
|
||||||
new AXI4BundleParameters(
|
new AXI4BundleParameters(
|
||||||
addrBits = log2Up(slave.maxAddress+1),
|
addrBits = log2Up(slave.maxAddress+1),
|
||||||
|
@ -16,14 +16,9 @@ object TLImp extends NodeImp[TLClientPortParameters, TLManagerPortParameters, TL
|
|||||||
{
|
{
|
||||||
def edgeO(pd: TLClientPortParameters, pu: TLManagerPortParameters): TLEdgeOut = new TLEdgeOut(pd, pu)
|
def edgeO(pd: TLClientPortParameters, pu: TLManagerPortParameters): TLEdgeOut = new TLEdgeOut(pd, pu)
|
||||||
def edgeI(pd: TLClientPortParameters, pu: TLManagerPortParameters): TLEdgeIn = new TLEdgeIn(pd, pu)
|
def edgeI(pd: TLClientPortParameters, pu: TLManagerPortParameters): TLEdgeIn = new TLEdgeIn(pd, pu)
|
||||||
def bundleO(eo: Seq[TLEdgeOut]): Vec[TLBundle] = {
|
|
||||||
require (!eo.isEmpty)
|
def bundleO(eo: Seq[TLEdgeOut]): Vec[TLBundle] = Vec(eo.size, TLBundle(TLBundleParameters.union(eo.map(_.bundle))))
|
||||||
Vec(eo.size, TLBundle(eo.map(_.bundle).reduce(_.union(_))))
|
def bundleI(ei: Seq[TLEdgeIn]): Vec[TLBundle] = Vec(ei.size, TLBundle(TLBundleParameters.union(ei.map(_.bundle))))
|
||||||
}
|
|
||||||
def bundleI(ei: Seq[TLEdgeIn]): Vec[TLBundle] = {
|
|
||||||
require (!ei.isEmpty)
|
|
||||||
Vec(ei.size, TLBundle(ei.map(_.bundle).reduce(_.union(_))))
|
|
||||||
}
|
|
||||||
|
|
||||||
def colour = "#000000" // black
|
def colour = "#000000" // black
|
||||||
override def labelI(ei: TLEdgeIn) = (ei.manager.beatBytes * 8).toString
|
override def labelI(ei: TLEdgeIn) = (ei.manager.beatBytes * 8).toString
|
||||||
@ -152,14 +147,9 @@ object TLAsyncImp extends NodeImp[TLAsyncClientPortParameters, TLAsyncManagerPor
|
|||||||
{
|
{
|
||||||
def edgeO(pd: TLAsyncClientPortParameters, pu: TLAsyncManagerPortParameters): TLAsyncEdgeParameters = TLAsyncEdgeParameters(pd, pu)
|
def edgeO(pd: TLAsyncClientPortParameters, pu: TLAsyncManagerPortParameters): TLAsyncEdgeParameters = TLAsyncEdgeParameters(pd, pu)
|
||||||
def edgeI(pd: TLAsyncClientPortParameters, pu: TLAsyncManagerPortParameters): TLAsyncEdgeParameters = TLAsyncEdgeParameters(pd, pu)
|
def edgeI(pd: TLAsyncClientPortParameters, pu: TLAsyncManagerPortParameters): TLAsyncEdgeParameters = TLAsyncEdgeParameters(pd, pu)
|
||||||
def bundleO(eo: Seq[TLAsyncEdgeParameters]): Vec[TLAsyncBundle] = {
|
|
||||||
require (eo.size == 1)
|
def bundleO(eo: Seq[TLAsyncEdgeParameters]): Vec[TLAsyncBundle] = Vec(eo.size, new TLAsyncBundle(TLAsyncBundleParameters.union(eo.map(_.bundle))))
|
||||||
Vec(eo.size, new TLAsyncBundle(eo(0).bundle))
|
def bundleI(ei: Seq[TLAsyncEdgeParameters]): Vec[TLAsyncBundle] = Vec(ei.size, new TLAsyncBundle(TLAsyncBundleParameters.union(ei.map(_.bundle))))
|
||||||
}
|
|
||||||
def bundleI(ei: Seq[TLAsyncEdgeParameters]): Vec[TLAsyncBundle] = {
|
|
||||||
require (ei.size == 1)
|
|
||||||
Vec(ei.size, new TLAsyncBundle(ei(0).bundle))
|
|
||||||
}
|
|
||||||
|
|
||||||
def colour = "#ff0000" // red
|
def colour = "#ff0000" // red
|
||||||
override def labelI(ei: TLAsyncEdgeParameters) = ei.manager.depth.toString
|
override def labelI(ei: TLAsyncEdgeParameters) = ei.manager.depth.toString
|
||||||
|
@ -273,6 +273,15 @@ case class TLBundleParameters(
|
|||||||
|
|
||||||
object TLBundleParameters
|
object TLBundleParameters
|
||||||
{
|
{
|
||||||
|
val emptyBundleParams = TLBundleParameters(
|
||||||
|
addressBits = 1,
|
||||||
|
dataBits = 8,
|
||||||
|
sourceBits = 1,
|
||||||
|
sinkBits = 1,
|
||||||
|
sizeBits = 1)
|
||||||
|
|
||||||
|
def union(x: Seq[TLBundleParameters]) = x.foldLeft(emptyBundleParams)((x,y) => x.union(y))
|
||||||
|
|
||||||
def apply(client: TLClientPortParameters, manager: TLManagerPortParameters) =
|
def apply(client: TLClientPortParameters, manager: TLManagerPortParameters) =
|
||||||
new TLBundleParameters(
|
new TLBundleParameters(
|
||||||
addressBits = log2Up(manager.maxAddress + 1),
|
addressBits = log2Up(manager.maxAddress + 1),
|
||||||
@ -297,7 +306,21 @@ case class TLEdgeParameters(
|
|||||||
|
|
||||||
case class TLAsyncManagerPortParameters(depth: Int, base: TLManagerPortParameters) { require (isPow2(depth)) }
|
case class TLAsyncManagerPortParameters(depth: Int, base: TLManagerPortParameters) { require (isPow2(depth)) }
|
||||||
case class TLAsyncClientPortParameters(base: TLClientPortParameters)
|
case class TLAsyncClientPortParameters(base: TLClientPortParameters)
|
||||||
case class TLAsyncBundleParameters(depth: Int, base: TLBundleParameters) { require (isPow2(depth)) }
|
|
||||||
|
case class TLAsyncBundleParameters(depth: Int, base: TLBundleParameters)
|
||||||
|
{
|
||||||
|
require (isPow2(depth))
|
||||||
|
def union(x: TLAsyncBundleParameters) = TLAsyncBundleParameters(
|
||||||
|
depth = max(depth, x.depth),
|
||||||
|
base = base.union(x.base))
|
||||||
|
}
|
||||||
|
|
||||||
|
object TLAsyncBundleParameters
|
||||||
|
{
|
||||||
|
val emptyBundleParams = TLAsyncBundleParameters(depth = 1, base = TLBundleParameters.emptyBundleParams)
|
||||||
|
def union(x: Seq[TLAsyncBundleParameters]) = x.foldLeft(emptyBundleParams)((x,y) => x.union(y))
|
||||||
|
}
|
||||||
|
|
||||||
case class TLAsyncEdgeParameters(client: TLAsyncClientPortParameters, manager: TLAsyncManagerPortParameters)
|
case class TLAsyncEdgeParameters(client: TLAsyncClientPortParameters, manager: TLAsyncManagerPortParameters)
|
||||||
{
|
{
|
||||||
val bundle = TLAsyncBundleParameters(manager.depth, TLBundleParameters(client.base, manager.base))
|
val bundle = TLAsyncBundleParameters(manager.depth, TLBundleParameters(client.base, manager.base))
|
||||||
|
Loading…
Reference in New Issue
Block a user