diff options
| author | Adam Izraelevitz | 2019-08-12 15:49:42 -0700 |
|---|---|---|
| committer | GitHub | 2019-08-12 15:49:42 -0700 |
| commit | fddb5943b1d36925a5435d327c3312572e98ca58 (patch) | |
| tree | b22e3a544dbb265dead955544c75bf7abddb7c69 /chiselFrontend/src/main/scala/chisel3/aop | |
| parent | 466ffbc9ca4fcca73d56f849df9e2753f68c53a8 (diff) | |
Aspect-Oriented Programming for Chisel (#1077)
Added Aspects to Chisel, enabling a mechanism for dependency injection to hardware modules.
Diffstat (limited to 'chiselFrontend/src/main/scala/chisel3/aop')
| -rw-r--r-- | chiselFrontend/src/main/scala/chisel3/aop/Aspect.scala | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/aop/Aspect.scala b/chiselFrontend/src/main/scala/chisel3/aop/Aspect.scala new file mode 100644 index 00000000..86f5b347 --- /dev/null +++ b/chiselFrontend/src/main/scala/chisel3/aop/Aspect.scala @@ -0,0 +1,40 @@ +// See LICENSE for license details. + +package chisel3.aop + +import chisel3.experimental.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 { + /** 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): AnnotationSeq = { + 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) + } +} |
