@@ -13,47 +13,63 @@ object LayerControl {
1313 /** The type of all layer control variations */
1414 sealed trait Type {
1515
16- /** Return the layers that should be enabled in a circuit. The layers must exist in the design .
16+ /** Return the layers that should be enabled in a circuit. The layers must exist in the circuit .
1717 *
18- * @param design an Annotation that contains an elaborated design used to check that the requested layers exist
19- * @return all layers that should be enabled
20- * @throws IllegalArgumentException if the requested layers
18+ * @param allLayers all layers that are defined in a circuit
19+ * @return the layers that should be enabled
20+ * @throws IllegalArgumentException if the requested layers are not in `allLayers`
2121 */
22- protected def getLayerSubset (module : ElaboratedModule [_ ]): Seq [Layer ]
22+ protected def getLayerSubset (allLayers : Seq [ Layer ]): Seq [Layer ]
2323
2424 /** Return the preprocessor defines that should be set to enable the layers of
2525 * this `LayerControl.Type`.
2626 *
27- * This requires passing an elaborated module in order to know what layers
28- * exist in the design.
29- *
30- * @param module an elaborated module
27+ * @param module a Chisel module
28+ * @param allLayers all the layers that are allow
3129 * @return preprocessor defines to control the enabling of these layers
3230 */
3331 final def preprocessorDefines (
34- module : ElaboratedModule [_ <: RawModule ]
35- ): Seq [VerilogPreprocessorDefine ] = getLayerSubset(module).flatMap {
32+ module : RawModule ,
33+ allLayers : Seq [Layer ]
34+ ): Seq [VerilogPreprocessorDefine ] = getLayerSubset(allLayers).flatMap {
3635 case layer =>
3736 layer.config.abi match {
3837 case abi : chisel3.layer.ABI .PreprocessorDefine .type =>
39- Some (VerilogPreprocessorDefine (abi.toMacroIdentifier(layer, module.wrapped. circuitName)))
38+ Some (VerilogPreprocessorDefine (abi.toMacroIdentifier(layer, module.circuitName)))
4039 case _ => None
4140 }
4241 }
4342
43+ /** Return the preprocessor defines that should be set to enable the layers of
44+ * this `LayerControl.Type`.
45+ *
46+ * This requires passing an elaborated module in order to know what layers
47+ * exist in the design.
48+ *
49+ * @param module an elaborated Chisel module
50+ * @return preprocessor defines to control the enabling of these layers
51+ */
52+ final def preprocessorDefines (
53+ module : ElaboratedModule [_ <: RawModule ]
54+ ): Seq [VerilogPreprocessorDefine ] = preprocessorDefines(module.wrapped, module.layers)
55+
4456 /** Return a partial function that will return true if a file should be included
4557 * in the build to enable a layer. This partial function is not defined if
4658 * the file is not a layer file.
4759 *
48- * @param module an elaborated module
60+ * @param module a Chisel module
61+ * @param allLayers all the layers that can be enabled
4962 * @return a partial function to test if layer files should be included
5063 */
51- final def shouldIncludeFile (module : ElaboratedModule [_ <: RawModule ]): PartialFunction [File , Boolean ] = {
52- val layerFilenames : Seq [String ] = getLayerSubset(module).flatMap {
64+ final def shouldIncludeFile (
65+ module : RawModule ,
66+ allLayers : Seq [Layer ]
67+ ): PartialFunction [File , Boolean ] = {
68+ val layerFilenames : Seq [String ] = getLayerSubset(allLayers).flatMap {
5369 case layer =>
5470 layer.config.abi match {
5571 case abi : chisel3.layer.ABI .FileInclude .type =>
56- Some (abi.toFilename(layer, module.wrapped. circuitName))
72+ Some (abi.toFilename(layer, module.circuitName))
5773 case _ => None
5874 }
5975 }
@@ -64,12 +80,23 @@ object LayerControl {
6480 }
6581 }
6682
83+ /** Return a partial function that will return true if a file should be included
84+ * in the build to enable a layer. This partial function is not defined if
85+ * the file is not a layer file.
86+ *
87+ * @param module an elaborated Chisel module
88+ * @return a partial function to test if layer files should be included
89+ */
90+ final def shouldIncludeFile (
91+ module : ElaboratedModule [_ <: RawModule ]
92+ ): PartialFunction [File , Boolean ] = shouldIncludeFile(module.wrapped, module.layers)
93+
6794 }
6895
6996 /** Enable all layers */
7097 final case object EnableAll extends Type {
7198
72- override protected def getLayerSubset (module : ElaboratedModule [_ ]): Seq [Layer ] = module. layers
99+ override protected def getLayerSubset (layers : Seq [ Layer ]): Seq [Layer ] = layers
73100 }
74101
75102 /** Enable only the specified layers
@@ -89,12 +116,12 @@ object LayerControl {
89116 }
90117 }
91118
92- override protected def getLayerSubset (module : ElaboratedModule [_ ]): Seq [Layer ] = {
93- val definedLayers = module.layers
119+ override protected def getLayerSubset (allLayers : Seq [ Layer ]): Seq [Layer ] = {
120+ val layerSet = allLayers.toSet
94121 layers.foreach { layer =>
95122 require(
96- definedLayers .contains(layer),
97- s """ cannot enable layer ' ${layer.fullName}' as it is not one of the defined layers: ${definedLayers .map(
123+ layerSet .contains(layer),
124+ s """ cannot enable layer ' ${layer.fullName}' as it is not one of the defined layers: ${allLayers .map(
98125 _.fullName
99126 )}"""
100127 )
0 commit comments