diplomacy: add BlindNodes for use as external ports
This commit is contained in:
parent
0edcd3304a
commit
650f6fb23f
@ -208,12 +208,28 @@ class SourceNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])(po:
|
|||||||
extends SimpleNode(imp)({case (n, Seq()) => Seq.fill(n)(po)}, {case (0, _) => Seq()}, num, 0 to 0)
|
extends SimpleNode(imp)({case (n, Seq()) => Seq.fill(n)(po)}, {case (0, _) => Seq()}, num, 0 to 0)
|
||||||
{
|
{
|
||||||
require (num.end >= 1, s"${name} is a source which does not accept outputs${lazyModule.line}")
|
require (num.end >= 1, s"${name} is a source which does not accept outputs${lazyModule.line}")
|
||||||
|
override lazy val bundleIn = { require(false, s"${name} has no bundleIn; try bundleOut?"); bundleOut }
|
||||||
}
|
}
|
||||||
|
|
||||||
class SinkNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])(pi: PI, num: Range.Inclusive = 1 to 1)
|
class SinkNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])(pi: PI, num: Range.Inclusive = 1 to 1)
|
||||||
extends SimpleNode(imp)({case (0, _) => Seq()}, {case (n, Seq()) => Seq.fill(n)(pi)}, 0 to 0, num)
|
extends SimpleNode(imp)({case (0, _) => Seq()}, {case (n, Seq()) => Seq.fill(n)(pi)}, 0 to 0, num)
|
||||||
{
|
{
|
||||||
require (num.end >= 1, s"${name} is a sink which does not accept inputs${lazyModule.line}")
|
require (num.end >= 1, s"${name} is a sink which does not accept inputs${lazyModule.line}")
|
||||||
|
override lazy val bundleOut = { require(false, s"${name} has no bundleOut; try bundleIn?"); bundleIn }
|
||||||
|
}
|
||||||
|
|
||||||
|
class BlindOutputNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])(pi: PI)
|
||||||
|
extends SimpleNode(imp)({case (0, _) => Seq()}, {case (n, Seq()) => Seq.fill(n)(pi)}, 0 to 0, 1 to 1)
|
||||||
|
{
|
||||||
|
override val flip = true
|
||||||
|
override lazy val bundleOut = bundleIn
|
||||||
|
}
|
||||||
|
|
||||||
|
class BlindInputNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])(po: PO)
|
||||||
|
extends SimpleNode(imp)({case (n, Seq()) => Seq.fill(n)(po)}, {case (0, _) => Seq()}, 1 to 1, 0 to 0)
|
||||||
|
{
|
||||||
|
override val flip = true
|
||||||
|
override lazy val bundleIn = bundleOut
|
||||||
}
|
}
|
||||||
|
|
||||||
class InteriorNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])
|
class InteriorNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])
|
||||||
|
@ -30,18 +30,23 @@ object AXI4Imp extends NodeImp[AXI4MasterPortParameters, AXI4SlavePortParameters
|
|||||||
pu.copy(slaves = pu.slaves.map { m => m.copy (nodePath = node +: m.nodePath) })
|
pu.copy(slaves = pu.slaves.map { m => m.copy (nodePath = node +: m.nodePath) })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Nodes implemented inside modules
|
||||||
case class AXI4IdentityNode() extends IdentityNode(AXI4Imp)
|
case class AXI4IdentityNode() extends IdentityNode(AXI4Imp)
|
||||||
case class AXI4OutputNode() extends OutputNode(AXI4Imp)
|
|
||||||
case class AXI4InputNode() extends InputNode(AXI4Imp)
|
|
||||||
|
|
||||||
case class AXI4MasterNode(portParams: AXI4MasterPortParameters, numPorts: Range.Inclusive = 1 to 1)
|
case class AXI4MasterNode(portParams: AXI4MasterPortParameters, numPorts: Range.Inclusive = 1 to 1)
|
||||||
extends SourceNode(AXI4Imp)(portParams, numPorts)
|
extends SourceNode(AXI4Imp)(portParams, numPorts)
|
||||||
case class AXI4SlaveNode(portParams: AXI4SlavePortParameters, numPorts: Range.Inclusive = 1 to 1)
|
case class AXI4SlaveNode(portParams: AXI4SlavePortParameters, numPorts: Range.Inclusive = 1 to 1)
|
||||||
extends SinkNode(AXI4Imp)(portParams, numPorts)
|
extends SinkNode(AXI4Imp)(portParams, numPorts)
|
||||||
|
|
||||||
case class AXI4AdapterNode(
|
case class AXI4AdapterNode(
|
||||||
masterFn: Seq[AXI4MasterPortParameters] => AXI4MasterPortParameters,
|
masterFn: Seq[AXI4MasterPortParameters] => AXI4MasterPortParameters,
|
||||||
slaveFn: Seq[AXI4SlavePortParameters] => AXI4SlavePortParameters,
|
slaveFn: Seq[AXI4SlavePortParameters] => AXI4SlavePortParameters,
|
||||||
numMasterPorts: Range.Inclusive = 1 to 1,
|
numMasterPorts: Range.Inclusive = 1 to 1,
|
||||||
numSlavePorts: Range.Inclusive = 1 to 1)
|
numSlavePorts: Range.Inclusive = 1 to 1)
|
||||||
extends InteriorNode(AXI4Imp)(masterFn, slaveFn, numMasterPorts, numSlavePorts)
|
extends InteriorNode(AXI4Imp)(masterFn, slaveFn, numMasterPorts, numSlavePorts)
|
||||||
|
|
||||||
|
// Nodes passed from an inner module
|
||||||
|
case class AXI4OutputNode() extends OutputNode(AXI4Imp)
|
||||||
|
case class AXI4InputNode() extends InputNode(AXI4Imp)
|
||||||
|
|
||||||
|
// Nodes used for external ports
|
||||||
|
case class AXI4BlindOutputNode(portParams: AXI4SlavePortParameters) extends BlindOutputNode(AXI4Imp)(portParams)
|
||||||
|
case class AXI4BlindInputNode(portParams: AXI4MasterPortParameters) extends BlindInputNode(AXI4Imp)(portParams)
|
||||||
|
@ -89,10 +89,8 @@ object TLImp extends NodeImp[TLClientPortParameters, TLManagerPortParameters, TL
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Nodes implemented inside modules
|
||||||
case class TLIdentityNode() extends IdentityNode(TLImp)
|
case class TLIdentityNode() extends IdentityNode(TLImp)
|
||||||
case class TLOutputNode() extends OutputNode(TLImp)
|
|
||||||
case class TLInputNode() extends InputNode(TLImp)
|
|
||||||
|
|
||||||
case class TLClientNode(portParams: TLClientPortParameters, numPorts: Range.Inclusive = 1 to 1)
|
case class TLClientNode(portParams: TLClientPortParameters, numPorts: Range.Inclusive = 1 to 1)
|
||||||
extends SourceNode(TLImp)(portParams, numPorts)
|
extends SourceNode(TLImp)(portParams, numPorts)
|
||||||
case class TLManagerNode(portParams: TLManagerPortParameters, numPorts: Range.Inclusive = 1 to 1)
|
case class TLManagerNode(portParams: TLManagerPortParameters, numPorts: Range.Inclusive = 1 to 1)
|
||||||
@ -117,6 +115,14 @@ case class TLAdapterNode(
|
|||||||
numManagerPorts: Range.Inclusive = 1 to 1)
|
numManagerPorts: Range.Inclusive = 1 to 1)
|
||||||
extends InteriorNode(TLImp)(clientFn, managerFn, numClientPorts, numManagerPorts)
|
extends InteriorNode(TLImp)(clientFn, managerFn, numClientPorts, numManagerPorts)
|
||||||
|
|
||||||
|
// Nodes passed from an inner module
|
||||||
|
case class TLOutputNode() extends OutputNode(TLImp)
|
||||||
|
case class TLInputNode() extends InputNode(TLImp)
|
||||||
|
|
||||||
|
// Nodes used for external ports
|
||||||
|
case class TLBlindOutputNode(portParams: TLManagerPortParameters) extends BlindOutputNode(TLImp)(portParams)
|
||||||
|
case class TLBlindInputNode(portParams: TLClientPortParameters) extends BlindInputNode(TLImp)(portParams)
|
||||||
|
|
||||||
/** Synthesizeable unit tests */
|
/** Synthesizeable unit tests */
|
||||||
import unittest._
|
import unittest._
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user