aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/Emitter.scala
diff options
context:
space:
mode:
authorjackkoenig2016-09-22 19:10:40 -0700
committerJack Koenig2016-10-26 15:15:37 -0700
commit4b8a0d2af52ceeb3ff5d05082af53bac76744361 (patch)
tree3c416fe2532c504cff18efc8b6d0dccab207802a /src/main/scala/firrtl/Emitter.scala
parente25c6f7a5e4e1bfbfcb8345288be478caa469525 (diff)
Add Support for Parameterized ExtModules and Name Override
Adds support for Integer, Double/Real, and String parameters in external modules. Also add name field to extmodules so that emitted name can be different from Firrtl name. This is important because parameterized extmodules will frequently have differing IO even though they need to be emitted as instantiating the same Verilog module.
Diffstat (limited to 'src/main/scala/firrtl/Emitter.scala')
-rw-r--r--src/main/scala/firrtl/Emitter.scala20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/main/scala/firrtl/Emitter.scala b/src/main/scala/firrtl/Emitter.scala
index 405019b7..e3a146e2 100644
--- a/src/main/scala/firrtl/Emitter.scala
+++ b/src/main/scala/firrtl/Emitter.scala
@@ -82,6 +82,14 @@ class VerilogEmitter extends Emitter {
}
case _ => error("Shouldn't be here")
}
+ /** Turn Params into Verilog Strings */
+ def stringify(param: Param): String = param match {
+ case IntParam(name, value) => s".$name($value)"
+ case DoubleParam(name, value) => s".$name($value)"
+ case StringParam(name, value) =>
+ val strx = "\"" + VerilogStringLitHandler.escape(value) + "\""
+ s".${name}($strx)"
+ }
def emit(x: Any)(implicit w: Writer) { emit(x, 0) }
def emit(x: Any, top: Int)(implicit w: Writer) {
def cast(e: Expression): Any = e.tpe match {
@@ -237,7 +245,7 @@ class VerilogEmitter extends Emitter {
}
}
- def emit_verilog(m: Module)(implicit w: Writer): DefModule = {
+ def emit_verilog(m: Module, moduleMap: Map[String, DefModule])(implicit w: Writer): DefModule = {
val netlist = mutable.LinkedHashMap[WrappedExpression, Expression]()
val addrRegs = mutable.HashSet[WrappedExpression]()
val namespace = Namespace(m)
@@ -448,8 +456,13 @@ class VerilogEmitter extends Emitter {
simulate(sx.clk, sx.en, printf(sx.string, sx.args), Some("PRINTF_COND"))
sx
case sx: WDefInstanceConnector =>
+ val (module, params) = moduleMap(sx.module) match {
+ case ExtModule(_, _, _, extname, params) => (extname, params)
+ case Module(_, name, _, _) => (name, Seq.empty)
+ }
val es = create_exps(WRef(sx.name, sx.tpe, InstanceKind, MALE))
- instdeclares += Seq(sx.module, " ", sx.name, " (")
+ val ps = if (params.nonEmpty) params map stringify mkString ("#(", ", ", ") ") else ""
+ instdeclares += Seq(module, " ", ps, sx.name ," (")
(es zip sx.exprs).zipWithIndex foreach {case ((l, r), i) =>
val s = Seq(tab, ".", remove_root(l), "(", r, ")")
if (i != es.size - 1) instdeclares += Seq(s, ",")
@@ -581,8 +594,9 @@ class VerilogEmitter extends Emitter {
def run(c: Circuit, w: Writer) = {
emit_preamble(w)
+ val moduleMap = (c.modules map (m => m.name -> m)).toMap
c.modules foreach {
- case (m: Module) => emit_verilog(m)(w)
+ case (m: Module) => emit_verilog(m, moduleMap)(w)
case (m: ExtModule) =>
}
}