CIRCT 23.0.0git
Loading...
Searching...
No Matches
Classes | Public Types | Public Member Functions | Public Attributes | Private Member Functions | List of all members
circt::ImportVerilog::Context Struct Reference

A helper class to facilitate the conversion from a Slang AST to MLIR operations. More...

#include <ImportVerilogInternals.h>

Collaboration diagram for circt::ImportVerilog::Context:
Collaboration graph
[legend]

Classes

struct  PendingMonitor
 Information about a pending $monitor call that needs to be converted after the current module's body has been processed. More...
 

Public Types

using InterfaceInstances = llvm::ScopedHashTable< const slang::ast::InstanceSymbol *, InterfaceLowering * >
 Expanded interface instances, keyed by the InstanceSymbol pointer.
 
using InterfaceInstanceScope = InterfaceInstances::ScopeTy
 
using ValueSymbols = llvm::ScopedHashTable< const slang::ast::ValueSymbol *, Value >
 A table of defined values, such as variables, that may be referred to by name in expressions.
 
using ValueSymbolScope = ValueSymbols::ScopeTy
 
using VirtualInterfaceMembers = llvm::ScopedHashTable< const slang::ast::ValueSymbol *, VirtualInterfaceMemberAccess >
 A table mapping symbols for interface members accessed through a virtual interface to the virtual interface base value symbol.
 
using VirtualInterfaceMemberScope = VirtualInterfaceMembers::ScopeTy
 

Public Member Functions

 Context (const ImportVerilogOptions &options, slang::ast::Compilation &compilation, mlir::ModuleOp intoModuleOp, const slang::SourceManager &sourceManager)
 
 Context (const Context &)=delete
 
MLIRContext * getContext ()
 Return the MLIR context.
 
Location convertLocation (slang::SourceLocation loc)
 Convert a slang SourceLocation into an MLIR Location.
 
Location convertLocation (slang::SourceRange range)
 Convert a slang SourceRange into an MLIR Location.
 
Type convertType (const slang::ast::Type &type, LocationAttr loc={})
 Convert a slang type into an MLIR type.
 
Type convertType (const slang::ast::DeclaredType &type)
 
LogicalResult convertCompilation ()
 Convert hierarchy and structure AST nodes to MLIR ops.
 
ModuleLoweringconvertModuleHeader (const slang::ast::InstanceBodySymbol *module)
 Convert a module and its ports to an empty module op in the IR.
 
LogicalResult convertModuleBody (const slang::ast::InstanceBodySymbol *module)
 Convert a module's body to the corresponding IR ops.
 
LogicalResult convertPackage (const slang::ast::PackageSymbol &package)
 Convert a package and its contents.
 
FunctionLoweringdeclareFunction (const slang::ast::SubroutineSymbol &subroutine)
 Convert a function and its arguments to a function declaration in the IR.
 
LogicalResult defineFunction (const slang::ast::SubroutineSymbol &subroutine)
 Define a function’s body.
 
LogicalResult convertPrimitiveInstance (const slang::ast::PrimitiveInstanceSymbol &prim)
 Convert a primitive instance.
 
ClassLoweringdeclareClass (const slang::ast::ClassType &cls)
 
LogicalResult buildClassProperties (const slang::ast::ClassType &classdecl)
 
LogicalResult materializeClassMethods (const slang::ast::ClassType &classdecl)
 
LogicalResult convertGlobalVariable (const slang::ast::VariableSymbol &var)
 Convert a variable to a moore.global_variable operation.
 
FailureOr< moore::UnpackedStructType > convertVirtualInterfaceType (const slang::ast::VirtualInterfaceType &type, Location loc)
 Convert a Slang virtual interface type into the Moore type used to represent virtual interface handles.
 
FailureOr< Value > materializeVirtualInterfaceValue (const slang::ast::VirtualInterfaceType &type, Location loc)
 Materialize a Moore value representing a concrete interface instance as a virtual interface handle.
 
LogicalResult registerVirtualInterfaceMembers (const slang::ast::ValueSymbol &base, const slang::ast::VirtualInterfaceType &type, Location loc)
 Register the interface members of a virtual interface base symbol for use in later expression conversion.
 
bool isClassDerivedFrom (const moore::ClassHandleType &actualTy, const moore::ClassHandleType &baseTy)
 Checks whether one class (actualTy) is derived from another class (baseTy).
 
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.
 
Value getImplicitThisRef () const
 
void populateAssertionClocks ()
 Generates a map from assertions to clocks using Slang's analysis.
 
Value getIndexedQueue () const
 
LogicalResult convertStatement (const slang::ast::Statement &stmt)
 
Value convertRvalueExpression (const slang::ast::Expression &expr, Type requiredType={})
 
Value convertLvalueExpression (const slang::ast::Expression &expr)
 
Value convertAssertionExpression (const slang::ast::AssertionExpr &expr, Location loc)
 
Value convertAssertionCallExpression (const slang::ast::CallExpression &expr, const slang::ast::CallExpression::SystemCallInfo &info, Location loc)
 
void traverseInstanceBody (const slang::ast::InstanceSymbol &symbol)
 
std::optional< std::pair< const slang::ast::InstanceSymbol *, mlir::StringAttr > > buildHierValueKey (const slang::ast::HierarchicalValueExpression &expr)
 Build a composite key for hierValueSymbols from a hierarchical value expression.
 
LogicalResult convertTimingControl (const slang::ast::TimingControl &ctrl)
 
