diff options
| author | Schuyler Eldridge | 2018-11-07 15:30:17 -0500 |
|---|---|---|
| committer | GitHub | 2018-11-07 15:30:17 -0500 |
| commit | 75284395ba7ef285daefd2da38e720590b465ad7 (patch) | |
| tree | 7ae4e04a16eb87ce306a9d891acabbd4c6b1c8b7 /src/main/scala/firrtl/passes | |
| parent | 17b4e9835bd95dcf91c5ea5a4d7c52280031ea93 (diff) | |
| parent | b05eaea3e59c64d619a544c63311d510f335f7e5 (diff) | |
Merge pull request #919 from seldridge/f764.6
- Add, but do not use Options-mirroring Annotations
Diffstat (limited to 'src/main/scala/firrtl/passes')
5 files changed, 84 insertions, 8 deletions
diff --git a/src/main/scala/firrtl/passes/Inline.scala b/src/main/scala/firrtl/passes/Inline.scala index feda80f2..dcee0ee2 100644 --- a/src/main/scala/firrtl/passes/Inline.scala +++ b/src/main/scala/firrtl/passes/Inline.scala @@ -7,6 +7,9 @@ import firrtl.ir._ import firrtl.Mappers._ import firrtl.annotations._ import firrtl.analyses.InstanceGraph +import firrtl.stage.RunFirrtlTransformAnnotation +import firrtl.options.RegisteredTransform +import scopt.OptionParser // Datastructures import scala.collection.mutable @@ -20,11 +23,30 @@ case class InlineAnnotation(target: Named) extends SingleTargetAnnotation[Named] * @note Only use on legal Firrtl. Specifically, the restriction of instance loops must have been checked, or else this * pass can infinitely recurse. */ -class InlineInstances extends Transform { +class InlineInstances extends Transform with RegisteredTransform { def inputForm = LowForm 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""") + private def collectAnns(circuit: Circuit, anns: Iterable[Annotation]): (Set[ModuleName], Set[ComponentName]) = anns.foldLeft(Set.empty[ModuleName], Set.empty[ComponentName]) { case ((modNames, instNames), ann) => ann match { diff --git a/src/main/scala/firrtl/passes/clocklist/ClockListTransform.scala b/src/main/scala/firrtl/passes/clocklist/ClockListTransform.scala index 6c7b2e18..8d70f211 100644 --- a/src/main/scala/firrtl/passes/clocklist/ClockListTransform.scala +++ b/src/main/scala/firrtl/passes/clocklist/ClockListTransform.scala @@ -14,6 +14,9 @@ import Utils._ import memlib.AnalysisUtils._ import memlib._ import Mappers._ +import firrtl.options.RegisteredTransform +import scopt.OptionParser +import firrtl.stage.RunFirrtlTransformAnnotation case class ClockListAnnotation(target: ModuleName, outputConfig: String) extends SingleTargetAnnotation[ModuleName] { @@ -54,9 +57,19 @@ Usage: } } -class ClockListTransform extends Transform { +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") + def passSeq(top: String, writer: Writer): Seq[Pass] = Seq(new ClockList(top, writer)) def execute(state: CircuitState): CircuitState = { diff --git a/src/main/scala/firrtl/passes/memlib/InferReadWrite.scala b/src/main/scala/firrtl/passes/memlib/InferReadWrite.scala index 2d1d7f6b..3494de45 100644 --- a/src/main/scala/firrtl/passes/memlib/InferReadWrite.scala +++ b/src/main/scala/firrtl/passes/memlib/InferReadWrite.scala @@ -8,10 +8,14 @@ import firrtl.ir._ import firrtl.Mappers._ import firrtl.PrimOps._ import firrtl.Utils.{one, zero, BoolType} +import firrtl.options.HasScoptOptions import MemPortUtils.memPortField import firrtl.passes.memlib.AnalysisUtils.{Connects, getConnects, getOrigin} import WrappedExpression.weq import annotations._ +import scopt.OptionParser +import firrtl.stage.RunFirrtlTransformAnnotation + case object InferReadWriteAnnotation extends NoTargetAnnotation @@ -72,10 +76,10 @@ object InferReadWritePass extends Pass { def replaceStmt(repl: Netlist)(s: Statement): Statement = s map replaceStmt(repl) map replaceExp(repl) match { - case Connect(_, EmptyExpression, _) => EmptyStmt + case Connect(_, EmptyExpression, _) => EmptyStmt case sx => sx } - + def inferReadWriteStmt(connects: Connects, repl: Netlist, stmts: Statements) @@ -143,9 +147,18 @@ 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 { +class InferReadWrite extends Transform with SeqTransformBased with HasScoptOptions { def inputForm = MidForm def outputForm = MidForm + + def addOptions(parser: OptionParser[AnnotationSeq]): Unit = parser + .opt[Unit]("infer-rw") + .abbr("firw") + .valueName ("<circuit>") + .action( (_, c) => c ++ Seq(InferReadWriteAnnotation, RunFirrtlTransformAnnotation(new InferReadWrite)) ) + .maxOccurs(1) + .text("Enable readwrite port inference for the target circuit") + def transforms = Seq( InferReadWritePass, CheckInitialization, diff --git a/src/main/scala/firrtl/passes/memlib/MemLibOptions.scala b/src/main/scala/firrtl/passes/memlib/MemLibOptions.scala new file mode 100644 index 00000000..2f26e4e5 --- /dev/null +++ b/src/main/scala/firrtl/passes/memlib/MemLibOptions.scala @@ -0,0 +1,15 @@ +// See LICENSE for license details. + +package firrtl.passes.memlib + +import firrtl._ +import firrtl.options.RegisteredLibrary +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)) +} diff --git a/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala b/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala index 311813db..f2e6cd4e 100644 --- a/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala +++ b/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala @@ -6,10 +6,13 @@ package memlib import firrtl._ import firrtl.ir._ import firrtl.annotations._ +import firrtl.options.HasScoptOptions import AnalysisUtils._ import Utils.error import java.io.{File, CharArrayWriter, PrintWriter} import wiring._ +import scopt.OptionParser +import firrtl.stage.RunFirrtlTransformAnnotation sealed trait PassOption case object InputConfigFileName extends PassOption @@ -19,11 +22,11 @@ case object PassModuleName extends PassOption object PassConfigUtil { type PassOptionMap = Map[PassOption, String] - + def getPassOptions(t: String, usage: String = "") = { // can't use space to delimit sub arguments (otherwise, Driver.scala will throw error) val passArgList = t.split(":").toList - + def nextPassOption(map: PassOptionMap, list: List[String]): PassOptionMap = { list match { case Nil => map @@ -103,9 +106,19 @@ 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 { +class ReplSeqMem extends Transform with HasScoptOptions { 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) => c ++ Seq(passes.memlib.ReplSeqMemAnnotation.parse(x), + RunFirrtlTransformAnnotation(new ReplSeqMem)) ) + .maxOccurs(1) + .text("Replace sequential memories with blackboxes + configuration file") + def transforms(inConfigFile: Option[YamlFileReader], outConfigFile: ConfWriter): Seq[Transform] = Seq(new SimpleMidTransform(Legalize), new SimpleMidTransform(ToMemIR), |
