User Guide
nmodl::visitor::UnitsVisitor Class Reference

Visitor for Units blocks of AST. More...

Detailed Description

Visitor for Units blocks of AST.

This is simple example of visitor that uses base AstVisitor interface. We override AstVisitor::visit_program, AstVisitor::visit_unit_def and AstVisitor::visit_factor_def method. Furthermore it keeps the parser::UnitDriver to parse the units file and the strings generated by the units in the mod files.

Definition at line 42 of file units_visitor.hpp.

#include <units_visitor.hpp>

Inheritance diagram for nmodl::visitor::UnitsVisitor:
nmodl::visitor::AstVisitor nmodl::visitor::Visitor

Public Member Functions

void visit_unit_def (ast::UnitDef &node) override
 Function to visit all the ast::UnitDef nodes and parse the units defined as ast::UnitDef in the UNITS block of mod files. More...
 
void visit_factor_def (ast::FactorDef &node) override
 Function to visit all the ast::FactorDef nodes and parse the units defined as ast::FactorDef in the UNITS block of mod files. More...
 
void visit_program (ast::Program &node) override
 Override visit_program function to parse the nrnunits.lib unit file before starting visiting the AST to parse the units defined in mod files. More...
 
const parser::UnitDriverget_unit_driver () const noexcept
 Get the parser::UnitDriver to be able to use it outside the visitor::UnitsVisitor scope keeping the same units::UnitTable. More...
 
Ctor & dtor
 UnitsVisitor ()=default
 Default UnitsVisitor constructor. More...
 
 UnitsVisitor (std::string t_units_dir)
 UnitsVisitor constructor that takes as argument the units file to parse the units from. More...
 
- Public Member Functions inherited from nmodl::visitor::AstVisitor
void visit_node (ast::Node &node) override
 visit node of type ast::Node More...
 
void visit_statement (ast::Statement &node) override
 visit node of type ast::Statement More...
 
void visit_expression (ast::Expression &node) override
 visit node of type ast::Expression More...
 
void visit_block (ast::Block &node) override
 visit node of type ast::Block More...
 
void visit_identifier (ast::Identifier &node) override
 visit node of type ast::Identifier More...
 
void visit_number (ast::Number &node) override
 visit node of type ast::Number More...
 
void visit_string (ast::String &node) override
 visit node of type ast::String More...
 
void visit_integer (ast::Integer &node) override
 visit node of type ast::Integer More...
 
void visit_float (ast::Float &node) override
 visit node of type ast::Float More...
 
void visit_double (ast::Double &node) override
 visit node of type ast::Double More...
 
void visit_boolean (ast::Boolean &node) override
 visit node of type ast::Boolean More...
 
void visit_name (ast::Name &node) override
 visit node of type ast::Name More...
 
void visit_prime_name (ast::PrimeName &node) override
 visit node of type ast::PrimeName More...
 
void visit_indexed_name (ast::IndexedName &node) override
 visit node of type ast::IndexedName More...
 
void visit_var_name (ast::VarName &node) override
 visit node of type ast::VarName More...
 
void visit_argument (ast::Argument &node) override
 visit node of type ast::Argument More...
 
void visit_react_var_name (ast::ReactVarName &node) override
 visit node of type ast::ReactVarName More...
 
void visit_read_ion_var (ast::ReadIonVar &node) override
 visit node of type ast::ReadIonVar More...
 
void visit_write_ion_var (ast::WriteIonVar &node) override
 visit node of type ast::WriteIonVar More...
 
void visit_nonspecific_cur_var (ast::NonspecificCurVar &node) override
 visit node of type ast::NonspecificCurVar More...
 
void visit_electrode_cur_var (ast::ElectrodeCurVar &node) override
 visit node of type ast::ElectrodeCurVar More...
 
void visit_range_var (ast::RangeVar &node) override
 visit node of type ast::RangeVar More...
 
void visit_global_var (ast::GlobalVar &node) override
 visit node of type ast::GlobalVar More...
 