LogicalResult convertTimingControl (const slang::ast::TimingControl &ctrl, const slang::ast::Statement &stmt)
 
Value convertToI1 (Value value)
 Helper function to convert a value to a MLIR I1 value.
 
Value convertLTLTimingControl (const slang::ast::TimingControl &ctrl, const Value &seqOrPro)
 
LogicalResult convertNInputPrimitive (const slang::ast::PrimitiveInstanceSymbol &prim)
 
LogicalResult convertNOutputPrimitive (const slang::ast::PrimitiveInstanceSymbol &prim)
 
LogicalResult convertFixedPrimitive (const slang::ast::PrimitiveInstanceSymbol &prim)
 
LogicalResult convertPullGatePrimitive (const slang::ast::PrimitiveInstanceSymbol &prim)
 
Value convertToBool (Value value)
 Helper function to convert a value to its "truthy" boolean value.
 
Value convertToBool (Value value, Domain domain)
 Helper function to convert a value to its "truthy" boolean value and convert it to the given domain.
 
Value convertToSimpleBitVector (Value value)
 Helper function to convert a value to its simple bit vector representation, if it has one.
 
Value materializeConversion (Type type, Value value, bool isSigned, Location loc, bool fallible=false)
 Helper function to insert the necessary operations to cast a value from one type to another.
 
Value materializeSVInt (const slang::SVInt &svint, const slang::ast::Type &type, Location loc)
 Helper function to materialize an SVInt as an SSA value.
 
Value materializeSVReal (const slang::ConstantValue &svreal, const slang::ast::Type &type, Location loc)
 Helper function to materialize a real value as an SSA value.
 
Value materializeString (const slang::ConstantValue &string, const slang::ast::Type &astType, Location loc)
 Helper function to materialize a string as an SSA value.
 
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 materializeConstant (const slang::ConstantValue &constant, const slang::ast::Type &type, Location loc)
 Helper function to materialize a ConstantValue as an SSA value.
 
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 interpolated into a !moore.format_string value.
 
Value convertSystemCall (const slang::ast::SystemSubroutine &subroutine, Location loc, std::span< const slang::ast::Expression *const > args)
 Convert system function calls.
 
FailureOr< Value > convertAssertionSystemCallArity1 (const slang::ast::SystemSubroutine &subroutine, Location loc, Value value, Type originalType, Value clockVal)
 Convert system function calls within properties and assertion with a single argument.
 
slang::ConstantValue evaluateConstant (const slang::ast::Expression &expr)
 Evaluate the constant value of an expression.
 
Value convertInsideCheck (Value insideLhs, Location loc, const slang::ast::Expression &expr)
 Convert the inside/set-membership expression.
 
void ensureMonitorGlobals ()
 Ensure that the global variables for $monitor state exist.
 
LogicalResult flushPendingMonitors ()
 Process any pending $monitor calls and generate the monitoring procedures at module level.
 

Public Attributes

DenseMap< const slang::ast::CallExpression *, const slang::ast::TimingControl * > assertionCallClocks
 Maps assertion system calls to their corresponding clocks.
 
const ImportVerilogOptionsoptions
 
slang::ast::Compilation & compilation
 
mlir::ModuleOp intoModuleOp
 
const slang::SourceManager & sourceManager
 
OpBuilder builder
 The builder used to create IR operations.
 
SymbolTable symbolTable
 A symbol table of the MLIR module we are emitting into.
 
std::map< LocationKey, Operation * > orderedRootOps
 The top-level operations ordered by their Slang source location.
 
DenseMap< const slang::ast::InstanceBodySymbol *, std::unique_ptr< ModuleLowering > > modules
 How we have lowered modules to MLIR.
 
InterfaceInstances interfaceInstances
 
SmallVector< std::unique_ptr< InterfaceLowering > > interfaceInstanceStorage
 Owning storage for InterfaceLowering objects because ScopedHashTable stores values by copy.
 
DenseMap< const slang::ast::InstanceBodySymbol *, VirtualInterfaceLoweringvirtualIfaceLowerings
 Cached virtual interface layouts (type + field order).
 
DenseMap< const slang::ast::ModportSymbol *, VirtualInterfaceLoweringvirtualIfaceModportLowerings
 
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.
 
std::queue< const slang::ast::SubroutineSymbol * > functionWorklist
 A list of functions for which the declaration has been created, but the body has not been defined yet.
 
DenseMap< const slang::ast::SubroutineSymbol *, std::unique_ptr< FunctionLowering > > functions
 Functions that have already been converted.
 
DenseMap< const slang::ast::ClassType *, std::unique_ptr< ClassLowering > > classes
 Classes that have already been converted.
 
ValueSymbols valueSymbols
 
VirtualInterfaceMembers virtualIfaceMembers
 
DenseMap< const slang::ast::ValueSymbol *, moore::GlobalVariableOp > globalVariables
 A table of defined global variables that may be referred to by name in expressions.
 
SmallVector< const slang::ast::ValueSymbol * > globalVariableWorklist
 A list of global variables that still need their initializers to be converted.
 
CaptureMap functionCaptures
 Pre-computed capture analysis: maps each function to the set of non-local, non-global variables it captures (directly or transitively).
 
DenseMap< const slang::ast::InstanceBodySymbol *, SmallVector< HierPathInfo > > hierPaths
 Collect all hierarchical names used for the per module/instance.
 
