User Guide
nmodl::visitor::SemanticAnalysisVisitor Class Reference

Detailed Description

Definition at line 43 of file semantic_analysis_visitor.hpp.

#include <semantic_analysis_visitor.hpp>

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

Public Member Functions

 SemanticAnalysisVisitor (bool accel_backend=false)
 
bool check (const ast::Program &node)
 
- 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 visit_program (const ast::Program &node) override
 Check number of DERIVATIVE blocks. More...
 
void visit_procedure_block (const ast::ProcedureBlock &node) override
 Store if we are in a procedure and if the arity of this is 1. More...
 
void visit_function_block (const ast::FunctionBlock &node) override
 Store if we are in a function and if the arity of this is 1. More...
 
void visit_table_statement (const ast::TableStatement &node) override
 Visit a table statement and check that the arity of the block were 1. More...
 
void visit_destructor_block (const ast::DestructorBlock &node) override
 Visit destructor and check that the file is of type POINT_PROCESS or ARTIFICIAL_CELL. More...
 
void visit_independent_block (const ast::IndependentBlock &node) override
 Visit independent block and check if one of the variable is not t. More...
 
void visit_function_table_block (const ast::FunctionTableBlock &node) override
 Visit function table to check that number of args > 0. More...
 
void visit_protect_statement (const ast::ProtectStatement &node) override
 Look if protect is inside a locked block. More...
 
void visit_mutex_lock (const ast::MutexLock &node) override
 Look if MUTEXLOCK is inside a locked block. More...
 
void visit_mutex_unlock (const ast::MutexUnlock &node) override
 Look if MUTEXUNLOCK is outside a locked block. More...
 
void visit_name (const ast::Name &node) override
 Only use of random_var is as first arg in random function. More...
 
void visit_function_call (const ast::FunctionCall &node) override
 random function first arg must be random_var More...
 

Private Attributes

bool check_fail = false
 
symtab::SymbolTableprogram_symtab = nullptr
 
bool accel_backend = false
 true if accelerator backend is used for code generation More...
 
bool one_arg_in_procedure_function = false
 true if the procedure or the function contains only one argument More...
 
bool in_procedure = false
 true if we are in a procedure block More...
 
bool in_function = false
 true if we are in a function block More...
 
bool is_point_process = false
 true if the mod file is of type point process More...
 
bool in_mutex = false
 true if we are inside a mutex locked part More...
 

Constructor & Destructor Documentation

◆ SemanticAnalysisVisitor()

nmodl::visitor::SemanticAnalysisVisitor::SemanticAnalysisVisitor ( bool  accel_backend = false)
inline

Definition at line 99 of file semantic_analysis_visitor.hpp.

Member Function Documentation

◆ check()

bool SemanticAnalysisVisitor::check ( const ast::Program node)

<– This code is for check 2

-->

<– This code is for check 4

make sure ion variables aren't redefined in a CONSTANT block.

-->

Definition at line 27 of file semantic_analysis_visitor.cpp.

◆ visit_destructor_block()

void SemanticAnalysisVisitor::visit_destructor_block ( const ast::DestructorBlock node)
overrideprivatevirtual

Visit destructor and check that the file is of type POINT_PROCESS or ARTIFICIAL_CELL.

<– This code is for check 2

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 204 of file semantic_analysis_visitor.cpp.

◆ visit_function_block()

void SemanticAnalysisVisitor::visit_function_block ( const ast::FunctionBlock node)
overrideprivatevirtual

Store if we are in a function and if the arity of this is 1.

<– This code is for check 1

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 86 of file semantic_analysis_visitor.cpp.

◆ visit_function_call()

void SemanticAnalysisVisitor::visit_function_call ( const ast::FunctionCall node)
overrideprivatevirtual

random function first arg must be random_var

<– This code is a portion of check 9

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 151 of file semantic_analysis_visitor.cpp.

◆ visit_function_table_block()

void SemanticAnalysisVisitor::visit_function_table_block ( const ast::FunctionTableBlock node)
overrideprivatevirtual

Visit function table to check that number of args > 0.

