aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/Emitter.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/firrtl/Emitter.scala')
-rw-r--r--src/main/scala/firrtl/Emitter.scala47
1 files changed, 24 insertions, 23 deletions
diff --git a/src/main/scala/firrtl/Emitter.scala b/src/main/scala/firrtl/Emitter.scala
index 0269a4fc..0a3068bc 100644
--- a/src/main/scala/firrtl/Emitter.scala
+++ b/src/main/scala/firrtl/Emitter.scala
@@ -64,6 +64,7 @@ case class VRandom(width: BigInt) extends Expression {
def mapType(f: Type => Type): Expression = this
def mapWidth(f: Width => Width): Expression = this
}
+
class VerilogEmitter extends Emitter {
val tab = " "
def AND(e1: WrappedExpression, e2: WrappedExpression): Expression = {
@@ -87,6 +88,7 @@ class VerilogEmitter extends Emitter {
case (t: UIntType) => e
case (t: SIntType) => Seq("$signed(",e,")")
case ClockType => e
+ case AnalogType(w) => e
}
(x) match {
case (e: DoPrim) => emit(op_stream(e), top + 1)
@@ -106,6 +108,9 @@ class VerilogEmitter extends Emitter {
val wx = bitWidth(t) - 1
if (wx > 0) w write s"[$wx:0]"
case ClockType =>
+ case t: AnalogType =>
+ val wx = bitWidth(t) - 1
+ if (wx > 0) w write s"[$wx:0]"
case (t: VectorType) =>
emit(t.tpe, top + 1)
w write s"[${t.size - 1}:0]"
@@ -371,21 +376,6 @@ class VerilogEmitter extends Emitter {
initials += Seq("`endif")
}
- def instantiate(n: String,m: String, es: Seq[Expression]) {
- instdeclares += Seq(m, " ", n, " (")
- es.zipWithIndex foreach {case (e, i) =>
- val s = Seq(tab, ".", remove_root(e), "(", LowerTypes.loweredName(e), ")")
- if (i != es.size - 1) instdeclares += Seq(s, ",")
- else instdeclares += s
- }
- instdeclares += Seq(");")
- es foreach { e =>
- declare("wire",LowerTypes.loweredName(e), e.tpe)
- val ex = WRef(LowerTypes.loweredName(e), e.tpe, kind(e), gender(e))
- if (gender(e) == FEMALE) assign(ex,netlist(e))
- }
- }
-
def simulate(clk: Expression, en: Expression, s: Seq[Any], cond: Option[String]) {
if (!at_clock.contains(clk)) at_clock(clk) = ArrayBuffer[Seq[Any]]()
at_clock(clk) += Seq("`ifndef SYNTHESIS")
@@ -415,10 +405,12 @@ class VerilogEmitter extends Emitter {
}
def build_ports(): Unit = portdefs ++= m.ports.zipWithIndex map {
- case (p, i) => p.direction match {
- case Input =>
+ case (p, i) => (p.tpe, p.direction) match {
+ case (AnalogType(_), _) =>
+ Seq("inout", " ", p.tpe, " ", p.name)
+ case (_, Input) =>
Seq(p.direction, " ", p.tpe, " ", p.name)
- case Output =>
+ case (_, Output) =>
val ex = WRef(p.name, p.tpe, PortKind, FEMALE)
assign(ex, netlist(ex))
Seq(p.direction, " ", p.tpe, " ", p.name)
@@ -427,9 +419,12 @@ class VerilogEmitter extends Emitter {
def build_streams(s: Statement): Statement = s map build_streams match {
case (s: DefWire) =>
- declare("wire", s.name, s.tpe)
- val e = wref(s.name, s.tpe)
- assign(e,netlist(e))
+ declare("wire",s.name,s.tpe)
+ val e = wref(s.name,s.tpe)
+ netlist get e match {
+ case Some(n) => assign(e,n)
+ case None =>
+ }
s
case (s: DefRegister) =>
declare("reg", s.name, s.tpe)
@@ -453,9 +448,15 @@ class VerilogEmitter extends Emitter {
case (s: Print) =>
simulate(s.clk, s.en, printf(s.string, s.args), Some("PRINTF_COND"))
s
- case (s: WDefInstance) =>
+ case (s: WDefInstanceConnector) =>
val es = create_exps(WRef(s.name, s.tpe, InstanceKind, MALE))
- instantiate(s.name, s.module, es)
+ instdeclares += Seq(s.module, " ", s.name, " (")
+ (es zip s.exprs).zipWithIndex foreach {case ((l, r), i) =>
+ val s = Seq(tab, ".", remove_root(l), "(", r, ")")
+ if (i != es.size - 1) instdeclares += Seq(s, ",")
+ else instdeclares += s
+ }
+ instdeclares += Seq(");")
s
case (s: DefMemory) =>
declare("reg", s.name, VectorType(s.dataType, s.depth))