// // SPDX-License-Identifier: Apache-2.0 // package chisel3.aop // import chisel3.RawModule // import firrtl.options.{OptionsException, RegisteredLibrary, ShellOption} // /** Enables adding aspects to a design from the commandline, e.g. // * sbt> runMain chisel3.stage.ChiselMain --module --with-aspect // */ // final class AspectLibrary() extends RegisteredLibrary { // val name = "AspectLibrary" // import scala.reflect.runtime.universe._ // private def apply(aspectName: String): Aspect[RawModule] = { // try { // // If a regular class, instantiate, otherwise try as a singleton object // try { // val x = Class.forName(aspectName).asInstanceOf[Class[_ <: Aspect[RawModule]]] // x.newInstance() // } catch { // case e: InstantiationException => // val rm = runtimeMirror(getClass.getClassLoader) // val x = rm.staticModule(aspectName) // try { // rm.reflectModule(x).instance.asInstanceOf[Aspect[RawModule]] // } catch { // case _: Exception => throw e // } // } // } catch { // case e: ClassNotFoundException => // throw new OptionsException(s"Unable to locate aspect '$aspectName'! (Did you misspell it?)", e) // case e: InstantiationException => // throw new OptionsException( // s"Unable to create instance of aspect '$aspectName'! (Does this class take parameters?)", // e // ) // } // } // val options = Seq( // new ShellOption[String]( // longOption = "with-aspect", // toAnnotationSeq = { // case aspectName: String => Seq(apply(aspectName)) // }, // helpText = "The name/class of an aspect to compile with (must be a class/object without arguments!)", // helpValueName = Some(".") // ) // ) // }