From 1613a7127dd74427786baa093b0dde5a76265b78 Mon Sep 17 00:00:00 2001
From: Jack
Date: Sat, 30 Jan 2016 15:22:08 -0800
Subject: Restructure passes to be new subpackage with more modular design, add
new structures Compiler and Emitter, deprecate old Passes object, update
Driver to use new constructs
---
src/main/scala/firrtl/Compiler.scala | 65 +++++++++++++
src/main/scala/firrtl/Driver.scala | 145 ++--------------------------
src/main/scala/firrtl/Emitter.scala | 41 ++++++++
src/main/scala/firrtl/Passes.scala | 1 +
src/main/scala/firrtl/passes/Passes.scala | 152 ++++++++++++++++++++++++++++++
5 files changed, 265 insertions(+), 139 deletions(-)
create mode 100644 src/main/scala/firrtl/Compiler.scala
create mode 100644 src/main/scala/firrtl/Emitter.scala
create mode 100644 src/main/scala/firrtl/passes/Passes.scala
(limited to 'src/main')
diff --git a/src/main/scala/firrtl/Compiler.scala b/src/main/scala/firrtl/Compiler.scala
new file mode 100644
index 00000000..18bec9dc
--- /dev/null
+++ b/src/main/scala/firrtl/Compiler.scala
@@ -0,0 +1,65 @@
+
+package firrtl
+
+import com.typesafe.scalalogging.LazyLogging
+import java.io.Writer
+
+import Utils._
+import firrtl.passes._
+
+trait Compiler extends LazyLogging {
+ def run(c: Circuit, w: Writer)
+}
+
+object FIRRTLCompiler extends Compiler {
+ def run(c: Circuit, w: Writer) = {
+ FIRRTLEmitter.run(c, w)
+ w.close
+ }
+}
+
+object VerilogCompiler extends Compiler {
+ // Copied from Stanza implementation
+ val passes = Seq(
+ CheckHighForm,
+ ToWorkingIR,
+ ResolveKinds,
+ InferTypes,
+ CheckTypes,
+ ResolveGenders,
+ CheckGenders,
+ InferWidths,
+ CheckWidths,
+ PullMuxes,
+ ExpandConnects,
+ RemoveAccesses,
+ ExpandWhens,
+ CheckInitialization,
+ ConstProp,
+ ResolveKinds,
+ InferTypes,
+ CheckTypes,
+ ResolveGenders,
+ CheckGenders,
+ InferWidths,
+ CheckWidths,
+ LowerTypes,
+ ResolveKinds,
+ InferTypes,
+ CheckTypes,
+ ResolveGenders,
+ CheckGenders,
+ InferWidths,
+ CheckWidths,
+ VerilogWrap,
+ SplitExp,
+ VerilogRename
+ )
+ def run(c: Circuit, w: Writer)
+ {
+ val loweredIR = PassUtils.executePasses(c, passes)
+ VerilogEmitter.run(loweredIR, w)
+ w.close
+ }
+
+}
diff --git a/src/main/scala/firrtl/Driver.scala b/src/main/scala/firrtl/Driver.scala
index 8876aac4..14861f5e 100644
--- a/src/main/scala/firrtl/Driver.scala
+++ b/src/main/scala/firrtl/Driver.scala
@@ -12,150 +12,17 @@ import Utils._
import DebugUtils._
import Passes._
-trait DriverPass {
- def run(input: String, output: String) : Unit
-}
-case class StanzaPass(val passes : Seq[String]) extends DriverPass with LazyLogging {
- def run(input : String, output : String): Unit = {
- val cmd = Seq("firrtl-stanza", "-i", input, "-o", output, "-b", "firrtl") ++ passes.flatMap(x=>Seq("-x", x))
- logger.info(cmd.mkString(" "))
- val ret = cmd.!!
- logger.info(ret)
- }
-}
-case class ScalaPass(val func : Circuit => Circuit) extends DriverPass with LazyLogging {
- def run(input : String, output : String): Unit = {
- var ast = Parser.parse(input, Source.fromFile(input).getLines)
- val newast = func(ast)
- logger.info("Writing to " + output)
- val writer = new PrintWriter(new File(output))
- writer.write(newast.serialize())
- writer.close()
- }
-}
-object StanzaPass {
- def apply(pass: String): StanzaPass = StanzaPass(Seq(pass))
-}
-
-object DriverPasses {
- private def aggregateStanzaPasses(passes: Seq[DriverPass]): Seq[DriverPass] = {
- if (passes.isEmpty) return Seq()
- val span = passes.span(x => x match {
- case p : StanzaPass => true
- case _ => false
- })
- if (span._1.isEmpty) {
- Seq(span._2.head) ++ aggregateStanzaPasses(span._2.tail)
- } else {
- Seq(StanzaPass(span._1.flatMap(x=>x.asInstanceOf[StanzaPass].passes))) ++ aggregateStanzaPasses(span._2)
- }
- }
-
- def optimize(passes: Seq[DriverPass]): Seq[DriverPass] = {
- aggregateStanzaPasses(aggregateStanzaPasses(passes))
- }
-}
-
object Driver extends LazyLogging {
private val usage = """
Usage: java -cp utils/bin/firrtl.jar firrtl.Driver [options] -i -o