User Guide
nmodl::visitor::PerfVisitor Class Reference

Visitor for measuring performance related information More...

Detailed Description

Visitor for measuring performance related information

This visitor used to visit the ast and associated symbol tables to measure the performance of every block in nmodl file. For every symbol in associated symbol table, read/write count is updated which will be used during code generation (to select memory types). Certain statements like useion, valence etc. are not executed in the translated C code and hence need to be skipped (i.e. without visiting children). Note that this pass must be run after symbol table generation pass.

Todo:
  • To measure the performance of statements like if, elseif and else, we have to find maximum performance from if,elseif,else and then use it to calculate total performance. In the current implementation we are doing sum of all blocks. We need to override IfStatement (which has all sub-blocks) and get maximum performance of all statements recursively.
  • In order to avoid empty implementations and checking start_measurement, there should be "empty" ast visitor from which PerfVisitor should be inherited.

Definition at line 58 of file perf_visitor.hpp.

#include <perf_visitor.hpp>

Inheritance diagram for nmodl::visitor::PerfVisitor:
nmodl::visitor::ConstAstVisitor nmodl::visitor::ConstVisitor

Public Member Functions

 PerfVisitor ()=default
 
 PerfVisitor (const std::string &filename)
 
void compact_json (bool flag)
 
const utils::PerfStatget_total_perfstat () const noexcept
 
int get_instance_variable_count () const noexcept
 
int get_const_instance_variable_count () const noexcept
 
int get_const_global_variable_count () const noexcept
 
int get_global_variable_count () const noexcept
 
int get_state_variable_count () const noexcept
 
void visit_binary_expression (const ast::BinaryExpression &node) override
 count math operations from all binary expressions More...
 
void visit_function_call (const ast::FunctionCall &node) override
 count function calls and "most useful" or "commonly used" math functions More...
 
void visit_name (const ast::Name &node) override
 every variable used is of type name, update counters More...
 
void visit_prime_name (const ast::PrimeName &node) override
 prime name derived from identifier and hence need to be handled here More...
 
void visit_solve_block (const ast::SolveBlock &node) override
 solve is not a statement but could have associated block and hence could/should not be skipped completely we can't ignore the block because it could have associated statement block (in theory) More...
 
void visit_statement_block (const ast::StatementBlock &node) override
 Blocks like function can have multiple statement blocks and blocks like net receive has nested initial blocks. More...
 
void visit_unary_expression (const ast::UnaryExpression &node) override
 visit node of type ast::UnaryExpression More...
 
void visit_if_statement (const ast::IfStatement &node) override
 visit node of type ast::IfStatement More...
 
void visit_else_if_statement (const ast::ElseIfStatement &node) override
 visit node of type ast::ElseIfStatement More...
 
void visit_program (const ast::Program &node) override
 visit node of type ast::Program More...
 
void visit_initial_block (const ast::InitialBlock &node) override
 skip initial block under net_receive block More...
 
void visit_constructor_block (const ast::ConstructorBlock &node) override
 visit node of type ast::ConstructorBlock More...
 
void visit_destructor_block (const ast::DestructorBlock &node) override
 visit node of type ast::DestructorBlock More...
 
void visit_derivative_block (const ast::DerivativeBlock &node) override
 visit node of type ast::DerivativeBlock More...
 
void visit_linear_block (const ast::LinearBlock &node) override
 visit node of type ast::LinearBlock More...
 
void visit_non_linear_block (const ast::NonLinearBlock &node) override
 visit node of type ast::NonLinearBlock More...
 
void visit_discrete_block (const ast::DiscreteBlock &node) override
 visit node of type ast::DiscreteBlock More...
 
void visit_function_table_block (const ast::FunctionTableBlock &node) override
 visit node of type ast::FunctionTableBlock More...
 
void visit_function_block (const ast::FunctionBlock &node) override
 visit node of type ast::FunctionBlock More...
 
void visit_procedure_block (const ast::ProcedureBlock &node) override
 visit node of type ast::ProcedureBlock More...
 
void visit_net_receive_block (const ast::NetReceiveBlock &node) override
 visit node of type ast::NetReceiveBlock More...
 
void visit_breakpoint_block (const ast::BreakpointBlock &node) override
 visit node of type ast::BreakpointBlock More...
 
void visit_before_block (const ast::BeforeBlock &node) override
 visit node of type ast::BeforeBlock More...
 
void visit_after_block (const ast::AfterBlock &node) override
 visit node of type ast::AfterBlock More...
 
void visit_ba_block (const ast::BABlock &node) override
 visit node of type ast::BABlock More...
 
void visit_for_netcon (const ast::ForNetcon &node) override
 visit node of type ast::ForNetcon More...
 
void visit_kinetic_block (const ast::KineticBlock &node) override
 visit node of type ast::KineticBlock More...
 
void visit_conductance_hint (const ast::ConductanceHint &) override
 certain constructs needs to be excluded from usage counting and hence need to provide empty implementations More...
 
void visit_local_list_statement (const ast::LocalListStatement &) override
 visit node of type ast::LocalListStatement More...
 
void visit_suffix (const ast::Suffix &) override
 visit node of type ast::Suffix More...
 
