diff --git a/include/verilogAST.hpp b/include/verilogAST.hpp index 14e74d5..b675712 100644 --- a/include/verilogAST.hpp +++ b/include/verilogAST.hpp @@ -478,6 +478,39 @@ typedef std::vector< std::pair, std::unique_ptr>> Parameters; +typedef std::vector>> + ConnectionVector; + +class Connections { + public: + Connections() : connections() {} + ~Connections() = default; + + // Non-copyable class + Connections(const Connections&) = delete; + + // Takes ownership of @expr. + void insert(std::string name, std::unique_ptr expr) { + connections.push_back(std::make_pair(name, std::move(expr))); + } + + // Releases ownership of expression at @name if exists, othwerwise throws error. + std::unique_ptr at(std::string name) { + auto is_name = [name](auto& element) { return element.first == name; }; + auto it = std::find_if(connections.begin(), connections.end(), is_name); + if (it != connections.end()) return std::move(it->second); + throw std::runtime_error("Could not find '" + name + "'"); + } + + ConnectionVector::iterator begin() { return connections.begin(); } + ConnectionVector::iterator end() { return connections.end(); } + + bool empty() const { return connections.empty(); } + + private: + ConnectionVector connections; +}; + class ModuleInstantiation : public StructuralStatement { public: std::string module_name; @@ -487,15 +520,13 @@ class ModuleInstantiation : public StructuralStatement { std::string instance_name; - // map from instance port names to connection expression // NOTE: anonymous style of module connections is not supported - std::map> connections; + std::unique_ptr connections; // TODO Need to make sure that the instance parameters are a subset of the // module parameters - ModuleInstantiation( - std::string module_name, Parameters parameters, std::string instance_name, - std::map> connections) + ModuleInstantiation(std::string module_name, Parameters parameters, + std::string instance_name, std::unique_ptr connections) : module_name(module_name), parameters(std::move(parameters)), instance_name(instance_name), diff --git a/src/transformer.cpp b/src/transformer.cpp index 94f13b2..76d4f5c 100644 --- a/src/transformer.cpp +++ b/src/transformer.cpp @@ -186,7 +186,7 @@ std::unique_ptr Transformer::visit( std::unique_ptr Transformer::visit( std::unique_ptr node) { - for (auto&& conn : node->connections) { + for (auto&& conn : *node->connections) { conn.second = this->visit(std::move(conn.second)); } for (auto&& param : node->parameters) { diff --git a/src/verilogAST.cpp b/src/verilogAST.cpp index 7e67c9b..a65d93b 100644 --- a/src/verilogAST.cpp +++ b/src/verilogAST.cpp @@ -385,9 +385,9 @@ std::string ModuleInstantiation::toString() { module_inst_str += "\n)"; } module_inst_str += " " + instance_name + " (\n "; - if (!connections.empty()) { + if (!connections->empty()) { std::vector param_strs; - for (auto &it : connections) { + for (auto &it : *connections) { param_strs.push_back("." + it.first + "(" + it.second->toString() + ")"); } module_inst_str += join(param_strs, ",\n "); diff --git a/tests/assign_inliner.cpp b/tests/assign_inliner.cpp index 0e61e0c..fbcc036 100644 --- a/tests/assign_inliner.cpp +++ b/tests/assign_inliner.cpp @@ -546,20 +546,19 @@ TEST(InlineAssignTests, TestInstConn) { std::make_unique("a"))); vAST::Parameters parameters; - std::map> connections; - connections["c"] = vAST::make_id("a"); - connections["i"] = vAST::make_id("x"); - connections["o"] = vAST::make_id("y"); + std::unique_ptr connections = std::make_unique(); + connections->insert("c", vAST::make_id("a")); + connections->insert("i", vAST::make_id("x")); + connections->insert("o", vAST::make_id("y")); body.push_back(std::make_unique( - "inner_module", std::move(parameters), "inner_module_inst", - std::move(connections))); + "inner_module", std::move(parameters), "inner_module_inst", + std::move(connections))); body.push_back(std::make_unique( std::make_unique("o"), std::make_unique("y"))); - std::unique_ptr module = std::make_unique( "test_module", std::move(ports), std::move(body)); diff --git a/tests/common.cpp b/tests/common.cpp index 9e2f9ff..d1cded5 100644 --- a/tests/common.cpp +++ b/tests/common.cpp @@ -11,14 +11,15 @@ vAST::Parameters make_simple_params() { return parameters; } -std::map> -make_simple_connections() { - std::map> connections; - connections["a"] = vAST::make_id("a"); - connections["b"] = - std::make_unique(vAST::make_id("b"), vAST::make_num("0")); - connections["c"] = std::make_unique( - vAST::make_id("c"), vAST::make_num("31"), vAST::make_num("0")); +std::unique_ptr make_simple_connections() { + std::unique_ptr connections = std::make_unique(); + connections->insert("a", vAST::make_id("a")); + connections->insert( + "b", + std::make_unique(vAST::make_id("b"), vAST::make_num("0"))); + connections->insert( + "c", std::make_unique( + vAST::make_id("c"), vAST::make_num("31"), vAST::make_num("0"))); return connections; }