package firrtl
import java.io._
import java.nio.file.{Paths, Files}
import scala.io.Source
import scala.sys.process._
import com.typesafe.scalalogging.LazyLogging
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(passes)
}
}
object Driver extends LazyLogging {
private val usage = """
Usage: java -cp utils/bin/firrtl.jar firrtl.Driver [options] -i -o