diff options
| author | Schuyler Eldridge | 2020-04-21 22:41:23 -0400 |
|---|---|---|
| committer | Schuyler Eldridge | 2020-04-22 18:46:31 -0400 |
| commit | 39d76a02785f4391b67abd3b7d7720d287736312 (patch) | |
| tree | e820790206a46a315e0b2d5634c5a8c9825931a2 /src/main/scala/firrtl/passes | |
| parent | 1bf80040825e96ce04c15374304c144b9d48e902 (diff) | |
Mixin DependencyAPIMigration to all Transforms
This mixes in the new DependencyAPIMigration trait into all Transforms
and Passes. This enables in-tree transforms/passes to build without
deprecation warnings associated with the deprecated CircuitForm.
As a consequence of this, every Transform now has UnknownForm as both
its inputForm and outputForm. This PR modifies legacy Compiler and
testing infrastructure to schedule transforms NOT using
mergeTransforms/getLoweringTransforms (which rely on inputForm and
outputForm not being UnknownForm), but instead using the Dependency
API.
Signed-off-by: Schuyler Eldridge <schuyler.eldridge@ibm.com>
Diffstat (limited to 'src/main/scala/firrtl/passes')
43 files changed, 152 insertions, 127 deletions
diff --git a/src/main/scala/firrtl/passes/CInferMDir.scala b/src/main/scala/firrtl/passes/CInferMDir.scala index 33587741..f12d073d 100644 --- a/src/main/scala/firrtl/passes/CInferMDir.scala +++ b/src/main/scala/firrtl/passes/CInferMDir.scala @@ -10,7 +10,7 @@ import Utils.throwInternalError object CInferMDir extends Pass with PreservesAll[Transform] { - override val prerequisites = firrtl.stage.Forms.ChirrtlForm :+ Dependency(CInferTypes) + override def prerequisites = firrtl.stage.Forms.ChirrtlForm :+ Dependency(CInferTypes) type MPortDirMap = collection.mutable.LinkedHashMap[String, MPortDir] diff --git a/src/main/scala/firrtl/passes/CheckFlows.scala b/src/main/scala/firrtl/passes/CheckFlows.scala index 37749f5f..bd637ff0 100644 --- a/src/main/scala/firrtl/passes/CheckFlows.scala +++ b/src/main/scala/firrtl/passes/CheckFlows.scala @@ -10,9 +10,9 @@ import firrtl.options.{Dependency, PreservesAll} object CheckFlows extends Pass with PreservesAll[Transform] { - override val prerequisites = Dependency(passes.ResolveFlows) +: firrtl.stage.Forms.WorkingIR + override def prerequisites = Dependency(passes.ResolveFlows) +: firrtl.stage.Forms.WorkingIR - override val dependents = + override def dependents = Seq( Dependency[passes.InferBinaryPoints], Dependency[passes.TrimIntervals], Dependency[passes.InferWidths], @@ -118,4 +118,3 @@ object CheckFlows extends Pass with PreservesAll[Transform] { c } } - diff --git a/src/main/scala/firrtl/passes/CheckHighForm.scala b/src/main/scala/firrtl/passes/CheckHighForm.scala index 462367fe..51b9c6f0 100644 --- a/src/main/scala/firrtl/passes/CheckHighForm.scala +++ b/src/main/scala/firrtl/passes/CheckHighForm.scala @@ -283,9 +283,9 @@ trait CheckHighFormLike { this: Pass => object CheckHighForm extends Pass with CheckHighFormLike with PreservesAll[Transform] { - override val prerequisites = firrtl.stage.Forms.WorkingIR + override def prerequisites = firrtl.stage.Forms.WorkingIR - override val dependents = + override def dependents = Seq( Dependency(passes.ResolveKinds), Dependency(passes.InferTypes), Dependency(passes.Uniquify), diff --git a/src/main/scala/firrtl/passes/CheckInitialization.scala b/src/main/scala/firrtl/passes/CheckInitialization.scala index 63790564..fe0ff450 100644 --- a/src/main/scala/firrtl/passes/CheckInitialization.scala +++ b/src/main/scala/firrtl/passes/CheckInitialization.scala @@ -17,7 +17,7 @@ import annotation.tailrec */ object CheckInitialization extends Pass with PreservesAll[Transform] { - override val prerequisites = firrtl.stage.Forms.Resolved + override def prerequisites = firrtl.stage.Forms.Resolved private case class VoidExpr(stmt: Statement, voidDeps: Seq[Expression]) diff --git a/src/main/scala/firrtl/passes/CheckTypes.scala b/src/main/scala/firrtl/passes/CheckTypes.scala index 1e127fa2..eecc692e 100644 --- a/src/main/scala/firrtl/passes/CheckTypes.scala +++ b/src/main/scala/firrtl/passes/CheckTypes.scala @@ -13,9 +13,9 @@ import firrtl.options.{Dependency, PreservesAll} object CheckTypes extends Pass with PreservesAll[Transform] { - override val prerequisites = Dependency(InferTypes) +: firrtl.stage.Forms.WorkingIR + override def prerequisites = Dependency(InferTypes) +: firrtl.stage.Forms.WorkingIR - override val dependents = + override def dependents = Seq( Dependency(passes.Uniquify), Dependency(passes.ResolveFlows), Dependency(passes.CheckFlows), diff --git a/src/main/scala/firrtl/passes/CheckWidths.scala b/src/main/scala/firrtl/passes/CheckWidths.scala index 1be7b34e..6761bc7d 100644 --- a/src/main/scala/firrtl/passes/CheckWidths.scala +++ b/src/main/scala/firrtl/passes/CheckWidths.scala @@ -13,9 +13,9 @@ import firrtl.options.{Dependency, PreservesAll} object CheckWidths extends Pass with PreservesAll[Transform] { - override val prerequisites = Dependency[passes.InferWidths] +: firrtl.stage.Forms.WorkingIR + override def prerequisites = Dependency[passes.InferWidths] +: firrtl.stage.Forms.WorkingIR - override val dependents = Seq(Dependency[transforms.InferResets]) + override def dependents = Seq(Dependency[transforms.InferResets]) /** The maximum allowed width for any circuit element */ val MaxWidth = 1000000 diff --git a/src/main/scala/firrtl/passes/CommonSubexpressionElimination.scala b/src/main/scala/firrtl/passes/CommonSubexpressionElimination.scala index d54d8088..100b3187 100644 --- a/src/main/scala/firrtl/passes/CommonSubexpressionElimination.scala +++ b/src/main/scala/firrtl/passes/CommonSubexpressionElimination.scala @@ -9,14 +9,14 @@ import firrtl.options.{Dependency, PreservesAll} object CommonSubexpressionElimination extends Pass with PreservesAll[Transform] { - override val prerequisites = firrtl.stage.Forms.LowForm ++ + override def 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] ) - override val dependents = + override def dependents = Seq( Dependency[SystemVerilogEmitter], Dependency[VerilogEmitter] ) diff --git a/src/main/scala/firrtl/passes/ConvertFixedToSInt.scala b/src/main/scala/firrtl/passes/ConvertFixedToSInt.scala index 7e65bdd1..5b9cc70b 100644 --- a/src/main/scala/firrtl/passes/ConvertFixedToSInt.scala +++ b/src/main/scala/firrtl/passes/ConvertFixedToSInt.scala @@ -14,7 +14,7 @@ import firrtl.options.{Dependency, PreservesAll} */ object ConvertFixedToSInt extends Pass with PreservesAll[Transform] { - override val prerequisites = + override def prerequisites = Seq( Dependency(PullMuxes), Dependency(ReplaceAccesses), Dependency(ExpandConnects), diff --git a/src/main/scala/firrtl/passes/ExpandConnects.scala b/src/main/scala/firrtl/passes/ExpandConnects.scala index 250c9ce0..f80c705c 100644 --- a/src/main/scala/firrtl/passes/ExpandConnects.scala +++ b/src/main/scala/firrtl/passes/ExpandConnects.scala @@ -8,7 +8,7 @@ import firrtl.Mappers._ object ExpandConnects extends Pass with PreservesAll[Transform] { - override val prerequisites = + override def prerequisites = Seq( Dependency(PullMuxes), Dependency(ReplaceAccesses) ) ++ firrtl.stage.Forms.Deduped diff --git a/src/main/scala/firrtl/passes/ExpandWhens.scala b/src/main/scala/firrtl/passes/ExpandWhens.scala index aaf3d9b4..f84309d0 100644 --- a/src/main/scala/firrtl/passes/ExpandWhens.scala +++ b/src/main/scala/firrtl/passes/ExpandWhens.scala @@ -26,7 +26,7 @@ import collection.mutable */ object ExpandWhens extends Pass { - override val prerequisites = + override def prerequisites = Seq( Dependency(PullMuxes), Dependency(ReplaceAccesses), Dependency(ExpandConnects), @@ -302,9 +302,9 @@ object ExpandWhens extends Pass { DoPrim(Eq, Seq(e, zero), Nil, BoolType) } -class ExpandWhensAndCheck extends SeqTransform { +class ExpandWhensAndCheck extends Transform with DependencyAPIMigration { - override val prerequisites = + override def prerequisites = Seq( Dependency(PullMuxes), Dependency(ReplaceAccesses), Dependency(ExpandConnects), @@ -316,9 +316,7 @@ class ExpandWhensAndCheck extends SeqTransform { case _ => false } - override def inputForm = UnknownForm - override def outputForm = UnknownForm - - override val transforms = Seq(ExpandWhens, CheckInitialization) + override def execute(a: CircuitState): CircuitState = + Seq(ExpandWhens, CheckInitialization).foldLeft(a){ case (acc, tx) => tx.transform(acc) } } diff --git a/src/main/scala/firrtl/passes/InferBinaryPoints.scala b/src/main/scala/firrtl/passes/InferBinaryPoints.scala index 86bc36fc..ab08926c 100644 --- a/src/main/scala/firrtl/passes/InferBinaryPoints.scala +++ b/src/main/scala/firrtl/passes/InferBinaryPoints.scala @@ -12,13 +12,13 @@ import firrtl.options.{Dependency, PreservesAll} class InferBinaryPoints extends Pass with PreservesAll[Transform] { - override val prerequisites = + override def prerequisites = Seq( Dependency(ResolveKinds), Dependency(InferTypes), Dependency(Uniquify), Dependency(ResolveFlows) ) - override val dependents = Seq.empty + override def dependents = Seq.empty private val constraintSolver = new ConstraintSolver() diff --git a/src/main/scala/firrtl/passes/InferTypes.scala b/src/main/scala/firrtl/passes/InferTypes.scala index d625b626..78213f49 100644 --- a/src/main/scala/firrtl/passes/InferTypes.scala +++ b/src/main/scala/firrtl/passes/InferTypes.scala @@ -10,7 +10,7 @@ import firrtl.options.{Dependency, PreservesAll} object InferTypes extends Pass with PreservesAll[Transform] { - override val prerequisites = Dependency(ResolveKinds) +: firrtl.stage.Forms.WorkingIR + override def prerequisites = Dependency(ResolveKinds) +: firrtl.stage.Forms.WorkingIR type TypeMap = collection.mutable.LinkedHashMap[String, Type] @@ -90,7 +90,7 @@ object InferTypes extends Pass with PreservesAll[Transform] { object CInferTypes extends Pass with PreservesAll[Transform] { - override val prerequisites = firrtl.stage.Forms.ChirrtlForm + override def prerequisites = firrtl.stage.Forms.ChirrtlForm type TypeMap = collection.mutable.LinkedHashMap[String, Type] diff --git a/src/main/scala/firrtl/passes/InferWidths.scala b/src/main/scala/firrtl/passes/InferWidths.scala index 1e9657cf..3bee4515 100644 --- a/src/main/scala/firrtl/passes/InferWidths.scala +++ b/src/main/scala/firrtl/passes/InferWidths.scala @@ -60,9 +60,12 @@ case class WidthGeqConstraintAnnotation(loc: ReferenceTarget, exp: ReferenceTarg * * Uses firrtl.constraint package to infer widths */ -class InferWidths extends Transform with ResolvedAnnotationPaths with PreservesAll[Transform] { +class InferWidths extends Transform + with ResolvedAnnotationPaths + with DependencyAPIMigration + with PreservesAll[Transform] { - override val prerequisites = + override def prerequisites = Seq( Dependency(passes.ResolveKinds), Dependency(passes.InferTypes), Dependency(passes.Uniquify), @@ -70,9 +73,6 @@ class InferWidths extends Transform with ResolvedAnnotationPaths with PreservesA Dependency[passes.InferBinaryPoints], Dependency[passes.TrimIntervals] ) ++ firrtl.stage.Forms.WorkingIR - def inputForm: CircuitForm = UnknownForm - def outputForm: CircuitForm = UnknownForm - private val constraintSolver = new ConstraintSolver() val annotationClasses = Seq(classOf[WidthGeqConstraintAnnotation]) diff --git a/src/main/scala/firrtl/passes/Inline.scala b/src/main/scala/firrtl/passes/Inline.scala index 9ddbe92e..047703da 100644 --- a/src/main/scala/firrtl/passes/Inline.scala +++ b/src/main/scala/firrtl/passes/Inline.scala @@ -9,7 +9,7 @@ import firrtl.annotations._ import firrtl.annotations.TargetToken.{Instance, OfModule} import firrtl.analyses.{InstanceGraph} import firrtl.graph.{DiGraph, MutableDiGraph} -import firrtl.stage.RunFirrtlTransformAnnotation +import firrtl.stage.{Forms, RunFirrtlTransformAnnotation} import firrtl.options.{RegisteredTransform, ShellOption} // Datastructures @@ -24,13 +24,16 @@ 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 with RegisteredTransform { - def inputForm = LowForm - def outputForm = LowForm - private [firrtl] val inlineDelim: String = "_" +class InlineInstances extends Transform with DependencyAPIMigration with RegisteredTransform { + + override def prerequisites = Forms.LowForm + override def optionalPrerequisites = Seq.empty + override def dependents = Forms.LowEmitters override def invalidates(a: Transform): Boolean = a == ResolveKinds + private [firrtl] val inlineDelim: String = "_" + val options = Seq( new ShellOption[Seq[String]]( longOption = "inline", diff --git a/src/main/scala/firrtl/passes/Legalize.scala b/src/main/scala/firrtl/passes/Legalize.scala index 37556769..6f0e23f1 100644 --- a/src/main/scala/firrtl/passes/Legalize.scala +++ b/src/main/scala/firrtl/passes/Legalize.scala @@ -12,11 +12,11 @@ import firrtl.Mappers._ // TODO replace UInt with zero-width wire instead object Legalize extends Pass with PreservesAll[Transform] { - override val prerequisites = firrtl.stage.Forms.MidForm :+ Dependency(LowerTypes) + override def prerequisites = firrtl.stage.Forms.MidForm :+ Dependency(LowerTypes) - override val optionalPrerequisites = Seq.empty + override def optionalPrerequisites = Seq.empty - override val dependents = Seq.empty + override def dependents = Seq.empty private def legalizeShiftRight(e: DoPrim): Expression = { require(e.op == Shr) diff --git a/src/main/scala/firrtl/passes/LowerTypes.scala b/src/main/scala/firrtl/passes/LowerTypes.scala index 73ef8a22..8168b665 100644 --- a/src/main/scala/firrtl/passes/LowerTypes.scala +++ b/src/main/scala/firrtl/passes/LowerTypes.scala @@ -22,13 +22,11 @@ import firrtl.Mappers._ * wire foo_b : UInt<16> * }}} */ -object LowerTypes extends Transform { - def inputForm = UnknownForm - def outputForm = UnknownForm +object LowerTypes extends Transform with DependencyAPIMigration { - override val prerequisites = firrtl.stage.Forms.MidForm + override def prerequisites = firrtl.stage.Forms.MidForm - override val dependents = Seq.empty + override def dependents = Seq.empty override def invalidates(a: Transform): Boolean = a match { case ResolveKinds | InferTypes | ResolveFlows | _: InferWidths => true diff --git a/src/main/scala/firrtl/passes/PadWidths.scala b/src/main/scala/firrtl/passes/PadWidths.scala index 163b2270..22dde436 100644 --- a/src/main/scala/firrtl/passes/PadWidths.scala +++ b/src/main/scala/firrtl/passes/PadWidths.scala @@ -13,15 +13,15 @@ import scala.collection.mutable // Makes all implicit width extensions and truncations explicit object PadWidths extends Pass { - override val prerequisites = + override def prerequisites = ((new mutable.LinkedHashSet()) ++ firrtl.stage.Forms.LowForm - Dependency(firrtl.passes.Legalize) + Dependency(firrtl.passes.RemoveValidIf)).toSeq - override val optionalPrerequisites = Seq(Dependency[firrtl.transforms.ConstantPropagation]) + override def optionalPrerequisites = Seq(Dependency[firrtl.transforms.ConstantPropagation]) - override val dependents = + override def dependents = Seq( Dependency(firrtl.passes.memlib.VerilogMemDelays), Dependency[SystemVerilogEmitter], Dependency[VerilogEmitter] ) diff --git a/src/main/scala/firrtl/passes/Pass.scala b/src/main/scala/firrtl/passes/Pass.scala index 4673a8e1..4b7a34bf 100644 --- a/src/main/scala/firrtl/passes/Pass.scala +++ b/src/main/scala/firrtl/passes/Pass.scala @@ -1,26 +1,15 @@ package firrtl.passes -import firrtl.Utils.error +import firrtl.DependencyAPIMigration import firrtl.ir.Circuit -import firrtl.{CircuitForm, CircuitState, FirrtlUserException, Transform, UnknownForm} +import firrtl.{CircuitState, FirrtlUserException, Transform} /** [[Pass]] is simple transform that is generally part of a larger [[Transform]] * Has an [[UnknownForm]], because larger [[Transform]] should specify form */ -trait Pass extends Transform { - def inputForm: CircuitForm = UnknownForm - def outputForm: CircuitForm = UnknownForm +trait Pass extends Transform with DependencyAPIMigration { def run(c: Circuit): Circuit - def execute(state: CircuitState): CircuitState = { - val result = (state.form, inputForm) match { - case (_, UnknownForm) => run(state.circuit) - case (UnknownForm, _) => run(state.circuit) - case (x, y) if x > y => - error(s"[$name]: Input form must be lower or equal to $inputForm. Got ${state.form}") - case _ => run(state.circuit) - } - CircuitState(result, outputForm, state.annotations, state.renames) - } + def execute(state: CircuitState): CircuitState = state.copy(circuit = run(state.circuit)) } // Error handling diff --git a/src/main/scala/firrtl/passes/PullMuxes.scala b/src/main/scala/firrtl/passes/PullMuxes.scala index 8befd9fa..768b1cb9 100644 --- a/src/main/scala/firrtl/passes/PullMuxes.scala +++ b/src/main/scala/firrtl/passes/PullMuxes.scala @@ -7,7 +7,7 @@ import firrtl.{Transform, WSubAccess, WSubField, WSubIndex} object PullMuxes extends Pass with PreservesAll[Transform] { - override val prerequisites = firrtl.stage.Forms.Deduped + override def prerequisites = firrtl.stage.Forms.Deduped def run(c: Circuit): Circuit = { def pull_muxes_e(e: Expression): Expression = e map pull_muxes_e match { diff --git a/src/main/scala/firrtl/passes/RemoveAccesses.scala b/src/main/scala/firrtl/passes/RemoveAccesses.scala index 5c6dfc3f..176312d5 100644 --- a/src/main/scala/firrtl/passes/RemoveAccesses.scala +++ b/src/main/scala/firrtl/passes/RemoveAccesses.scala @@ -16,7 +16,7 @@ import scala.collection.mutable */ object RemoveAccesses extends Pass { - override val prerequisites = + override def prerequisites = Seq( Dependency(PullMuxes), Dependency(ZeroLengthVecs), Dependency(ReplaceAccesses), diff --git a/src/main/scala/firrtl/passes/RemoveCHIRRTL.scala b/src/main/scala/firrtl/passes/RemoveCHIRRTL.scala index 05dd8bd9..af9518e9 100644 --- a/src/main/scala/firrtl/passes/RemoveCHIRRTL.scala +++ b/src/main/scala/firrtl/passes/RemoveCHIRRTL.scala @@ -14,14 +14,12 @@ case class MPort(name: String, clk: Expression) case class MPorts(readers: ArrayBuffer[MPort], writers: ArrayBuffer[MPort], readwriters: ArrayBuffer[MPort]) case class DataRef(exp: Expression, male: String, female: String, mask: String, rdwrite: Boolean) -object RemoveCHIRRTL extends Transform with PreservesAll[Transform] { +object RemoveCHIRRTL extends Transform with DependencyAPIMigration with PreservesAll[Transform] { - override val prerequisites = firrtl.stage.Forms.ChirrtlForm ++ + override def prerequisites = firrtl.stage.Forms.ChirrtlForm ++ Seq( Dependency(passes.CInferTypes), Dependency(passes.CInferMDir) ) - def inputForm: CircuitForm = UnknownForm - def outputForm: CircuitForm = UnknownForm val ut = UnknownType type MPortMap = collection.mutable.LinkedHashMap[String, MPorts] type SeqMemSet = collection.mutable.HashSet[String] @@ -274,6 +272,6 @@ object RemoveCHIRRTL extends Transform with PreservesAll[Transform] { val renames = RenameMap() renames.setCircuit(c.main) val result = c copy (modules = c.modules map remove_chirrtl_m(renames)) - CircuitState(result, outputForm, state.annotations, Some(renames)) + state.copy(circuit = result, renames = Some(renames)) } } diff --git a/src/main/scala/firrtl/passes/RemoveEmpty.scala b/src/main/scala/firrtl/passes/RemoveEmpty.scala index 087ddeca..5951b5c0 100644 --- a/src/main/scala/firrtl/passes/RemoveEmpty.scala +++ b/src/main/scala/firrtl/passes/RemoveEmpty.scala @@ -4,8 +4,15 @@ package firrtl package passes import firrtl.ir._ +import firrtl.options.PreservesAll +import firrtl.stage.Forms + +object RemoveEmpty extends Pass with DependencyAPIMigration with PreservesAll[Transform] { + + override def prerequisites = Seq.empty + override def optionalPrerequisites = Forms.LowFormOptimized + override def dependents = Forms.ChirrtlEmitters -object RemoveEmpty extends Pass { private def onModule(m: DefModule): DefModule = { m match { case m: Module => Module(m.info, m.name, m.ports, Utils.squashEmpty(m.body)) diff --git a/src/main/scala/firrtl/passes/RemoveIntervals.scala b/src/main/scala/firrtl/passes/RemoveIntervals.scala index b4114a50..2cf4a3e0 100644 --- a/src/main/scala/firrtl/passes/RemoveIntervals.scala +++ b/src/main/scala/firrtl/passes/RemoveIntervals.scala @@ -38,7 +38,7 @@ class WrapWithRemainder(info: Info, mname: String, wrap: DoPrim) */ class RemoveIntervals extends Pass with PreservesAll[Transform] { - override val prerequisites: Seq[Dependency[Transform]] = + override def prerequisites: Seq[Dependency[Transform]] = Seq( Dependency(PullMuxes), Dependency(ReplaceAccesses), Dependency(ExpandConnects), diff --git a/src/main/scala/firrtl/passes/RemoveValidIf.scala b/src/main/scala/firrtl/passes/RemoveValidIf.scala index 3b5499ac..70a575ad 100644 --- a/src/main/scala/firrtl/passes/RemoveValidIf.scala +++ b/src/main/scala/firrtl/passes/RemoveValidIf.scala @@ -29,9 +29,9 @@ object RemoveValidIf extends Pass { case other => throwInternalError(s"Unexpected type $other") } - override val prerequisites = firrtl.stage.Forms.LowForm + override def prerequisites = firrtl.stage.Forms.LowForm - override val dependents = + override def dependents = Seq( Dependency[SystemVerilogEmitter], Dependency[VerilogEmitter] ) diff --git a/src/main/scala/firrtl/passes/ReplaceAccesses.scala b/src/main/scala/firrtl/passes/ReplaceAccesses.scala index 6992b6b8..5edab1f0 100644 --- a/src/main/scala/firrtl/passes/ReplaceAccesses.scala +++ b/src/main/scala/firrtl/passes/ReplaceAccesses.scala @@ -13,7 +13,7 @@ import firrtl.options.{Dependency, PreservesAll} */ object ReplaceAccesses extends Pass with PreservesAll[Transform] { - override val prerequisites = firrtl.stage.Forms.Deduped :+ Dependency(PullMuxes) + override def prerequisites = firrtl.stage.Forms.Deduped :+ Dependency(PullMuxes) def run(c: Circuit): Circuit = { def onStmt(s: Statement): Statement = s map onStmt map onExp diff --git a/src/main/scala/firrtl/passes/ResolveFlows.scala b/src/main/scala/firrtl/passes/ResolveFlows.scala index 8f413082..aacbf27c 100644 --- a/src/main/scala/firrtl/passes/ResolveFlows.scala +++ b/src/main/scala/firrtl/passes/ResolveFlows.scala @@ -9,7 +9,7 @@ import firrtl.options.{Dependency, PreservesAll} object ResolveFlows extends Pass with PreservesAll[Transform] { - override val prerequisites = + override def prerequisites = Seq( Dependency(passes.ResolveKinds), Dependency(passes.InferTypes), Dependency(passes.Uniquify) ) ++ firrtl.stage.Forms.WorkingIR diff --git a/src/main/scala/firrtl/passes/ResolveKinds.scala b/src/main/scala/firrtl/passes/ResolveKinds.scala index fb36ccd5..73c8646a 100644 --- a/src/main/scala/firrtl/passes/ResolveKinds.scala +++ b/src/main/scala/firrtl/passes/ResolveKinds.scala @@ -9,7 +9,7 @@ import firrtl.options.PreservesAll object ResolveKinds extends Pass with PreservesAll[Transform] { - override val prerequisites = firrtl.stage.Forms.WorkingIR + override def prerequisites = firrtl.stage.Forms.WorkingIR type KindMap = collection.mutable.LinkedHashMap[String, Kind] diff --git a/src/main/scala/firrtl/passes/SplitExpressions.scala b/src/main/scala/firrtl/passes/SplitExpressions.scala index 43d0ed34..808f9f0d 100644 --- a/src/main/scala/firrtl/passes/SplitExpressions.scala +++ b/src/main/scala/firrtl/passes/SplitExpressions.scala @@ -16,11 +16,11 @@ import scala.collection.mutable // and named intermediate nodes object SplitExpressions extends Pass with PreservesAll[Transform] { - override val prerequisites = firrtl.stage.Forms.LowForm ++ + override def prerequisites = firrtl.stage.Forms.LowForm ++ Seq( Dependency(firrtl.passes.RemoveValidIf), Dependency(firrtl.passes.memlib.VerilogMemDelays) ) - override val dependents = + override def dependents = Seq( Dependency[SystemVerilogEmitter], Dependency[VerilogEmitter] ) diff --git a/src/main/scala/firrtl/passes/ToWorkingIR.scala b/src/main/scala/firrtl/passes/ToWorkingIR.scala index 109654ee..53936c18 100644 --- a/src/main/scala/firrtl/passes/ToWorkingIR.scala +++ b/src/main/scala/firrtl/passes/ToWorkingIR.scala @@ -8,7 +8,7 @@ import firrtl.{Transform, UnknownFlow, UnknownKind, WDefInstance, WRef, WSubAcce // These should be distributed into separate files object ToWorkingIR extends Pass with PreservesAll[Transform] { - override val prerequisites = firrtl.stage.Forms.MinimalHighForm + override def prerequisites = firrtl.stage.Forms.MinimalHighForm def toExp(e: Expression): Expression = e map toExp match { case ex: Reference => WRef(ex.name, ex.tpe, UnknownKind, UnknownFlow) diff --git a/src/main/scala/firrtl/passes/TrimIntervals.scala b/src/main/scala/firrtl/passes/TrimIntervals.scala index 4e558e2a..65a43787 100644 --- a/src/main/scala/firrtl/passes/TrimIntervals.scala +++ b/src/main/scala/firrtl/passes/TrimIntervals.scala @@ -22,14 +22,14 @@ import firrtl.Transform */ class TrimIntervals extends Pass with PreservesAll[Transform] { - override val prerequisites = + override def prerequisites = Seq( Dependency(ResolveKinds), Dependency(InferTypes), Dependency(Uniquify), Dependency(ResolveFlows), Dependency[InferBinaryPoints] ) - override val dependents = Seq.empty + override def dependents = Seq.empty def run(c: Circuit): Circuit = { // Open -> closed diff --git a/src/main/scala/firrtl/passes/Uniquify.scala b/src/main/scala/firrtl/passes/Uniquify.scala index 1268cac2..89a99780 100644 --- a/src/main/scala/firrtl/passes/Uniquify.scala +++ b/src/main/scala/firrtl/passes/Uniquify.scala @@ -32,9 +32,9 @@ import MemPortUtils.memType * there WOULD be collisions in references a[0] and a_0 so we still have * to rename a */ -object Uniquify extends Transform { +object Uniquify extends Transform with DependencyAPIMigration { - override val prerequisites = + override def prerequisites = Seq( Dependency(ResolveKinds), Dependency(InferTypes) ) ++ firrtl.stage.Forms.WorkingIR @@ -43,8 +43,6 @@ object Uniquify extends Transform { case _ => false } - def inputForm = UnknownForm - def outputForm = UnknownForm private case class UniquifyException(msg: String) extends FirrtlInternalException(msg) private def error(msg: String)(implicit sinfo: Info, mname: String) = throw new UniquifyException(s"$sinfo: [moduleOpt $mname] $msg") @@ -392,6 +390,6 @@ object Uniquify extends Transform { sinfo = c.info val result = Circuit(c.info, c.modules map uniquifyPorts(renames) map uniquifyModule(renames), c.main) - CircuitState(result, outputForm, state.annotations, Some(renames)) + state.copy(circuit = result, renames = Some(renames)) } } diff --git a/src/main/scala/firrtl/passes/VerilogModulusCleanup.scala b/src/main/scala/firrtl/passes/VerilogModulusCleanup.scala index f47ddfbd..f063fccf 100644 --- a/src/main/scala/firrtl/passes/VerilogModulusCleanup.scala +++ b/src/main/scala/firrtl/passes/VerilogModulusCleanup.scala @@ -26,7 +26,7 @@ import scala.collection.mutable */ object VerilogModulusCleanup extends Pass with PreservesAll[Transform] { - override val prerequisites = firrtl.stage.Forms.LowFormMinimumOptimized ++ + override def prerequisites = firrtl.stage.Forms.LowFormMinimumOptimized ++ Seq( Dependency[firrtl.transforms.BlackBoxSourceHelper], Dependency[firrtl.transforms.FixAddingNegativeLiterals], Dependency[firrtl.transforms.ReplaceTruncatingArithmetic], @@ -35,9 +35,9 @@ object VerilogModulusCleanup extends Pass with PreservesAll[Transform] { Dependency[firrtl.transforms.LegalizeClocksTransform], Dependency[firrtl.transforms.FlattenRegUpdate] ) - override val optionalPrerequisites = firrtl.stage.Forms.LowFormOptimized + override def optionalPrerequisites = firrtl.stage.Forms.LowFormOptimized - override val dependents = Seq.empty + override def dependents = Seq.empty private def onModule(m: Module): Module = { val namespace = Namespace(m) diff --git a/src/main/scala/firrtl/passes/VerilogPrep.scala b/src/main/scala/firrtl/passes/VerilogPrep.scala index 776c0f5f..6733e9d5 100644 --- a/src/main/scala/firrtl/passes/VerilogPrep.scala +++ b/src/main/scala/firrtl/passes/VerilogPrep.scala @@ -20,7 +20,7 @@ import scala.collection.mutable */ object VerilogPrep extends Pass with PreservesAll[Transform] { - override val prerequisites = firrtl.stage.Forms.LowFormMinimumOptimized ++ + override def prerequisites = firrtl.stage.Forms.LowFormMinimumOptimized ++ Seq( Dependency[firrtl.transforms.BlackBoxSourceHelper], Dependency[firrtl.transforms.FixAddingNegativeLiterals], Dependency[firrtl.transforms.ReplaceTruncatingArithmetic], @@ -31,9 +31,9 @@ object VerilogPrep extends Pass with PreservesAll[Transform] { Dependency(passes.VerilogModulusCleanup), Dependency[firrtl.transforms.VerilogRename] ) - override val optionalPrerequisites = firrtl.stage.Forms.LowFormOptimized + override def optionalPrerequisites = firrtl.stage.Forms.LowFormOptimized - override val dependents = Seq.empty + override def dependents = Seq.empty type AttachSourceMap = Map[WrappedExpression, Expression] diff --git a/src/main/scala/firrtl/passes/ZeroLengthVecs.scala b/src/main/scala/firrtl/passes/ZeroLengthVecs.scala index 67d9bce4..14fcd387 100644 --- a/src/main/scala/firrtl/passes/ZeroLengthVecs.scala +++ b/src/main/scala/firrtl/passes/ZeroLengthVecs.scala @@ -16,7 +16,7 @@ import firrtl.options.{Dependency, PreservesAll} * @note Replaces "source" references to elements of zero-length vectors with always-invalid validif */ object ZeroLengthVecs extends Pass with PreservesAll[Transform] { - override val prerequisites = + override def prerequisites = Seq( Dependency(PullMuxes), Dependency(ResolveKinds), Dependency(InferTypes), diff --git a/src/main/scala/firrtl/passes/ZeroWidth.scala b/src/main/scala/firrtl/passes/ZeroWidth.scala index e60d76d1..4f7e2369 100644 --- a/src/main/scala/firrtl/passes/ZeroWidth.scala +++ b/src/main/scala/firrtl/passes/ZeroWidth.scala @@ -8,9 +8,9 @@ import firrtl._ import firrtl.Mappers._ import firrtl.options.Dependency -object ZeroWidth extends Transform { +object ZeroWidth extends Transform with DependencyAPIMigration { - override val prerequisites = + override def prerequisites = Seq( Dependency(PullMuxes), Dependency(ReplaceAccesses), Dependency(ExpandConnects), @@ -24,9 +24,6 @@ object ZeroWidth extends Transform { case _ => false } - def inputForm: CircuitForm = UnknownForm - def outputForm: CircuitForm = UnknownForm - private def makeEmptyMemBundle(name: String): Field = Field(name, Flip, BundleType(Seq( Field("addr", Default, UIntType(IntWidth(0))), diff --git a/src/main/scala/firrtl/passes/clocklist/ClockListTransform.scala b/src/main/scala/firrtl/passes/clocklist/ClockListTransform.scala index 26003954..b097d748 100644 --- a/src/main/scala/firrtl/passes/clocklist/ClockListTransform.scala +++ b/src/main/scala/firrtl/passes/clocklist/ClockListTransform.scala @@ -10,7 +10,7 @@ import java.io.{PrintWriter, Writer} import Utils._ import memlib._ import firrtl.options.{RegisteredTransform, ShellOption} -import firrtl.stage.RunFirrtlTransformAnnotation +import firrtl.stage.{Forms, RunFirrtlTransformAnnotation} case class ClockListAnnotation(target: ModuleName, outputConfig: String) extends SingleTargetAnnotation[ModuleName] { @@ -51,9 +51,11 @@ Usage: } } -class ClockListTransform extends Transform with RegisteredTransform { - def inputForm = LowForm - def outputForm = LowForm +class ClockListTransform extends Transform with DependencyAPIMigration with RegisteredTransform { + + override def prerequisites = Forms.LowForm + override def optionalPrerequisites = Seq.empty + override def dependents = Forms.LowEmitters val options = Seq( new ShellOption[String]( diff --git a/src/main/scala/firrtl/passes/memlib/DecorateMems.scala b/src/main/scala/firrtl/passes/memlib/DecorateMems.scala index 412098fd..48e8041a 100644 --- a/src/main/scala/firrtl/passes/memlib/DecorateMems.scala +++ b/src/main/scala/firrtl/passes/memlib/DecorateMems.scala @@ -4,9 +4,17 @@ package firrtl package passes package memlib -class CreateMemoryAnnotations(reader: Option[YamlFileReader]) extends Transform { - def inputForm = MidForm - def outputForm = MidForm +import firrtl.options.PreservesAll +import firrtl.stage.Forms + +class CreateMemoryAnnotations(reader: Option[YamlFileReader]) extends Transform + with DependencyAPIMigration + with PreservesAll[Transform] { + + override def prerequisites = Forms.MidForm + override def optionalPrerequisites = Seq.empty + override def dependents = Forms.MidEmitters + def execute(state: CircuitState): CircuitState = reader match { case None => state case Some(r) => diff --git a/src/main/scala/firrtl/passes/memlib/InferReadWrite.scala b/src/main/scala/firrtl/passes/memlib/InferReadWrite.scala index 1e88a9b0..0de2f46d 100644 --- a/src/main/scala/firrtl/passes/memlib/InferReadWrite.scala +++ b/src/main/scala/firrtl/passes/memlib/InferReadWrite.scala @@ -8,12 +8,12 @@ import firrtl.ir._ import firrtl.Mappers._ import firrtl.PrimOps._ import firrtl.Utils.{one, zero, BoolType} -import firrtl.options.{HasShellOptions, ShellOption} +import firrtl.options.{HasShellOptions, PreservesAll, ShellOption} import MemPortUtils.memPortField import firrtl.passes.memlib.AnalysisUtils.{Connects, getConnects, getOrigin} import WrappedExpression.weq import annotations._ -import firrtl.stage.RunFirrtlTransformAnnotation +import firrtl.stage.{Forms, RunFirrtlTransformAnnotation} case object InferReadWriteAnnotation extends NoTargetAnnotation @@ -144,9 +144,15 @@ 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 HasShellOptions { - def inputForm = MidForm - def outputForm = MidForm +class InferReadWrite extends Transform + with DependencyAPIMigration + with PreservesAll[Transform] + with SeqTransformBased + with HasShellOptions { + + override def prerequisites = Forms.MidForm + override def optionalPrerequisites = Seq.empty + override def dependents = Forms.MidEmitters val options = Seq( new ShellOption[Unit]( @@ -166,7 +172,7 @@ class InferReadWrite extends Transform with SeqTransformBased with HasShellOptio val runTransform = state.annotations.contains(InferReadWriteAnnotation) if (runTransform) { val ret = runTransforms(state) - CircuitState(ret.circuit, outputForm, ret.annotations, ret.renames) + state.copy(circuit = ret.circuit, annotations = ret.annotations, renames = ret.renames) } else { state } diff --git a/src/main/scala/firrtl/passes/memlib/ReplaceMemMacros.scala b/src/main/scala/firrtl/passes/memlib/ReplaceMemMacros.scala index f81dc71b..abc145f0 100644 --- a/src/main/scala/firrtl/passes/memlib/ReplaceMemMacros.scala +++ b/src/main/scala/firrtl/passes/memlib/ReplaceMemMacros.scala @@ -10,6 +10,8 @@ import firrtl.Mappers._ import MemPortUtils.{MemPortMap, Modules} import MemTransformUtils._ import firrtl.annotations._ +import firrtl.options.PreservesAll +import firrtl.stage.Forms import wiring._ @@ -24,9 +26,11 @@ object ReplaceMemMacros { * This will not generate wmask ports if not needed. * Creates the minimum # of black boxes needed by the design. */ -class ReplaceMemMacros(writer: ConfWriter) extends Transform { - def inputForm = MidForm - def outputForm = MidForm +class ReplaceMemMacros(writer: ConfWriter) extends Transform with DependencyAPIMigration with PreservesAll[Transform] { + + override def prerequisites = Forms.MidForm + override def optionalPrerequisites = Seq.empty + override def dependents = Forms.MidEmitters /** Return true if mask granularity is per bit, false if per byte or unspecified */ @@ -263,6 +267,6 @@ class ReplaceMemMacros(writer: ConfWriter) extends Transform { case m: ExtModule => SinkAnnotation(ModuleName(m.name, CircuitName(c.main)), pin) } } ++ state.annotations - CircuitState(c.copy(modules = modules ++ memMods), inputForm, annos) + state.copy(circuit = c.copy(modules = modules ++ memMods), annotations = annos) } } diff --git a/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala b/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala index f3ef917b..f5030188 100644 --- a/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala +++ b/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala @@ -5,11 +5,11 @@ package memlib import firrtl._ import firrtl.annotations._ -import firrtl.options.{HasShellOptions, ShellOption} +import firrtl.options.{HasShellOptions, PreservesAll, ShellOption} import Utils.error import java.io.{File, CharArrayWriter, PrintWriter} import wiring._ -import firrtl.stage.RunFirrtlTransformAnnotation +import firrtl.stage.{Forms, RunFirrtlTransformAnnotation} sealed trait PassOption case object InputConfigFileName extends PassOption @@ -90,6 +90,10 @@ Optional Arguments: } } +@deprecated( + "Migrate to a transform that does not take arguments. This will be removed in 1.4.", + "FIRRTL 1.3" +) class SimpleTransform(p: Pass, form: CircuitForm) extends Transform { def inputForm = form def outputForm = form @@ -99,9 +103,11 @@ 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 HasShellOptions { - def inputForm = MidForm - def outputForm = MidForm +class ReplSeqMem extends Transform with HasShellOptions with DependencyAPIMigration with PreservesAll[Transform] { + + override def prerequisites = Forms.MidForm + override def optionalPrerequisites = Seq.empty + override def dependents = Forms.MidEmitters val options = Seq( new ShellOption[String]( diff --git a/src/main/scala/firrtl/passes/memlib/ResolveMemoryReference.scala b/src/main/scala/firrtl/passes/memlib/ResolveMemoryReference.scala index b0d3731f..007aa330 100644 --- a/src/main/scala/firrtl/passes/memlib/ResolveMemoryReference.scala +++ b/src/main/scala/firrtl/passes/memlib/ResolveMemoryReference.scala @@ -6,6 +6,8 @@ import firrtl._ import firrtl.ir._ import firrtl.Mappers._ import firrtl.annotations._ +import firrtl.options.PreservesAll +import firrtl.stage.Forms /** A component, e.g. register etc. Must be declared only once under the TopAnnotation */ case class NoDedupMemAnnotation(target: ComponentName) extends SingleTargetAnnotation[ComponentName] { @@ -14,9 +16,11 @@ case class NoDedupMemAnnotation(target: ComponentName) extends SingleTargetAnnot /** Resolves annotation ref to memories that exactly match (except name) another memory */ -class ResolveMemoryReference extends Transform { - def inputForm = MidForm - def outputForm = MidForm +class ResolveMemoryReference extends Transform with DependencyAPIMigration with PreservesAll[Transform] { + + override def prerequisites = Forms.MidForm + override def optionalPrerequisites = Seq.empty + override def dependents = Forms.MidEmitters /** Helper class for determining when two memories are equivalent while igoring * irrelevant details like name and info diff --git a/src/main/scala/firrtl/passes/memlib/VerilogMemDelays.scala b/src/main/scala/firrtl/passes/memlib/VerilogMemDelays.scala index e5e6d6d4..3da4c391 100644 --- a/src/main/scala/firrtl/passes/memlib/VerilogMemDelays.scala +++ b/src/main/scala/firrtl/passes/memlib/VerilogMemDelays.scala @@ -168,7 +168,7 @@ class MemDelayAndReadwriteTransformer(m: DefModule) { object VerilogMemDelays extends Pass { - override val prerequisites = firrtl.stage.Forms.LowForm :+ Dependency(firrtl.passes.RemoveValidIf) + override def prerequisites = firrtl.stage.Forms.LowForm :+ Dependency(firrtl.passes.RemoveValidIf) override val dependents = Seq( Dependency[VerilogEmitter], diff --git a/src/main/scala/firrtl/passes/wiring/WiringTransform.scala b/src/main/scala/firrtl/passes/wiring/WiringTransform.scala index 31030375..c41d3fed 100644 --- a/src/main/scala/firrtl/passes/wiring/WiringTransform.scala +++ b/src/main/scala/firrtl/passes/wiring/WiringTransform.scala @@ -7,6 +7,7 @@ import firrtl._ import firrtl.Utils._ import scala.collection.mutable import firrtl.annotations._ +import firrtl.stage.Forms /** A class for all exceptions originating from firrtl.passes.wiring */ case class WiringException(msg: String) extends PassException(msg) @@ -36,9 +37,16 @@ case class SinkAnnotation(target: Named, pin: String) extends * * @throws WiringException if a sink is equidistant to two sources */ -class WiringTransform extends Transform { - def inputForm: CircuitForm = MidForm - def outputForm: CircuitForm = HighForm +class WiringTransform extends Transform with DependencyAPIMigration { + + override def prerequisites = Forms.MidForm + override def optionalPrerequisites = Seq.empty + override def dependents = Forms.MidEmitters + + override def invalidates(a: Transform): Boolean = { + val everything = new mutable.LinkedHashSet[Dependency[Transform]] ++ Forms.VerilogOptimized + (everything -- Forms.MinimalHighForm)(Dependency.fromTransform(a)) + } /** Defines the sequence of Transform that should be applied */ private def transforms(w: Seq[WiringInfo]): Seq[Transform] = Seq( |
