89 if( !aGraph ||
m_nets.size() < 2 )
98 wxString startNet = netKeyForPin( aGraph,
pinA );
99 wxString endNet = netKeyForPin( aGraph, pinB );
101 if( startNet.IsEmpty() || endNet.IsEmpty() )
104 if( !
m_nets.count( startNet ) || !
m_nets.count( endNet ) )
110 std::map<wxString, std::set<wxString>> adjacency;
117 std::vector<SCH_PIN*> pins = sym->GetPins();
122 wxString net = netKeyForPin( aGraph, p );
124 if( net.IsEmpty() || !
m_nets.count( net ) )
127 if( !last.IsEmpty() && last != net )
129 adjacency[last].insert( net );
130 adjacency[net].insert( last );
138 std::map<wxString, wxString> predecessor;
139 std::set<wxString> visited;
140 std::queue<wxString> frontier;
142 frontier.push( startNet );
143 visited.insert( startNet );
145 bool foundEnd =
false;
147 while( !frontier.empty() && !foundEnd )
149 wxString cur = frontier.front();
158 auto it = adjacency.find( cur );
160 if( it == adjacency.end() )
163 for(
const wxString& nbr : it->second )
165 if( visited.insert( nbr ).second )
167 predecessor[nbr] = cur;
168 frontier.push( nbr );
173 std::vector<wxString>
path;
178 for( wxString cur = endNet; cur != startNet; cur = predecessor[cur] )
179 path.push_back( cur );
181 path.push_back( startNet );
182 std::reverse(
path.begin(),
path.end() );
188 path.push_back( startNet );
190 if( startNet != endNet )
191 path.push_back( endNet );
195 std::set<wxString> onPath(
path.begin(),
path.end() );
199 for(
const wxString& net :
m_nets )
201 if( !onPath.count( net ) )