diff options
Diffstat (limited to 'src/main/scala/firrtl/Visitor.scala')
| -rw-r--r-- | src/main/scala/firrtl/Visitor.scala | 16 |
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 |
