diff options
| author | azidar | 2016-02-08 22:47:43 -0800 |
|---|---|---|
| committer | azidar | 2016-02-09 18:57:07 -0800 |
| commit | a9afec2145fe27a26c51fca7e169495114c5108d (patch) | |
| tree | 39b232e7bd67cec9c8a65807d92c51b5a44ad764 /src/main/scala/firrtl/Passes.scala | |
| parent | 32f26d3939980644ddd573c1fcf1dd985a150947 (diff) | |
Added chirrtl passes, need to update parser
Diffstat (limited to 'src/main/scala/firrtl/Passes.scala')
| -rw-r--r-- | src/main/scala/firrtl/Passes.scala | 490 |
1 files changed, 245 insertions, 245 deletions
diff --git a/src/main/scala/firrtl/Passes.scala b/src/main/scala/firrtl/Passes.scala index 28ad876c..babe18d0 100644 --- a/src/main/scala/firrtl/Passes.scala +++ b/src/main/scala/firrtl/Passes.scala @@ -10,248 +10,248 @@ import DebugUtils._ import PrimOps._ -@deprecated("This object will be replaced with package firrtl.passes") -object Passes extends LazyLogging { - - - // TODO Perhaps we should get rid of Logger since this map would be nice - ////private val defaultLogger = Logger() - //private def mapNameToPass = Map[String, Circuit => Circuit] ( - // "infer-types" -> inferTypes - //) - var mname = "" - //def nameToPass(name: String): Circuit => Circuit = { - //mapNameToPass.getOrElse(name, throw new Exception("No Standard FIRRTL Pass of name " + name)) - //name match { - //case "to-working-ir" => toWorkingIr - //case "infer-types" => inferTypes - // errrrrrrrrrr... - //case "renameall" => renameall(Map()) - //} - //} - - private def toField(p: Port): Field = { - logger.debug(s"toField called on port ${p.serialize}") - p.direction match { - case INPUT => Field(p.name, REVERSE, p.tpe) - case OUTPUT => Field(p.name, DEFAULT, p.tpe) - } - } - // ============== RESOLVE ALL =================== - def resolve (c:Circuit) = {c - //val passes = Seq( - // toWorkingIr _, - // resolveKinds _, - // inferTypes _, - // resolveGenders _, - // pullMuxes _, - // expandConnects _, - // removeAccesses _) - //val names = Seq( - // "To Working IR", - // "Resolve Kinds", - // "Infer Types", - // "Resolve Genders", - // "Pull Muxes", - // "Expand Connects", - // "Remove Accesses") - //var c_BANG = c - //(names, passes).zipped.foreach { - // (n,p) => { - // println("Starting " + n) - // c_BANG = p(c_BANG) - // println(c_BANG.serialize()) - // println("Finished " + n) - // } - //} - //c_BANG - } - - - // ============== RESOLVE KINDS ================== - // =============================================== - - // ============== INFER TYPES ================== - - // ------------------ Utils ------------------------- - - -// =================== RESOLVE GENDERS ======================= - // =============================================== - - // =============== PULL MUXES ==================== - // =============================================== - - - - // ============ EXPAND CONNECTS ================== - // ---------------- UTILS ------------------ - - - //---------------- Pass --------------------- - - // =============================================== - - - - // ============ REMOVE ACCESSES ================== - // ---------------- UTILS ------------------ - - - /** INFER TYPES - * - * This pass infers the type field in all IR nodes by updating - * and passing an environment to all statements in pre-order - * traversal, and resolving types in expressions in post- - * order traversal. - * Type propagation for primary ops are defined in Primops.scala. - * Type errors are not checked in this pass, as this is - * postponed for a later/earlier pass. - */ - // input -> flip - //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(_))) - // } - //} -} +//@deprecated("This object will be replaced with package firrtl.passes") +//object Passes extends LazyLogging { +// +// +// // TODO Perhaps we should get rid of Logger since this map would be nice +// ////private val defaultLogger = Logger() +// //private def mapNameToPass = Map[String, Circuit => Circuit] ( +// // "infer-types" -> inferTypes +// //) +// var mname = "" +// //def nameToPass(name: String): Circuit => Circuit = { +// //mapNameToPass.getOrElse(name, throw new Exception("No Standard FIRRTL Pass of name " + name)) +// //name match { +// //case "to-working-ir" => toWorkingIr +// //case "infer-types" => inferTypes +// // errrrrrrrrrr... +// //case "renameall" => renameall(Map()) +// //} +// //} +// +// private def toField(p: Port): Field = { +// logger.debug(s"toField called on port ${p.serialize}") +// p.direction match { +// case INPUT => Field(p.name, REVERSE, p.tpe) +// case OUTPUT => Field(p.name, DEFAULT, p.tpe) +// } +// } +// // ============== RESOLVE ALL =================== +// def resolve (c:Circuit) = {c +// //val passes = Seq( +// // toWorkingIr _, +// // resolveKinds _, +// // inferTypes _, +// // resolveGenders _, +// // pullMuxes _, +// // expandConnects _, +// // removeAccesses _) +// //val names = Seq( +// // "To Working IR", +// // "Resolve Kinds", +// // "Infer Types", +// // "Resolve Genders", +// // "Pull Muxes", +// // "Expand Connects", +// // "Remove Accesses") +// //var c_BANG = c +// //(names, passes).zipped.foreach { +// // (n,p) => { +// // println("Starting " + n) +// // c_BANG = p(c_BANG) +// // println(c_BANG.serialize()) +// // println("Finished " + n) +// // } +// //} +// //c_BANG +// } +// +// +// // ============== RESOLVE KINDS ================== +// // =============================================== +// +// // ============== INFER TYPES ================== +// +// // ------------------ Utils ------------------------- +// +// +//// =================== RESOLVE GENDERS ======================= +// // =============================================== +// +// // =============== PULL MUXES ==================== +// // =============================================== +// +// +// +// // ============ EXPAND CONNECTS ================== +// // ---------------- UTILS ------------------ +// +// +// //---------------- Pass --------------------- +// +// // =============================================== +// +// +// +// // ============ REMOVE ACCESSES ================== +// // ---------------- UTILS ------------------ +// +// +// /** INFER TYPES +// * +// * This pass infers the type field in all IR nodes by updating +// * and passing an environment to all statements in pre-order +// * traversal, and resolving types in expressions in post- +// * order traversal. +// * Type propagation for primary ops are defined in Primops.scala. +// * Type errors are not checked in this pass, as this is +// * postponed for a later/earlier pass. +// */ +// // input -> flip +// //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(_))) +// // } +// //} +//} |