DenseMap< std::pair< const slang::ast::InstanceSymbol *, mlir::StringAttr >, Value > hierValueSymbols
 Persistent map for hierarchical value lookups.
 
SmallVector< Value > lvalueStack
 A stack of assignment left-hand side values.
 
SmallVector< LoopFrameloopStack
 A stack of loop continuation and exit blocks.
 
std::function< void(moore::ReadOp)> rvalueReadCallback
 A listener called for every variable or net being read.
 
std::function< void(mlir::Operation *)> variableAssignCallback
 A listener called for every variable or net being assigned.
 
bool isInsideTimingControl = false
 Whether we are currently converting expressions inside a timing control, such as @(posedge clk).
 
slang::TimeScale timeScale
 The time scale currently in effect.
 
Value currentThisRef = {}
 Variable to track the value of the current function's implicit this reference.
 
Value currentQueue = {}
 Variable that tracks the queue which we are currently converting the index expression for.
 
moore::GlobalVariableOp monitorActiveIdGlobal = nullptr
 Global variable ops for $monitor state management.
 
moore::GlobalVariableOp monitorEnabledGlobal = nullptr
 
unsigned nextMonitorId = 1
 The next monitor ID to allocate. ID 0 is reserved for "no monitor active".
 
SmallVector< PendingMonitorpendingMonitors
 Pending $monitor calls that need to be converted at module level.
 

Private Member Functions

FunctionLoweringdeclareCallableImpl (const slang::ast::SubroutineSymbol &subroutine, mlir::StringRef qualifiedName, llvm::SmallVectorImpl< Type > &extraParams)
 Helper function to extract the commonalities in lowering of functions and methods.
 

Detailed Description

A helper class to facilitate the conversion from a Slang AST to MLIR operations.

Keeps track of the destination MLIR module, builders, and various worklists and utilities needed for conversion.

Definition at line 201 of file ImportVerilogInternals.h.

Member Typedef Documentation

◆ InterfaceInstances

using circt::ImportVerilog::Context::InterfaceInstances = llvm::ScopedHashTable<const slang::ast::InstanceSymbol *, InterfaceLowering *>

Expanded interface instances, keyed by the InstanceSymbol pointer.

Each entry maps body members to their expanded SSA values. Scoped per-module so entries are cleaned up when a module's conversion ends.

Definition at line 445 of file ImportVerilogInternals.h.

◆ InterfaceInstanceScope

using circt::ImportVerilog::Context::InterfaceInstanceScope = InterfaceInstances::ScopeTy

Definition at line 448 of file ImportVerilogInternals.h.

◆ ValueSymbols

using circt::ImportVerilog::Context::ValueSymbols = llvm::ScopedHashTable<const slang::ast::ValueSymbol *, Value>

A table of defined values, such as variables, that may be referred to by name in expressions.

The expressions use this table to lookup the MLIR value that was created for a given declaration in the Slang AST node.

Definition at line 479 of file ImportVerilogInternals.h.

◆ ValueSymbolScope

using circt::ImportVerilog::Context::ValueSymbolScope = ValueSymbols::ScopeTy

Definition at line 481 of file ImportVerilogInternals.h.

◆ VirtualInterfaceMembers

using circt::ImportVerilog::Context::VirtualInterfaceMembers = llvm::ScopedHashTable<const slang::ast::ValueSymbol *, VirtualInterfaceMemberAccess>

A table mapping symbols for interface members accessed through a virtual interface to the virtual interface base value symbol.

Definition at line 486 of file ImportVerilogInternals.h.

◆ VirtualInterfaceMemberScope

using circt::ImportVerilog::Context::VirtualInterfaceMemberScope = VirtualInterfaceMembers::ScopeTy

Definition at line 489 of file ImportVerilogInternals.h.

Constructor & Destructor Documentation

◆ Context() [1/2]

circt::ImportVerilog::Context::Context ( const ImportVerilogOptions options,
slang::ast::Compilation &  compilation,
mlir::ModuleOp  intoModuleOp,
const slang::SourceManager &  sourceManager 
)
inline

Definition at line 202 of file ImportVerilogInternals.h.

◆ Context() [2/2]

circt::ImportVerilog::Context::Context ( const Context )
delete

Member Function Documentation

◆ buildClassProperties()

LogicalResult Context::buildClassProperties ( const slang::ast::ClassType &  classdecl)

Definition at line 2395 of file Structure.cpp.

References buildClassProperties(), classes, declareClass(), and timeScale.

Referenced by buildClassProperties().

◆ buildHierValueKey()

std::optional< std::pair< const slang::ast::InstanceSymbol *, mlir::StringAttr > > Context::buildHierValueKey ( const slang::ast::HierarchicalValueExpression &  expr)

Build a composite key for hierValueSymbols from a hierarchical value expression.

Returns {firstInstanceSymbol, dottedHierName} or std::nullopt if the expression has no instance path.

Definition at line 2637 of file Expressions.cpp.

References builder.

◆ convertAssertionCallExpression()

Value Context::convertAssertionCallExpression ( const slang::ast::CallExpression &  expr,
const slang::ast::CallExpression::SystemCallInfo &  info,
Location  loc 
)

◆ convertAssertionExpression()

Value Context::convertAssertionExpression ( const slang::ast::AssertionExpr &  expr,
Location  loc 
)

Definition at line 527 of file AssertionExpr.cpp.

◆ convertAssertionSystemCallArity1()

