CIRCT 23.0.0git
Loading...
Searching...
No Matches
ImportVerilogInternals.h
Go to the documentation of this file.
1//===- ImportVerilogInternals.h - Internal implementation details ---------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// NOLINTNEXTLINE(llvm-header-guard)
10#ifndef CONVERSION_IMPORTVERILOG_IMPORTVERILOGINTERNALS_H
11#define CONVERSION_IMPORTVERILOG_IMPORTVERILOGINTERNALS_H
12
19#include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h"
20#include "mlir/Dialect/Func/IR/FuncOps.h"
21#include "slang/ast/ASTVisitor.h"
22#include "llvm/ADT/ScopedHashTable.h"
23#include "llvm/Support/Debug.h"
24#include <map>
25#include <queue>
26
27#define DEBUG_TYPE "import-verilog"
28
29namespace circt {
30namespace ImportVerilog {
31
32using moore::Domain;
33
34/// Port lowering information.
36 const slang::ast::PortSymbol &ast;
37 Location loc;
38 BlockArgument arg;
39};
40
41/// Lowering information for a single signal flattened from an interface port.
43 StringAttr name;
45 mlir::Type type;
46 Location loc;
47 BlockArgument arg;
48 /// the origin interface port symbol this was flattened from.
49 const slang::ast::InterfacePortSymbol *origin;
50 /// the interface body member (VariableSymbol , NetSymbol)
51 const slang::ast::Symbol *bodySym;
52};
53
54/// Lowering information for an expanded interface instance. Maps each interface
55/// body member to its expanded SSA value (moore.variable or moore.net).
57 DenseMap<const slang::ast::Symbol *, Value> expandedMembers;
58};
59
60/// Module lowering information.
62 moore::SVModuleOp op;
63 SmallVector<PortLowering> ports;
64 SmallVector<FlattenedIfacePort> ifacePorts;
65 DenseMap<const slang::syntax::SyntaxNode *, const slang::ast::PortSymbol *>
67};
68
69/// Function lowering information.
71 mlir::func::FuncOp op;
72 llvm::SmallVector<Value, 4> captures;
73 llvm::DenseMap<Value, unsigned> captureIndex;
74 bool capturesFinalized = false;
75 bool isConverting = false;
76};
77
78// Class lowering information.
80 circt::moore::ClassDeclOp op;
81 bool methodsFinalized = false;
82};
83
84/// Information about a loops continuation and exit blocks relevant while
85/// lowering the loop's body statements.
86struct LoopFrame {
87 /// The block to jump to from a `continue` statement.
89 /// The block to jump to from a `break` statement.
90 Block *breakBlock;
91};
92
93/// Hierarchical path information.
94/// The "hierName" means a different hierarchical name at different module
95/// levels.
96/// The "idx" means where the current hierarchical name is on the portlists.
97/// The "direction" means hierarchical names whether downward(In) or
98/// upward(Out).
100 mlir::StringAttr hierName;
101 std::optional<unsigned int> idx;
102 slang::ast::ArgumentDirection direction;
103 const slang::ast::ValueSymbol *valueSym;
104};
105
106/// A helper class to facilitate the conversion from a Slang AST to MLIR
107/// operations. Keeps track of the destination MLIR module, builders, and
108/// various worklists and utilities needed for conversion.
109struct Context {
111 slang::ast::Compilation &compilation, mlir::ModuleOp intoModuleOp,
112 const slang::SourceManager &sourceManager)
115 builder(OpBuilder::atBlockEnd(intoModuleOp.getBody())),
117 Context(const Context &) = delete;
118
119 /// Return the MLIR context.
120 MLIRContext *getContext() { return intoModuleOp.getContext(); }
121
122 /// Convert a slang `SourceLocation` into an MLIR `Location`.
123 Location convertLocation(slang::SourceLocation loc);
124 /// Convert a slang `SourceRange` into an MLIR `Location`.
125 Location convertLocation(slang::SourceRange range);
126
127 /// Convert a slang type into an MLIR type. Returns null on failure. Uses the
128 /// provided location for error reporting, or tries to guess one from the
129 /// given type. Types tend to have unreliable location information, so it's
130 /// generally a good idea to pass in a location.
131 Type convertType(const slang::ast::Type &type, LocationAttr loc = {});
132 Type convertType(const slang::ast::DeclaredType &type);
133
134 /// Convert hierarchy and structure AST nodes to MLIR ops.
135 LogicalResult convertCompilation();
136 ModuleLowering *
137 convertModuleHeader(const slang::ast::InstanceBodySymbol *module);
138 LogicalResult convertModuleBody(const slang::ast::InstanceBodySymbol *module);
139 LogicalResult convertPackage(const slang::ast::PackageSymbol &package);
140 FunctionLowering *
141 declareFunction(const slang::ast::SubroutineSymbol &subroutine);
142 LogicalResult convertFunction(const slang::ast::SubroutineSymbol &subroutine);
143 LogicalResult finalizeFunctionBodyCaptures(FunctionLowering &lowering);
144 ClassLowering *declareClass(const slang::ast::ClassType &cls);
145 LogicalResult buildClassProperties(const slang::ast::ClassType &classdecl);
146 LogicalResult materializeClassMethods(const slang::ast::ClassType &classdecl);
147 LogicalResult convertGlobalVariable(const slang::ast::VariableSymbol &var);
148
149 /// Checks whether one class (actualTy) is derived from another class
150 /// (baseTy). True if it's a subclass, false otherwise.
151 bool isClassDerivedFrom(const moore::ClassHandleType &actualTy,
152 const moore::ClassHandleType &baseTy);
153
154 /// Tries to find the closest base class of actualTy that carries a property
155 /// with name fieldName. The location is used for error reporting.
156 moore::ClassHandleType
157 getAncestorClassWithProperty(const moore::ClassHandleType &actualTy,
158 StringRef fieldName, Location loc);
159
160 Value getImplicitThisRef() const {
161 return currentThisRef; // block arg added in declareFunction
162 }
163
164 Value getIndexedQueue() const { return currentQueue; }
165
166 // Convert a statement AST node to MLIR ops.
167 LogicalResult convertStatement(const slang::ast::Statement &stmt);
168
169 // Convert an expression AST node to MLIR ops.
170 Value convertRvalueExpression(const slang::ast::Expression &expr,
171 Type requiredType = {});
172 Value convertLvalueExpression(const slang::ast::Expression &expr);
173
174 // Convert an assertion expression AST node to MLIR ops.
175 Value convertAssertionExpression(const slang::ast::AssertionExpr &expr,
176 Location loc);
177
178 // Convert an assertion expression AST node to MLIR ops.
180 const slang::ast::CallExpression &expr,
181 const slang::ast::CallExpression::SystemCallInfo &info, Location loc);
182
183 // Traverse the whole AST to collect hierarchical names.
184 LogicalResult
185 collectHierarchicalValues(const slang::ast::Expression &expr,
186 const slang::ast::Symbol &outermostModule);
187 LogicalResult traverseInstanceBody(const slang::ast::Symbol &symbol);
188
189 // Convert timing controls into a corresponding set of ops that delay
190 // execution of the current block. Produces an error if the implicit event
191 // control `@*` or `@(*)` is used.
192 LogicalResult convertTimingControl(const slang::ast::TimingControl &ctrl);
193 // Convert timing controls into a corresponding set of ops that delay
194 // execution of the current block. Then converts the given statement, taking
195 // note of the rvalues it reads and adding them to a wait op in case an
196 // implicit event control `@*` or `@(*)` is used.
197 LogicalResult convertTimingControl(const slang::ast::TimingControl &ctrl,
198 const slang::ast::Statement &stmt);
199
200 /// Helper function to convert a value to a MLIR I1 value.
201 Value convertToI1(Value value);
202
203 // Convert a slang timing control for LTL
204 Value convertLTLTimingControl(const slang::ast::TimingControl &ctrl,
205 const Value &seqOrPro);
206
207 /// Helper function to convert a value to its "truthy" boolean value.
208 Value convertToBool(Value value);
209
210 /// Helper function to convert a value to its "truthy" boolean value and
211 /// convert it to the given domain.
212 Value convertToBool(Value value, Domain domain);
213
214 /// Helper function to convert a value to its simple bit vector
215 /// representation, if it has one. Otherwise returns null. Also returns null
216 /// if the given value is null.
217 Value convertToSimpleBitVector(Value value);
218
219 /// Helper function to insert the necessary operations to cast a value from
220 /// one type to another.
221 Value materializeConversion(Type type, Value value, bool isSigned,
222 Location loc);
223
224 /// Helper function to materialize an `SVInt` as an SSA value.
225 Value materializeSVInt(const slang::SVInt &svint,
226 const slang::ast::Type &type, Location loc);
227
228 /// Helper function to materialize a real value as an SSA value.
229 Value materializeSVReal(const slang::ConstantValue &svreal,
230 const slang::ast::Type &type, Location loc);
231
232 /// Helper function to materialize a string as an SSA value.
233 Value materializeString(const slang::ConstantValue &string,
234 const slang::ast::Type &astType, Location loc);
235
236 /// Helper function to materialize an unpacked array of `SVInt`s as an SSA
237 /// value.
239 const slang::ConstantValue &constant,
240 const slang::ast::FixedSizeUnpackedArrayType &astType, Location loc);
241
242 /// Helper function to materialize a `ConstantValue` as an SSA value. Returns
243 /// null if the constant cannot be materialized.
244 Value materializeConstant(const slang::ConstantValue &constant,
245 const slang::ast::Type &type, Location loc);
246
247 /// Convert a list of string literal arguments with formatting specifiers and
248 /// arguments to be interpolated into a `!moore.format_string` value. Returns
249 /// failure if an error occurs. Returns a null value if the formatted string
250 /// is trivially empty. Otherwise returns the formatted string.
251 FailureOr<Value> convertFormatString(
252 std::span<const slang::ast::Expression *const> arguments, Location loc,
253 moore::IntFormat defaultFormat = moore::IntFormat::Decimal,
254 bool appendNewline = false);
255
256 /// Convert system function calls only have arity-0.
257 FailureOr<Value>
258 convertSystemCallArity0(const slang::ast::SystemSubroutine &subroutine,
259 Location loc);
260
261 /// Convert system function calls only have arity-1.
262 FailureOr<Value>
263 convertSystemCallArity1(const slang::ast::SystemSubroutine &subroutine,
264 Location loc, Value value);
265
266 /// Convert system function calls with arity-2.
267 FailureOr<Value>
268 convertSystemCallArity2(const slang::ast::SystemSubroutine &subroutine,
269 Location loc, Value value1, Value value2);
270
271 /// Convert system function calls within properties and assertion with a
272 /// single argument.
273 FailureOr<Value> convertAssertionSystemCallArity1(
274 const slang::ast::SystemSubroutine &subroutine, Location loc, Value value,
275 Type originalType);
276
277 /// Evaluate the constant value of an expression.
278 slang::ConstantValue evaluateConstant(const slang::ast::Expression &expr);
279
281 slang::ast::Compilation &compilation;
282 mlir::ModuleOp intoModuleOp;
283 const slang::SourceManager &sourceManager;
284
285 /// The builder used to create IR operations.
286 OpBuilder builder;
287 /// A symbol table of the MLIR module we are emitting into.
288 SymbolTable symbolTable;
289
290 /// The top-level operations ordered by their Slang source location. This is
291 /// used to produce IR that follows the source file order.
292 std::map<slang::SourceLocation, Operation *> orderedRootOps;
293
294 /// How we have lowered modules to MLIR.
295 DenseMap<const slang::ast::InstanceBodySymbol *,
296 std::unique_ptr<ModuleLowering>>
298
299 /// Expanded interface instances, keyed by the InstanceSymbol pointer.
300 /// Each entry maps body members to their expanded SSA values. Scoped
301 /// per-module so entries are cleaned up when a module's conversion ends.
303 llvm::ScopedHashTable<const slang::ast::InstanceSymbol *,
305 using InterfaceInstanceScope = InterfaceInstances::ScopeTy;
307 /// Owning storage for InterfaceLowering objects
308 /// because ScopedHashTable stores values by copy.
309 SmallVector<std::unique_ptr<InterfaceLowering>> interfaceInstanceStorage;
310 /// A list of modules for which the header has been created, but the body has
311 /// not been converted yet.
312 std::queue<const slang::ast::InstanceBodySymbol *> moduleWorklist;
313
314 /// Functions that have already been converted.
315 DenseMap<const slang::ast::SubroutineSymbol *,
316 std::unique_ptr<FunctionLowering>>
318
319 /// Classes that have already been converted.
320 DenseMap<const slang::ast::ClassType *, std::unique_ptr<ClassLowering>>
322
323 /// A table of defined values, such as variables, that may be referred to by
324 /// name in expressions. The expressions use this table to lookup the MLIR
325 /// value that was created for a given declaration in the Slang AST node.
327 llvm::ScopedHashTable<const slang::ast::ValueSymbol *, Value>;
328 using ValueSymbolScope = ValueSymbols::ScopeTy;
330
331 /// A table of defined global variables that may be referred to by name in
332 /// expressions.
333 DenseMap<const slang::ast::ValueSymbol *, moore::GlobalVariableOp>
335 /// A list of global variables that still need their initializers to be
336 /// converted.
337 SmallVector<const slang::ast::ValueSymbol *> globalVariableWorklist;
338
339 /// Collect all hierarchical names used for the per module/instance.
340 DenseMap<const slang::ast::InstanceBodySymbol *, SmallVector<HierPathInfo>>
342
343 /// It's used to collect the repeat hierarchical names on the same path.
344 /// Such as `Top.sub.a` and `sub.a`, they are equivalent. The variable "a"
345 /// will be added to the port list. But we only record once. If we don't do
346 /// that. We will view the strange IR, such as `module @Sub(out y, out y)`;
347 DenseSet<StringAttr> sameHierPaths;
348
349 /// A stack of assignment left-hand side values. Each assignment will push its
350 /// lowered left-hand side onto this stack before lowering its right-hand
351 /// side. This allows expressions to resolve the opaque
352 /// `LValueReferenceExpression`s in the AST.
353 SmallVector<Value> lvalueStack;
354
355 /// A stack of loop continuation and exit blocks. Each loop will push the
356 /// relevant info onto this stack, lower its loop body statements, and pop the
357 /// info off the stack again. Continue and break statements encountered as
358 /// part of the loop body statements will use this information to branch to
359 /// the correct block.
360 SmallVector<LoopFrame> loopStack;
361
362 /// A listener called for every variable or net being read. This can be used
363 /// to collect all variables read as part of an expression or statement, for
364 /// example to populate the list of observed signals in an implicit event
365 /// control `@*`.
366 std::function<void(moore::ReadOp)> rvalueReadCallback;
367 /// A listener called for every variable or net being assigned. This can be
368 /// used to collect all variables assigned in a task scope.
369 std::function<void(mlir::Operation *)> variableAssignCallback;
370
371 /// The time scale currently in effect.
372 slang::TimeScale timeScale;
373
374 /// Variable to track the value of the current function's implicit `this`
375 /// reference
376 Value currentThisRef = {};
377
378 /// Variable that tracks the queue which we are currently converting the index
379 /// expression for. This is necessary to implement the `$` operator, which
380 /// returns the index of the last element of the queue.
381 Value currentQueue = {};
382
383private:
384 /// Helper function to extract the commonalities in lowering of functions and
385 /// methods
387 declareCallableImpl(const slang::ast::SubroutineSymbol &subroutine,
388 mlir::StringRef qualifiedName,
389 llvm::SmallVectorImpl<Type> &extraParams);
390};
391
392} // namespace ImportVerilog
393} // namespace circt
394#endif // CONVERSION_IMPORTVERILOG_IMPORTVERILOGINTERNALS_H
Domain
The number of values each bit of a type can assume.
Definition MooreTypes.h:49
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
Options that control how Verilog input files are parsed and processed.
A helper class to facilitate the conversion from a Slang AST to MLIR operations.
LogicalResult convertFunction(const slang::ast::SubroutineSymbol &subroutine)
Convert a function.
Value convertToI1(Value value)
Helper function to convert a value to a MLIR I1 value.
Value materializeConversion(Type type, Value value, bool isSigned, Location loc)
Helper function to insert the necessary operations to cast a value from one type to another.
llvm::ScopedHashTable< const slang::ast::InstanceSymbol *, InterfaceLowering * > InterfaceInstances
Expanded interface instances, keyed by the InstanceSymbol pointer.
FunctionLowering * declareCallableImpl(const slang::ast::SubroutineSymbol &subroutine, mlir::StringRef qualifiedName, llvm::SmallVectorImpl< Type > &extraParams)
Helper function to extract the commonalities in lowering of functions and methods.
ModuleLowering * convertModuleHeader(const slang::ast::InstanceBodySymbol *module)
Convert a module and its ports to an empty module op in the IR.
Value convertLvalueExpression(const slang::ast::Expression &expr)
Value materializeConstant(const slang::ConstantValue &constant, const slang::ast::Type &type, Location loc)
Helper function to materialize a ConstantValue as an SSA value.
SmallVector< LoopFrame > loopStack
A stack of loop continuation and exit blocks.
LogicalResult convertModuleBody(const slang::ast::InstanceBodySymbol *module)
Convert a module's body to the corresponding IR ops.
slang::ConstantValue evaluateConstant(const slang::ast::Expression &expr)
Evaluate the constant value of an expression.
Value convertLTLTimingControl(const slang::ast::TimingControl &ctrl, const Value &seqOrPro)
LogicalResult materializeClassMethods(const slang::ast::ClassType &classdecl)
DenseMap< const slang::ast::ValueSymbol *, moore::GlobalVariableOp > globalVariables
A table of defined global variables that may be referred to by name in expressions.
slang::ast::Compilation & compilation
LogicalResult convertTimingControl(const slang::ast::TimingControl &ctrl)
Context(const ImportVerilogOptions &options, slang::ast::Compilation &compilation, mlir::ModuleOp intoModuleOp, const slang::SourceManager &sourceManager)
OpBuilder builder
The builder used to create IR operations.
std::queue< const slang::ast::InstanceBodySymbol * > moduleWorklist
A list of modules for which the header has been created, but the body has not been converted yet.
LogicalResult convertGlobalVariable(const slang::ast::VariableSymbol &var)
Convert a variable to a moore.global_variable operation.
Value materializeFixedSizeUnpackedArrayType(const slang::ConstantValue &constant, const slang::ast::FixedSizeUnpackedArrayType &astType, Location loc)
Helper function to materialize an unpacked array of SVInts as an SSA value.
Value convertAssertionCallExpression(const slang::ast::CallExpression &expr, const slang::ast::CallExpression::SystemCallInfo &info, Location loc)
DenseMap< const slang::ast::ClassType *, std::unique_ptr< ClassLowering > > classes
Classes that have already been converted.
std::function< void(moore::ReadOp)> rvalueReadCallback
A listener called for every variable or net being read.
bool isClassDerivedFrom(const moore::ClassHandleType &actualTy, const moore::ClassHandleType &baseTy)
Checks whether one class (actualTy) is derived from another class (baseTy).
Context(const Context &)=delete
std::map< slang::SourceLocation, Operation * > orderedRootOps
The top-level operations ordered by their Slang source location.
Type convertType(const slang::ast::Type &type, LocationAttr loc={})
Convert a slang type into an MLIR type.
Definition Types.cpp:216
DenseMap< const slang::ast::SubroutineSymbol *, std::unique_ptr< FunctionLowering > > functions
Functions that have already been converted.
Value materializeSVInt(const slang::SVInt &svint, const slang::ast::Type &type, Location loc)
Helper function to materialize an SVInt as an SSA value.
slang::TimeScale timeScale
The time scale currently in effect.
LogicalResult finalizeFunctionBodyCaptures(FunctionLowering &lowering)
Value materializeSVReal(const slang::ConstantValue &svreal, const slang::ast::Type &type, Location loc)
Helper function to materialize a real value as an SSA value.
ClassLowering * declareClass(const slang::ast::ClassType &cls)
Value convertToBool(Value value)
Helper function to convert a value to its "truthy" boolean value.
std::function< void(mlir::Operation *)> variableAssignCallback
A listener called for every variable or net being assigned.
moore::ClassHandleType getAncestorClassWithProperty(const moore::ClassHandleType &actualTy, StringRef fieldName, Location loc)
Tries to find the closest base class of actualTy that carries a property with name fieldName.
FailureOr< Value > convertFormatString(std::span< const slang::ast::Expression *const > arguments, Location loc, moore::IntFormat defaultFormat=moore::IntFormat::Decimal, bool appendNewline=false)
Convert a list of string literal arguments with formatting specifiers and arguments to be interpolate...
const ImportVerilogOptions & options
Value convertRvalueExpression(const slang::ast::Expression &expr, Type requiredType={})
FailureOr< Value > convertSystemCallArity0(const slang::ast::SystemSubroutine &subroutine, Location loc)
Convert system function calls only have arity-0.
SmallVector< std::unique_ptr< InterfaceLowering > > interfaceInstanceStorage
Owning storage for InterfaceLowering objects because ScopedHashTable stores values by copy.
llvm::ScopedHashTable< const slang::ast::ValueSymbol *, Value > ValueSymbols
A table of defined values, such as variables, that may be referred to by name in expressions.
Value convertToSimpleBitVector(Value value)
Helper function to convert a value to its simple bit vector representation, if it has one.
LogicalResult traverseInstanceBody(const slang::ast::Symbol &symbol)
Value materializeString(const slang::ConstantValue &string, const slang::ast::Type &astType, Location loc)
Helper function to materialize a string as an SSA value.
Value currentThisRef
Variable to track the value of the current function's implicit this reference.
FailureOr< Value > convertSystemCallArity1(const slang::ast::SystemSubroutine &subroutine, Location loc, Value value)
Convert system function calls only have arity-1.
const slang::SourceManager & sourceManager
DenseSet< StringAttr > sameHierPaths
It's used to collect the repeat hierarchical names on the same path.
Value currentQueue
Variable that tracks the queue which we are currently converting the index expression for.
InterfaceInstances::ScopeTy InterfaceInstanceScope
SymbolTable symbolTable
A symbol table of the MLIR module we are emitting into.
DenseMap< const slang::ast::InstanceBodySymbol *, SmallVector< HierPathInfo > > hierPaths
Collect all hierarchical names used for the per module/instance.
FunctionLowering * declareFunction(const slang::ast::SubroutineSymbol &subroutine)
Convert a function and its arguments to a function declaration in the IR.
LogicalResult collectHierarchicalValues(const slang::ast::Expression &expr, const slang::ast::Symbol &outermostModule)
Value convertAssertionExpression(const slang::ast::AssertionExpr &expr, Location loc)
LogicalResult buildClassProperties(const slang::ast::ClassType &classdecl)
LogicalResult convertPackage(const slang::ast::PackageSymbol &package)
Convert a package and its contents.
LogicalResult convertCompilation()
Convert hierarchy and structure AST nodes to MLIR ops.
MLIRContext * getContext()
Return the MLIR context.
FailureOr< Value > convertAssertionSystemCallArity1(const slang::ast::SystemSubroutine &subroutine, Location loc, Value value, Type originalType)
Convert system function calls within properties and assertion with a single argument.
LogicalResult convertStatement(const slang::ast::Statement &stmt)
FailureOr< Value > convertSystemCallArity2(const slang::ast::SystemSubroutine &subroutine, Location loc, Value value1, Value value2)
Convert system function calls with arity-2.
SmallVector< const slang::ast::ValueSymbol * > globalVariableWorklist
A list of global variables that still need their initializers to be converted.
SmallVector< Value > lvalueStack
A stack of assignment left-hand side values.
DenseMap< const slang::ast::InstanceBodySymbol *, std::unique_ptr< ModuleLowering > > modules
How we have lowered modules to MLIR.
Location convertLocation(slang::SourceLocation loc)
Convert a slang SourceLocation into an MLIR Location.
Lowering information for a single signal flattened from an interface port.
const slang::ast::InterfacePortSymbol * origin
the origin interface port symbol this was flattened from.
const slang::ast::Symbol * bodySym
the interface body member (VariableSymbol , NetSymbol)
llvm::DenseMap< Value, unsigned > captureIndex
Hierarchical path information.
slang::ast::ArgumentDirection direction
const slang::ast::ValueSymbol * valueSym
Lowering information for an expanded interface instance.
DenseMap< const slang::ast::Symbol *, Value > expandedMembers
Information about a loops continuation and exit blocks relevant while lowering the loop's body statem...
Block * breakBlock
The block to jump to from a break statement.
Block * continueBlock
The block to jump to from a continue statement.
DenseMap< const slang::syntax::SyntaxNode *, const slang::ast::PortSymbol * > portsBySyntaxNode
SmallVector< FlattenedIfacePort > ifacePorts
const slang::ast::PortSymbol & ast