User Guide
local_to_assigned.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2023 Blue Brain Project, EPFL.
3  * See the top-level LICENSE file for details.
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 #include <catch2/catch_test_macros.hpp>
9 
10 #include "ast/program.hpp"
11 #include "parser/nmodl_driver.hpp"
17 
18 using namespace nmodl;
19 using namespace visitor;
20 using namespace test_utils;
21 
24 
25 //=============================================================================
26 // GlobalToRange visitor tests
27 //=============================================================================
28 
29 std::shared_ptr<ast::Program> run_local_to_assigned_visitor(const std::string& text) {
30  std::map<std::string, std::string> rval;
32  auto ast = driver.parse_string(text);
33 
34  SymtabVisitor().visit_program(*ast);
35  PerfVisitor().visit_program(*ast);
36  LocalToAssignedVisitor().visit_program(*ast);
37  SymtabVisitor().visit_program(*ast);
38  return ast;
39 }
40 
41 SCENARIO("LOCAL to ASSIGNED variable transformer", "[visitor][localtoassigned]") {
42  GIVEN("mod file with LOCAL variables that are written") {
43  std::string input_nmodl = R"(
44  NEURON {
45  SUFFIX test
46  }
47 
48  LOCAL x, y, z
49 
50  INITIAL {
51  x = 1
52  }
53 
54  BREAKPOINT {
55  z = 2
56  }
57  )";
58 
59  auto ast = run_local_to_assigned_visitor(input_nmodl);
60  auto symtab = ast->get_symbol_table();
61 
62  THEN("LOCAL variables that are written are turned to ASSIGNED") {
63  /// check for all ASSIGNED variables : old ones + newly converted ones
64  auto vars = symtab->get_variables_with_properties(NmodlType::assigned_definition);
65  REQUIRE(vars.size() == 2);
66 
67  /// x and z should be converted from LOCAL to ASSIGNED
68  auto x = symtab->lookup("x");
69  REQUIRE(x != nullptr);
70  REQUIRE(x->has_any_property(NmodlType::assigned_definition) == true);
71  REQUIRE(x->has_any_property(NmodlType::local_var) == false);
72 
73  auto z = symtab->lookup("z");
74  REQUIRE(z != nullptr);
75  REQUIRE(z->has_any_property(NmodlType::assigned_definition) == true);
76  REQUIRE(z->has_any_property(NmodlType::local_var) == false);
77  }
78 
79  THEN("LOCAL variables that are read only remain LOCAL") {
80  auto vars = symtab->get_variables_with_properties(NmodlType::local_var);
81  REQUIRE(vars.size() == 1);
82  REQUIRE(vars[0]->get_name() == "y");
83  }
84  }
85 }
nmodl::parser::NmodlDriver
Class that binds all pieces together for parsing nmodl file.
Definition: nmodl_driver.hpp:67
run_local_to_assigned_visitor
std::shared_ptr< ast::Program > run_local_to_assigned_visitor(const std::string &text)
Definition: local_to_assigned.cpp:29
perf_visitor.hpp
Visitor for measuring performance related information
nmodl::codegen::get_name
std::string get_name(ast::Ast const *sym)
Definition: codegen_cpp_visitor.hpp:172
nmodl
encapsulates code generation backend implementations
Definition: ast_common.hpp:26
local_to_assigned_visitor.hpp
Visitor to convert top level LOCAL variables to ASSIGNED variables.
program.hpp
Auto generated AST classes declaration.
driver
nmodl::parser::UnitDriver driver
Definition: parser.cpp:28
nmodl::parser::UnitDriver::parse_string
bool parse_string(const std::string &input)
parser Units provided as string (used for testing)
Definition: unit_driver.cpp:40
nmodl::symtab::syminfo::NmodlType
NmodlType
NMODL variable properties.
Definition: symbol_properties.hpp:116
SCENARIO
SCENARIO("LOCAL to ASSIGNED variable transformer", "[visitor][localtoassigned]")
Definition: local_to_assigned.cpp:41
nmodl_driver.hpp
symtab_visitor.hpp
THIS FILE IS GENERATED AT BUILD TIME AND SHALL NOT BE EDITED.
nmodl_constructs.hpp
nmodl_visitor.hpp
THIS FILE IS GENERATED AT BUILD TIME AND SHALL NOT BE EDITED.