FailureOr< Value > Context::convertAssertionSystemCallArity1 ( const slang::ast::SystemSubroutine &  subroutine,
Location  loc,
Value  value,
Type  originalType,
Value  clockVal 
)

Convert system function calls within properties and assertion with a single argument.

Definition at line 305 of file AssertionExpr.cpp.

References builder, and hw.ConstantOp::create().

Referenced by convertAssertionCallExpression().

◆ convertCompilation()

LogicalResult Context::convertCompilation ( )

◆ convertFixedPrimitive()

LogicalResult Context::convertFixedPrimitive ( const slang::ast::PrimitiveInstanceSymbol &  prim)

Definition at line 2004 of file Structure.cpp.

References convertLocation(), and convertPullGatePrimitive().

Referenced by convertPrimitiveInstance().

◆ convertFormatString()

FailureOr< Value > Context::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 interpolated into a !moore.format_string value.

Returns failure if an error occurs. Returns a null value if the formatted string is trivially empty. Otherwise returns the formatted string.

Definition at line 308 of file FormatStrings.cpp.

Referenced by flushPendingMonitors().

◆ convertGlobalVariable()

LogicalResult Context::convertGlobalVariable ( const slang::ast::VariableSymbol &  var)

◆ convertInsideCheck()

Value Context::convertInsideCheck ( Value  insideLhs,
Location  loc,
const slang::ast::Expression &  expr 
)

Convert the inside/set-membership expression.

Definition at line 3638 of file Expressions.cpp.

References builder, convertRvalueExpression(), and convertToSimpleBitVector().

◆ convertLocation() [1/2]

Location Context::convertLocation ( slang::SourceLocation  loc)

◆ convertLocation() [2/2]

Location Context::convertLocation ( slang::SourceRange  range)

Convert a slang SourceRange into an MLIR Location.

Definition at line 95 of file ImportVerilog.cpp.

References getContext(), and sourceManager.

◆ convertLTLTimingControl()

Value Context::convertLTLTimingControl ( const slang::ast::TimingControl &  ctrl,
const Value &  seqOrPro 
)

Definition at line 267 of file TimingControls.cpp.

References builder, and convertLocation().

◆ convertLvalueExpression()

Value Context::convertLvalueExpression ( const slang::ast::Expression &  expr)

◆ convertModuleBody()

LogicalResult Context::convertModuleBody ( const slang::ast::InstanceBodySymbol *  module)

Convert a module's body to the corresponding IR ops.

The module op must have already been created earlier through a convertModuleHeader call. module must be the canonical module body if there is one.

Definition at line 1233 of file Structure.cpp.

References builder, flushPendingMonitors(), hierPaths, interfaceInstances, interfaceInstanceStorage, modules, circt::hw::ModulePort::Output, timeScale, valueSymbols, and virtualIfaceMembers.

Referenced by convertCompilation().

◆ convertModuleHeader()

ModuleLowering * Context::convertModuleHeader ( const slang::ast::InstanceBodySymbol *  module)

Convert a module and its ports to an empty module op in the IR.

Also adds the op to the worklist of module bodies to be lowered. This acts like a module "declaration", allowing instances to already refer to a module even before its body has been lowered. module must be the canonical module body if there is one.

Definition at line 1016 of file Structure.cpp.

References builder, convertLocation(), convertType(), circt::hw::ModulePort::Input, modules, circt::hw::ModulePort::Output, and timeScale.

Referenced by convertCompilation().

◆ convertNInputPrimitive()

LogicalResult Context::convertNInputPrimitive ( const slang::ast::PrimitiveInstanceSymbol &  prim)

◆ convertNOutputPrimitive()

LogicalResult Context::convertNOutputPrimitive ( const slang::ast::PrimitiveInstanceSymbol &  prim)

◆ convertPackage()

LogicalResult Context::convertPackage ( const slang::ast::PackageSymbol &  package)

Convert a package and its contents.

Definition at line 1400 of file Structure.cpp.

References builder, convertLocation(), intoModuleOp, timeScale, and valueSymbols.

◆ convertPrimitiveInstance()

LogicalResult Context::convertPrimitiveInstance ( const slang::ast::PrimitiveInstanceSymbol &  prim)

Convert a primitive instance.

Definition at line 1796 of file Structure.cpp.

References convertFixedPrimitive(), convertLocation(), convertNInputPrimitive(), and convertNOutputPrimitive().

◆ convertPullGatePrimitive()

LogicalResult Context::convertPullGatePrimitive ( const slang::ast::PrimitiveInstanceSymbol &  prim)

◆ convertRvalueExpression()

Value Context::convertRvalueExpression ( const slang::ast::Expression &  expr,
Type  requiredType = {} 
)

◆ convertStatement()

LogicalResult Context::convertStatement ( const slang::ast::Statement &  stmt)

Definition at line 1289 of file Statements.cpp.

References assert(), builder, and convertLocation().

Referenced by convertTimingControl(), and defineFunction().

◆ convertSystemCall()

Value Context::convertSystemCall ( const slang::ast::SystemSubroutine &  subroutine,
Location  loc,
std::span< const slang::ast::Expression *const >  args 
)

Convert system function calls.

Returns a null Value on failure after emitting an error.

Definition at line 3194 of file Expressions.cpp.

References assert(), builder, convertLvalueExpression(), convertRvalueExpression(), convertToSimpleBitVector(), convertType(), getContext(), and materializeConversion().

