slang::netlist::DataFlowAnalysis struct

A data flow analysis used as part of the netlist graph construction.

Public types

using ParentAnalysis = analysis::AbstractFlowAnalysis<DataFlowAnalysis, AnalysisState>

Public static functions

static auto unreachableState() -> AnalysisState
static auto topState() -> AnalysisState

Constructors, destructors, conversion operators

DataFlowAnalysis(analysis::AnalysisManager& analysisManager, const ast::Symbol& symbol, NetlistGraph& graph, NetlistNode* externalNode = nullptr)

Public functions

auto getState() -> AnalysisState&
auto getState() const -> AnalysisState const&
auto saveLValueFlag() -> auto
void updateDefinitions(ast::ValueSymbol const& symbol, std::pair<uint64_t, uint64_t> bounds, NetlistNode* node)
void addNonBlockingLvalue(const ast::ValueSymbol* symbol, std::pair<uint64_t, uint64_t> bounds, NetlistNode* node)
auto processNonBlockingLvalues() -> auto
void handleRvalue(const ast::ValueSymbol& symbol, std::pair<uint32_t, uint32_t> bounds)
auto finalize() -> auto
auto handleLvalue(const ast::ValueSymbol& symbol, const ast::Expression& lsp, std::pair<uint32_t, uint32_t> bounds) -> auto
void noteReference(const ast::ValueSymbol& symbol, const ast::Expression& lsp)
template<typename T>
void handle(const T& expr)
template<typename T>
void handle(const T& expr)
void updateNode(NetlistNode* node, bool conditional)
void handle(const ast::ProceduralAssignStatement& stmt)
void handle(const ast::AssignmentExpression& expr)
void handle(ast::ConditionalStatement const& stmt)
void handle(ast::CaseStatement const& stmt)
auto mergeStates(AnalysisState const& a, AnalysisState const& b) -> auto
void joinState(AnalysisState& result, const AnalysisState& other)
void meetState(AnalysisState& result, const AnalysisState& other)
auto copyState(const AnalysisState& source) -> AnalysisState

Public variables

analysis::AnalysisManager& analysisManager
BumpAllocator allocator
SymbolDriverMap::allocator_type bitMapAllocator
SymbolLSPMap::allocator_type lspMapAllocator
SymbolSlotMap symbolToSlot
std::vector<const ast::ValueSymbol*> slotToSymbol
ast::LSPVisitor<DataFlowAnalysis> lspVisitor
bool isLValue
bool isBlocking
bool prohibitLValue
NetlistGraph& graph
NetlistNode* externalNode
std::vector<PendingRvalue> pendingLValues

Function documentation

void slang::netlist::DataFlowAnalysis::updateDefinitions(ast::ValueSymbol const& symbol, std::pair<uint64_t, uint64_t> bounds, NetlistNode* node)

Update the current state definitions for an L-value symbol with the specified bounds.

void slang::netlist::DataFlowAnalysis::addNonBlockingLvalue(const ast::ValueSymbol* symbol, std::pair<uint64_t, uint64_t> bounds, NetlistNode* node)

Add a non-blocking L-value to a pending list to be processed at the end of the block.

auto slang::netlist::DataFlowAnalysis::processNonBlockingLvalues()

Process all pending non-blocking L-values by updating the final definitions of the block.

auto slang::netlist::DataFlowAnalysis::finalize()

Finalize the analysis by processing any pending non-blocking L-values. This should be called after the main analysis has completed.

void slang::netlist::DataFlowAnalysis::noteReference(const ast::ValueSymbol& symbol, const ast::Expression& lsp)

As per DataFlowAnalysis in upstream slang, but with custom handling of L- and R-values. Called by the LSP visitor.