aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJack Koenig2017-06-22 14:52:24 -0700
committerJack Koenig2017-06-27 18:50:15 -0700
commitca01018fb144dcd206735973e5aa302dbc552ea8 (patch)
treec282e0dfe37de7a49271d9a1da364606fe35cf1a /src
parent6f55a30b201716b6a0e72b65f6e5777b6b5d4b81 (diff)
Add RemoveReset transform to replace register reset with a Mux
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/firrtl/LoweringCompilers.scala1
-rw-r--r--src/main/scala/firrtl/transforms/RemoveReset.scala43
2 files changed, 44 insertions, 0 deletions
diff --git a/src/main/scala/firrtl/LoweringCompilers.scala b/src/main/scala/firrtl/LoweringCompilers.scala
index 0df052af..66ae1673 100644
--- a/src/main/scala/firrtl/LoweringCompilers.scala
+++ b/src/main/scala/firrtl/LoweringCompilers.scala
@@ -85,6 +85,7 @@ class MiddleFirrtlToLowFirrtl extends CoreTransform {
passes.ResolveGenders,
passes.InferWidths,
passes.Legalize,
+ new firrtl.transforms.RemoveReset,
new firrtl.transforms.CheckCombLoops)
}
diff --git a/src/main/scala/firrtl/transforms/RemoveReset.scala b/src/main/scala/firrtl/transforms/RemoveReset.scala
new file mode 100644
index 00000000..bfec76a2
--- /dev/null
+++ b/src/main/scala/firrtl/transforms/RemoveReset.scala
@@ -0,0 +1,43 @@
+// See LICENSE for license details.
+
+package firrtl
+package transforms
+
+import firrtl.ir._
+import firrtl.Mappers._
+
+import scala.collection.mutable
+
+/** Remove Synchronous Reset
+ *
+ * @note This pass must run after LowerTypes
+ */
+class RemoveReset extends Transform {
+ def inputForm = MidForm
+ def outputForm = MidForm
+
+ private case class Reset(cond: Expression, value: Expression)
+
+ private def onModule(m: DefModule): DefModule = {
+ val resets = mutable.HashMap.empty[String, Reset]
+ def onStmt(stmt: Statement): Statement = {
+ stmt match {
+ case reg @ DefRegister(_, rname, _, _, reset, init) if reset != Utils.zero =>
+ // Add register reset to map
+ resets(rname) = Reset(reset, init)
+ reg.copy(reset = Utils.zero, init = WRef(reg))
+ case Connect(info, ref @ WRef(rname, _, RegKind, _), expr) if resets.contains(rname) =>
+ val reset = resets(rname)
+ val muxType = Utils.mux_type_and_widths(reset.value, expr)
+ Connect(info, ref, Mux(reset.cond, reset.value, expr, muxType))
+ case other => other map onStmt
+ }
+ }
+ m.map(onStmt)
+ }
+
+ def execute(state: CircuitState): CircuitState = {
+ val c = state.circuit.map(onModule)
+ state.copy(circuit = c)
+ }
+}