◆ convertTimingControl() [1/2]

LogicalResult Context::convertTimingControl ( const slang::ast::TimingControl &  ctrl)

Definition at line 213 of file TimingControls.cpp.

References handleRoot().

◆ convertTimingControl() [2/2]

LogicalResult Context::convertTimingControl ( const slang::ast::TimingControl &  ctrl,
const slang::ast::Statement &  stmt 
)

◆ convertToBool() [1/2]

Value Context::convertToBool ( Value  value)

Helper function to convert a value to its "truthy" boolean value.

Definition at line 2682 of file Expressions.cpp.

References builder.

Referenced by convertToBool().

◆ convertToBool() [2/2]

Value Context::convertToBool ( Value  value,
Domain  domain 
)

Helper function to convert a value to its "truthy" boolean value and convert it to the given domain.

Definition at line 2857 of file Expressions.cpp.

References convertToBool(), getContext(), and materializeConversion().

◆ convertToI1()

Value Context::convertToI1 ( Value  value)

Helper function to convert a value to a MLIR I1 value.

Helper function to convert a value to an i1 value.

Definition at line 535 of file AssertionExpr.cpp.

References builder.

Referenced by convertAssertionCallExpression().

◆ convertToSimpleBitVector()

Value Context::convertToSimpleBitVector ( Value  value)

Helper function to convert a value to its simple bit vector representation, if it has one.

Otherwise returns null. Also returns null if the given value is null.

Definition at line 2865 of file Expressions.cpp.

References materializeConversion().

Referenced by convertInsideCheck(), and convertSystemCall().

◆ convertType() [1/2]

Type Context::convertType ( const slang::ast::DeclaredType &  type)

Definition at line 230 of file Types.cpp.

References convertLocation(), and convertType().

◆ convertType() [2/2]

Type Context::convertType ( const slang::ast::Type &  type,
LocationAttr  loc = {} 
)

Convert a slang type into an MLIR type.

Returns null on failure. Uses the provided location for error reporting, or tries to guess one from the given type. Types tend to have unreliable location information, so it's generally a good idea to pass in a location.

Definition at line 224 of file Types.cpp.

References convertLocation().

Referenced by convertGlobalVariable(), convertModuleHeader(), convertSystemCall(), convertType(), convertVirtualInterfaceType(), declareCallableImpl(), defineFunction(), materializeFixedSizeUnpackedArrayType(), and materializeSVInt().

◆ convertVirtualInterfaceType()

FailureOr< moore::UnpackedStructType > Context::convertVirtualInterfaceType ( const slang::ast::VirtualInterfaceType &  type,
Location  loc 
)

Convert a Slang virtual interface type into the Moore type used to represent virtual interface handles.

Populates internal caches so that interface instance references can be materialized consistently.

Definition at line 238 of file Types.cpp.

References builder, convertLocation(), convertType(), getContext(), virtualIfaceLowerings, and virtualIfaceModportLowerings.

Referenced by materializeVirtualInterfaceValue().

◆ declareCallableImpl()

FunctionLowering * Context::declareCallableImpl ( const slang::ast::SubroutineSymbol &  subroutine,
mlir::StringRef  qualifiedName,
llvm::SmallVectorImpl< Type > &  extraParams 
)
private

Helper function to extract the commonalities in lowering of functions and methods.

Convert a function and its arguments to a function declaration in the IR.

This does not convert the function body.

Definition at line 1554 of file Structure.cpp.

References builder, convertLocation(), convertType(), functionCaptures, functions, functionWorklist, circt::ImportVerilog::LocationKey::get(), getContext(), getDPISignature(), getFunctionSignature(), intoModuleOp, orderedRootOps, sourceManager, and symbolTable.

Referenced by declareFunction().

◆ declareClass()

ClassLowering * Context::declareClass ( const slang::ast::ClassType &  cls)

◆ declareFunction()

FunctionLowering * Context::declareFunction ( const slang::ast::SubroutineSymbol &  subroutine)

Convert a function and its arguments to a function declaration in the IR.

This does not convert the function body.

Definition at line 1421 of file Structure.cpp.

References classes, convertLocation(), declareCallableImpl(), functions, getContext(), and guessNamespacePrefix().

◆ defineFunction()

LogicalResult Context::defineFunction ( const slang::ast::SubroutineSymbol &  subroutine)

Define a function’s body.

The function must already have been declared via declareFunction. This is called from the function worklist after all declarations have been created, ensuring that all function prototypes are available for calls within the body.

Definition at line 1641 of file Structure.cpp.

References builder, convertLocation(), convertStatement(), convertType(), currentThisRef, functions, registerVirtualInterfaceMembers(), timeScale, valueSymbols, and virtualIfaceMembers.

Referenced by convertCompilation().

◆ ensureMonitorGlobals()

void Context::ensureMonitorGlobals ( )

Ensure that the global variables for $monitor state exist.

This creates the __monitor_active_id and __monitor_enabled globals on first call.

Definition at line 1300 of file Statements.cpp.

References builder, getContext(), intoModuleOp, monitorActiveIdGlobal, monitorEnabledGlobal, symbolTable, and circt::moore::TwoValued.

◆ evaluateConstant()

slang::ConstantValue Context::evaluateConstant ( const slang::ast::Expression &  expr)

Evaluate the constant value of an expression.

Definition at line 2846 of file Expressions.cpp.

References compilation.

◆ flushPendingMonitors()

