10 #include <unordered_set>
23 std::unordered_set<ast::LocalVar*> local_variables_to_remove;
24 std::unordered_set<ast::Node*> local_nodes_to_remove;
25 std::shared_ptr<ast::AssignedBlock> assigned_block;
27 const auto& top_level_nodes =
node.get_blocks();
28 const auto& symbol_table =
node.get_symbol_table();
30 for (
auto& top_level_node: top_level_nodes) {
32 if (top_level_node->is_assigned_block()) {
33 assigned_block = std::static_pointer_cast<ast::AssignedBlock>(top_level_node);
37 if (!top_level_node->is_local_list_statement()) {
41 const auto& local_list_statement = std::static_pointer_cast<ast::LocalListStatement>(
44 for (
const auto& local_variable: local_list_statement->get_variables()) {
45 const auto& variable_name = local_variable->get_node_name();
47 if (symbol_table->lookup(variable_name)->get_write_count() > 0) {
48 assigned_variables.emplace_back(
49 std::make_shared<ast::AssignedDefinition>(local_variable->get_name(),
56 local_variables_to_remove.insert(local_variable.get());
61 local_list_statement->erase_local_var(local_variables_to_remove);
65 if (local_list_statement->get_variables().empty()) {
66 local_nodes_to_remove.insert(top_level_node.get());
71 node.erase_node(local_nodes_to_remove);
74 if (assigned_block ==
nullptr) {
75 assigned_block = std::make_shared<ast::AssignedBlock>(assigned_variables);
76 node.emplace_back_node(std::static_pointer_cast<ast::Node>(assigned_block));
78 for (
const auto& assigned_variable: assigned_variables) {
79 assigned_block->emplace_back_assigned_definition(assigned_variable);
Auto generated AST classes declaration.
Represents top level AST node for whole NMODL input.
void visit_program(ast::Program &node) override
Visit ast::Program node to transform top level LOCAL variables to ASSIGNED if they are written in the...
std::vector< std::shared_ptr< AssignedDefinition > > AssignedDefinitionVector
Auto generated AST classes declaration.
Visitor to convert top level LOCAL variables to ASSIGNED variables.
encapsulates code generation backend implementations
static Node * node(Object *)
Auto generated AST classes declaration.
Utility functions for visitors implementation.