void visit_useion (const ast::Useion &) override
 visit node of type ast::Useion More...
 
void visit_valence (const ast::Valence &) override
 visit node of type ast::Valence More...
 
void print (std::ostream &ss) const
 
- Public Member Functions inherited from nmodl::visitor::ConstAstVisitor
void visit_node (const ast::Node &node) override
 visit node of type ast::Node More...
 
void visit_statement (const ast::Statement &node) override
 visit node of type ast::Statement More...
 
void visit_expression (const ast::Expression &node) override
 visit node of type ast::Expression More...
 
void visit_block (const ast::Block &node) override
 visit node of type ast::Block More...
 
void visit_identifier (const ast::Identifier &node) override
 visit node of type ast::Identifier More...
 
void visit_number (const ast::Number &node) override
 visit node of type ast::Number More...
 
void visit_string (const ast::String &node) override
 visit node of type ast::String More...
 
void visit_integer (const ast::Integer &node) override
 visit node of type ast::Integer More...
 
void visit_float (const ast::Float &node) override
 visit node of type ast::Float More...
 
void visit_double (const ast::Double &node) override
 visit node of type ast::Double More...
 
void visit_boolean (const ast::Boolean &node) override
 visit node of type ast::Boolean More...
 
void visit_name (const ast::Name &node) override
 visit node of type ast::Name More...
 
void visit_prime_name (const ast::PrimeName &node) override
 visit node of type ast::PrimeName More...
 
void visit_indexed_name (const ast::IndexedName &node) override
 visit node of type ast::IndexedName More...
 
void visit_var_name (const ast::VarName &node) override
 visit node of type ast::VarName More...
 
void visit_argument (const ast::Argument &node) override
 visit node of type ast::Argument More...
 
void visit_react_var_name (const ast::ReactVarName &node) override
 visit node of type ast::ReactVarName More...
 
void visit_read_ion_var (const ast::ReadIonVar &node) override
 visit node of type ast::ReadIonVar More...
 
void visit_write_ion_var (const ast::WriteIonVar &node) override
 visit node of type ast::WriteIonVar More...
 
void visit_nonspecific_cur_var (const ast::NonspecificCurVar &node) override
 visit node of type ast::NonspecificCurVar More...
 
void visit_electrode_cur_var (const ast::ElectrodeCurVar &node) override
 visit node of type ast::ElectrodeCurVar More...
 
void visit_range_var (const ast::RangeVar &node) override
 visit node of type ast::RangeVar More...
 
void visit_global_var (const ast::GlobalVar &node) override
 visit node of type ast::GlobalVar More...
 
void visit_pointer_var (const ast::PointerVar &node) override
 visit node of type ast::PointerVar More...
 
void visit_random_var (const ast::RandomVar &node) override
 visit node of type ast::RandomVar More...
 
void visit_bbcore_pointer_var (const ast::BbcorePointerVar &node) override
 visit node of type ast::BbcorePointerVar More...
 
void visit_extern_var (const ast::ExternVar &node) override
 visit node of type ast::ExternVar More...
 
void visit_param_block (const ast::ParamBlock &node) override
 visit node of type ast::ParamBlock More...
 
void visit_independent_block (const ast::IndependentBlock &node) override
 visit node of type ast::IndependentBlock More...
 
void visit_assigned_block (const ast::AssignedBlock &node) override
 visit node of type ast::AssignedBlock More...
 
void visit_state_block (const ast::StateBlock &node) override
 visit node of type ast::StateBlock More...
 
void visit_initial_block (const ast::InitialBlock &node) override
 visit node of type ast::InitialBlock More...
 
void visit_constructor_block (const ast::ConstructorBlock &node) override
 visit node of type ast::ConstructorBlock More...
 
void visit_destructor_block (const ast::DestructorBlock &node) override
 visit node of type ast::DestructorBlock More...
 
void visit_statement_block (const ast::StatementBlock &node) override
 visit node of type ast::StatementBlock More...
 
void visit_derivative_block (const ast::DerivativeBlock &node) override
 visit node of type ast::DerivativeBlock More...
 
void visit_linear_block (const ast::LinearBlock &node) override
 visit node of type ast::LinearBlock More...
 
void visit_non_linear_block (const ast::NonLinearBlock &node) override
 visit node of type ast::NonLinearBlock More...
 
void visit_discrete_block (const ast::DiscreteBlock &node) override
 visit node of type ast::DiscreteBlock More...
 
void visit_function_table_block (const ast::FunctionTableBlock &node) override
 visit node of type ast::FunctionTableBlock More...
 
void visit_function_block (const ast::FunctionBlock &node) override
 visit node of type ast::FunctionBlock More...
 
void visit_procedure_block (const ast::ProcedureBlock &node) override
 visit node of type ast::ProcedureBlock More...
 
void visit_net_receive_block (const ast::NetReceiveBlock &node) override
 visit node of type ast::NetReceiveBlock More...
 
void visit_solve_block (const ast::SolveBlock &node) override
 visit node of type ast::SolveBlock More...
 
void visit_breakpoint_block (const ast::BreakpointBlock &node) override
 visit node of type ast::BreakpointBlock More...
 
void visit_before_block (const ast::BeforeBlock &node) override
 visit node of type ast::BeforeBlock More...
 
