diff --git a/src/main/scala/diplomacy/LazyModule.scala b/src/main/scala/diplomacy/LazyModule.scala index 972963c5..5fe14545 100644 --- a/src/main/scala/diplomacy/LazyModule.scala +++ b/src/main/scala/diplomacy/LazyModule.scala @@ -4,6 +4,7 @@ package diplomacy import Chisel._ import config._ +import chisel3.experimental.{BaseModule, RawModule, MultiIOModule} import chisel3.internal.sourceinfo.{SourceInfo, SourceLine, UnlocatableSourceInfo} abstract class LazyModule()(implicit val p: Parameters) @@ -51,7 +52,7 @@ abstract class LazyModule()(implicit val p: Parameters) def name = valName.getOrElse(className) def line = sourceLine(info) - def module: LazyModuleImp + def module: LazyModuleImpLike protected[diplomacy] def instantiate() = { children.reverse.foreach { c => @@ -140,14 +141,23 @@ object LazyModule } } -abstract class LazyModuleImp(outer: LazyModule) extends Module +trait LazyModuleImpLike extends BaseModule { + val wrapper: LazyModule + // .module had better not be accessed while LazyModules are still being built! - require (LazyModule.stack.isEmpty, s"${outer.name}.module was constructed before LazyModule() was run on ${LazyModule.stack.head.name}") + require (LazyModule.stack.isEmpty, s"${wrapper.name}.module was constructed before LazyModule() was run on ${LazyModule.stack.head.name}") - override def desiredName = outer.moduleName - suggestName(outer.instanceName) + override def desiredName = wrapper.moduleName + suggestName(wrapper.instanceName) - outer.instantiate() - implicit val p = outer.p + wrapper.instantiate() + + implicit val p = wrapper.p } + +abstract class LazyModuleImp(val wrapper: LazyModule) extends Module with LazyModuleImpLike + +abstract class LazyMultiIOModuleImp(val wrapper: LazyModule) extends MultiIOModule with LazyModuleImpLike + +abstract class LazyRawModuleImp(val wrapper: LazyModule) extends RawModule with LazyModuleImpLike diff --git a/src/main/scala/diplomacy/Monitor.scala b/src/main/scala/diplomacy/Monitor.scala new file mode 100644 index 00000000..eacddb7b --- /dev/null +++ b/src/main/scala/diplomacy/Monitor.scala @@ -0,0 +1,11 @@ +// See LICENSE.SiFive for license details. + +package diplomacy + +import Chisel._ +import chisel3.internal.sourceinfo.{SourceInfo, SourceLine} +import config._ + +abstract class MonitorBase(implicit sourceInfo: SourceInfo, p: Parameters) extends LazyModule()(p) { + override val module: LazyModuleImp +} diff --git a/src/main/scala/diplomacy/Nodes.scala b/src/main/scala/diplomacy/Nodes.scala index b5f2f7b9..11aedb97 100644 --- a/src/main/scala/diplomacy/Nodes.scala +++ b/src/main/scala/diplomacy/Nodes.scala @@ -18,7 +18,7 @@ trait InwardNodeImp[DI, UI, EI, BI <: Data] def bundleI(ei: EI): BI def colour: String def reverse: Boolean = false - def connect(edges: () => Seq[EI], bundles: () => Seq[(BI, BI)])(implicit p: Parameters, sourceInfo: SourceInfo): (Option[LazyModule], () => Unit) = { + def connect(edges: () => Seq[EI], bundles: () => Seq[(BI, BI)])(implicit p: Parameters, sourceInfo: SourceInfo): (Option[MonitorBase], () => Unit) = { (None, () => bundles().foreach { case (i, o) => i <> o }) } @@ -78,11 +78,11 @@ case class NodeHandle[DI, UI, BI <: Data, DO, UO, BO <: Data] trait InwardNodeHandle[DI, UI, BI <: Data] { val inward: InwardNode[DI, UI, BI] - def := (h: OutwardNodeHandle[DI, UI, BI])(implicit p: Parameters, sourceInfo: SourceInfo): Option[LazyModule] = + def := (h: OutwardNodeHandle[DI, UI, BI])(implicit p: Parameters, sourceInfo: SourceInfo): Option[MonitorBase] = inward.:=(h)(p, sourceInfo) - def :*= (h: OutwardNodeHandle[DI, UI, BI])(implicit p: Parameters, sourceInfo: SourceInfo): Option[LazyModule] = + def :*= (h: OutwardNodeHandle[DI, UI, BI])(implicit p: Parameters, sourceInfo: SourceInfo): Option[MonitorBase] = inward.:*=(h)(p, sourceInfo) - def :=* (h: OutwardNodeHandle[DI, UI, BI])(implicit p: Parameters, sourceInfo: SourceInfo): Option[LazyModule] = + def :=* (h: OutwardNodeHandle[DI, UI, BI])(implicit p: Parameters, sourceInfo: SourceInfo): Option[MonitorBase] = inward.:=*(h)(p, sourceInfo) } @@ -232,7 +232,7 @@ abstract class MixedNode[DI, UI, EI, BI <: Data, DO, UO, EO, BO <: Data]( lazy val bundleIn = wireI(flipI(HeterogeneousBag(edgesIn .map(inner.bundleI(_))))) // connects the outward part of a node with the inward part of this node - private def bind(h: OutwardNodeHandle[DI, UI, BI], binding: NodeBinding)(implicit p: Parameters, sourceInfo: SourceInfo): Option[LazyModule] = { + private def bind(h: OutwardNodeHandle[DI, UI, BI], binding: NodeBinding)(implicit p: Parameters, sourceInfo: SourceInfo): Option[MonitorBase] = { val x = this // x := y val y = h.outward val info = sourceLine(sourceInfo, " at ", "") @@ -263,9 +263,9 @@ abstract class MixedNode[DI, UI, EI, BI <: Data, DO, UO, EO, BO <: Data]( out } - override def := (h: OutwardNodeHandle[DI, UI, BI])(implicit p: Parameters, sourceInfo: SourceInfo): Option[LazyModule] = bind(h, BIND_ONCE) - override def :*= (h: OutwardNodeHandle[DI, UI, BI])(implicit p: Parameters, sourceInfo: SourceInfo): Option[LazyModule] = bind(h, BIND_STAR) - override def :=* (h: OutwardNodeHandle[DI, UI, BI])(implicit p: Parameters, sourceInfo: SourceInfo): Option[LazyModule] = bind(h, BIND_QUERY) + override def := (h: OutwardNodeHandle[DI, UI, BI])(implicit p: Parameters, sourceInfo: SourceInfo): Option[MonitorBase] = bind(h, BIND_ONCE) + override def :*= (h: OutwardNodeHandle[DI, UI, BI])(implicit p: Parameters, sourceInfo: SourceInfo): Option[MonitorBase] = bind(h, BIND_STAR) + override def :=* (h: OutwardNodeHandle[DI, UI, BI])(implicit p: Parameters, sourceInfo: SourceInfo): Option[MonitorBase] = bind(h, BIND_QUERY) // meta-data for printing the node graph protected[diplomacy] def colour = inner.colour diff --git a/src/main/scala/rocketchip/BaseTop.scala b/src/main/scala/rocketchip/BaseTop.scala index ffb2b6f9..d97f8c5f 100644 --- a/src/main/scala/rocketchip/BaseTop.scala +++ b/src/main/scala/rocketchip/BaseTop.scala @@ -22,9 +22,9 @@ abstract class BareTopBundle[+L <: BareTop](_outer: L) extends GenericParameteri implicit val p = outer.p } -abstract class BareTopModule[+L <: BareTop, +B <: BareTopBundle[L]](_outer: L, _io: () => B) extends LazyModuleImp(_outer) { +abstract class BareTopModule[+L <: BareTop, +B <: BareTopBundle[L]](_outer: L, _io: () => B) extends LazyMultiIOModuleImp(_outer) { val outer = _outer - val io = _io () + val io = IO(_io()) } /** HasTopLevelNetworks provides buses that will serve as attachment points, @@ -59,13 +59,13 @@ trait HasTopLevelNetworksModule extends HasPeripheryParameters { } /** Base Top class with no peripheral devices or ports added */ -class BaseTop(implicit p: Parameters) extends BareTop +abstract class BaseTop(implicit p: Parameters) extends BareTop with HasTopLevelNetworks { - override lazy val module = new BaseTopModule(this, () => new BaseTopBundle(this)) + override val module: BaseTopModule[BaseTop, BaseTopBundle[BaseTop]] } -class BaseTopBundle[+L <: BaseTop](_outer: L) extends BareTopBundle(_outer) +abstract class BaseTopBundle[+L <: BaseTop](_outer: L) extends BareTopBundle(_outer) with HasTopLevelNetworksBundle -class BaseTopModule[+L <: BaseTop, +B <: BaseTopBundle[L]](_outer: L, _io: () => B) extends BareTopModule(_outer, _io) +abstract class BaseTopModule[+L <: BaseTop, +B <: BaseTopBundle[L]](_outer: L, _io: () => B) extends BareTopModule(_outer, _io) with HasTopLevelNetworksModule diff --git a/src/main/scala/uncore/tilelink2/Monitor.scala b/src/main/scala/uncore/tilelink2/Monitor.scala index 0fb7b575..b911d412 100644 --- a/src/main/scala/uncore/tilelink2/Monitor.scala +++ b/src/main/scala/uncore/tilelink2/Monitor.scala @@ -9,10 +9,8 @@ import diplomacy._ case class TLMonitorArgs(edge: () => Seq[TLEdge], sourceInfo: SourceInfo, p: Parameters) -abstract class TLMonitorBase(args: TLMonitorArgs) extends LazyModule()(args.p) +abstract class TLMonitorBase(args: TLMonitorArgs) extends MonitorBase()(args.sourceInfo, args.p) { - implicit val sourceInfo = args.sourceInfo - def legalize(bundle: TLBundleSnoop, edge: TLEdge, reset: Bool): Unit lazy val module = new LazyModuleImp(this) { diff --git a/src/main/scala/uncore/tilelink2/Nodes.scala b/src/main/scala/uncore/tilelink2/Nodes.scala index 8ce68deb..32d502b6 100644 --- a/src/main/scala/uncore/tilelink2/Nodes.scala +++ b/src/main/scala/uncore/tilelink2/Nodes.scala @@ -24,7 +24,7 @@ object TLImp extends NodeImp[TLClientPortParameters, TLManagerPortParameters, TL override def labelI(ei: TLEdgeIn) = (ei.manager.beatBytes * 8).toString override def labelO(eo: TLEdgeOut) = (eo.manager.beatBytes * 8).toString - override def connect(edges: () => Seq[TLEdgeIn], bundles: () => Seq[(TLBundle, TLBundle)])(implicit p: Parameters, sourceInfo: SourceInfo): (Option[LazyModule], () => Unit) = { + override def connect(edges: () => Seq[TLEdgeIn], bundles: () => Seq[(TLBundle, TLBundle)])(implicit p: Parameters, sourceInfo: SourceInfo): (Option[TLMonitorBase], () => Unit) = { val monitor = p(TLMonitorBuilder)(TLMonitorArgs(edges, sourceInfo, p)) (monitor, () => { val eval = bundles ()