@@ -8,7 +8,6 @@ import freechips.rocketchip.subsystem._
88import freechips .rocketchip .rocket .{RocketCoreParams , MulDivParams , DCacheParams , ICacheParams }
99import freechips .rocketchip .diplomacy ._
1010
11- import cva6 .{CVA6TileAttachParams }
1211import sodor .common .{SodorTileAttachParams }
1312import ibex .{IbexTileAttachParams }
1413import vexiiriscv .{VexiiRiscvTileAttachParams }
@@ -18,6 +17,43 @@ import freechips.rocketchip.trace.{TraceEncoderParams, TraceCoreParams}
1817import tacit .{TacitEncoder , TacitBPParams }
1918import shuttle .common .{ShuttleTileAttachParams }
2019
20+ // Static plugin discovery for optional generators via Java ServiceLoader.
21+ // Optional generators can implement TilePluginProvider and register using
22+ // META-INF/services without creating hard dependencies here.
23+ import scala .jdk .CollectionConverters ._
24+ import org .reflections .Reflections
25+ import freechips .rocketchip .subsystem .HierarchicalElementPortParamsLike
26+
27+ trait TilePluginProvider {
28+ def tileTraceEnableInjectors : Seq [PartialFunction [Any , Any ]] = Nil
29+ def tileTraceDisableInjectors : Seq [PartialFunction [Any , Any ]] = Nil
30+ def tilePrefetchInjectors (make : (Int , HierarchicalElementPortParamsLike ) => HierarchicalElementPortParamsLike ): Seq [PartialFunction [Any , Any ]] = Nil
31+ }
32+
33+ private object TilePlugins {
34+ private lazy val providers : Seq [TilePluginProvider ] = {
35+ val reflections = new Reflections (" chipyard" )
36+ val subs = reflections.getSubTypesOf(classOf [TilePluginProvider ]).asScala.toSeq.distinct
37+ subs.flatMap { cls =>
38+ try Some (cls.getDeclaredConstructor().newInstance())
39+ catch { case _ : Throwable => None }
40+ }
41+ }
42+
43+ def traceEnableInjectors : Seq [PartialFunction [Any , Any ]] =
44+ providers.flatMap(_.tileTraceEnableInjectors)
45+ def traceDisableInjectors : Seq [PartialFunction [Any , Any ]] =
46+ providers.flatMap(_.tileTraceDisableInjectors)
47+ def prefetchInjectors (make : (Int , HierarchicalElementPortParamsLike ) => HierarchicalElementPortParamsLike ): Seq [PartialFunction [Any , Any ]] =
48+ providers.flatMap(_.tilePrefetchInjectors(make))
49+
50+ def applyInjectors [A ](tp : A , injectors : Seq [PartialFunction [Any , Any ]]): A = {
51+ var acc : Any = tp
52+ injectors.foreach { pf => if (pf.isDefinedAt(acc)) acc = pf(acc) }
53+ acc.asInstanceOf [A ]
54+ }
55+ }
56+
2157class WithL2TLBs (entries : Int ) extends Config ((site, here, up) => {
2258 case TilesLocated (InSubsystem ) => up(TilesLocated (InSubsystem ), site) map {
2359 case tp : RocketTileAttachParams => tp.copy(tileParams = tp.tileParams.copy(
@@ -31,27 +67,29 @@ class WithL2TLBs(entries: Int) extends Config((site, here, up) => {
3167})
3268
3369class WithTraceIO extends Config ((site, here, up) => {
34- case TilesLocated (InSubsystem ) => up(TilesLocated (InSubsystem ), site) map {
35- case tp : boom.v3.common.BoomTileAttachParams => tp.copy(tileParams = tp.tileParams.copy(
36- core = tp.tileParams.core.copy(trace = true )))
37- case tp : boom.v4.common.BoomTileAttachParams => tp.copy(tileParams = tp.tileParams.copy(
38- core = tp.tileParams.core.copy(trace = true )))
39- case tp : CVA6TileAttachParams => tp.copy(tileParams = tp.tileParams.copy(
40- trace = true ))
41- case other => other
70+ case TilesLocated (InSubsystem ) => up(TilesLocated (InSubsystem ), site) map { tp =>
71+ val updated = tp match {
72+ case tp : boom.v3.common.BoomTileAttachParams => tp.copy(tileParams = tp.tileParams.copy(
73+ core = tp.tileParams.core.copy(trace = true )))
74+ case tp : boom.v4.common.BoomTileAttachParams => tp.copy(tileParams = tp.tileParams.copy(
75+ core = tp.tileParams.core.copy(trace = true )))
76+ case other => other
77+ }
78+ TilePlugins .applyInjectors(updated, TilePlugins .traceEnableInjectors)
4279 }
4380 case TracePortKey => Some (TracePortParams ())
4481})
4582
4683class WithNoTraceIO extends Config ((site, here, up) => {
47- case TilesLocated (InSubsystem ) => up(TilesLocated (InSubsystem ), site) map {
48- case tp : boom.v3.common.BoomTileAttachParams => tp.copy(tileParams = tp.tileParams.copy(
49- core = tp.tileParams.core.copy(trace = false )))
50- case tp : boom.v4.common.BoomTileAttachParams => tp.copy(tileParams = tp.tileParams.copy(
51- core = tp.tileParams.core.copy(trace = false )))
52- case tp : CVA6TileAttachParams => tp.copy(tileParams = tp.tileParams.copy(
53- trace = false ))
54- case other => other
84+ case TilesLocated (InSubsystem ) => up(TilesLocated (InSubsystem ), site) map { tp =>
85+ val updated = tp match {
86+ case tp : boom.v3.common.BoomTileAttachParams => tp.copy(tileParams = tp.tileParams.copy(
87+ core = tp.tileParams.core.copy(trace = false )))
88+ case tp : boom.v4.common.BoomTileAttachParams => tp.copy(tileParams = tp.tileParams.copy(
89+ core = tp.tileParams.core.copy(trace = false )))
90+ case other => other
91+ }
92+ TilePlugins .applyInjectors(updated, TilePlugins .traceDisableInjectors)
5593 }
5694 case TracePortKey => None
5795})
@@ -78,9 +116,9 @@ class WithTacitEncoder extends Config((site, here, up) => {
78116 nGroups = 1 ,
79117 xlen = tp.tileParams.core.xLen,
80118 iaddrWidth = tp.tileParams.core.xLen
81- ),
82- bufferDepth = 16 ,
83- coreStages = 5 ,
119+ ),
120+ bufferDepth = 16 ,
121+ coreStages = 5 ,
84122 bpParams = TacitBPParams (xlen = tp.tileParams.core.xLen, n_entries = 1024 ))(p)),
85123 useArbiterMonitor = false
86124 )),
@@ -92,9 +130,9 @@ class WithTacitEncoder extends Config((site, here, up) => {
92130 nGroups = tp.tileParams.core.retireWidth,
93131 xlen = tp.tileParams.core.xLen,
94132 iaddrWidth = tp.tileParams.core.xLen
95- ),
96- bufferDepth = 16 ,
97- coreStages = 7 ,
133+ ),
134+ bufferDepth = 16 ,
135+ coreStages = 7 ,
98136 bpParams = TacitBPParams (xlen = tp.tileParams.core.xLen, n_entries = 1024 ))(p)),
99137 useArbiterMonitor = false
100138 )),
@@ -144,21 +182,25 @@ class WithRocketDCacheScratchpad extends Config((site, here, up) => {
144182})
145183
146184class WithTilePrefetchers extends Config ((site, here, up) => {
147- case TilesLocated (InSubsystem ) => up(TilesLocated (InSubsystem ), site) map {
148- case tp : RocketTileAttachParams => tp.copy(crossingParams = tp.crossingParams.copy(
149- master = TilePrefetchingMasterPortParams (tp.tileParams.tileId, tp.crossingParams.master)))
150- case tp : boom.v3.common.BoomTileAttachParams => tp.copy(crossingParams = tp.crossingParams.copy(
151- master = TilePrefetchingMasterPortParams (tp.tileParams.tileId, tp.crossingParams.master)))
152- case tp : boom.v4.common.BoomTileAttachParams => tp.copy(crossingParams = tp.crossingParams.copy(
153- master = TilePrefetchingMasterPortParams (tp.tileParams.tileId, tp.crossingParams.master)))
154- case tp : SodorTileAttachParams => tp.copy(crossingParams = tp.crossingParams.copy(
155- master = TilePrefetchingMasterPortParams (tp.tileParams.tileId, tp.crossingParams.master)))
156- case tp : IbexTileAttachParams => tp.copy(crossingParams = tp.crossingParams.copy(
157- master = TilePrefetchingMasterPortParams (tp.tileParams.tileId, tp.crossingParams.master)))
158- case tp : VexiiRiscvTileAttachParams => tp.copy(crossingParams = tp.crossingParams.copy(
159- master = TilePrefetchingMasterPortParams (tp.tileParams.tileId, tp.crossingParams.master)))
160- case tp : CVA6TileAttachParams => tp.copy(crossingParams = tp.crossingParams.copy(
161- master = TilePrefetchingMasterPortParams (tp.tileParams.tileId, tp.crossingParams.master)))
185+ case TilesLocated (InSubsystem ) => up(TilesLocated (InSubsystem ), site) map { tp =>
186+ val updated = tp match {
187+ case tp : RocketTileAttachParams => tp.copy(crossingParams = tp.crossingParams.copy(
188+ master = TilePrefetchingMasterPortParams (tp.tileParams.tileId, tp.crossingParams.master)))
189+ case tp : boom.v3.common.BoomTileAttachParams => tp.copy(crossingParams = tp.crossingParams.copy(
190+ master = TilePrefetchingMasterPortParams (tp.tileParams.tileId, tp.crossingParams.master)))
191+ case tp : boom.v4.common.BoomTileAttachParams => tp.copy(crossingParams = tp.crossingParams.copy(
192+ master = TilePrefetchingMasterPortParams (tp.tileParams.tileId, tp.crossingParams.master)))
193+ case tp : SodorTileAttachParams => tp.copy(crossingParams = tp.crossingParams.copy(
194+ master = TilePrefetchingMasterPortParams (tp.tileParams.tileId, tp.crossingParams.master)))
195+ case tp : IbexTileAttachParams => tp.copy(crossingParams = tp.crossingParams.copy(
196+ master = TilePrefetchingMasterPortParams (tp.tileParams.tileId, tp.crossingParams.master)))
197+ case tp : VexiiRiscvTileAttachParams => tp.copy(crossingParams = tp.crossingParams.copy(
198+ master = TilePrefetchingMasterPortParams (tp.tileParams.tileId, tp.crossingParams.master)))
199+ case other => other
200+ }
201+ val make = (tileId : Int , master : HierarchicalElementPortParamsLike ) =>
202+ barf.TilePrefetchingMasterPortParams (tileId, master)
203+ TilePlugins .applyInjectors(updated, TilePlugins .prefetchInjectors(make))
162204 }
163205})
164206
0 commit comments