7
mirror of https://gitlab.com/kicad/code/kicad.git synced 2025-04-19 00:21:36 +00:00

Check secondary driver names when merging

If two nets are joined by a global power pin but both have global labels
that override the net name, we still want them to be merged.  This
checks for all net names in the drivers when looking for subgraph
merging candidates

Fixes https://gitlab.com/kicad/code/kicad/-/issues/18092
This commit is contained in:
Seth Hillbrand 2024-12-10 11:10:19 -08:00
parent 937d8c9541
commit ad985aff9d
7 changed files with 2147 additions and 13 deletions

View File

@ -2026,7 +2026,7 @@ void CONNECTION_GRAPH::processSubGraphs()
subgraph->m_bus_neighbors[member].insert( candidate );
candidate->m_bus_parents[member].insert( subgraph );
}
else if( connection->Type() == candidate->m_driver_connection->Type() )
else if( !connection->IsBus() || connection->Type() == candidate->m_driver_connection->Type() )
{
wxLogTrace( ConnTrace, wxS( "%lu (%s) absorbs neighbor %lu (%s)" ),
subgraph->m_code, connection->Name(),
@ -2184,18 +2184,19 @@ void CONNECTION_GRAPH::buildConnectionGraph( std::function<void( SCH_ITEM* )>* a
if( !secondary_is_global && candidate->m_sheet != subgraph->m_sheet )
continue;
SCH_CONNECTION* conn = candidate->m_driver_connection;
if( conn->Name() == secondary_name )
for( SCH_ITEM* candidate_driver : candidate->m_drivers )
{
wxLogTrace( ConnTrace, wxS( "Global %lu (%s) promoted to %s" ),
candidate->m_code, conn->Name(),
subgraph->m_driver_connection->Name() );
if( candidate->GetNameForDriver( candidate_driver ) == secondary_name )
{
wxLogTrace( ConnTrace, wxS( "Global %lu (%s) promoted to %s" ),
candidate->m_code, candidate->m_driver_connection->Name(),
subgraph->m_driver_connection->Name() );
conn->Clone( *subgraph->m_driver_connection );
candidate->m_driver_connection->Clone( *subgraph->m_driver_connection );
candidate->m_dirty = false;
propagateToNeighbors( candidate, false );
candidate->m_dirty = false;
propagateToNeighbors( candidate, false );
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

LOADING design file

View File

LOADING design file

View File

@ -62,6 +62,7 @@ set( QA_EESCHEMA_SRCS
erc/test_erc_label_multiple_wires.cpp
erc/test_erc_unconnected_wire_endpoints.cpp
test_connectivity_algo.cpp
test_eagle_plugin.cpp
test_junction_helpers.cpp
test_lib_part.cpp

View File

@ -0,0 +1,64 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2024 KiCad Developers, see AUTHORS.TXT for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.en.html
* or you may search the http://www.gnu.org website for the version 32 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <qa_utils/wx_utils/unit_test_utils.h>
#include <schematic_utils/schematic_file_util.h>
#include <connection_graph.h>
#include <schematic.h>
#include <sch_sheet.h>
#include <sch_screen.h>
#include <settings/settings_manager.h>
#include <locale_io.h>
struct CONNECTIVITY_TEST_FIXTURE
{
CONNECTIVITY_TEST_FIXTURE() :
m_settingsManager( true /* headless */ )
{ }
SETTINGS_MANAGER m_settingsManager;
std::unique_ptr<SCHEMATIC> m_schematic;
};
BOOST_FIXTURE_TEST_CASE( CheckNetCounts, CONNECTIVITY_TEST_FIXTURE )
{
LOCALE_IO dummy;
std::vector<std::pair<wxString, int>> tests =
{
{ "issue18092/issue18092", 1 }
};
for( auto&[ name, nets] : tests )
{
KI_TEST::LoadSchematic( m_settingsManager, name, m_schematic );
SCH_SHEET_LIST sheets = m_schematic->BuildSheetListSortedByPageNumbers();
CONNECTION_GRAPH* graph = m_schematic->ConnectionGraph();
BOOST_CHECK( nets == graph->GetNetMap().size() );
}
}

View File

@ -32,9 +32,9 @@
#include <settings/settings_manager.h>
#include <locale_io.h>
struct INCREMENTAL_NETLIST_TEST_FIXTURE
struct CONNECTIVITY_TEST_FIXTURE
{
INCREMENTAL_NETLIST_TEST_FIXTURE() :
CONNECTIVITY_TEST_FIXTURE() :
m_settingsManager( true /* headless */ )
{ }
@ -42,7 +42,7 @@ struct INCREMENTAL_NETLIST_TEST_FIXTURE
std::unique_ptr<SCHEMATIC> m_schematic;
};
BOOST_FIXTURE_TEST_CASE( RemoveAddItems, INCREMENTAL_NETLIST_TEST_FIXTURE )
BOOST_FIXTURE_TEST_CASE( RemoveAddItems, CONNECTIVITY_TEST_FIXTURE )
{
LOCALE_IO dummy;