void visit_pointer_var (ast::PointerVar &node) override
 visit node of type ast::PointerVar More...
 
void visit_random_var (ast::RandomVar &node) override
 visit node of type ast::RandomVar More...
 
void visit_bbcore_pointer_var (ast::BbcorePointerVar &node) override
 visit node of type ast::BbcorePointerVar More...
 
void visit_extern_var (ast::ExternVar &node) override
 visit node of type ast::ExternVar More...
 
void visit_param_block (ast::ParamBlock &node) override
 visit node of type ast::ParamBlock More...
 
void visit_independent_block (ast::IndependentBlock &node) override
 visit node of type ast::IndependentBlock More...
 
void visit_assigned_block (ast::AssignedBlock &node) override
 visit node of type ast::AssignedBlock More...
 
void visit_state_block (ast::StateBlock &node) override
 visit node of type ast::StateBlock More...
 
void visit_initial_block (ast::InitialBlock &node) override
 visit node of type ast::InitialBlock More...
 
void visit_constructor_block (ast::ConstructorBlock &node) override
 visit node of type ast::ConstructorBlock More...
 
void visit_destructor_block (ast::DestructorBlock &node) override
 visit node of type ast::DestructorBlock More...
 
void visit_statement_block (ast::StatementBlock &node) override
 visit node of type ast::StatementBlock More...
 
void visit_derivative_block (ast::DerivativeBlock &node) override
 visit node of type ast::DerivativeBlock More...
 
void visit_linear_block (ast::LinearBlock &node) override
 visit node of type ast::LinearBlock More...
 
void visit_non_linear_block (ast::NonLinearBlock &node) override
 visit node of type ast::NonLinearBlock More...
 
void visit_discrete_block (ast::DiscreteBlock &node) override
 visit node of type ast::DiscreteBlock More...
 
void visit_function_table_block (ast::FunctionTableBlock &node) override
 visit node of type ast::FunctionTableBlock More...
 
void visit_function_block (ast::FunctionBlock &node) override
 visit node of type ast::FunctionBlock More...
 
void visit_procedure_block (ast::ProcedureBlock &node) override
 visit node of type ast::ProcedureBlock More...
 
void visit_net_receive_block (ast::NetReceiveBlock &node) override
 visit node of type ast::NetReceiveBlock More...
 
void visit_solve_block (ast::SolveBlock &node) override
 visit node of type ast::SolveBlock More...
 
void visit_breakpoint_block (ast::BreakpointBlock &node) override
 visit node of type ast::BreakpointBlock More...
 
void visit_before_block (ast::BeforeBlock &node) override
 visit node of type ast::BeforeBlock More...
 
void visit_after_block (ast::AfterBlock &node) override
 visit node of type ast::AfterBlock More...
 
void visit_ba_block (ast::BABlock &node) override
 visit node of type ast::BABlock More...
 
void visit_for_netcon (ast::ForNetcon &node) override
 visit node of type ast::ForNetcon More...
 
void visit_kinetic_block (ast::KineticBlock &node) override
 visit node of type ast::KineticBlock More...
 
void visit_unit_block (ast::UnitBlock &node) override
 visit node of type ast::UnitBlock More...
 
void visit_constant_block (ast::ConstantBlock &node) override
 visit node of type ast::ConstantBlock More...
 
void visit_neuron_block (ast::NeuronBlock &node) override
 visit node of type ast::NeuronBlock More...
 
void visit_unit (ast::Unit &node) override
 visit node of type ast::Unit More...
 
void visit_double_unit (ast::DoubleUnit &node) override
 visit node of type ast::DoubleUnit More...
 
void visit_local_var (ast::LocalVar &node) override
 visit node of type ast::LocalVar More...
 
void visit_limits (ast::Limits &node) override
 visit node of type ast::Limits More...
 
void visit_number_range (ast::NumberRange &node) override
 visit node of type ast::NumberRange More...
 
