struct
#include <netlist/DataFlowAnalysis.hpp>
DataFlowAnalysis 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.