diff options
Diffstat (limited to 'src/main/scala/firrtl/parser')
| -rw-r--r-- | src/main/scala/firrtl/parser/Listener.scala | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/main/scala/firrtl/parser/Listener.scala b/src/main/scala/firrtl/parser/Listener.scala new file mode 100644 index 00000000..ffaa22b2 --- /dev/null +++ b/src/main/scala/firrtl/parser/Listener.scala @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: Apache-2.0 + +package firrtl.parser + +import firrtl.antlr.{FIRRTLParser, _} +import firrtl.Visitor +import firrtl.Parser.InfoMode +import firrtl.ir._ + +import scala.collection.mutable +import scala.concurrent.{Await, Future} +import scala.concurrent.duration.Duration + +private[firrtl] class Listener(infoMode: InfoMode) extends FIRRTLBaseListener { + private var main: Option[String] = None + private var info: Option[Info] = None + private val modules = mutable.ArrayBuffer.empty[DefModule] + + private val visitor = new Visitor(infoMode) + + override def exitModule(ctx: FIRRTLParser.ModuleContext): Unit = { + val m = visitor.visitModule(ctx) + ctx.children = null // Null out to save memory + modules += m + } + + override def exitCircuit(ctx: FIRRTLParser.CircuitContext): Unit = { + info = Some(visitor.visitInfo(Option(ctx.info), ctx)) + main = Some(ctx.id.getText) + ctx.children = null // Null out to save memory + } + + def getCircuit: Circuit = { + require(main.nonEmpty) + val mods = modules.toSeq + Circuit(info.get, mods, main.get) + } +} |
