aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/options/Shell.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/firrtl/options/Shell.scala')
-rw-r--r--src/main/scala/firrtl/options/Shell.scala48
1 files changed, 35 insertions, 13 deletions
diff --git a/src/main/scala/firrtl/options/Shell.scala b/src/main/scala/firrtl/options/Shell.scala
index 4fb89450..28c0554a 100644
--- a/src/main/scala/firrtl/options/Shell.scala
+++ b/src/main/scala/firrtl/options/Shell.scala
@@ -4,25 +4,22 @@ package firrtl.options
import firrtl.AnnotationSeq
+import logger.{LogLevelAnnotation, ClassLogLevelAnnotation, LogFileAnnotation, LogClassNamesAnnotation}
+
import scopt.OptionParser
import java.util.ServiceLoader
-/** Indicate an error in [[firrtl.options]]
- * @param msg a message to print
- */
-case class OptionsException(msg: String, cause: Throwable = null) extends Exception(msg, cause)
-
/** A utility for working with command line options
* @param applicationName the application associated with these command line options
*/
class Shell(val applicationName: String) {
/** Command line argument parser (OptionParser) with modifications */
- final val parser = new OptionParser[AnnotationSeq](applicationName) with DuplicateHandling
+ protected val parser = new OptionParser[AnnotationSeq](applicationName) with DuplicateHandling with ExceptOnError
/** Contains all discovered [[RegisteredLibrary]] */
- lazy val registeredLibraries: Seq[RegisteredLibrary] = {
+ final lazy val registeredLibraries: Seq[RegisteredLibrary] = {
val libraries = scala.collection.mutable.ArrayBuffer[RegisteredLibrary]()
val iter = ServiceLoader.load(classOf[RegisteredLibrary]).iterator()
while (iter.hasNext) {
@@ -31,19 +28,21 @@ class Shell(val applicationName: String) {
parser.note(lib.name)
lib.addOptions(parser)
}
+
libraries
}
/** Contains all discovered [[RegisteredTransform]] */
- lazy val registeredTransforms: Seq[RegisteredTransform] = {
+ final lazy val registeredTransforms: Seq[RegisteredTransform] = {
val transforms = scala.collection.mutable.ArrayBuffer[RegisteredTransform]()
val iter = ServiceLoader.load(classOf[RegisteredTransform]).iterator()
- parser.note("FIRRTL Transform Options")
+ if (iter.hasNext) { parser.note("FIRRTL Transform Options") }
while (iter.hasNext) {
val tx = iter.next()
transforms += tx
tx.addOptions(parser)
}
+
transforms
}
@@ -56,12 +55,35 @@ class Shell(val applicationName: String) {
registeredTransforms
registeredLibraries
parser
- .parse(args, initAnnos)
+ .parse(args, initAnnos.reverse)
.getOrElse(throw new OptionsException("Failed to parse command line options", new IllegalArgumentException))
+ .reverse
}
parser.note("Shell Options")
- Seq( InputAnnotationFileAnnotation(),
- TargetDirAnnotation() )
- .map(_.addOptions(parser))
+ ProgramArgsAnnotation.addOptions(parser)
+ Seq( TargetDirAnnotation,
+ InputAnnotationFileAnnotation,
+ OutputAnnotationFileAnnotation )
+ .foreach(_.addOptions(parser))
+
+ parser.opt[Unit]("show-registrations")
+ .action{ (_, c) =>
+ val rtString = registeredTransforms.map(r => s"\n - ${r.getClass.getName}").mkString
+ val rlString = registeredLibraries.map(l => s"\n - ${l.getClass.getName}").mkString
+
+ println(s"""|The following FIRRTL transforms registered command line options:$rtString
+ |The following libraries registered command line options:$rlString""".stripMargin)
+ c }
+ .unbounded()
+ .text("print discovered registered libraries and transforms")
+
+ parser.help("help").text("prints this usage text")
+
+ parser.note("Logging Options")
+ Seq( LogLevelAnnotation,
+ ClassLogLevelAnnotation,
+ LogFileAnnotation,
+ LogClassNamesAnnotation )
+ .foreach(_.addOptions(parser))
}