void visit_constant_var (ast::ConstantVar &node) override
 visit node of type ast::ConstantVar More...
 
void visit_binary_operator (ast::BinaryOperator &node) override
 visit node of type ast::BinaryOperator More...
 
void visit_unary_operator (ast::UnaryOperator &node) override
 visit node of type ast::UnaryOperator More...
 
void visit_reaction_operator (ast::ReactionOperator &node) override
 visit node of type ast::ReactionOperator More...
 
void visit_paren_expression (ast::ParenExpression &node) override
 visit node of type ast::ParenExpression More...
 
void visit_binary_expression (ast::BinaryExpression &node) override
 visit node of type ast::BinaryExpression More...
 
void visit_diff_eq_expression (ast::DiffEqExpression &node) override
 visit node of type ast::DiffEqExpression More...
 
void visit_unary_expression (ast::UnaryExpression &node) override
 visit node of type ast::UnaryExpression More...
 
void visit_non_lin_equation (ast::NonLinEquation &node) override
 visit node of type ast::NonLinEquation More...
 
void visit_lin_equation (ast::LinEquation &node) override
 visit node of type ast::LinEquation More...
 
void visit_function_call (ast::FunctionCall &node) override
 visit node of type ast::FunctionCall More...
 
void visit_watch (ast::Watch &node) override
 visit node of type ast::Watch More...
 
void visit_ba_block_type (ast::BABlockType &node) override
 visit node of type ast::BABlockType More...
 
void visit_unit_def (ast::UnitDef &node) override
 visit node of type ast::UnitDef More...
 
void visit_factor_def (ast::FactorDef &node) override
 visit node of type ast::FactorDef More...
 
void visit_valence (ast::Valence &node) override
 visit node of type ast::Valence More...
 
void visit_unit_state (ast::UnitState &node) override
 visit node of type ast::UnitState More...
 
void visit_local_list_statement (ast::LocalListStatement &node) override
 visit node of type ast::LocalListStatement More...
 
void visit_model (ast::Model &node) override
 visit node of type ast::Model More...
 
void visit_define (ast::Define &node) override
 visit node of type ast::Define More...
 
void visit_include (ast::Include &node) override
 visit node of type ast::Include More...
 
void visit_param_assign (ast::ParamAssign &node) override
 visit node of type ast::ParamAssign More...
 
void visit_assigned_definition (ast::AssignedDefinition &node) override
 visit node of type ast::AssignedDefinition More...
 
void visit_conductance_hint (ast::ConductanceHint &node) override
 visit node of type ast::ConductanceHint More...
 
void visit_expression_statement (ast::ExpressionStatement &node) override
 visit node of type ast::ExpressionStatement More...
 
void visit_protect_statement (ast::ProtectStatement &node) override
 visit node of type ast::ProtectStatement More...
 
void visit_from_statement (ast::FromStatement &node) override
 visit node of type ast::FromStatement More...
 
void visit_while_statement (ast::WhileStatement &node) override
 visit node of type ast::WhileStatement More...
 
void visit_if_statement (ast::IfStatement &node) override
 visit node of type ast::IfStatement More...
 
void visit_else_if_statement (ast::ElseIfStatement &node) override
 visit node of type ast::ElseIfStatement More...
 
void visit_else_statement (ast::ElseStatement &node) override
 visit node of type ast::ElseStatement More...
 
void visit_watch_statement (ast::WatchStatement &node) override
 visit node of type ast::WatchStatement More...
 
void visit_mutex_lock (ast::MutexLock &node) override
 visit node of type ast::MutexLock More...
 
void visit_mutex_unlock (ast::MutexUnlock &node) override
 visit node of type ast::MutexUnlock More...
 
void visit_conserve (ast::Conserve &node) override
 visit node of type ast::Conserve More...
 
void visit_compartment (ast::Compartment &node) override
 visit node of type ast::Compartment More...
 
