aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/passes
diff options
context:
space:
mode:
authorSchuyler Eldridge2018-11-07 15:30:17 -0500
committerGitHub2018-11-07 15:30:17 -0500
commit75284395ba7ef285daefd2da38e720590b465ad7 (patch)
tree7ae4e04a16eb87ce306a9d891acabbd4c6b1c8b7 /src/main/scala/firrtl/passes
parent17b4e9835bd95dcf91c5ea5a4d7c52280031ea93 (diff)
parentb05eaea3e59c64d619a544c63311d510f335f7e5 (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')
-rw-r--r--src/main/scala/firrtl/passes/Inline.scala24
-rw-r--r--src/main/scala/firrtl/passes/clocklist/ClockListTransform.scala15
-rw-r--r--src/main/scala/firrtl/passes/memlib/InferReadWrite.scala19
-rw-r--r--src/main/scala/firrtl/passes/memlib/MemLibOptions.scala15
-rw-r--r--src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala19
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),