blob: dd014357a3d0f9b192ea17ea1daf92324d8eac7d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
// SPDX-License-Identifier: Apache-2.0
package chisel3.aop
import chisel3.RawModule
import firrtl.annotations.{Annotation, NoTargetAnnotation}
import firrtl.options.Unserializable
import firrtl.AnnotationSeq
/** Represents an aspect of a Chisel module, by specifying
* what behavior should be done to instance, via the FIRRTL Annotation Mechanism
* @tparam T Type of top-level module
*/
abstract class Aspect[T <: RawModule] extends Annotation with Unserializable with NoTargetAnnotation {
/** variable to save [[AnnotationSeq]] from [[chisel3.stage.phases.AspectPhase]]
* to be used at [[chisel3.aop.injecting.InjectorAspect]], exposes annotations to [[chisel3.internal.DynamicContext]]
*/
private[aop] var annotationsInAspect: AnnotationSeq = Seq()
/** Convert this Aspect to a seq of FIRRTL annotation
* @param top
* @return
*/
def toAnnotation(top: T): AnnotationSeq
/** Called by [[chisel3.stage.phases.AspectPhase]] to resolve this Aspect into annotations
* @param top
* @return
*/
private[chisel3] def resolveAspect(top: RawModule, remainingAnnotations: AnnotationSeq): AnnotationSeq = {
annotationsInAspect = remainingAnnotations
toAnnotation(top.asInstanceOf[T])
}
}
/** Holds utility functions for Aspect stuff */
object Aspect {
/** Converts elaborated Chisel components to FIRRTL modules
* @param chiselIR
* @return
*/
def getFirrtl(chiselIR: chisel3.internal.firrtl.Circuit): firrtl.ir.Circuit = {
chisel3.internal.firrtl.Converter.convert(chiselIR)
}
}
|