aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/Passes.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/firrtl/Passes.scala')
-rw-r--r--src/main/scala/firrtl/Passes.scala314
1 files changed, 176 insertions, 138 deletions
diff --git a/src/main/scala/firrtl/Passes.scala b/src/main/scala/firrtl/Passes.scala
index 02016494..e28205f9 100644
--- a/src/main/scala/firrtl/Passes.scala
+++ b/src/main/scala/firrtl/Passes.scala
@@ -7,9 +7,6 @@ import Utils._
import DebugUtils._
import PrimOps._
-
-
-
object Passes extends LazyLogging {
// TODO Perhaps we should get rid of Logger since this map would be nice
@@ -20,9 +17,10 @@ object Passes extends LazyLogging {
def nameToPass(name: String): Circuit => Circuit = {
//mapNameToPass.getOrElse(name, throw new Exception("No Standard FIRRTL Pass of name " + name))
name match {
- case "infer-types" => inferTypes
+ case "to-working-ir" => toWorkingIr
+ //case "infer-types" => inferTypes
// errrrrrrrrrr...
- case "renameall" => renameall(Map())
+ //case "renameall" => renameall(Map())
}
}
@@ -34,6 +32,34 @@ object Passes extends LazyLogging {
}
}
+ // ============== TO WORKING IR ==================
+ def toWorkingIr (c:Circuit) = {
+ def toExp (e:Expression) : Expression = {
+ eMap(toExp _,e) match {
+ case e:Ref => WRef(e.name, e.tpe, NodeKind(), UNKNOWNGENDER)
+ case e:SubField => WSubField(e.exp, e.name, e.tpe, UNKNOWNGENDER)
+ case e:SubIndex => WSubIndex(e.exp, e.value, e.tpe, UNKNOWNGENDER)
+ case e:SubAccess => WSubAccess(e.exp, e.index, e.tpe, UNKNOWNGENDER)
+ case e => e
+ }
+ }
+ def toStmt (s:Stmt) : Stmt = {
+ eMap(toExp _,s) match {
+ case s:DefInstance => WDefInstance(s.info,s.name,s.module,UnknownType())
+ case s => sMap(toStmt _,s)
+ }
+ }
+ val modulesx = c.modules.map { m =>
+ m match {
+ case m:InModule => InModule(m.info,m.name, m.ports, toStmt(m.body))
+ case m:ExModule => m
+ }
+ }
+ Circuit(c.info,modulesx,c.main)
+ }
+ // ===============================================
+
+
/** INFER TYPES
*
* This pass infers the type field in all IR nodes by updating
@@ -45,137 +71,149 @@ object Passes extends LazyLogging {
* postponed for a later/earlier pass.
*/
// input -> flip
- private def getBundleSubtype(t: Type, name: String): Type = {
- t match {
- case b: BundleType => {
- val tpe = b.fields.find( _.name == name )
- if (tpe.isEmpty) UnknownType
- else tpe.get.tpe
- }
- case _ => UnknownType
- }
- }
- private def getVectorSubtype(t: Type): Type = t.getType // Added for clarity
- private type TypeMap = Map[String, Type]
- /*def inferTypes(c: Circuit): Circuit = {
- val moduleTypeMap = Map[String, Type]().withDefaultValue(UnknownType)
- def inferTypes(m: Module): Module = {
- val typeMap = Map[String, Type]().withDefaultValue(UnknownType)
- def inferExpTypes(exp: Expression): Expression = {
- //logger.debug(s"inferTypes called on ${exp.getClass.getSimpleName}")
- exp.map(inferExpTypes) match {
- case e: UIntValue => e
- case e: SIntValue => e
- case e: Ref => Ref(e.name, typeMap(e.name))
- case e: SubField => SubField(e.exp, e.name, getBundleSubtype(e.exp.getType, e.name))
- case e: SubIndex => SubIndex(e.exp, e.value, getVectorSubtype(e.exp.getType))
- case e: SubAccess => SubAccess(e.exp, e.index, getVectorSubtype(e.exp.getType))
- case e: DoPrim => lowerAndTypePrimOp(e)
- case e: Expression => e
- }
- }
- def inferStmtTypes(stmt: Stmt): (Stmt) = {
- //logger.debug(s"inferStmtTypes called on ${stmt.getClass.getSimpleName} ")
- stmt match {
- case s: DefWire =>
- typeMap(s.name) = s.tpe
- s
- case s: DefRegister =>
- typeMap(s.name) = get_tpe(s)
- s
- case s: DefMemory =>
- typeMap(s.name) = get_tpe(s)
- s
- case s: DefInstance => (s, typeMap ++ Map(s.name -> typeMap(s.module)))
- case s: DefNode => (s, typeMap ++ Map(s.name -> s.value.getType))
- case s: s.map(inferStmtTypes)
- }.map(inferExpTypes)
- }
- //logger.debug(s"inferTypes called on module ${m.name}")
-
- m.ports.for( p => typeMap(p.name) = p.tpe)
- Module(m.info, m.name, m.ports, inferStmtTypes(m.stmt))
- }
- //logger.debug(s"inferTypes called on circuit ${c.name}")
-
- // initialize typeMap with each module of circuit mapped to their bundled IO (ports converted to fields)
- val typeMap = c.modules.map(m => m.name -> BundleType(m.ports.map(toField(_)))).toMap
- Circuit(c.info, c.name, c.modules.map(inferTypes(typeMap, _)))
- }*/
-
- def renameall(s : String)(implicit map : Map[String,String]) : String =
- map getOrElse (s, s)
-
- def renameall(e : Expression)(implicit map : Map[String,String]) : Expression = {
- logger.debug(s"renameall called on expression ${e.toString}")
- e match {
- case p : Ref =>
- Ref(renameall(p.name), p.tpe)
- case p : SubField =>
- SubField(renameall(p.exp), renameall(p.name), p.tpe)
- case p : SubIndex =>
- SubIndex(renameall(p.exp), p.value, p.tpe)
- case p : SubAccess =>
- SubAccess(renameall(p.exp), renameall(p.index), p.tpe)
- case p : Mux =>
- Mux(renameall(p.cond), renameall(p.tval), renameall(p.fval), p.tpe)
- case p : ValidIf =>
- ValidIf(renameall(p.cond), renameall(p.value), p.tpe)
- case p : DoPrim =>
- println( p.args.map(x => renameall(x)) )
- DoPrim(p.op, p.args.map(renameall), p.consts, p.tpe)
- case p : Expression => p
- }
- }
-
- def renameall(s : Stmt)(implicit map : Map[String,String]) : Stmt = {
- logger.debug(s"renameall called on statement ${s.toString}")
-
- s match {
- case p : DefWire =>
- DefWire(p.info, renameall(p.name), p.tpe)
- case p: DefRegister =>
- DefRegister(p.info, renameall(p.name), p.tpe, p.clock, p.reset, p.init)
- case p : DefMemory =>
- DefMemory(p.info, renameall(p.name), p.dataType, p.depth, p.writeLatency, p.readLatency,
- p.readers, p.writers, p.readwriters)
- case p : DefInstance =>
- DefInstance(p.info, renameall(p.name), renameall(p.module))
- case p : DefNode =>
- DefNode(p.info, renameall(p.name), renameall(p.value))
- case p : Connect =>
- Connect(p.info, renameall(p.loc), renameall(p.exp))
- case p : BulkConnect =>
- BulkConnect(p.info, renameall(p.loc), renameall(p.exp))
- case p : IsInvalid =>
- IsInvalid(p.info, renameall(p.exp))
- case p : Stop =>
- Stop(p.info, p.ret, renameall(p.clk), renameall(p.en))
- case p : Print =>
- Print(p.info, p.string, p.args.map(renameall), renameall(p.clk), renameall(p.en))
- case p : Conditionally =>
- Conditionally(p.info, renameall(p.pred), renameall(p.conseq), renameall(p.alt))
- case p : Begin =>
- Begin(p.stmts.map(renameall))
- case p : Stmt => p
- }
- }
-
- def renameall(p : Port)(implicit map : Map[String,String]) : Port = {
- logger.debug(s"renameall called on port ${p.name}")
- Port(p.info, renameall(p.name), p.dir, p.tpe)
- }
-
- def renameall(m : Module)(implicit map : Map[String,String]) : Module = {
- logger.debug(s"renameall called on module ${m.name}")
- Module(m.info, renameall(m.name), m.ports.map(renameall(_)), renameall(m.stmt))
- }
-
- def renameall(map : Map[String,String]) : Circuit => Circuit = {
- c => {
- implicit val imap = map
- logger.debug(s"renameall called on circuit ${c.name} with %{renameto}")
- Circuit(c.info, renameall(c.name), c.modules.map(renameall(_)))
- }
- }
+ //private type TypeMap = Map[String, Type]
+ //private val TypeMap = Map[String, Type]().withDefaultValue(UnknownType)
+ //private def getBundleSubtype(t: Type, name: String): Type = {
+ // t match {
+ // case b: BundleType => {
+ // val tpe = b.fields.find( _.name == name )
+ // if (tpe.isEmpty) UnknownType
+ // else tpe.get.tpe
+ // }
+ // case _ => UnknownType
+ // }
+ //}
+ //private def getVectorSubtype(t: Type): Type = t.getType // Added for clarity
+ //// TODO Add genders
+ //private def inferExpTypes(typeMap: TypeMap)(exp: Expression): Expression = {
+ // logger.debug(s"inferTypes called on ${exp.getClass.getSimpleName}")
+ // exp.map(inferExpTypes(typeMap)) match {
+ // case e: UIntValue => e
+ // case e: SIntValue => e
+ // case e: Ref => Ref(e.name, typeMap(e.name))
+ // case e: SubField => SubField(e.exp, e.name, getBundleSubtype(e.exp.getType, e.name))
+ // case e: SubIndex => SubIndex(e.exp, e.value, getVectorSubtype(e.exp.getType))
+ // case e: SubAccess => SubAccess(e.exp, e.index, getVectorSubtype(e.exp.getType))
+ // case e: DoPrim => lowerAndTypePrimOp(e)
+ // case e: Expression => e
+ // }
+ //}
+ //private def inferTypes(typeMap: TypeMap, stmt: Stmt): (Stmt, TypeMap) = {
+ // logger.debug(s"inferTypes called on ${stmt.getClass.getSimpleName} ")
+ // stmt.map(inferExpTypes(typeMap)) match {
+ // case b: Begin => {
+ // var tMap = typeMap
+ // // TODO FIXME is map correctly called in sequential order
+ // val body = b.stmts.map { s =>
+ // val ret = inferTypes(tMap, s)
+ // tMap = ret._2
+ // ret._1
+ // }
+ // (Begin(body), tMap)
+ // }
+ // case s: DefWire => (s, typeMap ++ Map(s.name -> s.tpe))
+ // case s: DefRegister => (s, typeMap ++ Map(s.name -> s.tpe))
+ // case s: DefMemory => (s, typeMap ++ Map(s.name -> s.dataType))
+ // case s: DefInstance => (s, typeMap ++ Map(s.name -> typeMap(s.module)))
+ // case s: DefNode => (s, typeMap ++ Map(s.name -> s.value.getType))
+ // case s: Conditionally => { // TODO Check: Assuming else block won't see when scope
+ // val (conseq, cMap) = inferTypes(typeMap, s.conseq)
+ // val (alt, aMap) = inferTypes(typeMap, s.alt)
+ // (Conditionally(s.info, s.pred, conseq, alt), cMap ++ aMap)
+ // }
+ // case s: Stmt => (s, typeMap)
+ // }
+ //}
+ //private def inferTypes(typeMap: TypeMap, m: Module): Module = {
+ // logger.debug(s"inferTypes called on module ${m.name}")
+
+ // val pTypeMap = m.ports.map( p => p.name -> p.tpe ).toMap
+
+ // Module(m.info, m.name, m.ports, inferTypes(typeMap ++ pTypeMap, m.stmt)._1)
+ //}
+ //def inferTypes(c: Circuit): Circuit = {
+ // logger.debug(s"inferTypes called on circuit ${c.name}")
+
+ // // initialize typeMap with each module of circuit mapped to their bundled IO (ports converted to fields)
+ // val typeMap = c.modules.map(m => m.name -> BundleType(m.ports.map(toField(_)))).toMap
+
+ // //val typeMap = c.modules.flatMap(buildTypeMap).toMap
+ // Circuit(c.info, c.name, c.modules.map(inferTypes(typeMap, _)))
+ //}
+
+ //def renameall(s : String)(implicit map : Map[String,String]) : String =
+ // map getOrElse (s, s)
+
+ //def renameall(e : Expression)(implicit map : Map[String,String]) : Expression = {
+ // logger.debug(s"renameall called on expression ${e.toString}")
+ // e match {
+ // case p : Ref =>
+ // Ref(renameall(p.name), p.tpe)
+ // case p : SubField =>
+ // SubField(renameall(p.exp), renameall(p.name), p.tpe)
+ // case p : SubIndex =>
+ // SubIndex(renameall(p.exp), p.value, p.tpe)
+ // case p : SubAccess =>
+ // SubAccess(renameall(p.exp), renameall(p.index), p.tpe)
+ // case p : Mux =>
+ // Mux(renameall(p.cond), renameall(p.tval), renameall(p.fval), p.tpe)
+ // case p : ValidIf =>
+ // ValidIf(renameall(p.cond), renameall(p.value), p.tpe)
+ // case p : DoPrim =>
+ // println( p.args.map(x => renameall(x)) )
+ // DoPrim(p.op, p.args.map(renameall), p.consts, p.tpe)
+ // case p : Expression => p
+ // }
+ //}
+
+ //def renameall(s : Stmt)(implicit map : Map[String,String]) : Stmt = {
+ // logger.debug(s"renameall called on statement ${s.toString}")
+
+ // s match {
+ // case p : DefWire =>
+ // DefWire(p.info, renameall(p.name), p.tpe)
+ // case p: DefRegister =>
+ // DefRegister(p.info, renameall(p.name), p.tpe, p.clock, p.reset, p.init)
+ // case p : DefMemory =>
+ // DefMemory(p.info, renameall(p.name), p.dataType, p.depth, p.writeLatency, p.readLatency,
+ // p.readers, p.writers, p.readwriters)
+ // case p : DefInstance =>
+ // DefInstance(p.info, renameall(p.name), renameall(p.module))
+ // case p : DefNode =>
+ // DefNode(p.info, renameall(p.name), renameall(p.value))
+ // case p : Connect =>
+ // Connect(p.info, renameall(p.loc), renameall(p.exp))
+ // case p : BulkConnect =>
+ // BulkConnect(p.info, renameall(p.loc), renameall(p.exp))
+ // case p : IsInvalid =>
+ // IsInvalid(p.info, renameall(p.exp))
+ // case p : Stop =>
+ // Stop(p.info, p.ret, renameall(p.clk), renameall(p.en))
+ // case p : Print =>
+ // Print(p.info, p.string, p.args.map(renameall), renameall(p.clk), renameall(p.en))
+ // case p : Conditionally =>
+ // Conditionally(p.info, renameall(p.pred), renameall(p.conseq), renameall(p.alt))
+ // case p : Begin =>
+ // Begin(p.stmts.map(renameall))
+ // case p : Stmt => p
+ // }
+ //}
+
+ //def renameall(p : Port)(implicit map : Map[String,String]) : Port = {
+ // logger.debug(s"renameall called on port ${p.name}")
+ // Port(p.info, renameall(p.name), p.dir, p.tpe)
+ //}
+
+ //def renameall(m : Module)(implicit map : Map[String,String]) : Module = {
+ // logger.debug(s"renameall called on module ${m.name}")
+ // Module(m.info, renameall(m.name), m.ports.map(renameall(_)), renameall(m.stmt))
+ //}
+
+ //def renameall(map : Map[String,String]) : Circuit => Circuit = {
+ // c => {
+ // implicit val imap = map
+ // logger.debug(s"renameall called on circuit ${c.name} with %{renameto}")
+ // Circuit(c.info, renameall(c.name), c.modules.map(renameall(_)))
+ // }
+ //}
}