diplomacy: API beautification
This commit is contained in:
parent
9217baf9d4
commit
b9a2e4c243
@ -79,7 +79,7 @@ trait HasMasterAXI4MemPortBundle {
|
|||||||
/** Actually generates the corresponding IO in the concrete Module */
|
/** Actually generates the corresponding IO in the concrete Module */
|
||||||
trait HasMasterAXI4MemPortModuleImp extends LazyModuleImp with HasMasterAXI4MemPortBundle {
|
trait HasMasterAXI4MemPortModuleImp extends LazyModuleImp with HasMasterAXI4MemPortBundle {
|
||||||
val outer: HasMasterAXI4MemPort
|
val outer: HasMasterAXI4MemPort
|
||||||
val mem_axi4 = IO(HeterogeneousBag(outer.mem_axi4.in.map(_._1.cloneType)))
|
val mem_axi4 = IO(HeterogeneousBag.fromNode(outer.mem_axi4.in))
|
||||||
(mem_axi4 zip outer.mem_axi4.in) foreach { case (i, (o, _)) => i <> o }
|
(mem_axi4 zip outer.mem_axi4.in) foreach { case (i, (o, _)) => i <> o }
|
||||||
val nMemoryChannels = outer.nMemoryChannels
|
val nMemoryChannels = outer.nMemoryChannels
|
||||||
}
|
}
|
||||||
@ -119,7 +119,7 @@ trait HasMasterAXI4MMIOPortBundle {
|
|||||||
/** Actually generates the corresponding IO in the concrete Module */
|
/** Actually generates the corresponding IO in the concrete Module */
|
||||||
trait HasMasterAXI4MMIOPortModuleImp extends LazyModuleImp with HasMasterAXI4MMIOPortBundle {
|
trait HasMasterAXI4MMIOPortModuleImp extends LazyModuleImp with HasMasterAXI4MMIOPortBundle {
|
||||||
val outer: HasMasterAXI4MMIOPort
|
val outer: HasMasterAXI4MMIOPort
|
||||||
val mmio_axi4 = IO(HeterogeneousBag(outer.mmio_axi4.in.map(_._1.cloneType)))
|
val mmio_axi4 = IO(HeterogeneousBag.fromNode(outer.mmio_axi4.in))
|
||||||
(mmio_axi4 zip outer.mmio_axi4.in) foreach { case (i, (o, _)) => i <> o }
|
(mmio_axi4 zip outer.mmio_axi4.in) foreach { case (i, (o, _)) => i <> o }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,7 +159,7 @@ trait HasSlaveAXI4PortBundle {
|
|||||||
/** Actually generates the corresponding IO in the concrete Module */
|
/** Actually generates the corresponding IO in the concrete Module */
|
||||||
trait HasSlaveAXI4PortModuleImp extends LazyModuleImp with HasSlaveAXI4PortBundle {
|
trait HasSlaveAXI4PortModuleImp extends LazyModuleImp with HasSlaveAXI4PortBundle {
|
||||||
val outer: HasSlaveAXI4Port
|
val outer: HasSlaveAXI4Port
|
||||||
val l2_frontend_bus_axi4 = IO(HeterogeneousBag(outer.l2FrontendAXI4Node.out.map(_._1.cloneType)).flip)
|
val l2_frontend_bus_axi4 = IO(HeterogeneousBag.fromNode(outer.l2FrontendAXI4Node.out).flip)
|
||||||
(outer.l2FrontendAXI4Node.out zip l2_frontend_bus_axi4) foreach { case ((i, _), o) => i <> o }
|
(outer.l2FrontendAXI4Node.out zip l2_frontend_bus_axi4) foreach { case ((i, _), o) => i <> o }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -201,7 +201,7 @@ trait HasMasterTLMMIOPortBundle {
|
|||||||
/** Actually generates the corresponding IO in the concrete Module */
|
/** Actually generates the corresponding IO in the concrete Module */
|
||||||
trait HasMasterTLMMIOPortModuleImp extends LazyModuleImp with HasMasterTLMMIOPortBundle {
|
trait HasMasterTLMMIOPortModuleImp extends LazyModuleImp with HasMasterTLMMIOPortBundle {
|
||||||
val outer: HasMasterTLMMIOPort
|
val outer: HasMasterTLMMIOPort
|
||||||
val mmio_tl = IO(HeterogeneousBag(outer.mmio_tl.in.map(_._1.cloneType)))
|
val mmio_tl = IO(HeterogeneousBag.fromNode(outer.mmio_tl.in))
|
||||||
(mmio_tl zip outer.mmio_tl.out) foreach { case (i, (o, _)) => i <> o }
|
(mmio_tl zip outer.mmio_tl.out) foreach { case (i, (o, _)) => i <> o }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,7 +239,7 @@ trait HasSlaveTLPortBundle {
|
|||||||
/** Actually generates the corresponding IO in the concrete Module */
|
/** Actually generates the corresponding IO in the concrete Module */
|
||||||
trait HasSlaveTLPortModuleImp extends LazyModuleImp with HasSlaveTLPortBundle {
|
trait HasSlaveTLPortModuleImp extends LazyModuleImp with HasSlaveTLPortBundle {
|
||||||
val outer: HasSlaveTLPort
|
val outer: HasSlaveTLPort
|
||||||
val l2_frontend_bus_tl = IO(HeterogeneousBag(outer.l2FrontendTLNode.out.map(_._1.cloneType)).flip)
|
val l2_frontend_bus_tl = IO(HeterogeneousBag.fromNode(outer.l2FrontendTLNode.out).flip)
|
||||||
(outer.l2FrontendTLNode.in zip l2_frontend_bus_tl) foreach { case ((i, _), o) => i <> o }
|
(outer.l2FrontendTLNode.in zip l2_frontend_bus_tl) foreach { case ((i, _), o) => i <> o }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -264,7 +264,7 @@ class SimAXIMem(channels: Int, forceSize: BigInt = 0)(implicit p: Parameters) ex
|
|||||||
|
|
||||||
lazy val module = new LazyModuleImp(this) {
|
lazy val module = new LazyModuleImp(this) {
|
||||||
val io = IO(new Bundle {
|
val io = IO(new Bundle {
|
||||||
val axi4 = HeterogeneousBag(node.out.map(_._1.cloneType)).flip
|
val axi4 = HeterogeneousBag.fromNode(node.out).flip
|
||||||
})
|
})
|
||||||
(node.out zip io.axi4) foreach { case ((i, _), o) => i <> o }
|
(node.out zip io.axi4) foreach { case ((i, _), o) => i <> o }
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ class SystemBus(params: SystemBusParams)(implicit p: Parameters) extends TLBusWr
|
|||||||
private val master_splitter = LazyModule(new TLSplitter) // Allows cycle-free connection to external networks
|
private val master_splitter = LazyModule(new TLSplitter) // Allows cycle-free connection to external networks
|
||||||
master_splitter.suggestName(s"${busName}_master_TLSplitter")
|
master_splitter.suggestName(s"${busName}_master_TLSplitter")
|
||||||
inwardNode :=* master_splitter.node
|
inwardNode :=* master_splitter.node
|
||||||
def busView = master_splitter.node.in.head._2
|
def busView = master_splitter.node.edges.in.head
|
||||||
|
|
||||||
protected def inwardSplitNode: TLInwardNode = master_splitter.node
|
protected def inwardSplitNode: TLInwardNode = master_splitter.node
|
||||||
protected def outwardSplitNode: TLOutwardNode = master_splitter.node
|
protected def outwardSplitNode: TLOutwardNode = master_splitter.node
|
||||||
|
@ -353,8 +353,9 @@ class TLDebugModuleOuter(device: Device)(implicit p: Parameters) extends LazyMod
|
|||||||
|
|
||||||
debugIntNxt := debugIntRegs
|
debugIntNxt := debugIntRegs
|
||||||
|
|
||||||
|
val (intnode_out, _) = intnode.out.unzip
|
||||||
for (component <- 0 until nComponents) {
|
for (component <- 0 until nComponents) {
|
||||||
intnode.out(component)._1(0) := debugIntRegs(component)
|
intnode_out(component)(0) := debugIntRegs(component)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Halt request registers are set & cleared by writes to DMCONTROL.haltreq
|
// Halt request registers are set & cleared by writes to DMCONTROL.haltreq
|
||||||
@ -1015,7 +1016,6 @@ class TLDebugModuleInnerAsync(device: Device, getNComponents: () => Int)(implici
|
|||||||
lazy val module = new LazyModuleImp(this) {
|
lazy val module = new LazyModuleImp(this) {
|
||||||
|
|
||||||
val io = IO(new Bundle {
|
val io = IO(new Bundle {
|
||||||
// this comes from tlClk domain.
|
|
||||||
// These are all asynchronous and come from Outer
|
// These are all asynchronous and come from Outer
|
||||||
val dmactive = Bool(INPUT)
|
val dmactive = Bool(INPUT)
|
||||||
val innerCtrl = new AsyncBundle(1, new DebugInternalBundle()).flip
|
val innerCtrl = new AsyncBundle(1, new DebugInternalBundle()).flip
|
||||||
@ -1045,7 +1045,7 @@ class TLDebugModule(implicit p: Parameters) extends LazyModule {
|
|||||||
val intnode = IntIdentityNode()
|
val intnode = IntIdentityNode()
|
||||||
|
|
||||||
val dmOuter = LazyModule(new TLDebugModuleOuterAsync(device)(p))
|
val dmOuter = LazyModule(new TLDebugModuleOuterAsync(device)(p))
|
||||||
val dmInner = LazyModule(new TLDebugModuleInnerAsync(device, () => {intnode.edges._2.size})(p))
|
val dmInner = LazyModule(new TLDebugModuleInnerAsync(device, () => {intnode.edges.out.size})(p))
|
||||||
|
|
||||||
dmInner.dmiNode := dmOuter.dmiInnerNode
|
dmInner.dmiNode := dmOuter.dmiInnerNode
|
||||||
dmInner.tlNode := node
|
dmInner.tlNode := node
|
||||||
|
@ -82,7 +82,7 @@ class BusBlocker(params: BusBlockerParams)(implicit p: Parameters) extends TLBus
|
|||||||
|
|
||||||
lazy val module = new LazyModuleImp(this) {
|
lazy val module = new LazyModuleImp(this) {
|
||||||
// We need to be able to represent +1 larger than the largest populated address
|
// We need to be able to represent +1 larger than the largest populated address
|
||||||
val addressBits = log2Ceil(nodeOut.out(0)._2.manager.maxAddress+1+1)
|
val addressBits = log2Ceil(nodeOut.edges.out(0).manager.maxAddress+1+1)
|
||||||
val pmps = RegInit(Vec.fill(params.pmpRegisters) { DevicePMP(addressBits, params.pageBits) })
|
val pmps = RegInit(Vec.fill(params.pmpRegisters) { DevicePMP(addressBits, params.pageBits) })
|
||||||
val blocks = pmps.tail.map(_.blockPriorAddress) :+ Bool(false)
|
val blocks = pmps.tail.map(_.blockPriorAddress) :+ Bool(false)
|
||||||
controlNode.regmap(0 -> (pmps zip blocks).map { case (p, b) => p.fields(b) }.toList.flatten)
|
controlNode.regmap(0 -> (pmps zip blocks).map { case (p, b) => p.fields(b) }.toList.flatten)
|
||||||
|
@ -68,7 +68,8 @@ class CoreplexLocalInterrupter(params: ClintParams)(implicit p: Parameters) exte
|
|||||||
val timecmp = Seq.fill(nTiles) { Seq.fill(timeWidth/regWidth)(Reg(UInt(width = regWidth))) }
|
val timecmp = Seq.fill(nTiles) { Seq.fill(timeWidth/regWidth)(Reg(UInt(width = regWidth))) }
|
||||||
val ipi = Seq.fill(nTiles) { RegInit(UInt(0, width = 1)) }
|
val ipi = Seq.fill(nTiles) { RegInit(UInt(0, width = 1)) }
|
||||||
|
|
||||||
intnode.in.map(_._1).zipWithIndex.foreach { case (int, i) =>
|
val (intnode_in, _) = intnode.in.unzip
|
||||||
|
intnode_in.zipWithIndex.foreach { case (int, i) =>
|
||||||
int(0) := ShiftRegister(ipi(i)(0), params.intStages) // msip
|
int(0) := ShiftRegister(ipi(i)(0), params.intStages) // msip
|
||||||
int(1) := ShiftRegister(time.asUInt >= timecmp(i).asUInt, params.intStages) // mtip
|
int(1) := ShiftRegister(time.asUInt >= timecmp(i).asUInt, params.intStages) // mtip
|
||||||
}
|
}
|
||||||
|
@ -91,12 +91,12 @@ class TLPLIC(params: PLICParams)(implicit p: Parameters) extends LazyModule
|
|||||||
sinkFn = { _ => IntSinkPortParameters(Seq(IntSinkParameters())) })
|
sinkFn = { _ => IntSinkPortParameters(Seq(IntSinkParameters())) })
|
||||||
|
|
||||||
/* Negotiated sizes */
|
/* Negotiated sizes */
|
||||||
def nDevices: Int = intnode.in.map(_._2.source.num).sum
|
def nDevices: Int = intnode.edges.in.map(_.source.num).sum
|
||||||
def nPriorities = min(params.maxPriorities, nDevices)
|
def nPriorities = min(params.maxPriorities, nDevices)
|
||||||
def nHarts = intnode.out.map(_._2.source.num).sum
|
def nHarts = intnode.edges.out.map(_.source.num).sum
|
||||||
|
|
||||||
// Assign all the devices unique ranges
|
// Assign all the devices unique ranges
|
||||||
lazy val sources = intnode.in.map(_._2.source)
|
lazy val sources = intnode.edges.in.map(_.source)
|
||||||
lazy val flatSources = (sources zip sources.map(_.num).scanLeft(0)(_+_).init).map {
|
lazy val flatSources = (sources zip sources.map(_.num).scanLeft(0)(_+_).init).map {
|
||||||
case (s, o) => s.sources.map(z => z.copy(range = z.range.offset(o)))
|
case (s, o) => s.sources.map(z => z.copy(range = z.range.offset(o)))
|
||||||
}.flatten
|
}.flatten
|
||||||
|
@ -96,6 +96,7 @@ object BaseNode
|
|||||||
protected[diplomacy] var serial = 0
|
protected[diplomacy] var serial = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// !!! rename the nodes we bind?
|
||||||
case class NodeHandle[DI, UI, BI <: Data, DO, UO, BO <: Data]
|
case class NodeHandle[DI, UI, BI <: Data, DO, UO, BO <: Data]
|
||||||
(inward: InwardNode[DI, UI, BI], outward: OutwardNode[DO, UO, BO])
|
(inward: InwardNode[DI, UI, BI], outward: OutwardNode[DO, UO, BO])
|
||||||
extends Object with InwardNodeHandle[DI, UI, BI] with OutwardNodeHandle[DO, UO, BO]
|
extends Object with InwardNodeHandle[DI, UI, BI] with OutwardNodeHandle[DO, UO, BO]
|
||||||
@ -177,6 +178,7 @@ trait OutwardNode[DO, UO, BO <: Data] extends BaseNode with OutwardNodeHandle[DO
|
|||||||
protected[diplomacy] val oParams: Seq[DO]
|
protected[diplomacy] val oParams: Seq[DO]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case class Edges[EI, EO](in: EI, out: EO)
|
||||||
sealed abstract class MixedNode[DI, UI, EI, BI <: Data, DO, UO, EO, BO <: Data](
|
sealed 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])(
|
||||||
@ -243,7 +245,7 @@ sealed abstract class MixedNode[DI, UI, EI, BI <: Data, DO, UO, EO, BO <: Data](
|
|||||||
protected[diplomacy] lazy val edgesIn = (iPorts zip iParams).map { case ((o, n, p), i) => inner.edgeI(n.oParams(o), i, p) }
|
protected[diplomacy] lazy val edgesIn = (iPorts zip iParams).map { case ((o, n, p), i) => inner.edgeI(n.oParams(o), i, p) }
|
||||||
|
|
||||||
// If you need access to the edges of a foreign Node, use this method (in/out create bundles)
|
// If you need access to the edges of a foreign Node, use this method (in/out create bundles)
|
||||||
lazy val edges = (edgesIn, edgesOut)
|
lazy val edges = Edges(edgesIn, edgesOut)
|
||||||
|
|
||||||
protected[diplomacy] lazy val bundleOut: Seq[BO] = edgesOut.map(e => Wire(outer.bundleO(e)))
|
protected[diplomacy] lazy val bundleOut: Seq[BO] = edgesOut.map(e => Wire(outer.bundleO(e)))
|
||||||
protected[diplomacy] lazy val bundleIn: Seq[BI] = edgesIn .map(e => Wire(inner.bundleI(e)))
|
protected[diplomacy] lazy val bundleIn: Seq[BI] = edgesIn .map(e => Wire(inner.bundleI(e)))
|
||||||
|
@ -75,7 +75,7 @@ class FrontendModule(outer: Frontend) extends LazyModuleImp(outer)
|
|||||||
with HasCoreParameters
|
with HasCoreParameters
|
||||||
with HasL1ICacheParameters {
|
with HasL1ICacheParameters {
|
||||||
val io = IO(new FrontendBundle(outer))
|
val io = IO(new FrontendBundle(outer))
|
||||||
implicit val edge = outer.masterNode.out(0)._2
|
implicit val edge = outer.masterNode.edges.out(0)
|
||||||
val icache = outer.icache.module
|
val icache = outer.icache.module
|
||||||
require(fetchWidth*coreInstBytes == outer.icacheParams.fetchBytes)
|
require(fetchWidth*coreInstBytes == outer.icacheParams.fetchBytes)
|
||||||
|
|
||||||
|
@ -181,8 +181,8 @@ class HellaCacheBundle(outer: HellaCache)(implicit p: Parameters) extends CoreBu
|
|||||||
|
|
||||||
class HellaCacheModule(outer: HellaCache) extends LazyModuleImp(outer)
|
class HellaCacheModule(outer: HellaCache) extends LazyModuleImp(outer)
|
||||||
with HasL1HellaCacheParameters {
|
with HasL1HellaCacheParameters {
|
||||||
implicit val edge = outer.node.out(0)._2
|
implicit val edge = outer.node.edges.out(0)
|
||||||
val tl_out = outer.node.out(0)._1
|
val (tl_out, _) = outer.node.out(0)
|
||||||
val io = IO(new HellaCacheBundle(outer))
|
val io = IO(new HellaCacheBundle(outer))
|
||||||
|
|
||||||
private val fifoManagers = edge.manager.managers.filter(TLFIFOFixer.allUncacheable)
|
private val fifoManagers = edge.manager.managers.filter(TLFIFOFixer.allUncacheable)
|
||||||
|
@ -109,6 +109,8 @@ class ICacheModule(outer: ICache) extends LazyModuleImp(outer)
|
|||||||
|
|
||||||
val io = IO(new ICacheBundle(outer))
|
val io = IO(new ICacheBundle(outer))
|
||||||
val (tl_out, edge_out) = outer.masterNode.out(0)
|
val (tl_out, edge_out) = outer.masterNode.out(0)
|
||||||
|
// Option.unzip does not exist :-(
|
||||||
|
// val (tl_in, edge_in) = outer.slaveNode.map(_.in(0)).unzip
|
||||||
val tl_in = outer.slaveNode.map(_.in(0)._1)
|
val tl_in = outer.slaveNode.map(_.in(0)._1)
|
||||||
val edge_in = outer.slaveNode.map(_.in(0)._2)
|
val edge_in = outer.slaveNode.map(_.in(0)._2)
|
||||||
|
|
||||||
|
@ -283,7 +283,7 @@ trait CanHavePTW extends HasHellaCache {
|
|||||||
trait CanHavePTWModule extends HasHellaCacheModule {
|
trait CanHavePTWModule extends HasHellaCacheModule {
|
||||||
val outer: CanHavePTW
|
val outer: CanHavePTW
|
||||||
val ptwPorts = ListBuffer(outer.dcache.module.io.ptw)
|
val ptwPorts = ListBuffer(outer.dcache.module.io.ptw)
|
||||||
val ptw = Module(new PTW(outer.nPTWPorts)(outer.dcache.node.out(0)._2, outer.p))
|
val ptw = Module(new PTW(outer.nPTWPorts)(outer.dcache.node.edges.out(0), outer.p))
|
||||||
if (outer.usingPTW)
|
if (outer.usingPTW)
|
||||||
dcachePorts += ptw.io.mem
|
dcachePorts += ptw.io.mem
|
||||||
}
|
}
|
||||||
|
@ -127,7 +127,7 @@ trait CanHaveScratchpad extends HasHellaCache with HasICacheFrontend {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def findScratchpadFromICache: Option[AddressSet] = scratch.map { s =>
|
def findScratchpadFromICache: Option[AddressSet] = scratch.map { s =>
|
||||||
val finalNode = frontend.masterNode.out.head._2.manager.managers.find(_.nodePath.last == s.node)
|
val finalNode = frontend.masterNode.edges.out.head.manager.managers.find(_.nodePath.last == s.node)
|
||||||
require (finalNode.isDefined, "Could not find the scratch pad; not reachable via icache?")
|
require (finalNode.isDefined, "Could not find the scratch pad; not reachable via icache?")
|
||||||
require (finalNode.get.address.size == 1, "Scratchpad address space was fragmented!")
|
require (finalNode.get.address.size == 1, "Scratchpad address space was fragmented!")
|
||||||
finalNode.get.address(0)
|
finalNode.get.address(0)
|
||||||
|
@ -56,6 +56,7 @@ trait HasExternalInterruptsModule {
|
|||||||
|
|
||||||
val core_ips = core.lip
|
val core_ips = core.lip
|
||||||
|
|
||||||
(async_ips ++ periph_ips ++ seip ++ core_ips).zip(outer.intNode.in(0)._1).foreach { case(c, i) => c := i }
|
val (interrupts, _) = outer.intNode.in(0)
|
||||||
|
(async_ips ++ periph_ips ++ seip ++ core_ips).zip(interrupts).foreach { case(c, i) => c := i }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -82,7 +82,7 @@ class RocketTile(val rocketParams: RocketTileParams, val hartid: Int)(implicit p
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
// Find all the caches
|
// Find all the caches
|
||||||
val outer = masterNode.out.map(_._2)
|
val outer = masterNode.edges.out
|
||||||
.flatMap(_.manager.managers)
|
.flatMap(_.manager.managers)
|
||||||
.filter(_.supportsAcquireB)
|
.filter(_.supportsAcquireB)
|
||||||
.flatMap(_.resources.headOption)
|
.flatMap(_.resources.headOption)
|
||||||
@ -115,7 +115,7 @@ class RocketTile(val rocketParams: RocketTileParams, val hartid: Int)(implicit p
|
|||||||
Resource(cpuDevice, "reg").bind(ResourceInt(BigInt(hartid)))
|
Resource(cpuDevice, "reg").bind(ResourceInt(BigInt(hartid)))
|
||||||
Resource(intcDevice, "reg").bind(ResourceInt(BigInt(hartid)))
|
Resource(intcDevice, "reg").bind(ResourceInt(BigInt(hartid)))
|
||||||
|
|
||||||
intNode.in.flatMap(_._2.source.sources).map { case s =>
|
intNode.edges.in.flatMap(_.source.sources).map { case s =>
|
||||||
for (i <- s.range.start until s.range.end) {
|
for (i <- s.range.start until s.range.end) {
|
||||||
csrIntMap.lift(i).foreach { j =>
|
csrIntMap.lift(i).foreach { j =>
|
||||||
s.resources.foreach { r =>
|
s.resources.foreach { r =>
|
||||||
|
@ -43,7 +43,7 @@ class TLNodeNumberer(nodeAddressOffset: Option[Int] = None)(implicit p: Paramete
|
|||||||
val node = TLNodeNumbererNode(nodeAddressOffset)
|
val node = TLNodeNumbererNode(nodeAddressOffset)
|
||||||
|
|
||||||
lazy val module = new LazyModuleImp(this) {
|
lazy val module = new LazyModuleImp(this) {
|
||||||
val minNodeOffset = log2Ceil(node.out.map(_._2.manager.maxAddress).max)
|
val minNodeOffset = log2Ceil(node.edges.out.map(_.manager.maxAddress).max)
|
||||||
val nodeOffset = nodeAddressOffset.getOrElse(minNodeOffset)
|
val nodeOffset = nodeAddressOffset.getOrElse(minNodeOffset)
|
||||||
|
|
||||||
(node.in zip node.out).zipWithIndex foreach { case (((in, _), (out, _)), i) =>
|
(node.in zip node.out).zipWithIndex foreach { case (((in, _), (out, _)), i) =>
|
||||||
|
@ -129,3 +129,5 @@ class TLRegisterRouter[B <: TLRegBundleBase, M <: LazyModuleImp](
|
|||||||
|
|
||||||
lazy val module = moduleBuilder(bundleBuilder(TLRegBundleArg()), this)
|
lazy val module = moduleBuilder(bundleBuilder(TLRegBundleArg()), this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// !!! eliminate third trait
|
||||||
|
@ -17,3 +17,8 @@ final case class HeterogeneousBag[T <: Data](elts: Seq[T]) extends Record with c
|
|||||||
override def hashCode: Int = super[Record].hashCode
|
override def hashCode: Int = super[Record].hashCode
|
||||||
override def equals(that: Any): Boolean = super[Record].equals(that)
|
override def equals(that: Any): Boolean = super[Record].equals(that)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object HeterogeneousBag
|
||||||
|
{
|
||||||
|
def fromNode[D <: Data, E](elts: Seq[(D, E)]) = new HeterogeneousBag(elts.map(_._1.cloneType))
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user