void visit_after_block (const ast::AfterBlock &node) override
 visit node of type ast::AfterBlock More...
 
void visit_ba_block (const ast::BABlock &node) override
 visit node of type ast::BABlock More...
 
void visit_for_netcon (const ast::ForNetcon &node) override
 visit node of type ast::ForNetcon More...
 
void visit_kinetic_block (const ast::KineticBlock &node) override
 visit node of type ast::KineticBlock More...
 
void visit_unit_block (const ast::UnitBlock &node) override
 visit node of type ast::UnitBlock More...
 
void visit_constant_block (const ast::ConstantBlock &node) override
 visit node of type ast::ConstantBlock More...
 
void visit_neuron_block (const ast::NeuronBlock &node) override
 visit node of type ast::NeuronBlock More...
 
void visit_unit (const ast::Unit &node) override
 visit node of type ast::Unit More...
 
void visit_double_unit (const ast::DoubleUnit &node) override
 visit node of type ast::DoubleUnit More...
 
void visit_local_var (const ast::LocalVar &node) override
 visit node of type ast::LocalVar More...
 
void visit_limits (const ast::Limits &node) override
 visit node of type ast::Limits More...
 
void visit_number_range (const ast::NumberRange &node) override
 visit node of type ast::NumberRange More...
 
void visit_constant_var (const ast::ConstantVar &node) override
 visit node of type ast::ConstantVar More...
 
void visit_binary_operator (const ast::BinaryOperator &node) override
 visit node of type ast::BinaryOperator More...
 
void visit_unary_operator (const ast::UnaryOperator &node) override
 visit node of type ast::UnaryOperator More...
 
void visit_reaction_operator (const ast::ReactionOperator &node) override
 visit node of type ast::ReactionOperator More...
 
void visit_paren_expression (const ast::ParenExpression &node) override
 visit node of type ast::ParenExpression More...
 
void visit_binary_expression (const ast::BinaryExpression &node) override
 visit node of type ast::BinaryExpression More...
 
void visit_diff_eq_expression (const ast::DiffEqExpression &node) override
 visit node of type ast::DiffEqExpression More...
 
void visit_unary_expression (const ast::UnaryExpression &node) override
 visit node of type ast::UnaryExpression More...
 
void visit_non_lin_equation (const ast::NonLinEquation &node) override
 visit node of type ast::NonLinEquation More...
 
void visit_lin_equation (const ast::LinEquation &node) override
 visit node of type ast::LinEquation More...
 
void visit_function_call (const ast::FunctionCall &node) override
 visit node of type ast::FunctionCall More...
 
void visit_watch (const ast::Watch &node) override
 visit node of type ast::Watch More...
 
void visit_ba_block_type (const ast::BABlockType &node) override
 visit node of type ast::BABlockType More...
 
void visit_unit_def (const ast::UnitDef &node) override
 visit node of type ast::UnitDef More...
 
void visit_factor_def (const ast::FactorDef &node) override
 visit node of type ast::FactorDef More...
 
void visit_valence (const ast::Valence &node) override
 visit node of type ast::Valence More...
 
void visit_unit_state (const ast::UnitState &node) override
 visit node of type ast::UnitState More...
 
void visit_local_list_statement (const ast::LocalListStatement &node) override
 visit node of type ast::LocalListStatement More...
 
void visit_model (const ast::Model &node) override
 visit node of type ast::Model More...
 
void visit_define (const ast::Define &node) override
 visit node of type ast::Define More...
 
void visit_include (const ast::Include &node) override
 visit node of type ast::Include More...
 
void visit_param_assign (const ast::ParamAssign &node) override
 visit node of type ast::ParamAssign More...
 
void visit_assigned_definition (const ast::AssignedDefinition &node) override
 visit node of type ast::AssignedDefinition More...
 
void visit_conductance_hint (const ast::ConductanceHint &node) override
 visit node of type ast::ConductanceHint More...
 
void visit_expression_statement (const ast::ExpressionStatement &node) override
 visit node of type ast::ExpressionStatement More...
 
void visit_protect_statement (const ast::ProtectStatement &node) override
 visit node of type ast::ProtectStatement More...
 
void visit_from_statement (const ast::FromStatement &node) override
 visit node of type ast::FromStatement More...
 
void visit_while_statement (const ast::WhileStatement &node) override
 visit node of type ast::WhileStatement More...
 
void visit_if_statement (const ast::IfStatement &node) override
 visit node of type ast::IfStatement More...
 
void visit_else_if_statement (const ast::ElseIfStatement &node) override
 visit node of type ast::ElseIfStatement More...
 
void visit_else_statement (const ast::ElseStatement &node) override
 visit node of type ast::ElseStatement More...
 
void visit_watch_statement (const ast::WatchStatement &node) override
 visit node of type ast::WatchStatement More...
 
void visit_mutex_lock (const ast::MutexLock &node) override
 visit node of type ast::MutexLock More...
 
void visit_mutex_unlock (const ast::MutexUnlock &node) override
 visit node of type ast::MutexUnlock More...
 
void visit_conserve (const ast::Conserve &node) override
 visit node of type ast::Conserve More...
 
