1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
// 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 && reset.tpe != AsyncResetType =>
// 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)
}
}
|