inline void populate_connected_component (connectivity_database& connectivity, std::vector<polygon>& polygons, std::vector<int> polygon_color, std::vector<std::set<int> >& graph, std::size_t node_id, std::size_t polygon_id_offset, std::string& net, std::vector<std::string>& net_ids, std::string net_prefix, std::string& layout_layer) { if(polygon_color[node_id] == 1) return; polygon_color[node_id] = 1; if(node_id < polygon_id_offset && net_ids[node_id] != net) { //merge nets in connectivity database //if one of the nets is internal net merge it into the other std::string net1 = net_ids[node_id]; std::string net2 = net; if(net.compare(0, net_prefix.length(), net_prefix) == 0) { net = net1; std::swap(net1, net2); } else { net_ids[node_id] = net; } connectivity_database::iterator itr = connectivity.find(net1); if(itr != connectivity.end()) { for(layout_database::iterator itr2 = (*itr).second.begin(); itr2 != (*itr).second.end(); ++itr2) { connectivity[net2][(*itr2).first].insert((*itr2).second); } connectivity.erase(itr); } } if(node_id >= polygon_id_offset) connectivity[net][layout_layer].insert(polygons[node_id - polygon_id_offset]); for(std::set<int>::iterator itr = graph[node_id].begin(); itr != graph[node_id].end(); ++itr) { populate_connected_component(connectivity, polygons, polygon_color, graph, *itr, polygon_id_offset, net, net_ids, net_prefix, layout_layer); } }