Fix determinism issue when comparing a local and hierarchical label

Fixes https://gitlab.com/kicad/code/kicad/-/issues/8406
This commit is contained in:
Jon Evans 2021-07-03 16:42:49 -04:00
parent 8cbd754362
commit 3aab37bd2a
1 changed files with 17 additions and 17 deletions

View File

@ -1832,18 +1832,18 @@ void CONNECTION_GRAPH::propagateToNeighbors( CONNECTION_SUBGRAPH* aSubgraph )
} }
// Now, find the best driver for this chain of subgraphs // Now, find the best driver for this chain of subgraphs
CONNECTION_SUBGRAPH* original = aSubgraph; CONNECTION_SUBGRAPH* bestDriver = aSubgraph;
CONNECTION_SUBGRAPH::PRIORITY highest = CONNECTION_SUBGRAPH::PRIORITY highest =
CONNECTION_SUBGRAPH::GetDriverPriority( aSubgraph->m_driver ); CONNECTION_SUBGRAPH::GetDriverPriority( aSubgraph->m_driver );
bool originalStrong = ( highest >= CONNECTION_SUBGRAPH::PRIORITY::HIER_LABEL ); bool bestIsStrong = ( highest >= CONNECTION_SUBGRAPH::PRIORITY::HIER_LABEL );
wxString originalName = original->m_driver_connection->Name(); wxString bestName = aSubgraph->m_driver_connection->Name();
// Check if a subsheet has a higher-priority connection to the same net // Check if a subsheet has a higher-priority connection to the same net
if( highest < CONNECTION_SUBGRAPH::PRIORITY::POWER_PIN ) if( highest < CONNECTION_SUBGRAPH::PRIORITY::POWER_PIN )
{ {
for( CONNECTION_SUBGRAPH* subgraph : visited ) for( CONNECTION_SUBGRAPH* subgraph : visited )
{ {
if( subgraph == original ) if( subgraph == aSubgraph )
continue; continue;
CONNECTION_SUBGRAPH::PRIORITY priority = CONNECTION_SUBGRAPH::PRIORITY priority =
@ -1851,8 +1851,8 @@ void CONNECTION_GRAPH::propagateToNeighbors( CONNECTION_SUBGRAPH* aSubgraph )
bool candidateStrong = ( priority >= CONNECTION_SUBGRAPH::PRIORITY::HIER_LABEL ); bool candidateStrong = ( priority >= CONNECTION_SUBGRAPH::PRIORITY::HIER_LABEL );
wxString candidateName = subgraph->m_driver_connection->Name(); wxString candidateName = subgraph->m_driver_connection->Name();
bool shorterPath = subgraph->m_sheet.size() < original->m_sheet.size(); bool shorterPath = subgraph->m_sheet.size() < bestDriver->m_sheet.size();
bool asGoodPath = subgraph->m_sheet.size() <= original->m_sheet.size(); bool asGoodPath = subgraph->m_sheet.size() <= bestDriver->m_sheet.size();
// Pick a better driving subgraph if it: // Pick a better driving subgraph if it:
// a) has a power pin or global driver // a) has a power pin or global driver
@ -1862,28 +1862,28 @@ void CONNECTION_GRAPH::propagateToNeighbors( CONNECTION_SUBGRAPH* aSubgraph )
// e) matches our strength and is at least as short, and is alphabetically lower // e) matches our strength and is at least as short, and is alphabetically lower
if( ( priority >= CONNECTION_SUBGRAPH::PRIORITY::POWER_PIN ) || if( ( priority >= CONNECTION_SUBGRAPH::PRIORITY::POWER_PIN ) ||
( !originalStrong && candidateStrong ) || ( !bestIsStrong && candidateStrong ) ||
( priority > highest && candidateStrong ) || ( priority > highest && candidateStrong ) ||
( priority == highest && candidateStrong && shorterPath ) || ( priority == highest && candidateStrong && shorterPath ) ||
( ( originalStrong == candidateStrong ) && asGoodPath && ( ( bestIsStrong == candidateStrong ) && asGoodPath && ( priority == highest ) &&
( candidateName < originalName ) ) ) ( candidateName < bestName ) ) )
{ {
original = subgraph; bestDriver = subgraph;
highest = priority; highest = priority;
originalStrong = candidateStrong; bestIsStrong = candidateStrong;
originalName = subgraph->m_driver_connection->Name(); bestName = candidateName;
} }
} }
} }
if( original != aSubgraph ) if( bestDriver != aSubgraph )
{ {
wxLogTrace( ConnTrace, "%lu (%s) overridden by new driver %lu (%s)", wxLogTrace( ConnTrace, "%lu (%s) overridden by new driver %lu (%s)",
aSubgraph->m_code, aSubgraph->m_driver_connection->Name(), original->m_code, aSubgraph->m_code, aSubgraph->m_driver_connection->Name(), bestDriver->m_code,
original->m_driver_connection->Name() ); bestDriver->m_driver_connection->Name() );
} }
conn = original->m_driver_connection; conn = bestDriver->m_driver_connection;
for( CONNECTION_SUBGRAPH* subgraph : visited ) for( CONNECTION_SUBGRAPH* subgraph : visited )
{ {