LogicalResult Context::flushPendingMonitors ( )

Process any pending $monitor calls and generate the monitoring procedures at module level.

Definition at line 1340 of file Statements.cpp.

References builder, convertFormatString(), getContext(), monitorActiveIdGlobal, monitorEnabledGlobal, and pendingMonitors.

Referenced by convertModuleBody().

◆ getAncestorClassWithProperty()

moore::ClassHandleType Context::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.

The location is used for error reporting.

Definition at line 3600 of file Expressions.cpp.

References resolve().

◆ getContext()

MLIRContext * circt::ImportVerilog::Context::getContext ( )
inline

◆ getImplicitThisRef()

Value circt::ImportVerilog::Context::getImplicitThisRef ( ) const
inline

Definition at line 283 of file ImportVerilogInternals.h.

References currentThisRef.

◆ getIndexedQueue()

Value circt::ImportVerilog::Context::getIndexedQueue ( ) const
inline

Definition at line 295 of file ImportVerilogInternals.h.

References currentQueue.

◆ isClassDerivedFrom()

bool Context::isClassDerivedFrom ( const moore::ClassHandleType &  actualTy,
const moore::ClassHandleType &  baseTy 
)

Checks whether one class (actualTy) is derived from another class (baseTy).

True if it's a subclass, false otherwise.

Definition at line 3574 of file Expressions.cpp.

References resolve().

◆ materializeClassMethods()

LogicalResult Context::materializeClassMethods ( const slang::ast::ClassType &  classdecl)

Definition at line 2423 of file Structure.cpp.

References classes, materializeClassMethods(), and timeScale.

Referenced by convertCompilation(), and materializeClassMethods().

◆ materializeConstant()

Value Context::materializeConstant ( const slang::ConstantValue &  constant,
const slang::ast::Type &  type,
Location  loc 
)

Helper function to materialize a ConstantValue as an SSA value.

Returns null if the constant cannot be materialized.

Definition at line 2830 of file Expressions.cpp.

References materializeFixedSizeUnpackedArrayType(), materializeString(), materializeSVInt(), and materializeSVReal().

◆ materializeConversion()

Value Context::materializeConversion ( Type  type,
Value  value,
bool  isSigned,
Location  loc,
bool  fallible = false 
)

Helper function to insert the necessary operations to cast a value from one type to another.

If fallible is true, conversion failures are reported by returning a null value without emitting diagnostics.

Definition at line 2994 of file Expressions.cpp.

References assert(), builder, circt::moore::f32, circt::moore::FourValued, getContext(), getTimeScaleInFemtoseconds(), materializeConversion(), materializePackedToSBVConversion(), materializeSBVToPackedConversion(), maybeUpcastHandle(), and circt::moore::TwoValued.

Referenced by convertNInputPrimitive(), convertNOutputPrimitive(), convertPullGatePrimitive(), convertRvalueExpression(), convertSystemCall(), convertToBool(), convertToSimpleBitVector(), materializeConversion(), and materializeSVInt().

◆ materializeFixedSizeUnpackedArrayType()

Value Context::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.

Definition at line 2757 of file Expressions.cpp.

References builder, convertSVIntToFVInt(), convertType(), circt::moore::FourValued, getContext(), materializeString(), and circt::moore::TwoValued.

Referenced by materializeConstant().

◆ materializeString()

Value Context::materializeString ( const slang::ConstantValue &  string,
const slang::ast::Type &  astType,
Location  loc 
)

Helper function to materialize a string as an SSA value.

Materialize a Slang string literal as a literal string constant op.

Definition at line 2718 of file Expressions.cpp.

References builder, and getContext().

Referenced by materializeConstant(), and materializeFixedSizeUnpackedArrayType().

◆ materializeSVInt()

Value Context::materializeSVInt ( const slang::SVInt &  svint,
const slang::ast::Type &  type,
Location  loc 
)

Helper function to materialize an SVInt as an SSA value.

Materialize a Slang integer literal as a constant op.

Definition at line 2738 of file Expressions.cpp.

References builder, convertSVIntToFVInt(), convertType(), circt::moore::FourValued, getContext(), materializeConversion(), and circt::moore::TwoValued.

Referenced by materializeConstant().

◆ materializeSVReal()

Value Context::materializeSVReal ( const slang::ConstantValue &  svreal,
const slang::ast::Type &  type,
Location  loc 
)

Helper function to materialize a real value as an SSA value.

Materialize a Slang real literal as a constant op.

Definition at line 2696 of file Expressions.cpp.

References assert(), and builder.

Referenced by materializeConstant().

◆ materializeVirtualInterfaceValue()

FailureOr< Value > Context::materializeVirtualInterfaceValue ( const slang::ast::VirtualInterfaceType &  type,
Location  loc 
)

Materialize a Moore value representing a concrete interface instance as a virtual interface handle.

This only succeeds for the Slang VirtualInterfaceType wrappers that refer to a real interface instance (isRealIface).

Definition at line 357 of file Types.cpp.

References builder, convertLocation(), convertLvalueExpression(), convertVirtualInterfaceType(), interfaceInstances, valueSymbols, virtualIfaceLowerings, and virtualIfaceModportLowerings.

◆ populateAssertionClocks()

void Context::populateAssertionClocks ( )

Generates a map from assertions to clocks using Slang's analysis.

Definition at line 579 of file AssertionExpr.cpp.

References compilation.

Referenced by convertCompilation().

