diff --git a/include/verilogAST/assign_inliner.hpp b/include/verilogAST/assign_inliner.hpp index aaa1794..8c12d2d 100644 --- a/include/verilogAST/assign_inliner.hpp +++ b/include/verilogAST/assign_inliner.hpp @@ -109,6 +109,31 @@ class IndexBlacklister : public Blacklister { virtual std::unique_ptr visit(std::unique_ptr node); }; +class ModuleInstanceBlacklister : public Blacklister { + // Prevent inling wires into module instance nodes, e.g. + // wire z; + // assign b = a; + // assign z = i + a; // <--- not inlined into .w below + // inner_module inner_module_inst ( + // .c(a), + // .i(i), + // .w(z), + // .o(o) + // ); + // + // We can make this configurable, but for now we keep it as the default since + // some tools do not support general expressions inside module instance + // statements + public: + ModuleInstanceBlacklister( + std::set &wire_blacklist, + std::map> &assign_map) + : Blacklister(wire_blacklist, assign_map){}; + using Blacklister::visit; + virtual std::unique_ptr visit( + std::unique_ptr node); +}; + class AssignInliner : public Transformer { std::map read_count; std::map assign_count; diff --git a/src/assign_inliner.cpp b/src/assign_inliner.cpp index b4b18af..b8136a6 100644 --- a/src/assign_inliner.cpp +++ b/src/assign_inliner.cpp @@ -50,6 +50,16 @@ std::unique_ptr IndexBlacklister::visit(std::unique_ptr node) { return node; } +std::unique_ptr ModuleInstanceBlacklister::visit( + std::unique_ptr node) { + this->blacklist = true; + for (auto&& conn : *node->connections) { + conn.second = this->visit(std::move(conn.second)); + } + this->blacklist = false; + return node; +} + std::unique_ptr WireReadCounter::visit( std::unique_ptr node) { this->read_count[node->toString()]++; @@ -264,6 +274,10 @@ std::unique_ptr AssignInliner::visit(std::unique_ptr node) { SliceBlacklister slice_blacklist(this->wire_blacklist, this->assign_map); node = slice_blacklist.visit(std::move(node)); + ModuleInstanceBlacklister module_instance_blacklister(this->wire_blacklist, + this->assign_map); + node = module_instance_blacklister.visit(std::move(node)); + std::vector> new_ports; for (auto&& item : node->ports) { new_ports.push_back(this->visit(std::move(item)));