void visit_lon_difuse (ast::LonDifuse &node) override
 visit node of type ast::LonDifuse More...
 
void visit_reaction_statement (ast::ReactionStatement &node) override
 visit node of type ast::ReactionStatement More...
 
void visit_lag_statement (ast::LagStatement &node) override
 visit node of type ast::LagStatement More...
 
void visit_constant_statement (ast::ConstantStatement &node) override
 visit node of type ast::ConstantStatement More...
 
void visit_table_statement (ast::TableStatement &node) override
 visit node of type ast::TableStatement More...
 
void visit_suffix (ast::Suffix &node) override
 visit node of type ast::Suffix More...
 
void visit_useion (ast::Useion &node) override
 visit node of type ast::Useion More...
 
void visit_nonspecific (ast::Nonspecific &node) override
 visit node of type ast::Nonspecific More...
 
void visit_electrode_current (ast::ElectrodeCurrent &node) override
 visit node of type ast::ElectrodeCurrent More...
 
void visit_range (ast::Range &node) override
 visit node of type ast::Range More...
 
void visit_global (ast::Global &node) override
 visit node of type ast::Global More...
 
void visit_random_var_list (ast::RandomVarList &node) override
 visit node of type ast::RandomVarList More...
 
void visit_pointer (ast::Pointer &node) override
 visit node of type ast::Pointer More...
 
void visit_bbcore_pointer (ast::BbcorePointer &node) override
 visit node of type ast::BbcorePointer More...
 
void visit_external (ast::External &node) override
 visit node of type ast::External More...
 
void visit_thread_safe (ast::ThreadSafe &node) override
 visit node of type ast::ThreadSafe More...
 
void visit_verbatim (ast::Verbatim &node) override
 visit node of type ast::Verbatim More...
 
void visit_line_comment (ast::LineComment &node) override
 visit node of type ast::LineComment More...
 
void visit_block_comment (ast::BlockComment &node) override
 visit node of type ast::BlockComment More...
 
void visit_ontology_statement (ast::OntologyStatement &node) override
 visit node of type ast::OntologyStatement More...
 
void visit_program (ast::Program &node) override
 visit node of type ast::Program More...
 
void visit_nrn_state_block (ast::NrnStateBlock &node) override
 visit node of type ast::NrnStateBlock More...
 
void visit_eigen_newton_solver_block (ast::EigenNewtonSolverBlock &node) override
 visit node of type ast::EigenNewtonSolverBlock More...
 
void visit_eigen_linear_solver_block (ast::EigenLinearSolverBlock &node) override
 visit node of type ast::EigenLinearSolverBlock More...
 
void visit_wrapped_expression (ast::WrappedExpression &node) override
 visit node of type ast::WrappedExpression More...
 
void visit_derivimplicit_callback (ast::DerivimplicitCallback &node) override
 visit node of type ast::DerivimplicitCallback More...
 
void visit_solution_expression (ast::SolutionExpression &node) override
 visit node of type ast::SolutionExpression More...
 
void visit_update_dt (ast::UpdateDt &node) override
 visit node of type ast::UpdateDt More...
 
- Public Member Functions inherited from nmodl::visitor::Visitor
virtual ~Visitor ()=default
 

Private Attributes

parser::UnitDriver units_driver
 Units Driver needed to parse the units file and the string produces by mod files' units. More...
 
std::string units_dir
 Directory of units lib file that defines all the basic units. More...
 
const std::string UNIT_FUZZ = "fuzz"
 Declaration of fuzz constant unit, which is the equivilant of 1 in mod files UNITS definitions. More...
 

Constructor & Destructor Documentation

◆ UnitsVisitor() [1/2]

nmodl::visitor::UnitsVisitor::UnitsVisitor ( )
default

Default UnitsVisitor constructor.

◆ UnitsVisitor() [2/2]

nmodl::visitor::UnitsVisitor::UnitsVisitor ( std::string  t_units_dir)
inlineexplicit

UnitsVisitor constructor that takes as argument the units file to parse the units from.