void visit_compartment (const ast::Compartment &node) override
 visit node of type ast::Compartment More...
 
void visit_lon_difuse (const ast::LonDifuse &node) override
 visit node of type ast::LonDifuse More...
 
void visit_reaction_statement (const ast::ReactionStatement &node) override
 visit node of type ast::ReactionStatement More...
 
void visit_lag_statement (const ast::LagStatement &node) override
 visit node of type ast::LagStatement More...
 
void visit_constant_statement (const ast::ConstantStatement &node) override
 visit node of type ast::ConstantStatement More...
 
void visit_table_statement (const ast::TableStatement &node) override
 visit node of type ast::TableStatement More...
 
void visit_suffix (const ast::Suffix &node) override
 visit node of type ast::Suffix More...
 
void visit_useion (const ast::Useion &node) override
 visit node of type ast::Useion More...
 
void visit_nonspecific (const ast::Nonspecific &node) override
 visit node of type ast::Nonspecific More...
 
void visit_electrode_current (const ast::ElectrodeCurrent &node) override
 visit node of type ast::ElectrodeCurrent More...
 
void visit_range (const ast::Range &node) override
 visit node of type ast::Range More...
 
void visit_global (const ast::Global &node) override
 visit node of type ast::Global More...
 
void visit_random_var_list (const ast::RandomVarList &node) override
 visit node of type ast::RandomVarList More...
 
void visit_pointer (const ast::Pointer &node) override
 visit node of type ast::Pointer More...
 
void visit_bbcore_pointer (const ast::BbcorePointer &node) override
 visit node of type ast::BbcorePointer More...
 
void visit_external (const ast::External &node) override
 visit node of type ast::External More...
 
void visit_thread_safe (const ast::ThreadSafe &node) override
 visit node of type ast::ThreadSafe More...
 
void visit_verbatim (const ast::Verbatim &node) override
 visit node of type ast::Verbatim More...
 
void visit_line_comment (const ast::LineComment &node) override
 visit node of type ast::LineComment More...
 
void visit_block_comment (const ast::BlockComment &node) override
 visit node of type ast::BlockComment More...
 
void visit_ontology_statement (const ast::OntologyStatement &node) override
 visit node of type ast::OntologyStatement More...
 
void visit_program (const ast::Program &node) override
 visit node of type ast::Program More...
 
void visit_nrn_state_block (const ast::NrnStateBlock &node) override
 visit node of type ast::NrnStateBlock More...
 
void visit_eigen_newton_solver_block (const ast::EigenNewtonSolverBlock &node) override
 visit node of type ast::EigenNewtonSolverBlock More...
 
void visit_eigen_linear_solver_block (const ast::EigenLinearSolverBlock &node) override
 visit node of type ast::EigenLinearSolverBlock More...
 
void visit_wrapped_expression (const ast::WrappedExpression &node) override
 visit node of type ast::WrappedExpression More...
 
void visit_derivimplicit_callback (const ast::DerivimplicitCallback &node) override
 visit node of type ast::DerivimplicitCallback More...
 
void visit_solution_expression (const ast::SolutionExpression &node) override
 visit node of type ast::SolutionExpression More...
 
void visit_update_dt (const ast::UpdateDt &node) override
 visit node of type ast::UpdateDt More...
 
- Public Member Functions inherited from nmodl::visitor::ConstVisitor
virtual ~ConstVisitor ()=default
 

Private Member Functions

void update_memory_ops (const std::string &name)
 Find symbol in closest scope (up to parent) and update read/write count. More...
 
bool symbol_to_skip (const std::shared_ptr< symtab::Symbol > &symbol) const
 Certain statements / symbols needs extra check while measuring read/write operations. More...
 
void count_variables ()
 
void measure_performance (const ast::Ast &node)
 Helper function used by all ast nodes : visit all children recursively and performance stats get added on stack. More...
 
void print_memory_usage ()
 
void add_perf_to_printer (const utils::PerfStat &perf) const
 add performance stats to json printer More...
 

Static Private Member Functions

static bool is_local_variable (const std::shared_ptr< symtab::Symbol > &symbol)
 
static bool is_constant_variable (const std::shared_ptr< symtab::Symbol > &symbol)
 

Private Attributes

symtab::SymbolTablecurrent_symtab = nullptr
 symbol table of current block being visited More...
 
std::stack< utils::PerfStatblocks_perf
 performance stats of all blocks being visited in recursive chain More...
 
utils::PerfStat total_perf
 total performance of mod file More...
 
utils::PerfStat current_block_perf
 performance of current block More...
 
std::stack< utils::PerfStatchildren_blocks_perf
 performance of current all childrens More...
 
bool start_measurement = false
 whether to measure performance for current block More...
 
bool visiting_lhs_expression = false
 true while visiting lhs of binary expression (to count write operations) More...
 
bool under_function_call = false
 whether function call is being visited More...
 
bool under_solve_block = false
 whether solve block is being visited More...
 
bool under_net_receive_block = false
 whether net receive block is being visited More...
 
std::unique_ptr< printer::JSONPrinterprinter
 to print to json file More...
 
std::stringstream stream
 if not json, all goes to string More...
 
int num_instance_variables = 0
 count of per channel instance variables More...
 