◆ registerVirtualInterfaceMembers()

LogicalResult Context::registerVirtualInterfaceMembers ( const slang::ast::ValueSymbol &  base,
const slang::ast::VirtualInterfaceType &  type,
Location  loc 
)

Register the interface members of a virtual interface base symbol for use in later expression conversion.

Definition at line 474 of file Types.cpp.

References circt::ImportVerilog::VirtualInterfaceMemberAccess::base, builder, convertLocation(), circt::ImportVerilog::VirtualInterfaceMemberAccess::fieldName, and virtualIfaceMembers.

Referenced by defineFunction().

◆ traverseInstanceBody()

void Context::traverseInstanceBody ( const slang::ast::InstanceSymbol &  symbol)

Definition at line 143 of file HierarchicalNames.cpp.

Referenced by convertCompilation().

Member Data Documentation

◆ assertionCallClocks

DenseMap<const slang::ast::CallExpression *, const slang::ast::TimingControl *> circt::ImportVerilog::Context::assertionCallClocks

Maps assertion system calls to their corresponding clocks.

Definition at line 290 of file ImportVerilogInternals.h.

Referenced by convertAssertionCallExpression().

◆ builder

OpBuilder circt::ImportVerilog::Context::builder

◆ classes

DenseMap<const slang::ast::ClassType *, std::unique_ptr<ClassLowering> > circt::ImportVerilog::Context::classes

Classes that have already been converted.

Definition at line 474 of file ImportVerilogInternals.h.

Referenced by buildClassProperties(), convertCompilation(), declareClass(), declareFunction(), and materializeClassMethods().

◆ compilation

slang::ast::Compilation& circt::ImportVerilog::Context::compilation

◆ currentQueue

Value circt::ImportVerilog::Context::currentQueue = {}

Variable that tracks the queue which we are currently converting the index expression for.

This is necessary to implement the $ operator, which returns the index of the last element of the queue.

Definition at line 557 of file ImportVerilogInternals.h.

Referenced by getIndexedQueue().

◆ currentThisRef

Value circt::ImportVerilog::Context::currentThisRef = {}

Variable to track the value of the current function's implicit this reference.

Definition at line 552 of file ImportVerilogInternals.h.

Referenced by defineFunction(), and getImplicitThisRef().

◆ functionCaptures

CaptureMap circt::ImportVerilog::Context::functionCaptures

Pre-computed capture analysis: maps each function to the set of non-local, non-global variables it captures (directly or transitively).

Definition at line 502 of file ImportVerilogInternals.h.

Referenced by convertCompilation(), and declareCallableImpl().

◆ functions

DenseMap<const slang::ast::SubroutineSymbol *, std::unique_ptr<FunctionLowering> > circt::ImportVerilog::Context::functions

Functions that have already been converted.

Definition at line 470 of file ImportVerilogInternals.h.

Referenced by declareCallableImpl(), declareFunction(), and defineFunction().

◆ functionWorklist

std::queue<const slang::ast::SubroutineSymbol *> circt::ImportVerilog::Context::functionWorklist

A list of functions for which the declaration has been created, but the body has not been defined yet.

Definition at line 465 of file ImportVerilogInternals.h.

Referenced by convertCompilation(), and declareCallableImpl().

◆ globalVariables

DenseMap<const slang::ast::ValueSymbol *, moore::GlobalVariableOp> circt::ImportVerilog::Context::globalVariables

A table of defined global variables that may be referred to by name in expressions.

Definition at line 495 of file ImportVerilogInternals.h.

Referenced by convertCompilation(), and convertGlobalVariable().

◆ globalVariableWorklist

SmallVector<const slang::ast::ValueSymbol *> circt::ImportVerilog::Context::globalVariableWorklist

A list of global variables that still need their initializers to be converted.

Definition at line 498 of file ImportVerilogInternals.h.

Referenced by convertCompilation(), and convertGlobalVariable().

◆ hierPaths

DenseMap<const slang::ast::InstanceBodySymbol *, SmallVector<HierPathInfo> > circt::ImportVerilog::Context::hierPaths

Collect all hierarchical names used for the per module/instance.