Definition at line 64 of file units_visitor.hpp.

Member Function Documentation

◆ get_unit_driver()

const parser::UnitDriver& nmodl::visitor::UnitsVisitor::get_unit_driver ( ) const
inlinenoexcept

Get the parser::UnitDriver to be able to use it outside the visitor::UnitsVisitor scope keeping the same units::UnitTable.

Definition at line 83 of file units_visitor.hpp.

◆ visit_factor_def()

void nmodl::visitor::UnitsVisitor::visit_factor_def ( ast::FactorDef node)
overridevirtual

Function to visit all the ast::FactorDef nodes and parse the units defined as ast::FactorDef in the UNITS block of mod files.

The new unit definition is based on a factor combined with units or other defined units. In the first case the factor saved to the ast::FactorDef node and printed to .cpp file is the one defined on the modfile. The factor and the dimensions saved to the units::UnitTable are based on the factor and the units defined in the modfile, so this factor will be calculated based on the base units of the units::UnitTable.
Example:

R = 8.314 (volt-coul/degC))

In the second case, the factor and the dimensions that are inserted to the units::UnitTable are based on the ast::FactorDef::unit1, like in MOD2C. However, the factor that is saved in the ast::FactorDef and printed in the .cpp file is the factor of the ast::FactorDef::unit1 divided by the factor of ast::FactorDef::unit2.
Example:

R = (mole k) (mV-coulomb/degC)

unit1 is mole k and unit2 is mV-coulomb/degC
To parse the units defined in modfiles there are stringstreams created that are passed to the string parser, to be parsed by the unit parser used for parsing the nrnunits.lib file, which takes care of all the units calculations.

Note
If the ast::FactorDef was made by using two units (second case), the factors of both of them must be calculated based on the units::UnitTable and then they must be divided to produce the unit's factor that will be printed to the .cpp file.
Example:
FARADAY = (faraday) (10000 coulomb)
In the .cpp file the printed factor will be 9.64853090 but in the units::UnitTable the factor of FARADAY will be 96485.30900000

Implements nmodl::visitor::Visitor.

Definition at line 83 of file units_visitor.cpp.

◆ visit_program()

void nmodl::visitor::UnitsVisitor::visit_program ( ast::Program node)
overridevirtual

Override visit_program function to parse the nrnunits.lib unit file before starting visiting the AST to parse the units defined in mod files.

Implements nmodl::visitor::Visitor.

Definition at line 22 of file units_visitor.cpp.

◆ visit_unit_def()

void nmodl::visitor::UnitsVisitor::visit_unit_def ( ast::UnitDef node)
overridevirtual

Function to visit all the ast::UnitDef nodes and parse the units defined as ast::UnitDef in the UNITS block of mod files.

units::Unit definition is based only on pre-defined units, parse only the new unit and the pre-defined units.
Example:

(nA) = (nanoamp) => nA nanoamp)

The ast::UnitDef is converted to a string that is able to be parsed by the unit parser which was used for parsing the nrnunits.lib file. On nrnunits.lib constant "1" is defined as "fuzz", so it must be converted.

Implements nmodl::visitor::Visitor.

Definition at line 38 of file units_visitor.cpp.

Member Data Documentation

◆ UNIT_FUZZ

const std::string nmodl::visitor::UnitsVisitor::UNIT_FUZZ = "fuzz"
private

Declaration of fuzz constant unit, which is the equivilant of 1 in mod files UNITS definitions.

Definition at line 53 of file units_visitor.hpp.

◆ units_dir

std::string nmodl::visitor::UnitsVisitor::units_dir
private

Directory of units lib file that defines all the basic units.

Definition at line 49 of file units_visitor.hpp.

◆ units_driver

parser::UnitDriver nmodl::visitor::UnitsVisitor::units_driver
private

Units Driver needed to parse the units file and the string produces by mod files' units.

Definition at line 46 of file units_visitor.hpp.


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