int num_constant_instance_variables = 0
 subset of instance variables which are constant More...
 
int num_localized_instance_variables = 0
 subset of instance variables which are localized More...
 
int num_global_variables = 0
 count of global variables More...
 
int num_constant_global_variables = 0
 subset of global variables which are constant More...
 
int num_localized_global_variables = 0
 subset of global variables which are localized More...
 
int num_state_variables = 0
 count of state variables More...
 
int num_pointer_variables = 0
 count of pointer / bbcorepointer variables More...
 
int num_random_variables = 0
 count of RANDOM variables More...
 
std::string const_memr_key = "cm_r_u"
 keys used in map to track var usage More...
 
std::string const_memw_key = "cm_w_u"
 
std::string global_memr_key = "gm_r_u"
 
std::string global_memw_key = "gm_w_u"
 
std::map< std::string, std::set< std::string > > var_usage
 map of variables to count unique read-writes More...
 

Constructor & Destructor Documentation

◆ PerfVisitor() [1/2]

nmodl::visitor::PerfVisitor::PerfVisitor ( )
default

◆ PerfVisitor() [2/2]

nmodl::visitor::PerfVisitor::PerfVisitor ( const std::string &  filename)
explicit

Definition at line 25 of file perf_visitor.cpp.

Member Function Documentation

◆ add_perf_to_printer()

void nmodl::visitor::PerfVisitor::add_perf_to_printer ( const utils::PerfStat perf) const
private

add performance stats to json printer

Definition at line 117 of file perf_visitor.cpp.

◆ compact_json()

void nmodl::visitor::PerfVisitor::compact_json ( bool  flag)

Definition at line 28 of file perf_visitor.cpp.

◆ count_variables()

void nmodl::visitor::PerfVisitor::count_variables ( )
private

number of instance variables: range or assigned variables one caveat is that the global variables appearing in assigned block are not treated as range

state variables have state_var property

pointer variables have pointer/bbcorepointer

RANDOM variables have NmodlType::random_var

number of global variables : parameters and pointers could appear also as range variables and hence need to filter out. But if anything declared as global is always global.

Definition at line 227 of file perf_visitor.cpp.

◆ get_const_global_variable_count()

int nmodl::visitor::PerfVisitor::get_const_global_variable_count ( ) const
inlinenoexcept

Definition at line 172 of file perf_visitor.hpp.

◆ get_const_instance_variable_count()

int nmodl::visitor::PerfVisitor::get_const_instance_variable_count ( ) const
inlinenoexcept

Definition at line 168 of file perf_visitor.hpp.

◆ get_global_variable_count()

int nmodl::visitor::PerfVisitor::get_global_variable_count ( ) const
inlinenoexcept

Definition at line 176 of file perf_visitor.hpp.

◆ get_instance_variable_count()

int nmodl::visitor::PerfVisitor::get_instance_variable_count ( ) const
inlinenoexcept

Definition at line 164 of file perf_visitor.hpp.

◆ get_state_variable_count()

int nmodl::visitor::PerfVisitor::get_state_variable_count ( ) const
inlinenoexcept

Definition at line 180 of file perf_visitor.hpp.

◆ get_total_perfstat()

const utils::PerfStat& nmodl::visitor::PerfVisitor::get_total_perfstat ( ) const
inlinenoexcept

Definition at line 160 of file perf_visitor.hpp.

◆ is_constant_variable()

bool nmodl::visitor::PerfVisitor::is_constant_variable ( const std::shared_ptr< symtab::Symbol > &  symbol)
staticprivate

Definition at line 520 of file perf_visitor.cpp.

◆ is_local_variable()

bool nmodl::visitor::PerfVisitor::is_local_variable ( const std::shared_ptr< symtab::Symbol > &  symbol)
staticprivate

in the function when we write to function variable then consider it as local variable

Definition at line 510 of file perf_visitor.cpp.

◆ measure_performance()

void nmodl::visitor::PerfVisitor::measure_performance ( const ast::Ast node)
private

Helper function used by all ast nodes : visit all children recursively and performance stats get added on stack.

Once all children visited, we get total performance by summing perfstat of all children.

clear var usage map

Definition at line 132 of file perf_visitor.cpp.

◆ print()

void nmodl::visitor::PerfVisitor::print ( std::ostream &  ss) const
inline

Definition at line 252 of file perf_visitor.hpp.

◆ print_memory_usage()

void nmodl::visitor::PerfVisitor::print_memory_usage ( )
private

Definition at line 287 of file perf_visitor.cpp.

◆ symbol_to_skip()

bool nmodl::visitor::PerfVisitor::symbol_to_skip ( const std::shared_ptr< symtab::Symbol > &  symbol) const
private

Certain statements / symbols needs extra check while measuring read/write operations.

For example, for expression "exp(a+b)", "exp" is an external math function and we should not increment read count for "exp" symbol. Same for solve statement where name will be derivative block name and neuron solver method.

Definition at line 494 of file perf_visitor.cpp.

◆ update_memory_ops()

void nmodl::visitor::PerfVisitor::update_memory_ops ( const std::string &  name)
private

Find symbol in closest scope (up to parent) and update read/write count.

Also update ops count in current block.

lhs symbols get written

