diff options
| author | Jack Koenig | 2021-12-01 12:04:36 -0800 |
|---|---|---|
| committer | GitHub | 2021-12-01 12:04:36 -0800 |
| commit | b14ed79d416883eb858a191e29326ec08c040a2d (patch) | |
| tree | 37b93b1c487f78e39acd17f94faf5f5c3b24b9d8 /src/main/scala/firrtl/parser | |
| parent | a4d13a5024f7488e1d2b9fdd27d3917157a67268 (diff) | |
| parent | 17250fba841ae3129dc798c0bc48d10200be18ae (diff) | |
Merge pull request #2343 from chipsalliance/improve-parser
Improve ANTLR Parser
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) + } +} |
