aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/passes/ToWorkingIR.scala
blob: 109654eed3802423362d77f811587b396ecb0c54 (plain)
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
package firrtl.passes

import firrtl.ir._
import firrtl.Mappers._
import firrtl.options.{PreservesAll}
import firrtl.{Transform, UnknownFlow, UnknownKind, WDefInstance, WRef, WSubAccess, WSubField, WSubIndex}

// These should be distributed into separate files
object ToWorkingIR extends Pass with PreservesAll[Transform] {

  override val prerequisites = firrtl.stage.Forms.MinimalHighForm

  def toExp(e: Expression): Expression = e map toExp match {
    case ex: Reference => WRef(ex.name, ex.tpe, UnknownKind, UnknownFlow)
    case ex: SubField => WSubField(ex.expr, ex.name, ex.tpe, UnknownFlow)
    case ex: SubIndex => WSubIndex(ex.expr, ex.value, ex.tpe, UnknownFlow)
    case ex: SubAccess => WSubAccess(ex.expr, ex.index, ex.tpe, UnknownFlow)
    case ex => ex // This might look like a case to use case _ => e, DO NOT!
  }

  def toStmt(s: Statement): Statement = s map toExp match {
    case sx: DefInstance => WDefInstance(sx.info, sx.name, sx.module, UnknownType)
    case sx => sx map toStmt
  }

  def run (c:Circuit): Circuit =
    c copy (modules = c.modules map (_ map toStmt))
}