rhs symbols get read

Definition at line 533 of file perf_visitor.cpp.

◆ visit_after_block()

void nmodl::visitor::PerfVisitor::visit_after_block ( const ast::AfterBlock node)
overridevirtual

visit node of type ast::AfterBlock

Implements nmodl::visitor::ConstVisitor.

Definition at line 413 of file perf_visitor.cpp.

◆ visit_ba_block()

void nmodl::visitor::PerfVisitor::visit_ba_block ( const ast::BABlock node)
overridevirtual

visit node of type ast::BABlock

Implements nmodl::visitor::ConstVisitor.

Definition at line 417 of file perf_visitor.cpp.

◆ visit_before_block()

void nmodl::visitor::PerfVisitor::visit_before_block ( const ast::BeforeBlock node)
overridevirtual

visit node of type ast::BeforeBlock

Implements nmodl::visitor::ConstVisitor.

Definition at line 409 of file perf_visitor.cpp.

◆ visit_binary_expression()

void nmodl::visitor::PerfVisitor::visit_binary_expression ( const ast::BinaryExpression node)
overridevirtual

count math operations from all binary expressions

if visiting assignment expression, symbols from lhs are written and hence need flag to track

lhs is done (rhs is read only)

Implements nmodl::visitor::ConstVisitor.

Definition at line 34 of file perf_visitor.cpp.

◆ visit_breakpoint_block()

void nmodl::visitor::PerfVisitor::visit_breakpoint_block ( const ast::BreakpointBlock node)
overridevirtual

visit node of type ast::BreakpointBlock

Implements nmodl::visitor::ConstVisitor.

Definition at line 405 of file perf_visitor.cpp.

◆ visit_conductance_hint()

void nmodl::visitor::PerfVisitor::visit_conductance_hint ( const ast::ConductanceHint )
inlineoverridevirtual

certain constructs needs to be excluded from usage counting and hence need to provide empty implementations

Implements nmodl::visitor::ConstVisitor.

Definition at line 242 of file perf_visitor.hpp.

◆ visit_constructor_block()

void nmodl::visitor::PerfVisitor::visit_constructor_block ( const ast::ConstructorBlock node)
overridevirtual

visit node of type ast::ConstructorBlock

Implements nmodl::visitor::ConstVisitor.

Definition at line 363 of file perf_visitor.cpp.

◆ visit_derivative_block()

void nmodl::visitor::PerfVisitor::visit_derivative_block ( const ast::DerivativeBlock node)
overridevirtual

visit node of type ast::DerivativeBlock

Implements nmodl::visitor::ConstVisitor.

Definition at line 371 of file perf_visitor.cpp.

◆ visit_destructor_block()

void nmodl::visitor::PerfVisitor::visit_destructor_block ( const ast::DestructorBlock node)
overridevirtual

visit node of type ast::DestructorBlock

Implements nmodl::visitor::ConstVisitor.

Definition at line 367 of file perf_visitor.cpp.

◆ visit_discrete_block()

void nmodl::visitor::PerfVisitor::visit_discrete_block ( const ast::DiscreteBlock node)
overridevirtual

visit node of type ast::DiscreteBlock

Implements nmodl::visitor::ConstVisitor.

Definition at line 383 of file perf_visitor.cpp.

◆ visit_else_if_statement()

void nmodl::visitor::PerfVisitor::visit_else_if_statement ( const ast::ElseIfStatement node)
overridevirtual

visit node of type ast::ElseIfStatement

Implements nmodl::visitor::ConstVisitor.

Definition at line 220 of file perf_visitor.cpp.

◆ visit_for_netcon()

void nmodl::visitor::PerfVisitor::visit_for_netcon ( const ast::ForNetcon node)
overridevirtual

visit node of type ast::ForNetcon

Implements nmodl::visitor::ConstVisitor.

Definition at line 421 of file perf_visitor.cpp.

◆ visit_function_block()

void nmodl::visitor::PerfVisitor::visit_function_block ( const ast::FunctionBlock node)
overridevirtual

visit node of type ast::FunctionBlock

Implements nmodl::visitor::ConstVisitor.

Definition at line 391 of file perf_visitor.cpp.

◆ visit_function_call()

void nmodl::visitor::PerfVisitor::visit_function_call ( const ast::FunctionCall node)
overridevirtual

count function calls and "most useful" or "commonly used" math functions

Implements nmodl::visitor::ConstVisitor.

Definition at line 175 of file perf_visitor.cpp.

◆ visit_function_table_block()

void nmodl::visitor::PerfVisitor::visit_function_table_block ( const ast::FunctionTableBlock node)
overridevirtual

visit node of type ast::FunctionTableBlock

Implements nmodl::visitor::ConstVisitor.

Definition at line 387 of file perf_visitor.cpp.

◆ visit_if_statement()

void nmodl::visitor::PerfVisitor::visit_if_statement ( const ast::IfStatement node)
overridevirtual

visit node of type ast::IfStatement

Implements nmodl::visitor::ConstVisitor.

Definition at line 213 of file perf_visitor.cpp.

◆ visit_initial_block()

void nmodl::visitor::PerfVisitor::visit_initial_block ( const ast::InitialBlock node)
overridevirtual

