aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/passes
diff options
context:
space:
mode:
authorSchuyler Eldridge2019-04-22 21:20:08 -0400
committerSchuyler Eldridge2019-04-25 16:24:15 -0400
commitef8f06f23b9ee6cf86de2450752dfd0fcd32da80 (patch)
tree79e2e8c5753903ca6d14e9b952c26a07442bd980 /src/main/scala/firrtl/passes
parent47fe781c4ace38dff7f31da7e78f772e131d689e (diff)
Add ShellOption, DeletedWrapper
Abstracts away option writing such that users no longer have to understand scopt semantics. This adds a ShellOption class and a HasShellOptions trait for something which provides one or more ShellOptions. This refactors the FIRRTL codebase to use this style of option specification. Adds and uses DeletedWrapper to automatically generate DeletedAnnotations. Signed-off-by: Schuyler Eldridge <schuyler.eldridge@ibm.com>
Diffstat (limited to 'src/main/scala/firrtl/passes')
-rw-r--r--src/main/scala/firrtl/passes/Inline.scala36
-rw-r--r--src/main/scala/firrtl/passes/clocklist/ClockListTransform.scala18
-rw-r--r--src/main/scala/firrtl/passes/memlib/InferReadWrite.scala17
-rw-r--r--src/main/scala/firrtl/passes/memlib/MemLibOptions.scala11
-rw-r--r--src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala20
5 files changed, 50 insertions, 52 deletions
diff --git a/src/main/scala/firrtl/passes/Inline.scala b/src/main/scala/firrtl/passes/Inline.scala
index dcee0ee2..0806563c 100644
--- a/src/main/scala/firrtl/passes/Inline.scala
+++ b/src/main/scala/firrtl/passes/Inline.scala
@@ -8,7 +8,7 @@ import firrtl.Mappers._
import firrtl.annotations._
import firrtl.analyses.InstanceGraph
import firrtl.stage.RunFirrtlTransformAnnotation
-import firrtl.options.RegisteredTransform
+import firrtl.options.{RegisteredTransform, ShellOption}
import scopt.OptionParser
// Datastructures
@@ -28,24 +28,22 @@ class InlineInstances extends Transform with RegisteredTransform {
def outputForm = LowForm
private [firrtl] val inlineDelim: String = "_"
- def addOptions(parser: OptionParser[AnnotationSeq]): Unit = parser
- .opt[Seq[String]]("inline")
- .abbr("fil")
- .valueName ("<circuit>[.<module>[.<instance>]][,..],")
- .action( (x, c) => {
- val newAnnotations = x.map { value =>
- value.split('.') match {
- case Array(circuit) =>
- InlineAnnotation(CircuitName(circuit))
- case Array(circuit, module) =>
- InlineAnnotation(ModuleName(module, CircuitName(circuit)))
- case Array(circuit, module, inst) =>
- InlineAnnotation(ComponentName(inst, ModuleName(module, CircuitName(circuit))))
- }
- }
- c ++ newAnnotations :+ RunFirrtlTransformAnnotation(new InlineInstances) } )
- .text(
- """Inline one or more module (comma separated, no spaces) module looks like "MyModule" or "MyModule.myinstance""")
+ val options = Seq(
+ new ShellOption[Seq[String]](
+ longOption = "inline",
+ toAnnotationSeq = (a: Seq[String]) => a.map { value =>
+ value.split('.') match {
+ case Array(circuit) =>
+ InlineAnnotation(CircuitName(circuit))
+ case Array(circuit, module) =>
+ InlineAnnotation(ModuleName(module, CircuitName(circuit)))
+ case Array(circuit, module, inst) =>
+ InlineAnnotation(ComponentName(inst, ModuleName(module, CircuitName(circuit))))
+ }
+ } :+ RunFirrtlTransformAnnotation(new InlineInstances),
+ helpText = "Inline selected modules",
+ shortOption = Some("fil"),
+ helpValueName = Some("<circuit>[.<module>[.<instance>]][,...]") ) )
private def collectAnns(circuit: Circuit, anns: Iterable[Annotation]): (Set[ModuleName], Set[ComponentName]) =
anns.foldLeft(Set.empty[ModuleName], Set.empty[ComponentName]) {
diff --git a/src/main/scala/firrtl/passes/clocklist/ClockListTransform.scala b/src/main/scala/firrtl/passes/clocklist/ClockListTransform.scala
index de9f6c52..f95787bd 100644
--- a/src/main/scala/firrtl/passes/clocklist/ClockListTransform.scala
+++ b/src/main/scala/firrtl/passes/clocklist/ClockListTransform.scala
@@ -13,7 +13,7 @@ import ClockListUtils._
import Utils._
import memlib.AnalysisUtils._
import memlib._
-import firrtl.options.RegisteredTransform
+import firrtl.options.{RegisteredTransform, ShellOption}
import scopt.OptionParser
import firrtl.stage.RunFirrtlTransformAnnotation
@@ -60,14 +60,14 @@ class ClockListTransform extends Transform with RegisteredTransform {
def inputForm = LowForm
def outputForm = LowForm
- def addOptions(parser: OptionParser[AnnotationSeq]): Unit = parser
- .opt[String]("list-clocks")
- .abbr("clks")
- .valueName ("-c:<circuit>:-m:<module>:-o:<filename>")
- .action( (x, c) => c ++ Seq(passes.clocklist.ClockListAnnotation.parse(x),
- RunFirrtlTransformAnnotation(new ClockListTransform)) )
- .maxOccurs(1)
- .text("List which signal drives each clock of every descendent of specified module")
+ val options = Seq(
+ new ShellOption[String](
+ longOption = "list-clocks",
+ toAnnotationSeq = (a: String) => Seq( passes.clocklist.ClockListAnnotation.parse(a),
+ RunFirrtlTransformAnnotation(new ClockListTransform) ),
+ helpText = "List which signal drives each clock of every descendent of specified modules",
+ shortOption = Some("clks"),
+ helpValueName = Some("-c:<circuit>:-m:<module>:-o:<filename>") ) )
def passSeq(top: String, writer: Writer): Seq[Pass] =
Seq(new ClockList(top, writer))
diff --git a/src/main/scala/firrtl/passes/memlib/InferReadWrite.scala b/src/main/scala/firrtl/passes/memlib/InferReadWrite.scala
index f524d60b..0602e4f1 100644
--- a/src/main/scala/firrtl/passes/memlib/InferReadWrite.scala
+++ b/src/main/scala/firrtl/passes/memlib/InferReadWrite.scala
@@ -8,7 +8,7 @@ import firrtl.ir._
import firrtl.Mappers._
import firrtl.PrimOps._
import firrtl.Utils.{one, zero, BoolType}
-import firrtl.options.HasScoptOptions
+import firrtl.options.{HasShellOptions, ShellOption}
import MemPortUtils.memPortField
import firrtl.passes.memlib.AnalysisUtils.{Connects, getConnects, getOrigin}
import WrappedExpression.weq
@@ -147,17 +147,16 @@ object InferReadWritePass extends Pass {
// Transform input: Middle Firrtl. Called after "HighFirrtlToMidleFirrtl"
// To use this transform, circuit name should be annotated with its TransId.
-class InferReadWrite extends Transform with SeqTransformBased with HasScoptOptions {
+class InferReadWrite extends Transform with SeqTransformBased with HasShellOptions {
def inputForm = MidForm
def outputForm = MidForm
- def addOptions(parser: OptionParser[AnnotationSeq]): Unit = parser
- .opt[Unit]("infer-rw")
- .abbr("firw")
- .valueName ("<circuit>")
- .action( (_, c) => Seq(InferReadWriteAnnotation, RunFirrtlTransformAnnotation(new InferReadWrite)) ++ c )
- .maxOccurs(1)
- .text("Enable readwrite port inference for the target circuit")
+ val options = Seq(
+ new ShellOption[Unit](
+ longOption = "infer-rw",
+ toAnnotationSeq = (_: Unit) => Seq(InferReadWriteAnnotation, RunFirrtlTransformAnnotation(new InferReadWrite)),
+ helpText = "Enable read/write port inference for memories",
+ shortOption = Some("firw") ) )
def transforms = Seq(
InferReadWritePass,
diff --git a/src/main/scala/firrtl/passes/memlib/MemLibOptions.scala b/src/main/scala/firrtl/passes/memlib/MemLibOptions.scala
index 2f26e4e5..4076d5d6 100644
--- a/src/main/scala/firrtl/passes/memlib/MemLibOptions.scala
+++ b/src/main/scala/firrtl/passes/memlib/MemLibOptions.scala
@@ -3,13 +3,14 @@
package firrtl.passes.memlib
import firrtl._
-import firrtl.options.RegisteredLibrary
+import firrtl.options.{RegisteredLibrary, ShellOption}
import scopt.OptionParser
class MemLibOptions extends RegisteredLibrary {
val name: String = "MemLib Options"
- def addOptions(p: OptionParser[AnnotationSeq]): Unit =
- Seq( new InferReadWrite,
- new ReplSeqMem )
- .map(_.addOptions(p))
+
+ val options: Seq[ShellOption[_]] = Seq( new InferReadWrite,
+ new ReplSeqMem )
+ .flatMap(_.options)
+
}
diff --git a/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala b/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala
index 32d83181..a9d0cc7c 100644
--- a/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala
+++ b/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala
@@ -6,7 +6,7 @@ package memlib
import firrtl._
import firrtl.ir._
import firrtl.annotations._
-import firrtl.options.HasScoptOptions
+import firrtl.options.{HasShellOptions, ShellOption}
import AnalysisUtils._
import Utils.error
import java.io.{File, CharArrayWriter, PrintWriter}
@@ -102,18 +102,18 @@ class SimpleTransform(p: Pass, form: CircuitForm) extends Transform {
class SimpleMidTransform(p: Pass) extends SimpleTransform(p, MidForm)
// SimpleRun instead of PassBased because of the arguments to passSeq
-class ReplSeqMem extends Transform with HasScoptOptions {
+class ReplSeqMem extends Transform with HasShellOptions {
def inputForm = MidForm
def outputForm = MidForm
- def addOptions(parser: OptionParser[AnnotationSeq]): Unit = parser
- .opt[String]("repl-seq-mem")
- .abbr("frsq")
- .valueName ("-c:<circuit>:-i:<filename>:-o:<filename>")
- .action( (x, c) => Seq(passes.memlib.ReplSeqMemAnnotation.parse(x),
- RunFirrtlTransformAnnotation(new ReplSeqMem)) ++ c )
- .maxOccurs(1)
- .text("Replace sequential memories with blackboxes + configuration file")
+ val options = Seq(
+ new ShellOption[String](
+ longOption = "repl-seq-mem",
+ toAnnotationSeq = (a: String) => Seq( passes.memlib.ReplSeqMemAnnotation.parse(a),
+ RunFirrtlTransformAnnotation(new ReplSeqMem) ),
+ helpText = "Blackbox and emit a configuration file for each sequential memory",
+ shortOption = Some("frsq"),
+ helpValueName = Some("-c:<circuit>:-i:<file>:-o:<file>") ) )
def transforms(inConfigFile: Option[YamlFileReader], outConfigFile: ConfWriter): Seq[Transform] =
Seq(new SimpleMidTransform(Legalize),