summaryrefslogtreecommitdiff
path: root/src/main/scala/chisel3/internal
diff options
context:
space:
mode:
authorjackkoenig2016-09-22 22:38:33 -0700
committerjackkoenig2016-11-18 11:05:33 -0800
commit822160cc8e76e70643fb56707bb39f6f7526b6fd (patch)
tree50b9e132c6e7d2d5113195683ef3cc3fc5fc1113 /src/main/scala/chisel3/internal
parent6929ca0fc64b562f4852a49df617a1836e083563 (diff)
Add support for parameterized BlackBoxes
Also restrict black boxes to not allow hardware inside of them since it was being silently dropped anyway. Resolves #289
Diffstat (limited to 'src/main/scala/chisel3/internal')
-rw-r--r--src/main/scala/chisel3/internal/firrtl/Emitter.scala24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/main/scala/chisel3/internal/firrtl/Emitter.scala b/src/main/scala/chisel3/internal/firrtl/Emitter.scala
index 3fb18893..b8651828 100644
--- a/src/main/scala/chisel3/internal/firrtl/Emitter.scala
+++ b/src/main/scala/chisel3/internal/firrtl/Emitter.scala
@@ -2,6 +2,7 @@
package chisel3.internal.firrtl
import chisel3._
+import chisel3.experimental._
import chisel3.internal.sourceinfo.{NoSourceInfo, SourceLine}
private[chisel3] object Emitter {
@@ -42,6 +43,16 @@ private class Emitter(circuit: Circuit) {
firrtlLine + e.sourceInfo.makeMessage(" " + _)
}
+ private def emitParam(name: String, p: Param): String = {
+ val str = p match {
+ case IntParam(value) => value.toString
+ case DoubleParam(value) => value.toString
+ case StringParam(str) => "\"" + str + "\""
+ case RawParam(str) => "'" + str + "'"
+ }
+ s"parameter $name = $str"
+ }
+
// Map of Module FIRRTL definition to FIRRTL name, if it has been emitted already.
private val defnMap = collection.mutable.HashMap[(String, String), Component]()
@@ -61,12 +72,13 @@ private class Emitter(circuit: Circuit) {
body ++= newline + emitPort(p)
body ++= newline
- m.id match {
- case _: BlackBox =>
- // TODO: BlackBoxes should be empty, but funkiness in Module() means
- // it's not for now. Eventually, this should assert out.
- case _: Module => for (cmd <- m.commands) {
- body ++= newline + emit(cmd, m)
+ m match {
+ case bb: DefBlackBox =>
+ // Firrtl extmodule can overrule name
+ body ++= newline + s"defname = ${bb.id.desiredName}"
+ body ++= newline + (bb.params map { case (n, p) => emitParam(n, p) } mkString newline)
+ case mod: DefModule => for (cmd <- mod.commands) {
+ body ++= newline + emit(cmd, mod)
}
}
body ++= newline