Make sure ERC tests honour the severity settings.

(And in particular, IGNORE.)

Fixes https://gitlab.com/kicad/code/kicad/issues/6178
This commit is contained in:
Jeff Young 2020-11-01 17:37:52 +00:00
parent 4e5dd6952e
commit 7c505da368
1 changed files with 50 additions and 35 deletions

View File

@ -2088,24 +2088,35 @@ int CONNECTION_GRAPH::RunERC()
* format due to their TestDanglingEnds() implementation. * format due to their TestDanglingEnds() implementation.
*/ */
if( settings.IsTestEnabled( ERCE_DRIVER_CONFLICT ) && !subgraph->ResolveDrivers( true ) ) if( settings.IsTestEnabled( ERCE_DRIVER_CONFLICT ) )
error_count++; {
if( !subgraph->ResolveDrivers( true ) )
error_count++;
}
if( settings.IsTestEnabled( ERCE_BUS_TO_NET_CONFLICT ) if( settings.IsTestEnabled( ERCE_BUS_TO_NET_CONFLICT ) )
&& !ercCheckBusToNetConflicts( subgraph ) ) {
error_count++; if( !ercCheckBusToNetConflicts( subgraph ) )
error_count++;
}
if( settings.IsTestEnabled( ERCE_BUS_ENTRY_CONFLICT ) if( settings.IsTestEnabled( ERCE_BUS_ENTRY_CONFLICT ) )
&& !ercCheckBusToBusEntryConflicts( subgraph ) ) {
error_count++; if( !ercCheckBusToBusEntryConflicts( subgraph ) )
error_count++;
}
if( settings.IsTestEnabled( ERCE_BUS_TO_BUS_CONFLICT ) if( settings.IsTestEnabled( ERCE_BUS_TO_BUS_CONFLICT ) )
&& !ercCheckBusToBusConflicts( subgraph ) ) {
error_count++; if( !ercCheckBusToBusConflicts( subgraph ) )
error_count++;
}
if( settings.IsTestEnabled( ERCE_WIRE_DANGLING ) if( settings.IsTestEnabled( ERCE_WIRE_DANGLING ) )
&& !ercCheckFloatingWires( subgraph ) ) {
error_count++; if( !ercCheckFloatingWires( subgraph ) )
error_count++;
}
// The following checks are always performed since they don't currently // The following checks are always performed since they don't currently
// have an option exposed to the user // have an option exposed to the user
@ -2113,9 +2124,12 @@ int CONNECTION_GRAPH::RunERC()
if( !ercCheckNoConnects( subgraph ) ) if( !ercCheckNoConnects( subgraph ) )
error_count++; error_count++;
if( ( settings.IsTestEnabled( ERCE_LABEL_NOT_CONNECTED ) if( settings.IsTestEnabled( ERCE_LABEL_NOT_CONNECTED )
|| settings.IsTestEnabled( ERCE_GLOBLABEL ) ) && !ercCheckLabels( subgraph ) ) || settings.IsTestEnabled( ERCE_GLOBLABEL ) )
error_count++; {
if( !ercCheckLabels( subgraph ) )
error_count++;
}
} }
// Hierarchical sheet checking is done at the schematic level // Hierarchical sheet checking is done at the schematic level
@ -2340,7 +2354,8 @@ bool CONNECTION_GRAPH::ercCheckBusToBusEntryConflicts( const CONNECTION_SUBGRAPH
// TODO(JE) Check sheet pins here too? // TODO(JE) Check sheet pins here too?
bool CONNECTION_GRAPH::ercCheckNoConnects( const CONNECTION_SUBGRAPH* aSubgraph ) bool CONNECTION_GRAPH::ercCheckNoConnects( const CONNECTION_SUBGRAPH* aSubgraph )
{ {
wxString msg; ERC_SETTINGS& settings = m_schematic->ErcSettings();
wxString msg;
const SCH_SHEET_PATH& sheet = aSubgraph->m_sheet; const SCH_SHEET_PATH& sheet = aSubgraph->m_sheet;
SCH_SCREEN* screen = sheet.LastScreen(); SCH_SCREEN* screen = sheet.LastScreen();
bool ok = true; bool ok = true;
@ -2390,7 +2405,7 @@ bool CONNECTION_GRAPH::ercCheckNoConnects( const CONNECTION_SUBGRAPH* aSubgraph
} }
} }
if( pin && has_invalid_items ) if( pin && has_invalid_items && settings.IsTestEnabled( ERCE_NOCONNECT_CONNECTED ) )
{ {
std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_NOCONNECT_CONNECTED ); std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_NOCONNECT_CONNECTED );
ercItem->SetItems( pin ); ercItem->SetItems( pin );
@ -2401,7 +2416,7 @@ bool CONNECTION_GRAPH::ercCheckNoConnects( const CONNECTION_SUBGRAPH* aSubgraph
ok = false; ok = false;
} }
if( !has_other_items ) if( !has_other_items && settings.IsTestEnabled(ERCE_NOCONNECT_NOT_CONNECTED ) )
{ {
std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_NOCONNECT_NOT_CONNECTED ); std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_NOCONNECT_NOT_CONNECTED );
ercItem->SetItems( aSubgraph->m_no_connect ); ercItem->SetItems( aSubgraph->m_no_connect );
@ -2465,7 +2480,9 @@ bool CONNECTION_GRAPH::ercCheckNoConnects( const CONNECTION_SUBGRAPH* aSubgraph
} }
// Only one pin, and it's not a no-connect pin // Only one pin, and it's not a no-connect pin
if( pin && !has_other_connections && pin->GetType() != ELECTRICAL_PINTYPE::PT_NC ) if( pin && !has_other_connections
&& pin->GetType() != ELECTRICAL_PINTYPE::PT_NC
&& settings.IsTestEnabled( ERCE_PIN_NOT_CONNECTED ) )
{ {
std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_PIN_NOT_CONNECTED ); std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_PIN_NOT_CONNECTED );
ercItem->SetItems( pin ); ercItem->SetItems( pin );
@ -2486,8 +2503,9 @@ bool CONNECTION_GRAPH::ercCheckNoConnects( const CONNECTION_SUBGRAPH* aSubgraph
// We only apply this test to power symbols, because other symbols have invisible // We only apply this test to power symbols, because other symbols have invisible
// pins that are meant to be dangling, but the KiCad standard library power symbols // pins that are meant to be dangling, but the KiCad standard library power symbols
// have invisible pins that are *not* meant to be dangling. // have invisible pins that are *not* meant to be dangling.
if( testPin->GetLibPin()->GetParent()->IsPower() && if( testPin->GetLibPin()->GetParent()->IsPower()
testPin->ConnectedItems( sheet ).empty() ) && testPin->ConnectedItems( sheet ).empty()
&& settings.IsTestEnabled( ERCE_PIN_NOT_CONNECTED ) )
{ {
std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_PIN_NOT_CONNECTED ); std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_PIN_NOT_CONNECTED );
ercItem->SetItems( testPin ); ercItem->SetItems( testPin );
@ -2553,10 +2571,11 @@ bool CONNECTION_GRAPH::ercCheckLabels( const CONNECTION_SUBGRAPH* aSubgraph )
if( aSubgraph->m_no_connect ) if( aSubgraph->m_no_connect )
return true; return true;
bool ok = true; ERC_SETTINGS& settings = m_schematic->ErcSettings();
SCH_TEXT* text = nullptr; bool ok = true;
bool hasOtherConnections = false; SCH_TEXT* text = nullptr;
int pinCount = 0; bool hasOtherConnections = false;
int pinCount = 0;
for( auto item : aSubgraph->m_items ) for( auto item : aSubgraph->m_items )
{ {
@ -2572,7 +2591,7 @@ bool CONNECTION_GRAPH::ercCheckLabels( const CONNECTION_SUBGRAPH* aSubgraph )
// we want to error if an individual label in the subgraph is floating, even if it's // we want to error if an individual label in the subgraph is floating, even if it's
// connected to other valid things by way of another label on the same sheet. // connected to other valid things by way of another label on the same sheet.
if( text->IsDangling() ) if( text->IsDangling() && settings.IsTestEnabled( ERCE_LABEL_NOT_CONNECTED ) )
{ {
std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_LABEL_NOT_CONNECTED ); std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_LABEL_NOT_CONNECTED );
ercItem->SetItems( text ); ercItem->SetItems( text );
@ -2600,13 +2619,10 @@ bool CONNECTION_GRAPH::ercCheckLabels( const CONNECTION_SUBGRAPH* aSubgraph )
return true; return true;
bool isGlobal = text->Type() == SCH_GLOBAL_LABEL_T; bool isGlobal = text->Type() == SCH_GLOBAL_LABEL_T;
int errCode = isGlobal ? ERCE_GLOBLABEL : ERCE_LABEL_NOT_CONNECTED;
wxCHECK_MSG( m_schematic, true, "Null m_schematic in CONNECTION_GRAPH::ercCheckLabels" ); wxCHECK_MSG( m_schematic, true, "Null m_schematic in CONNECTION_GRAPH::ercCheckLabels" );
// Global label check can be disabled independently
if( !m_schematic->ErcSettings().IsTestEnabled( ERCE_GLOBLABEL ) && isGlobal )
return true;
wxString name = EscapeString( text->GetShownText(), CTX_NETNAME ); wxString name = EscapeString( text->GetShownText(), CTX_NETNAME );
if( isGlobal ) if( isGlobal )
@ -2642,10 +2658,9 @@ bool CONNECTION_GRAPH::ercCheckLabels( const CONNECTION_SUBGRAPH* aSubgraph )
hasOtherConnections = true; hasOtherConnections = true;
} }
if( !hasOtherConnections ) if( !hasOtherConnections && settings.IsTestEnabled( errCode ) )
{ {
std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( isGlobal ? ERCE_GLOBLABEL std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( errCode );
: ERCE_LABEL_NOT_CONNECTED );
ercItem->SetItems( text ); ercItem->SetItems( text );
SCH_MARKER* marker = new SCH_MARKER( ercItem, text->GetPosition() ); SCH_MARKER* marker = new SCH_MARKER( ercItem, text->GetPosition() );