From: Andrew Zonenberg Date: Mon, 14 Aug 2017 18:44:05 +0000 (-0700) Subject: rmports: Now remove ports from cell instances if we optimized them out of that cell X-Git-Tag: yosys-0.8~345^2~1^2 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=15e41d6363b9f3a71a2fe564c793296f8c1fba6d;p=yosys.git rmports: Now remove ports from cell instances if we optimized them out of that cell --- diff --git a/passes/opt/rmports.cc b/passes/opt/rmports.cc index 39cef12e6..3aaa05c99 100644 --- a/passes/opt/rmports.cc +++ b/passes/opt/rmports.cc @@ -43,12 +43,44 @@ struct RmportsPassPass : public Pass { { log_header(design, "Executing RMPORTS pass (remove top level ports with no connections).\n"); + //The set of ports we removed + std::map< RTLIL::IdString, std::set > removed_ports; + + //Find all of the unused ports, and remove them from that module auto modules = design->selected_modules(); for(auto mod : modules) - ProcessModule(mod); + ScanModule(mod, removed_ports); + + //Remove the unused ports from all instances of those modules + for(auto mod : modules) + CleanupModule(mod, removed_ports); + } + + void CleanupModule(RTLIL::Module* module, std::map< RTLIL::IdString, std::set >& removed_ports) + { + log("Removing now-unused cell ports in module %s\n", module->name.c_str()); + + auto cells = module->cells(); + for(auto cell : cells) + { + if(removed_ports.find(cell->type) == removed_ports.end()) + { + //log(" Not touching instance \"%s\" because we didn't remove any ports from module \"%s\"\n", + // cell->name.c_str(), cell->type.c_str()); + continue; + } + + auto ports_to_remove = removed_ports[cell->type]; + for(auto p : ports_to_remove) + { + log(" Removing port \"%s\" from instance \"%s\"\n", + p.c_str(), cell->type.c_str()); + cell->unsetPort(p); + } + } } - void ProcessModule(RTLIL::Module* module) + void ScanModule(RTLIL::Module* module, std::map< RTLIL::IdString, std::set >& removed_ports) { log("Finding unconnected ports in module %s\n", module->name.c_str()); @@ -118,6 +150,7 @@ struct RmportsPassPass : public Pass { for(auto port : unused_ports) { log(" removing unused port %s\n", port.c_str()); + removed_ports[module->name].emplace(port); //Remove from ports list for(size_t i=0; iports.size(); i++)