The keys are the slang canonical instance bodies (or the real instance if slang's getCanonicalBody() returned null).

Definition at line 508 of file ImportVerilogInternals.h.

Referenced by convertModuleBody().

◆ hierValueSymbols

DenseMap<std::pair<const slang::ast::InstanceSymbol *, mlir::StringAttr>, Value> circt::ImportVerilog::Context::hierValueSymbols

Persistent map for hierarchical value lookups.

Keyed by a composite of the instance symbol (the specific instance being wired, e.g., p1 or p2) and the hierarchical path name (e.g., "child.child_val"). This ensures instance-specific resolution even when Slang shares or doesn't share instance bodies across multiple instances of the same module.

Definition at line 517 of file ImportVerilogInternals.h.

◆ interfaceInstances

InterfaceInstances circt::ImportVerilog::Context::interfaceInstances

◆ interfaceInstanceStorage

SmallVector<std::unique_ptr<InterfaceLowering> > circt::ImportVerilog::Context::interfaceInstanceStorage

Owning storage for InterfaceLowering objects because ScopedHashTable stores values by copy.

Definition at line 452 of file ImportVerilogInternals.h.

Referenced by convertModuleBody().

◆ intoModuleOp

mlir::ModuleOp circt::ImportVerilog::Context::intoModuleOp

◆ isInsideTimingControl

bool circt::ImportVerilog::Context::isInsideTimingControl = false

Whether we are currently converting expressions inside a timing control, such as @(posedge clk).

This is used by the implicit event control callback to avoid adding reads from explicit event controls to the implicit sensitivity list.

Definition at line 545 of file ImportVerilogInternals.h.

Referenced by convertTimingControl().

◆ loopStack

SmallVector<LoopFrame> circt::ImportVerilog::Context::loopStack

A stack of loop continuation and exit blocks.

Each loop will push the relevant info onto this stack, lower its loop body statements, and pop the info off the stack again. Continue and break statements encountered as part of the loop body statements will use this information to branch to the correct block.

Definition at line 530 of file ImportVerilogInternals.h.

◆ lvalueStack

SmallVector<Value> circt::ImportVerilog::Context::lvalueStack

A stack of assignment left-hand side values.

Each assignment will push its lowered left-hand side onto this stack before lowering its right-hand side. This allows expressions to resolve the opaque LValueReferenceExpressions in the AST.

Definition at line 523 of file ImportVerilogInternals.h.

◆ modules

DenseMap<const slang::ast::InstanceBodySymbol *, std::unique_ptr<ModuleLowering> > circt::ImportVerilog::Context::modules

How we have lowered modules to MLIR.

The keys must be the slang canonical module bodies where they exist.

Definition at line 440 of file ImportVerilogInternals.h.

Referenced by convertModuleBody(), and convertModuleHeader().

◆ moduleWorklist

std::queue<const slang::ast::InstanceBodySymbol *> circt::ImportVerilog::Context::moduleWorklist

A list of modules for which the header has been created, but the body has not been converted yet.

Definition at line 461 of file ImportVerilogInternals.h.

Referenced by convertCompilation().

◆ monitorActiveIdGlobal

moore::GlobalVariableOp circt::ImportVerilog::Context::monitorActiveIdGlobal = nullptr

Global variable ops for $monitor state management.

These are created on demand by ensureMonitorGlobals().

Definition at line 569 of file ImportVerilogInternals.h.

Referenced by ensureMonitorGlobals(), and flushPendingMonitors().

◆ monitorEnabledGlobal

moore::GlobalVariableOp circt::ImportVerilog::Context::monitorEnabledGlobal = nullptr

Definition at line 570 of file ImportVerilogInternals.h.

Referenced by ensureMonitorGlobals(), and flushPendingMonitors().

◆ nextMonitorId

unsigned circt::ImportVerilog::Context::nextMonitorId = 1

The next monitor ID to allocate. ID 0 is reserved for "no monitor active".

Definition at line 573 of file ImportVerilogInternals.h.

◆ options

const ImportVerilogOptions& circt::ImportVerilog::Context::options

Definition at line 422 of file ImportVerilogInternals.h.

◆ orderedRootOps

std::map<LocationKey, Operation *> circt::ImportVerilog::Context::orderedRootOps

The top-level operations ordered by their Slang source location.

This is used to produce IR that follows the source file order.

Definition at line 434 of file ImportVerilogInternals.h.

Referenced by convertGlobalVariable(), declareCallableImpl(), and declareClass().

◆ pendingMonitors

SmallVector<PendingMonitor> circt::ImportVerilog::Context::pendingMonitors

Pending $monitor calls that need to be converted at module level.

Definition at line 584 of file ImportVerilogInternals.h.

Referenced by flushPendingMonitors().

◆ rvalueReadCallback

std::function<void(moore::ReadOp)> circt::ImportVerilog::Context::rvalueReadCallback

A listener called for every variable or net being read.

This can be used to collect all variables read as part of an expression or statement, for example to populate the list of observed signals in an implicit event control @*.

Definition at line 536 of file ImportVerilogInternals.h.

Referenced by convertTimingControl().

◆ sourceManager

const slang::SourceManager& circt::ImportVerilog::Context::sourceManager

◆ symbolTable

SymbolTable circt::ImportVerilog::Context::symbolTable

A symbol table of the MLIR module we are emitting into.

Definition at line 430 of file ImportVerilogInternals.h.

Referenced by convertGlobalVariable(), declareCallableImpl(), declareClass(), and ensureMonitorGlobals().

◆ timeScale

slang::TimeScale circt::ImportVerilog::Context::timeScale

◆ valueSymbols

ValueSymbols circt::ImportVerilog::Context::valueSymbols

◆ variableAssignCallback

std::function<void(mlir::Operation *)> circt::ImportVerilog::Context::variableAssignCallback

A listener called for every variable or net being assigned.

This can be used to collect all variables assigned in a task scope.

Definition at line 539 of file ImportVerilogInternals.h.

◆ virtualIfaceLowerings

DenseMap<const slang::ast::InstanceBodySymbol *, VirtualInterfaceLowering> circt::ImportVerilog::Context::virtualIfaceLowerings

Cached virtual interface layouts (type + field order).

Definition at line 456 of file ImportVerilogInternals.h.

Referenced by convertVirtualInterfaceType(), and materializeVirtualInterfaceValue().

◆ virtualIfaceMembers

VirtualInterfaceMembers circt::ImportVerilog::Context::virtualIfaceMembers

◆ virtualIfaceModportLowerings

DenseMap<const slang::ast::ModportSymbol *, VirtualInterfaceLowering> circt::ImportVerilog::Context::virtualIfaceModportLowerings

The documentation for this struct was generated from the following files: