aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/transforms
diff options
context:
space:
mode:
authorSchuyler Eldridge2019-12-17 18:29:47 -0500
committerSchuyler Eldridge2020-03-11 14:01:31 -0400
commitabf226471249a1cbb8de33d0c4bc8526f9aafa70 (patch)
tree0537dff3091db3da167c0fffc3388a5966c46204 /src/main/scala/firrtl/transforms
parent646c91e71b8bfb1b0d0f22e81ca113147637ce71 (diff)
Migrate to DependencyAPI
Co-authored-by: Schuyler Eldridge <schuyler.eldridge@ibm.com> Co-authored-by: Albert Magyar <albert.magyar@gmail.com> Signed-off-by: Schuyler Eldridge <schuyler.eldridge@ibm.com>
Diffstat (limited to 'src/main/scala/firrtl/transforms')
-rw-r--r--src/main/scala/firrtl/transforms/BlackBoxSourceHelper.scala9
-rw-r--r--src/main/scala/firrtl/transforms/CheckCombLoops.scala14
-rw-r--r--src/main/scala/firrtl/transforms/CombineCats.scala17
-rw-r--r--src/main/scala/firrtl/transforms/ConstantPropagation.scala20
-rw-r--r--src/main/scala/firrtl/transforms/DeadCodeElimination.scala28
-rw-r--r--src/main/scala/firrtl/transforms/Dedup.scala8
-rw-r--r--src/main/scala/firrtl/transforms/FixAddingNegativeLiteralsTransform.scala16
-rw-r--r--src/main/scala/firrtl/transforms/FlattenRegUpdate.scala22
-rw-r--r--src/main/scala/firrtl/transforms/GroupComponents.scala1
-rw-r--r--src/main/scala/firrtl/transforms/InferResets.scala18
-rw-r--r--src/main/scala/firrtl/transforms/InlineBitExtractions.scala12
-rw-r--r--src/main/scala/firrtl/transforms/InlineCasts.scala17
-rw-r--r--src/main/scala/firrtl/transforms/LegalizeClocks.scala18
-rw-r--r--src/main/scala/firrtl/transforms/RemoveKeywordCollisions.scala24
-rw-r--r--src/main/scala/firrtl/transforms/RemoveReset.scala20
-rw-r--r--src/main/scala/firrtl/transforms/RemoveWires.scala14
-rw-r--r--src/main/scala/firrtl/transforms/ReplaceTruncatingArithmetic.scala15
17 files changed, 237 insertions, 36 deletions
diff --git a/src/main/scala/firrtl/transforms/BlackBoxSourceHelper.scala b/src/main/scala/firrtl/transforms/BlackBoxSourceHelper.scala
index b62cf7a1..07cf09b0 100644
--- a/src/main/scala/firrtl/transforms/BlackBoxSourceHelper.scala
+++ b/src/main/scala/firrtl/transforms/BlackBoxSourceHelper.scala
@@ -6,6 +6,7 @@ import java.io.{File, FileNotFoundException, FileInputStream, FileOutputStream,
import firrtl._
import firrtl.annotations._
+import firrtl.options.PreservesAll
import scala.collection.immutable.ListSet
@@ -54,12 +55,18 @@ class BlackBoxNotFoundException(fileName: String, message: String) extends Firrt
* will set the directory where the Verilog will be written. This annotation is typically be
* set by the execution harness, or directly in the tests
*/
-class BlackBoxSourceHelper extends firrtl.Transform {
+class BlackBoxSourceHelper extends firrtl.Transform with PreservesAll[Transform] {
import BlackBoxSourceHelper._
private val DefaultTargetDir = new File(".")
override def inputForm: CircuitForm = LowForm
override def outputForm: CircuitForm = LowForm
+ override val prerequisites = firrtl.stage.Forms.LowFormMinimumOptimized
+
+ override val optionalPrerequisites = firrtl.stage.Forms.LowFormOptimized
+
+ override val dependents = Seq.empty
+
/** Collect BlackBoxHelperAnnos and and find the target dir if specified
* @param annos a list of generic annotations for this transform
* @return BlackBoxHelperAnnos and target directory
diff --git a/src/main/scala/firrtl/transforms/CheckCombLoops.scala b/src/main/scala/firrtl/transforms/CheckCombLoops.scala
index bb5d88e7..b7ba5c5e 100644
--- a/src/main/scala/firrtl/transforms/CheckCombLoops.scala
+++ b/src/main/scala/firrtl/transforms/CheckCombLoops.scala
@@ -4,7 +4,6 @@ package firrtl.transforms
import scala.collection.mutable
-
import firrtl._
import firrtl.ir._
import firrtl.passes.{Errors, PassException}
@@ -13,7 +12,7 @@ import firrtl.annotations._
import firrtl.Utils.throwInternalError
import firrtl.graph._
import firrtl.analyses.InstanceGraph
-import firrtl.options.{RegisteredTransform, ShellOption}
+import firrtl.options.{Dependency, PreservesAll, RegisteredTransform, ShellOption}
/*
* A case class that represents a net in the circuit. This is
@@ -95,10 +94,19 @@ case class CombinationalPath(sink: ReferenceTarget, sources: Seq[ReferenceTarget
* @note The pass relies on ExtModulePathAnnotations to find loops through ExtModules
* @note The pass will throw exceptions on "false paths"
*/
-class CheckCombLoops extends Transform with RegisteredTransform {
+class CheckCombLoops extends Transform with RegisteredTransform with PreservesAll[Transform] {
def inputForm = LowForm
def outputForm = LowForm
+ override val prerequisites = firrtl.stage.Forms.MidForm ++
+ Seq( Dependency(passes.LowerTypes),
+ Dependency(passes.Legalize),
+ Dependency(firrtl.transforms.RemoveReset) )
+
+ override val optionalPrerequisites = Seq.empty
+
+ override val dependents = Seq.empty
+
import CheckCombLoops._
val options = Seq(
diff --git a/src/main/scala/firrtl/transforms/CombineCats.scala b/src/main/scala/firrtl/transforms/CombineCats.scala
index ac8fc5fb..8f5972e1 100644
--- a/src/main/scala/firrtl/transforms/CombineCats.scala
+++ b/src/main/scala/firrtl/transforms/CombineCats.scala
@@ -7,6 +7,8 @@ import firrtl.Mappers._
import firrtl.PrimOps._
import firrtl.WrappedExpression._
import firrtl.annotations.NoTargetAnnotation
+import firrtl.options.PreservesAll
+import firrtl.options.Dependency
import scala.collection.mutable
@@ -51,9 +53,22 @@ object CombineCats {
* Use [[MaxCatLenAnnotation]] to limit the number of elements that can be concatenated.
* The default maximum number of elements is 10.
*/
-class CombineCats extends Transform {
+class CombineCats extends Transform with PreservesAll[Transform] {
def inputForm: LowForm.type = LowForm
def outputForm: LowForm.type = LowForm
+
+ override val prerequisites = firrtl.stage.Forms.LowForm ++
+ Seq( Dependency(passes.RemoveValidIf),
+ Dependency[firrtl.transforms.ConstantPropagation],
+ Dependency(firrtl.passes.memlib.VerilogMemDelays),
+ Dependency(firrtl.passes.SplitExpressions) )
+
+ override val optionalPrerequisites = Seq.empty
+
+ override val dependents = Seq(
+ Dependency[SystemVerilogEmitter],
+ Dependency[VerilogEmitter] )
+
val defaultMaxCatLen = 10
def execute(state: CircuitState): CircuitState = {
diff --git a/src/main/scala/firrtl/transforms/ConstantPropagation.scala b/src/main/scala/firrtl/transforms/ConstantPropagation.scala
index 55c897b3..c11bc44d 100644
--- a/src/main/scala/firrtl/transforms/ConstantPropagation.scala
+++ b/src/main/scala/firrtl/transforms/ConstantPropagation.scala
@@ -13,6 +13,7 @@ import firrtl.PrimOps._
import firrtl.graph.DiGraph
import firrtl.analyses.InstanceGraph
import firrtl.annotations.TargetToken.Ref
+import firrtl.options.Dependency
import annotation.tailrec
import collection.mutable
@@ -102,6 +103,25 @@ class ConstantPropagation extends Transform with ResolvedAnnotationPaths {
def inputForm = LowForm
def outputForm = LowForm
+ override val prerequisites =
+ ((new mutable.LinkedHashSet())
+ ++ firrtl.stage.Forms.LowForm
+ - Dependency(firrtl.passes.Legalize)
+ + Dependency(firrtl.passes.RemoveValidIf)).toSeq
+
+ override val optionalPrerequisites = Seq.empty
+
+ override val dependents =
+ Seq( Dependency(firrtl.passes.memlib.VerilogMemDelays),
+ Dependency(firrtl.passes.SplitExpressions),
+ Dependency[SystemVerilogEmitter],
+ Dependency[VerilogEmitter] )
+
+ override def invalidates(a: Transform): Boolean = a match {
+ case firrtl.passes.Legalize => true
+ case _ => false
+ }
+
override val annotationClasses: Traversable[Class[_]] = Seq(classOf[DontTouchAnnotation])
sealed trait SimplifyBinaryOp {
diff --git a/src/main/scala/firrtl/transforms/DeadCodeElimination.scala b/src/main/scala/firrtl/transforms/DeadCodeElimination.scala
index 983f1048..04f1c7d2 100644
--- a/src/main/scala/firrtl/transforms/DeadCodeElimination.scala
+++ b/src/main/scala/firrtl/transforms/DeadCodeElimination.scala
@@ -10,7 +10,7 @@ import firrtl.analyses.InstanceGraph
import firrtl.Mappers._
import firrtl.Utils.{throwInternalError, kind}
import firrtl.MemoizedHash._
-import firrtl.options.{RegisteredTransform, ShellOption}
+import firrtl.options.{Dependency, PreservesAll, RegisteredTransform, ShellOption}
import collection.mutable
@@ -29,9 +29,29 @@ import collection.mutable
* circumstances of their instantiation in their parent module, they will still not be removed. To
* remove such modules, use the [[NoDedupAnnotation]] to prevent deduplication.
*/
-class DeadCodeElimination extends Transform with ResolvedAnnotationPaths with RegisteredTransform {
- def inputForm = LowForm
- def outputForm = LowForm
+class DeadCodeElimination extends Transform with ResolvedAnnotationPaths with RegisteredTransform
+ with PreservesAll[Transform] {
+ def inputForm = UnknownForm
+ def outputForm = UnknownForm
+
+ override val prerequisites = firrtl.stage.Forms.LowForm ++
+ Seq( Dependency(firrtl.passes.RemoveValidIf),
+ Dependency[firrtl.transforms.ConstantPropagation],
+ Dependency(firrtl.passes.memlib.VerilogMemDelays),
+ Dependency(firrtl.passes.SplitExpressions),
+ Dependency[firrtl.transforms.CombineCats],
+ Dependency(passes.CommonSubexpressionElimination) )
+
+ override val optionalPrerequisites = Seq.empty
+
+ override val dependents =
+ Seq( Dependency[firrtl.transforms.BlackBoxSourceHelper],
+ Dependency[firrtl.transforms.ReplaceTruncatingArithmetic],
+ Dependency[firrtl.transforms.FlattenRegUpdate],
+ Dependency(passes.VerilogModulusCleanup),
+ Dependency[firrtl.transforms.VerilogRename],
+ Dependency(passes.VerilogPrep),
+ Dependency[firrtl.AddDescriptionNodes] )
val options = Seq(
new ShellOption[Unit](
diff --git a/src/main/scala/firrtl/transforms/Dedup.scala b/src/main/scala/firrtl/transforms/Dedup.scala
index 0667a184..5caa9228 100644
--- a/src/main/scala/firrtl/transforms/Dedup.scala
+++ b/src/main/scala/firrtl/transforms/Dedup.scala
@@ -9,7 +9,7 @@ import firrtl.analyses.InstanceGraph
import firrtl.annotations._
import firrtl.passes.{InferTypes, MemPortUtils}
import firrtl.Utils.throwInternalError
-import firrtl.options.{HasShellOptions, ShellOption}
+import firrtl.options.{HasShellOptions, PreservesAll, ShellOption}
// Datastructures
import scala.collection.mutable
@@ -39,10 +39,14 @@ case object NoCircuitDedupAnnotation extends NoTargetAnnotation with HasShellOpt
* Specifically, the restriction of instance loops must have been checked, or else this pass can
* infinitely recurse
*/
-class DedupModules extends Transform {
+class DedupModules extends Transform with PreservesAll[Transform] {
def inputForm: CircuitForm = HighForm
def outputForm: CircuitForm = HighForm
+ override val prerequisites = firrtl.stage.Forms.Resolved
+
+ override val dependents = Seq.empty
+
/** Deduplicate a Circuit
* @param state Input Firrtl AST
* @return A transformed Firrtl AST
diff --git a/src/main/scala/firrtl/transforms/FixAddingNegativeLiteralsTransform.scala b/src/main/scala/firrtl/transforms/FixAddingNegativeLiteralsTransform.scala
index 08bf4af4..59d14ab2 100644
--- a/src/main/scala/firrtl/transforms/FixAddingNegativeLiteralsTransform.scala
+++ b/src/main/scala/firrtl/transforms/FixAddingNegativeLiteralsTransform.scala
@@ -2,10 +2,12 @@
package firrtl.transforms
-import firrtl.{CircuitState, LowForm, Namespace, PrimOps, Transform, Utils, WRef}
+import firrtl.{CircuitState, Namespace, PrimOps, Transform, UnknownForm, Utils, WRef}
import firrtl.ir._
import firrtl.Mappers._
+import firrtl.options.{Dependency, PreservesAll}
import firrtl.PrimOps.{Add, AsSInt, Sub, Tail}
+import firrtl.stage.Forms
import scala.collection.mutable
@@ -105,9 +107,15 @@ object FixAddingNegativeLiterals {
* the literal and thus not all expressions in the add are the same. This is fixed here when we directly
* subtract the literal instead.
*/
-class FixAddingNegativeLiterals extends Transform {
- def inputForm = LowForm
- def outputForm = LowForm
+class FixAddingNegativeLiterals extends Transform with PreservesAll[Transform] {
+ def inputForm = UnknownForm
+ def outputForm = UnknownForm
+
+ override val prerequisites = Forms.LowFormMinimumOptimized :+ Dependency[BlackBoxSourceHelper]
+
+ override val optionalPrerequisites = firrtl.stage.Forms.LowFormOptimized
+
+ override val dependents = Seq.empty
def execute(state: CircuitState): CircuitState = {
val modulesx = state.circuit.modules.map(FixAddingNegativeLiterals.fixupModule)
diff --git a/src/main/scala/firrtl/transforms/FlattenRegUpdate.scala b/src/main/scala/firrtl/transforms/FlattenRegUpdate.scala
index 2d04dc89..eadbb0cb 100644
--- a/src/main/scala/firrtl/transforms/FlattenRegUpdate.scala
+++ b/src/main/scala/firrtl/transforms/FlattenRegUpdate.scala
@@ -6,6 +6,7 @@ package transforms
import firrtl.ir._
import firrtl.Mappers._
import firrtl.Utils._
+import firrtl.options.Dependency
import scala.collection.mutable
@@ -105,8 +106,25 @@ object FlattenRegUpdate {
*/
// TODO Preserve source locators
class FlattenRegUpdate extends Transform {
- def inputForm = MidForm
- def outputForm = MidForm
+ def inputForm = UnknownForm
+ def outputForm = UnknownForm
+
+ override val prerequisites = firrtl.stage.Forms.LowFormMinimumOptimized ++
+ Seq( Dependency[BlackBoxSourceHelper],
+ Dependency[FixAddingNegativeLiterals],
+ Dependency[ReplaceTruncatingArithmetic],
+ Dependency[InlineBitExtractionsTransform],
+ Dependency[InlineCastsTransform],
+ Dependency[LegalizeClocksTransform] )
+
+ override val optionalPrerequisites = firrtl.stage.Forms.LowFormOptimized
+
+ override val dependents = Seq.empty
+
+ override def invalidates(a: Transform): Boolean = a match {
+ case _: DeadCodeElimination => true
+ case _ => false
+ }
def execute(state: CircuitState): CircuitState = {
val modulesx = state.circuit.modules.map {
diff --git a/src/main/scala/firrtl/transforms/GroupComponents.scala b/src/main/scala/firrtl/transforms/GroupComponents.scala
index c617e685..9e3d639d 100644
--- a/src/main/scala/firrtl/transforms/GroupComponents.scala
+++ b/src/main/scala/firrtl/transforms/GroupComponents.scala
@@ -61,6 +61,7 @@ class GroupComponents extends firrtl.Transform {
case other => Seq(other)
}
val cs = state.copy(circuit = state.circuit.copy(modules = newModules))
+ /* @todo move ResolveKinds and InferTypes out */
val csx = ResolveKinds.execute(InferTypes.execute(cs))
csx
}
diff --git a/src/main/scala/firrtl/transforms/InferResets.scala b/src/main/scala/firrtl/transforms/InferResets.scala
index 026b15fc..72724b27 100644
--- a/src/main/scala/firrtl/transforms/InferResets.scala
+++ b/src/main/scala/firrtl/transforms/InferResets.scala
@@ -8,6 +8,7 @@ import firrtl.Mappers._
import firrtl.traversals.Foreachers._
import firrtl.annotations.{ReferenceTarget, TargetToken}
import firrtl.Utils.{toTarget, throwInternalError}
+import firrtl.options.Dependency
import firrtl.passes.{Pass, PassException, InferTypes}
import firrtl.graph.MutableDiGraph
@@ -110,8 +111,21 @@ object InferResets {
*/
// TODO should we error if a DefMemory is of type AsyncReset? In CheckTypes?
class InferResets extends Transform {
- def inputForm: CircuitForm = HighForm
- def outputForm: CircuitForm = HighForm
+
+ def inputForm: CircuitForm = UnknownForm
+ def outputForm: CircuitForm = UnknownForm
+
+ override val prerequisites =
+ Seq( Dependency(passes.ResolveKinds),
+ Dependency(passes.InferTypes),
+ Dependency(passes.Uniquify),
+ Dependency(passes.ResolveFlows),
+ Dependency[passes.InferWidths] ) ++ stage.Forms.WorkingIR
+
+ override def invalidates(a: Transform): Boolean = a match {
+ case _: checks.CheckResets | passes.CheckTypes => true
+ case _ => false
+ }
import InferResets._
diff --git a/src/main/scala/firrtl/transforms/InlineBitExtractions.scala b/src/main/scala/firrtl/transforms/InlineBitExtractions.scala
index c4f40700..617dff96 100644
--- a/src/main/scala/firrtl/transforms/InlineBitExtractions.scala
+++ b/src/main/scala/firrtl/transforms/InlineBitExtractions.scala
@@ -3,6 +3,7 @@ package transforms
import firrtl.ir._
import firrtl.Mappers._
+import firrtl.options.{Dependency, PreservesAll}
import firrtl.PrimOps.{Bits, Head, Tail, Shr}
import firrtl.Utils.{isBitExtract, isTemp}
import firrtl.WrappedExpression._
@@ -91,10 +92,19 @@ object InlineBitExtractionsTransform {
}
/** Inline nodes that are simple bits */
-class InlineBitExtractionsTransform extends Transform {
+class InlineBitExtractionsTransform extends Transform with PreservesAll[Transform] {
def inputForm = UnknownForm
def outputForm = UnknownForm
+ override val prerequisites = firrtl.stage.Forms.LowFormMinimumOptimized ++
+ Seq( Dependency[BlackBoxSourceHelper],
+ Dependency[FixAddingNegativeLiterals],
+ Dependency[ReplaceTruncatingArithmetic] )
+
+ override val optionalPrerequisites = firrtl.stage.Forms.LowFormOptimized
+
+ override val dependents = Seq.empty
+
def execute(state: CircuitState): CircuitState = {
val modulesx = state.circuit.modules.map(InlineBitExtractionsTransform.onMod(_))
state.copy(circuit = state.circuit.copy(modules = modulesx))
diff --git a/src/main/scala/firrtl/transforms/InlineCasts.scala b/src/main/scala/firrtl/transforms/InlineCasts.scala
index e504eb70..91ba7578 100644
--- a/src/main/scala/firrtl/transforms/InlineCasts.scala
+++ b/src/main/scala/firrtl/transforms/InlineCasts.scala
@@ -3,6 +3,7 @@ package transforms
import firrtl.ir._
import firrtl.Mappers._
+import firrtl.options.{Dependency, PreservesAll}
import firrtl.Utils.{isCast, NodeMap}
@@ -59,9 +60,19 @@ object InlineCastsTransform {
}
/** Inline nodes that are simple casts */
-class InlineCastsTransform extends Transform {
- def inputForm = LowForm
- def outputForm = LowForm
+class InlineCastsTransform extends Transform with PreservesAll[Transform] {
+ def inputForm = UnknownForm
+ def outputForm = UnknownForm
+
+ override val prerequisites = firrtl.stage.Forms.LowFormMinimumOptimized ++
+ Seq( Dependency[BlackBoxSourceHelper],
+ Dependency[FixAddingNegativeLiterals],
+ Dependency[ReplaceTruncatingArithmetic],
+ Dependency[InlineBitExtractionsTransform] )
+
+ override val optionalPrerequisites = firrtl.stage.Forms.LowFormOptimized
+
+ override val dependents = Seq.empty
def execute(state: CircuitState): CircuitState = {
val modulesx = state.circuit.modules.map(InlineCastsTransform.onMod(_))
diff --git a/src/main/scala/firrtl/transforms/LegalizeClocks.scala b/src/main/scala/firrtl/transforms/LegalizeClocks.scala
index 1c2fc045..d87cd735 100644
--- a/src/main/scala/firrtl/transforms/LegalizeClocks.scala
+++ b/src/main/scala/firrtl/transforms/LegalizeClocks.scala
@@ -3,6 +3,7 @@ package transforms
import firrtl.ir._
import firrtl.Mappers._
+import firrtl.options.{Dependency, PreservesAll}
import firrtl.Utils.isCast
// Fixup otherwise legal Verilog that lint tools and other tools don't like
@@ -58,9 +59,20 @@ object LegalizeClocksTransform {
}
/** Ensure Clocks to be emitted are legal Verilog */
-class LegalizeClocksTransform extends Transform {
- def inputForm = LowForm
- def outputForm = LowForm
+class LegalizeClocksTransform extends Transform with PreservesAll[Transform] {
+ def inputForm = UnknownForm
+ def outputForm = UnknownForm
+
+ override val prerequisites = firrtl.stage.Forms.LowFormMinimumOptimized ++
+ Seq( Dependency[BlackBoxSourceHelper],
+ Dependency[FixAddingNegativeLiterals],
+ Dependency[ReplaceTruncatingArithmetic],
+ Dependency[InlineBitExtractionsTransform],
+ Dependency[InlineCastsTransform] )
+
+ override val optionalPrerequisites = firrtl.stage.Forms.LowFormOptimized
+
+ override val dependents = Seq.empty
def execute(state: CircuitState): CircuitState = {
val modulesx = state.circuit.modules.map(LegalizeClocksTransform.onMod(_))
diff --git a/src/main/scala/firrtl/transforms/RemoveKeywordCollisions.scala b/src/main/scala/firrtl/transforms/RemoveKeywordCollisions.scala
index 1f0202d1..fdb0090e 100644
--- a/src/main/scala/firrtl/transforms/RemoveKeywordCollisions.scala
+++ b/src/main/scala/firrtl/transforms/RemoveKeywordCollisions.scala
@@ -10,6 +10,8 @@ import firrtl.ir
import firrtl.passes.{Uniquify, PassException}
import firrtl.Utils.v_keywords
import firrtl.Mappers._
+import firrtl.options.{Dependency, PreservesAll}
+
import scala.collection.mutable
/** Transform that removes collisions with reserved keywords
@@ -19,8 +21,8 @@ import scala.collection.mutable
* @define implicitScope @param scope the enclosing scope of this name. If [[None]], then this is a [[Circuit]] name
*/
class RemoveKeywordCollisions(keywords: Set[String]) extends Transform {
- val inputForm: CircuitForm = LowForm
- val outputForm: CircuitForm = LowForm
+ val inputForm: CircuitForm = UnknownForm
+ val outputForm: CircuitForm = UnknownForm
private type ModuleType = mutable.HashMap[String, ir.Type]
private val inlineDelim = "_"
@@ -231,4 +233,20 @@ class RemoveKeywordCollisions(keywords: Set[String]) extends Transform {
}
/** Transform that removes collisions with Verilog keywords */
-class VerilogRename extends RemoveKeywordCollisions(v_keywords)
+class VerilogRename extends RemoveKeywordCollisions(v_keywords) with PreservesAll[Transform] {
+
+ override val prerequisites = firrtl.stage.Forms.LowFormMinimumOptimized ++
+ Seq( Dependency[BlackBoxSourceHelper],
+ Dependency[FixAddingNegativeLiterals],
+ Dependency[ReplaceTruncatingArithmetic],
+ Dependency[InlineBitExtractionsTransform],
+ Dependency[InlineCastsTransform],
+ Dependency[LegalizeClocksTransform],
+ Dependency[FlattenRegUpdate],
+ Dependency(passes.VerilogModulusCleanup) )
+
+ override val optionalPrerequisites = firrtl.stage.Forms.LowFormOptimized
+
+ override val dependents = Seq.empty
+
+}
diff --git a/src/main/scala/firrtl/transforms/RemoveReset.scala b/src/main/scala/firrtl/transforms/RemoveReset.scala
index ed1baf7d..75d64b76 100644
--- a/src/main/scala/firrtl/transforms/RemoveReset.scala
+++ b/src/main/scala/firrtl/transforms/RemoveReset.scala
@@ -7,6 +7,7 @@ import firrtl.ir._
import firrtl.Mappers._
import firrtl.traversals.Foreachers._
import firrtl.WrappedExpression.we
+import firrtl.options.Dependency
import scala.collection.{immutable, mutable}
@@ -14,9 +15,22 @@ import scala.collection.{immutable, mutable}
*
* @note This pass must run after LowerTypes
*/
-class RemoveReset extends Transform {
- def inputForm = MidForm
- def outputForm = MidForm
+object RemoveReset extends Transform {
+ def inputForm = LowForm
+ def outputForm = LowForm
+
+ override val prerequisites = firrtl.stage.Forms.MidForm ++
+ Seq( Dependency(passes.LowerTypes),
+ Dependency(passes.Legalize) )
+
+ override val optionalPrerequisites = Seq.empty
+
+ override val dependents = Seq.empty
+
+ override def invalidates(a: Transform): Boolean = a match {
+ case firrtl.passes.ResolveFlows => true
+ case _ => false
+ }
private case class Reset(cond: Expression, value: Expression)
diff --git a/src/main/scala/firrtl/transforms/RemoveWires.scala b/src/main/scala/firrtl/transforms/RemoveWires.scala
index 825cdb60..5e6b7910 100644
--- a/src/main/scala/firrtl/transforms/RemoveWires.scala
+++ b/src/main/scala/firrtl/transforms/RemoveWires.scala
@@ -9,6 +9,7 @@ import firrtl.Mappers._
import firrtl.traversals.Foreachers._
import firrtl.WrappedExpression._
import firrtl.graph.{MutableDiGraph, CyclicException}
+import firrtl.options.{Dependency, PreservesAll}
import scala.collection.mutable
import scala.util.{Try, Success, Failure}
@@ -19,10 +20,20 @@ import scala.util.{Try, Success, Failure}
* wires have multiple connections that may be impossible to order in a
* flow-foward way
*/
-class RemoveWires extends Transform {
+class RemoveWires extends Transform with PreservesAll[Transform] {
def inputForm = LowForm
def outputForm = LowForm
+ override val prerequisites = firrtl.stage.Forms.MidForm ++
+ Seq( Dependency(passes.LowerTypes),
+ Dependency(passes.Legalize),
+ Dependency(transforms.RemoveReset),
+ Dependency[transforms.CheckCombLoops] )
+
+ override val optionalPrerequisites = Seq(Dependency[checks.CheckResets])
+
+ override val dependents = Seq.empty
+
// Extract all expressions that are references to a Node, Wire, or Reg
// Since we are operating on LowForm, they can only be WRefs
private def extractNodeWireRegRefs(expr: Expression): Seq[WRef] = {
@@ -140,6 +151,7 @@ class RemoveWires extends Transform {
}
}
+ /* @todo move ResolveKinds outside */
private val cleanup = Seq(
passes.ResolveKinds
)
diff --git a/src/main/scala/firrtl/transforms/ReplaceTruncatingArithmetic.scala b/src/main/scala/firrtl/transforms/ReplaceTruncatingArithmetic.scala
index 8aa1553a..c8129450 100644
--- a/src/main/scala/firrtl/transforms/ReplaceTruncatingArithmetic.scala
+++ b/src/main/scala/firrtl/transforms/ReplaceTruncatingArithmetic.scala
@@ -7,6 +7,7 @@ import firrtl.ir._
import firrtl.Mappers._
import firrtl.PrimOps._
import firrtl.WrappedExpression._
+import firrtl.options.{Dependency, PreservesAll}
import scala.collection.mutable
@@ -76,9 +77,17 @@ object ReplaceTruncatingArithmetic {
* @note This replaces some FIRRTL primops with ops that are not actually legal FIRRTL. They are
* useful for emission to languages that support non-expanding arithmetic (like Verilog)
*/
-class ReplaceTruncatingArithmetic extends Transform {
- def inputForm = LowForm
- def outputForm = LowForm
+class ReplaceTruncatingArithmetic extends Transform with PreservesAll[Transform] {
+ def inputForm = UnknownForm
+ def outputForm = UnknownForm
+
+ override val prerequisites = firrtl.stage.Forms.LowFormMinimumOptimized ++
+ Seq( Dependency[BlackBoxSourceHelper],
+ Dependency[FixAddingNegativeLiterals] )
+
+ override val optionalPrerequisites = firrtl.stage.Forms.LowFormOptimized
+
+ override val dependents = Seq.empty
def execute(state: CircuitState): CircuitState = {
val modulesx = state.circuit.modules.map(ReplaceTruncatingArithmetic.onMod(_))