skip initial block under net_receive block

Implements nmodl::visitor::ConstVisitor.

Definition at line 357 of file perf_visitor.cpp.

◆ visit_kinetic_block()

void nmodl::visitor::PerfVisitor::visit_kinetic_block ( const ast::KineticBlock node)
overridevirtual

visit node of type ast::KineticBlock

Implements nmodl::visitor::ConstVisitor.

Definition at line 425 of file perf_visitor.cpp.

◆ visit_linear_block()

void nmodl::visitor::PerfVisitor::visit_linear_block ( const ast::LinearBlock node)
overridevirtual

visit node of type ast::LinearBlock

Implements nmodl::visitor::ConstVisitor.

Definition at line 375 of file perf_visitor.cpp.

◆ visit_local_list_statement()

void nmodl::visitor::PerfVisitor::visit_local_list_statement ( const ast::LocalListStatement node)
inlineoverridevirtual

visit node of type ast::LocalListStatement

Implements nmodl::visitor::ConstVisitor.

Definition at line 244 of file perf_visitor.hpp.

◆ visit_name()

void nmodl::visitor::PerfVisitor::visit_name ( const ast::Name node)
overridevirtual

every variable used is of type name, update counters

Implements nmodl::visitor::ConstVisitor.

Definition at line 202 of file perf_visitor.cpp.

◆ visit_net_receive_block()

void nmodl::visitor::PerfVisitor::visit_net_receive_block ( const ast::NetReceiveBlock node)
overridevirtual

visit node of type ast::NetReceiveBlock

Implements nmodl::visitor::ConstVisitor.

Definition at line 399 of file perf_visitor.cpp.

◆ visit_non_linear_block()

void nmodl::visitor::PerfVisitor::visit_non_linear_block ( const ast::NonLinearBlock node)
overridevirtual

visit node of type ast::NonLinearBlock

Implements nmodl::visitor::ConstVisitor.

Definition at line 379 of file perf_visitor.cpp.

◆ visit_prime_name()

void nmodl::visitor::PerfVisitor::visit_prime_name ( const ast::PrimeName node)
overridevirtual

prime name derived from identifier and hence need to be handled here

Implements nmodl::visitor::ConstVisitor.

Definition at line 208 of file perf_visitor.cpp.

◆ visit_procedure_block()

void nmodl::visitor::PerfVisitor::visit_procedure_block ( const ast::ProcedureBlock node)
overridevirtual

visit node of type ast::ProcedureBlock

Implements nmodl::visitor::ConstVisitor.

Definition at line 395 of file perf_visitor.cpp.

◆ visit_program()

void nmodl::visitor::PerfVisitor::visit_program ( const ast::Program node)
overridevirtual

visit node of type ast::Program

Implements nmodl::visitor::ConstVisitor.

Definition at line 334 of file perf_visitor.cpp.

◆ visit_solve_block()

void nmodl::visitor::PerfVisitor::visit_solve_block ( const ast::SolveBlock node)
overridevirtual

solve is not a statement but could have associated block and hence could/should not be skipped completely we can't ignore the block because it could have associated statement block (in theory)

Implements nmodl::visitor::ConstVisitor.

Definition at line 463 of file perf_visitor.cpp.

◆ visit_statement_block()

void nmodl::visitor::PerfVisitor::visit_statement_block ( const ast::StatementBlock node)
overridevirtual

Blocks like function can have multiple statement blocks and blocks like net receive has nested initial blocks.

Hence need to maintain separate stack.

starting new block, store current state

new block perf starts from zero

add performance of all visited children

Implements nmodl::visitor::ConstVisitor.

Definition at line 433 of file perf_visitor.cpp.

◆ visit_suffix()

void nmodl::visitor::PerfVisitor::visit_suffix ( const ast::Suffix node)
inlineoverridevirtual

visit node of type ast::Suffix

Implements nmodl::visitor::ConstVisitor.

Definition at line 246 of file perf_visitor.hpp.

◆ visit_unary_expression()

void nmodl::visitor::PerfVisitor::visit_unary_expression ( const ast::UnaryExpression node)
overridevirtual

visit node of type ast::UnaryExpression

Implements nmodl::visitor::ConstVisitor.

Definition at line 469 of file perf_visitor.cpp.

◆ visit_useion()

void nmodl::visitor::PerfVisitor::visit_useion ( const ast::Useion node)
inlineoverridevirtual

visit node of type ast::Useion

Implements nmodl::visitor::ConstVisitor.

Definition at line 248 of file perf_visitor.hpp.

◆ visit_valence()

void nmodl::visitor::PerfVisitor::visit_valence ( const ast::Valence node)
inlineoverridevirtual

visit node of type ast::Valence

Implements nmodl::visitor::ConstVisitor.

Definition at line 250 of file perf_visitor.hpp.

Member Data Documentation

◆ blocks_perf

std::stack<utils::PerfStat> nmodl::visitor::PerfVisitor::blocks_perf
private

performance stats of all blocks being visited in recursive chain

Definition at line 65 of file perf_visitor.hpp.

◆ children_blocks_perf

std::stack<utils::PerfStat> nmodl::visitor::PerfVisitor::children_blocks_perf
private

