aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/Visitor.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/firrtl/Visitor.scala')
-rw-r--r--src/main/scala/firrtl/Visitor.scala16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/main/scala/firrtl/Visitor.scala b/src/main/scala/firrtl/Visitor.scala
index d45283c6..03be0c4e 100644
--- a/src/main/scala/firrtl/Visitor.scala
+++ b/src/main/scala/firrtl/Visitor.scala
@@ -105,7 +105,11 @@ class Visitor(infoMode: InfoMode) extends FIRRTLBaseVisitor[FirrtlNode] {
if (ctx.moduleBlock() != null)
visitBlock(ctx.moduleBlock())
else EmptyStmt)
- case "extmodule" => ExtModule(info, ctx.id.getText, ctx.port.map(visitPort))
+ case "extmodule" =>
+ val defname = if (ctx.defname != null) ctx.defname.id.getText else ctx.id.getText
+ val ports = ctx.port map visitPort
+ val params = ctx.parameter map visitParameter
+ ExtModule(info, ctx.id.getText, ports, defname, params)
}
}
@@ -113,6 +117,16 @@ class Visitor(infoMode: InfoMode) extends FIRRTLBaseVisitor[FirrtlNode] {
Port(visitInfo(Option(ctx.info), ctx), ctx.id.getText, visitDir(ctx.dir), visitType(ctx.`type`))
}
+ private def visitParameter[FirrtlNode](ctx: FIRRTLParser.ParameterContext): Param = {
+ val name = ctx.id.getText
+ (ctx.IntLit, ctx.StringLit, ctx.DoubleLit) match {
+ case (int, null, null) => IntParam(name, string2BigInt(int.getText))
+ case (null, str, null) => StringParam(name, visitStringLit(str))
+ case (null, null, dbl) => DoubleParam(name, dbl.getText.toDouble)
+ case _ => throw new Exception(s"Internal error: Visiting impossible parameter ${ctx.getText}")
+ }
+ }
+
private def visitDir[FirrtlNode](ctx: FIRRTLParser.DirContext): Direction =
ctx.getText match {
case "input" => Input