<– This code is for check 7

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 228 of file semantic_analysis_visitor.cpp.

◆ visit_independent_block()

void SemanticAnalysisVisitor::visit_independent_block ( const ast::IndependentBlock node)
overrideprivatevirtual

Visit independent block and check if one of the variable is not t.

<– This code is for check 5

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 215 of file semantic_analysis_visitor.cpp.

◆ visit_mutex_lock()

void SemanticAnalysisVisitor::visit_mutex_lock ( const ast::MutexLock node)
overrideprivatevirtual

Look if MUTEXLOCK is inside a locked block.

<– This code is for check 6

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 250 of file semantic_analysis_visitor.cpp.

◆ visit_mutex_unlock()

void SemanticAnalysisVisitor::visit_mutex_unlock ( const ast::MutexUnlock node)
overrideprivatevirtual

Look if MUTEXUNLOCK is outside a locked block.

<– This code is for check 6

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 262 of file semantic_analysis_visitor.cpp.

◆ visit_name()

void SemanticAnalysisVisitor::visit_name ( const ast::Name node)
overrideprivatevirtual

Only use of random_var is as first arg in random function.

<– This code is a portion of check 9

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 95 of file semantic_analysis_visitor.cpp.

◆ visit_procedure_block()

void SemanticAnalysisVisitor::visit_procedure_block ( const ast::ProcedureBlock node)
overrideprivatevirtual

Store if we are in a procedure and if the arity of this is 1.

<– This code is for check 1

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 77 of file semantic_analysis_visitor.cpp.

◆ visit_program()

void SemanticAnalysisVisitor::visit_program ( const ast::Program node)
overrideprivatevirtual

Check number of DERIVATIVE blocks.

<– This code is for check 8

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 66 of file semantic_analysis_visitor.cpp.

◆ visit_protect_statement()

void SemanticAnalysisVisitor::visit_protect_statement ( const ast::ProtectStatement node)
overrideprivatevirtual

Look if protect is inside a locked block.

<– This code is for check 6

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 239 of file semantic_analysis_visitor.cpp.

◆ visit_table_statement()

void SemanticAnalysisVisitor::visit_table_statement ( const ast::TableStatement node)
overrideprivatevirtual

Visit a table statement and check that the arity of the block were 1.

<– This code is for check 1

--> <– This code is for check 3

-->

Implements nmodl::visitor::ConstVisitor.

Definition at line 181 of file semantic_analysis_visitor.cpp.

Member Data Documentation

◆ accel_backend

bool nmodl::visitor::SemanticAnalysisVisitor::accel_backend = false
private

true if accelerator backend is used for code generation

Definition at line 50 of file semantic_analysis_visitor.hpp.

◆ check_fail

bool nmodl::visitor::SemanticAnalysisVisitor::check_fail = false
private

Definition at line 46 of file semantic_analysis_visitor.hpp.

◆ in_function

bool nmodl::visitor::SemanticAnalysisVisitor::in_function = false
private

true if we are in a function block

Definition at line 56 of file semantic_analysis_visitor.hpp.

◆ in_mutex

bool nmodl::visitor::SemanticAnalysisVisitor::in_mutex = false
private

true if we are inside a mutex locked part

Definition at line 60 of file semantic_analysis_visitor.hpp.

◆ in_procedure

bool nmodl::visitor::SemanticAnalysisVisitor::in_procedure = false
private

true if we are in a procedure block

Definition at line 54 of file semantic_analysis_visitor.hpp.

◆ is_point_process

bool nmodl::visitor::SemanticAnalysisVisitor::is_point_process = false
private

true if the mod file is of type point process

Definition at line 58 of file semantic_analysis_visitor.hpp.

◆ one_arg_in_procedure_function

bool nmodl::visitor::SemanticAnalysisVisitor::one_arg_in_procedure_function = false
private

true if the procedure or the function contains only one argument

Definition at line 52 of file semantic_analysis_visitor.hpp.

◆ program_symtab

symtab::SymbolTable* nmodl::visitor::SemanticAnalysisVisitor::program_symtab = nullptr
private

Definition at line 48 of file semantic_analysis_visitor.hpp.


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