diff options
| author | Schuyler Eldridge | 2019-12-17 18:29:47 -0500 |
|---|---|---|
| committer | Schuyler Eldridge | 2020-03-11 14:01:31 -0400 |
| commit | abf226471249a1cbb8de33d0c4bc8526f9aafa70 (patch) | |
| tree | 0537dff3091db3da167c0fffc3388a5966c46204 /src/main/scala/firrtl/transforms | |
| parent | 646c91e71b8bfb1b0d0f22e81ca113147637ce71 (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')
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(_)) |