performance of current all childrens

Definition at line 74 of file perf_visitor.hpp.

◆ const_memr_key

std::string nmodl::visitor::PerfVisitor::const_memr_key = "cm_r_u"
private

keys used in map to track var usage

Definition at line 126 of file perf_visitor.hpp.

◆ const_memw_key

std::string nmodl::visitor::PerfVisitor::const_memw_key = "cm_w_u"
private

Definition at line 127 of file perf_visitor.hpp.

◆ current_block_perf

utils::PerfStat nmodl::visitor::PerfVisitor::current_block_perf
private

performance of current block

Definition at line 71 of file perf_visitor.hpp.

◆ current_symtab

symtab::SymbolTable* nmodl::visitor::PerfVisitor::current_symtab = nullptr
private

symbol table of current block being visited

Definition at line 61 of file perf_visitor.hpp.

◆ global_memr_key

std::string nmodl::visitor::PerfVisitor::global_memr_key = "gm_r_u"
private

Definition at line 128 of file perf_visitor.hpp.

◆ global_memw_key

std::string nmodl::visitor::PerfVisitor::global_memw_key = "gm_w_u"
private

Definition at line 129 of file perf_visitor.hpp.

◆ num_constant_global_variables

int nmodl::visitor::PerfVisitor::num_constant_global_variables = 0
private

subset of global variables which are constant

Definition at line 111 of file perf_visitor.hpp.

◆ num_constant_instance_variables

int nmodl::visitor::PerfVisitor::num_constant_instance_variables = 0
private

subset of instance variables which are constant

Definition at line 102 of file perf_visitor.hpp.

◆ num_global_variables

int nmodl::visitor::PerfVisitor::num_global_variables = 0
private

count of global variables

Definition at line 108 of file perf_visitor.hpp.

◆ num_instance_variables

int nmodl::visitor::PerfVisitor::num_instance_variables = 0
private

count of per channel instance variables

Definition at line 99 of file perf_visitor.hpp.

◆ num_localized_global_variables

int nmodl::visitor::PerfVisitor::num_localized_global_variables = 0
private

subset of global variables which are localized

Definition at line 114 of file perf_visitor.hpp.

◆ num_localized_instance_variables

int nmodl::visitor::PerfVisitor::num_localized_instance_variables = 0
private

subset of instance variables which are localized

Definition at line 105 of file perf_visitor.hpp.

◆ num_pointer_variables

int nmodl::visitor::PerfVisitor::num_pointer_variables = 0
private

count of pointer / bbcorepointer variables

Definition at line 120 of file perf_visitor.hpp.

◆ num_random_variables

int nmodl::visitor::PerfVisitor::num_random_variables = 0
private

count of RANDOM variables

Definition at line 123 of file perf_visitor.hpp.

◆ num_state_variables

int nmodl::visitor::PerfVisitor::num_state_variables = 0
private

count of state variables

Definition at line 117 of file perf_visitor.hpp.

◆ printer

std::unique_ptr<printer::JSONPrinter> nmodl::visitor::PerfVisitor::printer
private

to print to json file

Definition at line 93 of file perf_visitor.hpp.

◆ start_measurement

bool nmodl::visitor::PerfVisitor::start_measurement = false
private

whether to measure performance for current block

Definition at line 77 of file perf_visitor.hpp.

◆ stream

std::stringstream nmodl::visitor::PerfVisitor::stream
private

if not json, all goes to string

Definition at line 96 of file perf_visitor.hpp.

◆ total_perf

utils::PerfStat nmodl::visitor::PerfVisitor::total_perf
private

total performance of mod file

Definition at line 68 of file perf_visitor.hpp.

◆ under_function_call

bool nmodl::visitor::PerfVisitor::under_function_call = false
private

whether function call is being visited

Definition at line 84 of file perf_visitor.hpp.

◆ under_net_receive_block

bool nmodl::visitor::PerfVisitor::under_net_receive_block = false
private

whether net receive block is being visited

Definition at line 90 of file perf_visitor.hpp.

◆ under_solve_block

bool nmodl::visitor::PerfVisitor::under_solve_block = false
private

whether solve block is being visited

Definition at line 87 of file perf_visitor.hpp.

◆ var_usage

std::map<std::string, std::set<std::string> > nmodl::visitor::PerfVisitor::var_usage
private
Initial value:

map of variables to count unique read-writes

Definition at line 132 of file perf_visitor.hpp.

◆ visiting_lhs_expression

bool nmodl::visitor::PerfVisitor::visiting_lhs_expression = false
private

true while visiting lhs of binary expression (to count write operations)

Definition at line 81 of file perf_visitor.hpp.


The documentation for this class was generated from the following files:
nmodl::visitor::PerfVisitor::global_memr_key
std::string global_memr_key
Definition: perf_visitor.hpp:128
nmodl::visitor::PerfVisitor::global_memw_key
std::string global_memw_key
Definition: perf_visitor.hpp:129
nmodl::visitor::PerfVisitor::const_memr_key
std::string const_memr_key
keys used in map to track var usage
Definition: perf_visitor.hpp:126
nmodl::visitor::PerfVisitor::const_memw_key
std::string const_memw_key
Definition: perf_visitor.hpp:127