82 _(
"Bidirectional Pin" ),
86 _(
"Unspecified Pin" ),
87 _(
"Power Input Pin" ),
88 _(
"Power Output Pin" ),
89 _(
"Open Collector" ),
99 _(
"Bidirectional Pin" ),
100 _(
"Tri-State Pin" ),
103 _(
"Unspecified Pin" ),
104 _(
"Power Input Pin" ),
105 _(
"Power Output Pin" ),
106 _(
"Open Collector" ),
148 std::vector<SCH_SHEET*> list;
151 list.push_back(
static_cast<SCH_SHEET*
>( item ) );
153 for(
size_t i = 0; i < list.size(); i++ )
157 for(
size_t j = i + 1; j < list.size(); j++ )
169 ercItem->SetItems( sheet, test_item );
172 screen->Append( marker );
190 [
this]( wxString str )
193 return str.Matches( wxS(
"*${*}*" ) );
200 static wxRegEx warningExpr( wxS(
"^\\$\\{ERC_WARNING\\s*([^}]*)\\}(.*)$" ) );
201 static wxRegEx errorExpr( wxS(
"^\\$\\{ERC_ERROR\\s*([^}]*)\\}(.*)$" ) );
203 if( warningExpr.Matches(
text ) )
206 wxString ercText = warningExpr.GetMatch(
text, 1 );
209 ercItem->SetItems( item );
211 ercText +=
_(
" (in drawing sheet)" );
213 ercItem->SetSheetSpecificPath( sheet );
214 ercItem->SetErrorMessage( ercText );
217 screen->Append( marker );
222 if( errorExpr.Matches(
text ) )
225 wxString ercText = errorExpr.GetMatch(
text, 1 );
228 ercItem->SetItems( item );
230 ercText +=
_(
" (in drawing sheet)" );
232 ercItem->SetSheetSpecificPath( sheet );
233 ercItem->SetErrorMessage( ercText );
236 screen->Append( marker );
267 if( unresolved( field.GetShownText( &sheet,
true ) ) )
270 ercItem->SetItems( symbol );
271 ercItem->SetSheetSpecificPath( sheet );
277 testAssertion( &field, sheet, screen, field.GetText(), field.
GetPosition() );
293 if( unresolved( textItem->
GetShownText( &sheet,
true ) ) )
296 ercItem->SetItems( symbol );
297 ercItem->SetSheetSpecificPath( sheet );
307 testAssertion( symbol, sheet, screen, textItem->
GetText(),
314 if( unresolved( textboxItem->
GetShownText(
nullptr, &sheet,
true ) ) )
317 ercItem->SetItems( symbol );
318 ercItem->SetSheetSpecificPath( sheet );
328 testAssertion( symbol, sheet, screen, textboxItem->
GetText(),
337 for(
SCH_FIELD& field : label->GetFields() )
339 if( unresolved( field.GetShownText( &sheet,
true ) ) )
342 ercItem->SetItems( label );
343 ercItem->SetSheetSpecificPath( sheet );
349 testAssertion( &field, sheet, screen, field.GetText(), field.
GetPosition() );
358 if( unresolved( field.GetShownText( &sheet,
true ) ) )
361 ercItem->SetItems( subSheet );
362 ercItem->SetSheetSpecificPath( sheet );
368 testAssertion( &field, sheet, screen, field.GetText(), field.
GetPosition() );
376 if(
pin->GetShownText( &subSheetPath,
true ).Matches( wxS(
"*${*}*" ) ) )
379 ercItem->SetItems(
pin );
380 ercItem->SetSheetSpecificPath( sheet );
389 if(
text->GetShownText( &sheet,
true ).Matches( wxS(
"*${*}*" ) ) )
392 ercItem->SetItems(
text );
393 ercItem->SetSheetSpecificPath( sheet );
399 testAssertion(
text, sheet, screen,
text->GetText(),
text->GetPosition() );
403 if( textBox->GetShownText(
nullptr, &sheet,
true ).Matches( wxS(
"*${*}*" ) ) )
406 ercItem->SetItems( textBox );
407 ercItem->SetSheetSpecificPath( sheet );
413 testAssertion( textBox, sheet, screen, textBox->GetText(), textBox->
GetPosition() );
421 if( testAssertion(
nullptr, sheet, screen,
text->GetText(),
text->GetPosition() ) )
425 else if(
text->GetShownText(
true ).Matches( wxS(
"*${*}*" ) ) )
428 ercItem->SetErrorMessage(
_(
"Unresolved text variable in drawing sheet" ) );
429 ercItem->SetSheetSpecificPath( sheet );
444 for( std::pair<const wxString, SCH_REFERENCE_LIST>& symbol :
m_refMap )
459 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
464 if( !unitFP.IsEmpty() )
467 unitName = unit->
GetRef( &sheetPath,
true );
472 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
480 if( unit && !secondFp.IsEmpty() && unitFP != secondFp )
482 msg.Printf(
_(
"Different footprints assigned to %s and %s" ),
483 unitName, secondName );
486 ercItem->SetErrorMessage( msg );
487 ercItem->SetItems( unit, secondUnit );
505 for( std::pair<const wxString, SCH_REFERENCE_LIST>& symbol :
m_refMap )
509 wxCHECK2( refList.
GetCount(),
continue );
519 std::set<int> lib_units;
520 std::set<int> instance_units;
521 std::set<int> missing_units;
524 [&]( std::set<int>& aMissingUnits,
const wxString& aErrorMsg,
int aErrorCode )
527 wxString missing_pin_units = wxS(
"[ " );
530 for(
int missing_unit : aMissingUnits )
534 missing_pin_units += wxS(
"..." );
541 missing_pin_units.Truncate( missing_pin_units.length() - 2 );
542 missing_pin_units += wxS(
" ]" );
544 msg.Printf( aErrorMsg, symbol.first, missing_pin_units );
547 ercItem->SetErrorMessage( msg );
548 ercItem->SetItems( unit );
549 ercItem->SetSheetSpecificPath( base_ref.
GetSheetPath() );
558 for(
int ii = 1; ii <= libSymbol->
GetUnitCount(); ++ii )
559 lib_units.insert( lib_units.end(), ii );
561 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
562 instance_units.insert( instance_units.end(), refList.
GetItem( ii ).
GetUnit() );
564 std::set_difference( lib_units.begin(), lib_units.end(),
565 instance_units.begin(), instance_units.end(),
566 std::inserter( missing_units, missing_units.begin() ) );
573 std::set<int> missing_power;
574 std::set<int> missing_input;
575 std::set<int> missing_bidi;
577 for(
int missing_unit : missing_units )
581 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
592 switch(
pin->GetType() )
595 missing_power.insert( missing_unit );
599 missing_bidi.insert( missing_unit );
603 missing_input.insert( missing_unit );
614 report( missing_power,
_(
"Symbol %s has input power pins in units %s that are not placed" ),
620 report( missing_input,
_(
"Symbol %s has input pins in units %s that are not placed" ),
626 report( missing_bidi,
_(
"Symbol %s has bidirectional pins in units %s that are not placed" ),
638 std::shared_ptr<NET_SETTINGS>& settings =
m_schematic->Project().GetProjectFile().NetSettings();
639 wxString defaultNetclass = settings->GetDefaultNetclass()->GetName();
648 ercItem->SetItems( item );
649 ercItem->SetErrorMessage( wxString::Format(
_(
"Netclass %s is not defined" ), netclass ) );
668 wxString netclass = field->
GetShownText( &sheet,
false );
670 if( !netclass.empty() && !netclass.IsSameAs( defaultNetclass )
671 && !settings->HasNetclass( netclass ) )
673 logError( sheet, item, netclass );
694 std::map<VECTOR2I, std::vector<SCH_ITEM*>> connMap;
701 connMap[pt].emplace_back( label );
704 for(
const std::pair<
const VECTOR2I, std::vector<SCH_ITEM*>>& pair : connMap )
706 std::vector<SCH_ITEM*> lines;
708 for(
SCH_ITEM* item : sheet.LastScreen()->Items().Overlapping(
SCH_LINE_T, pair.first ) )
717 lines.emplace_back( line );
720 if( lines.size() > 1 )
726 wxString msg = wxString::Format(
_(
"Label connects more than one wire at %d, %d" ),
727 pair.first.x, pair.first.y );
729 ercItem->SetItems( pair.second.front(), lines[0], lines[1], lines[2] );
730 ercItem->SetErrorMessage( msg );
731 ercItem->SetSheetSpecificPath( sheet );
734 sheet.LastScreen()->Append( marker );
747 auto pinStackAlreadyRepresented =
748 [](
SCH_PIN*
pin, std::vector<SCH_ITEM*>& collection ) ->
bool
752 if( item->Type() ==
SCH_PIN_T && item->GetParentSymbol() ==
pin->GetParentSymbol() )
766 std::map<VECTOR2I, std::vector<SCH_ITEM*>> connMap;
775 std::vector<SCH_ITEM*>& entry = connMap[
pin->GetPosition()];
778 if( pinStackAlreadyRepresented(
pin, entry ) )
781 entry.emplace_back(
pin );
793 connMap[pt].emplace_back( line );
796 for(
const std::pair<
const VECTOR2I, std::vector<SCH_ITEM*>>& pair : connMap )
798 if( pair.second.size() >= 4 )
804 ercItem->SetItems( pair.second[0], pair.second[1], pair.second[2], pair.second[3] );
806 wxString msg = wxString::Format(
_(
"Four items connected at %d, %d" ),
807 pair.first.x, pair.first.y );
808 ercItem->SetErrorMessage( msg );
810 ercItem->SetSheetSpecificPath( sheet );
813 sheet.LastScreen()->Append( marker );
828 std::map<VECTOR2I, std::vector<SCH_ITEM*>> pinMap;
833 if( pinMap.count( pt ) )
834 pinMap[pt].emplace_back( aOther );
844 pinMap[
pin->GetPosition()].emplace_back(
pin );
848 for(
SCH_ITEM* item : sheet.LastScreen()->Items() )
857 addOther(
pin->GetPosition(),
pin );
862 for(
const VECTOR2I& pt : item->GetConnectionPoints() )
863 addOther( pt, item );
867 for(
const std::pair<
const VECTOR2I, std::vector<SCH_ITEM*>>& pair : pinMap )
869 if( pair.second.size() > 1 )
897 ercItem->SetItems( pair.second[0], pair.second[1],
898 pair.second.size() > 2 ? pair.second[2] :
nullptr,
899 pair.second.size() > 3 ? pair.second[3] :
nullptr );
900 ercItem->SetErrorMessage(
_(
"Pin with 'no connection' type is connected" ) );
901 ercItem->SetSheetSpecificPath( sheet );
904 sheet.LastScreen()->Append( marker );
919 using iterator_t = std::vector<ERC_SCH_PIN_CONTEXT>::iterator;
920 std::vector<ERC_SCH_PIN_CONTEXT> pins;
921 std::unordered_map<EDA_ITEM*, SCH_SCREEN*> pinToScreenMap;
922 bool has_noconnect =
false;
927 has_noconnect =
true;
933 pins.emplace_back(
static_cast<SCH_PIN*
>( item ), subgraph->
GetSheet() );
939 std::sort( pins.begin(), pins.end(),
942 int ret = StrNumCmp( lhs.Pin()->GetParentSymbol()->GetRef( &lhs.Sheet() ),
943 rhs.Pin()->GetParentSymbol()->GetRef( &rhs.Sheet() ) );
946 ret = StrNumCmp( lhs.Pin()->GetNumber(), rhs.Pin()->GetNumber() );
956 bool hasDriver =
false;
957 std::vector<ERC_SCH_PIN_CONTEXT*> pinsNeedingDrivers;
958 std::vector<ERC_SCH_PIN_CONTEXT*> nonPowerPinsNeedingDrivers;
963 bool ispowerNet =
false;
974 std::vector<std::tuple<iterator_t, iterator_t, PIN_ERROR>> pin_mismatches;
975 std::map<iterator_t, int> pin_mismatch_counts;
977 for(
auto refIt = pins.begin(); refIt != pins.end(); ++refIt )
987 pinsNeedingDrivers.push_back( &refPin );
990 nonPowerPinsNeedingDrivers.push_back( &refPin );
992 if( !needsDriver.
Pin()
997 needsDriver = refPin;
998 needsDriverType = needsDriver.
Pin()->
GetType();
1007 for(
auto testIt = refIt + 1; testIt != pins.end(); ++testIt )
1028 pin_mismatches.emplace_back( std::tuple<iterator_t, iterator_t, PIN_ERROR>{ refIt, testIt,
erc } );
1032 pin_mismatch_counts[refIt] =
m_settings.GetPinTypeWeight( ( *refIt ).Pin()->GetType() );
1033 pin_mismatch_counts[testIt] =
m_settings.GetPinTypeWeight( ( *testIt ).Pin()->GetType() );
1037 if( !pin_mismatch_counts.contains( testIt ) )
1038 pin_mismatch_counts.emplace( testIt, 1 );
1040 pin_mismatch_counts[testIt]++;
1042 if( !pin_mismatch_counts.contains( refIt ) )
1043 pin_mismatch_counts.emplace( refIt, 1 );
1045 pin_mismatch_counts[refIt]++;
1051 std::multimap<size_t, iterator_t, std::greater<size_t>> pins_dsc;
1053 std::transform( pin_mismatch_counts.begin(), pin_mismatch_counts.end(),
1054 std::inserter( pins_dsc, pins_dsc.begin() ),
1057 return std::pair<size_t, iterator_t>( p.second, p.first );
1060 for(
const auto& [amount, pinItBind] : pins_dsc )
1062 auto& pinIt = pinItBind;
1064 if( pin_mismatches.empty() )
1070 iterator_t nearest_pin = pins.end();
1071 double smallest_distance = std::numeric_limits<double>::infinity();
1076 [&](
const auto& tuple )
1080 if( pinIt == std::get<0>( tuple ) )
1081 other = std::get<1>( tuple );
1082 else if( pinIt == std::get<1>( tuple ) )
1083 other = std::get<0>( tuple );
1087 if( ( *pinIt ).Sheet().Cmp( ( *other ).Sheet() ) != 0 )
1089 if( std::isinf( smallest_distance ) )
1091 nearest_pin = other;
1092 erc = std::get<2>( tuple );
1099 if( std::isinf( smallest_distance ) ||
distance < smallest_distance )
1102 nearest_pin = other;
1103 erc = std::get<2>( tuple );
1110 if( nearest_pin != pins.end() )
1112 SCH_PIN* other_pin = ( *nearest_pin ).Pin();
1116 ercItem->SetItems(
pin, other_pin );
1117 ercItem->SetSheetSpecificPath( ( *pinIt ).Sheet() );
1118 ercItem->SetItemsSheetPaths( ( *pinIt ).Sheet(), ( *nearest_pin ).Sheet() );
1120 ercItem->SetErrorMessage( wxString::Format(
_(
"Pins of type %s and %s are connected" ),
1125 pinToScreenMap[
pin]->Append( marker );
1130 if( needsDriver.
Pin() && !hasDriver && !has_noconnect )
1136 std::vector<ERC_SCH_PIN_CONTEXT*> pinsToMark;
1140 if( !nonPowerPinsNeedingDrivers.empty() )
1141 pinsToMark = nonPowerPinsNeedingDrivers;
1143 pinsToMark = pinsNeedingDrivers;
1147 if( !nonPowerPinsNeedingDrivers.empty() )
1148 pinsToMark.push_back( nonPowerPinsNeedingDrivers.front() );
1150 pinsToMark.push_back( &needsDriver );
1157 ercItem->SetItems( pinCtx->Pin() );
1158 ercItem->SetSheetSpecificPath( pinCtx->Sheet() );
1159 ercItem->SetItemsSheetPaths( pinCtx->Sheet() );
1162 pinToScreenMap[pinCtx->Pin()]->Append( marker );
1177 std::unordered_map<wxString, std::pair<wxString, SCH_PIN*>> pinToNetMap;
1181 const wxString& netName = net.first.Name;
1192 if( !
pin->GetParentSymbol()->IsMultiUnit() )
1195 wxString
name =
pin->GetParentSymbol()->GetRef( &sheet ) +
":" +
pin->GetShownNumber();
1197 if( !pinToNetMap.count(
name ) )
1199 pinToNetMap[
name] = std::make_pair( netName,
pin );
1201 else if( pinToNetMap[
name].first != netName )
1205 ercItem->SetErrorMessage( wxString::Format(
_(
"Pin %s is connected to both %s and %s" ),
1206 pin->GetShownNumber(),
1208 pinToNetMap[
name].first ) );
1210 ercItem->SetItems(
pin, pinToNetMap[
name].second );
1211 ercItem->SetSheetSpecificPath( sheet );
1212 ercItem->SetItemsSheetPaths( sheet, sheet );
1232 [](
const wxString& txt )
1234 wxString upper = txt.Upper();
1235 return upper.Contains( wxT(
"GND" ) );
1245 bool hasGroundNet =
false;
1246 std::vector<SCH_PIN*> mismatched;
1251 wxString net = conn ? conn->
GetNetName() : wxString();
1252 bool netIsGround = isGround( net );
1262 hasGroundNet =
true;
1264 if( isGround(
pin->GetShownName() ) && !netIsGround )
1265 mismatched.push_back(
pin );
1274 ercItem->SetErrorMessage( wxString::Format(
_(
"Pin %s not connected to ground net" ),
1275 pin->GetShownName() ) );
1276 ercItem->SetItems(
pin );
1277 ercItem->SetSheetSpecificPath( sheet );
1278 ercItem->SetItemsSheetPaths( sheet );
1281 screen->
Append( marker );
1307 pin->GetStackedPinNumbers( &valid );
1312 ercItem->SetItems(
pin );
1313 ercItem->SetSheetSpecificPath( sheet );
1314 ercItem->SetItemsSheetPaths( sheet );
1317 screen->
Append( marker );
1332 std::unordered_map<wxString, std::pair<SCH_ITEM*, SCH_SHEET_PATH>> globalLabels;
1333 std::unordered_map<wxString, std::pair<SCH_ITEM*, SCH_SHEET_PATH>> localLabels;
1348 auto& map = item->Type() ==
SCH_LABEL_T ? localLabels : globalLabels;
1350 if( !map.count(
text ) )
1352 map[
text] = std::make_pair( label, sheet );
1359 for(
auto& [globalText, globalItem] : globalLabels )
1361 for(
auto& [localText, localItem] : localLabels )
1363 if( globalText == localText )
1366 ercItem->SetItems( globalItem.first, localItem.first );
1367 ercItem->SetSheetSpecificPath( globalItem.second );
1368 ercItem->SetItemsSheetPaths( globalItem.second, localItem.second );
1371 globalItem.second.LastScreen()->Append( marker );
1385 std::unordered_map<wxString, std::vector<std::tuple<wxString, SCH_ITEM*, SCH_SHEET_PATH>>> generalMap;
1389 const std::tuple<wxString, SCH_ITEM*, SCH_SHEET_PATH>& other )
1391 auto& [otherText, otherItem, otherSheet] = other;
1411 ercItem->SetItems( item, otherItem );
1412 ercItem->SetSheetSpecificPath( sheet );
1413 ercItem->SetItemsSheetPaths( sheet, otherSheet );
1416 sheet.LastScreen()->Append( marker );
1427 switch( item->Type() )
1434 wxString unnormalized = label->
GetShownText( &sheet,
false );
1435 wxString normalized = unnormalized.Lower();
1437 generalMap[normalized].emplace_back( std::make_tuple( unnormalized, label, sheet ) );
1439 for(
const auto& otherTuple : generalMap.at( normalized ) )
1441 const auto& [otherText, otherItem, otherSheet] = otherTuple;
1443 if( unnormalized != otherText )
1447 && sheet != otherSheet )
1452 logError( normalized, label, sheet, otherTuple );
1463 if( !
pin->IsPower() )
1467 wxString unnormalized = symbol->
GetValue(
true, &sheet,
false );
1468 wxString normalized = unnormalized.Lower();
1470 generalMap[normalized].emplace_back( std::make_tuple( unnormalized,
pin, sheet ) );
1472 for(
const auto& otherTuple : generalMap.at( normalized ) )
1474 const auto& [otherText, otherItem, otherSheet] = otherTuple;
1476 if( unnormalized != otherText )
1478 logError( normalized,
pin, sheet, otherTuple );
1508 std::vector<SCH_MARKER*> markers;
1515 if( !libSymbolInSchematic )
1520 std::optional<const LIBRARY_TABLE_ROW*> optRow =
1523 if( !optRow || ( *optRow )->Disabled() )
1528 ercItem->SetItems( symbol );
1529 msg.Printf(
_(
"The current configuration does not include the symbol library '%s'" ),
1531 ercItem->SetErrorMessage( msg );
1543 std::optional<wxString> uri =
1545 wxCHECK2( uri.has_value(), uri = wxEmptyString );
1546 ercItem->SetItems( symbol );
1547 msg.Printf(
_(
"The symbol library '%s' was not found at '%s'" ),
1549 ercItem->SetErrorMessage( msg );
1560 if( libSymbol ==
nullptr )
1565 ercItem->SetItems( symbol );
1566 msg.Printf(
_(
"Symbol '%s' not found in symbol library '%s'" ),
1569 ercItem->SetErrorMessage( msg );
1577 std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->
Flatten();
1583 std::vector<wxString> messages;
1587 if( !messages.empty() )
1590 ercItem->SetItems( symbol );
1591 msg.Printf(
_(
"Symbol '%s' has multiple pins with the same pin number" ),
1593 ercItem->SetErrorMessage( msg );
1597 else if( flattenedSymbol->Compare( *libSymbolInSchematic, flags ) != 0 )
1600 ercItem->SetItems( symbol );
1601 msg.Printf(
_(
"Symbol '%s' doesn't match copy in library '%s'" ),
1604 ercItem->SetErrorMessage( msg );
1613 screen->Append( marker );
1629 typedef int (*TESTER_FN_PTR)(
const wxString&,
PROJECT* );
1635 std::vector<SCH_MARKER*> markers;
1642 if( footprint.IsEmpty() )
1647 if( fpID.
Parse( footprint,
true ) >= 0 )
1650 msg.Printf(
_(
"'%s' is not a valid footprint identifier" ), footprint );
1651 ercItem->SetErrorMessage( msg );
1652 ercItem->SetItems( symbol );
1659 int ret = (linkTester)( footprint, aProject );
1664 msg.Printf(
_(
"The current configuration does not include the footprint library '%s'" ),
1666 ercItem->SetErrorMessage( msg );
1667 ercItem->SetItems( symbol );
1673 msg.Printf(
_(
"The footprint library '%s' is not enabled in the current configuration" ),
1675 ercItem->SetErrorMessage( msg );
1676 ercItem->SetItems( symbol );
1682 msg.Printf(
_(
"Footprint '%s' not found in library '%s'" ),
1685 ercItem->SetErrorMessage( msg );
1686 ercItem->SetItems( symbol );
1693 sheet.LastScreen()->Append( marker );
1711 std::vector<SCH_MARKER*> markers;
1716 std::unique_ptr<LIB_SYMBOL>& lib_symbol = sch_symbol->
GetLibSymbolRef();
1721 wxArrayString filters = lib_symbol->GetFPFilters();
1723 if( filters.empty() )
1729 if( footprint.
Parse( lowerId ) > 0 )
1735 for( wxString
filter : filters )
1740 if(
filter.Contains( wxS(
":" ) ) )
1741 found |= lowerId.Matches(
filter );
1743 found |= lowerItemName.Matches(
filter );
1752 msg.Printf(
_(
"Assigned footprint (%s) doesn't match footprint filters (%s)" ),
1754 wxJoin( filters,
' ' ) );
1755 ercItem->SetErrorMessage( msg );
1756 ercItem->SetItems( sch_symbol );
1763 sheet.LastScreen()->Append( marker );
1774 const int gridSize =
m_schematic->Settings().m_ConnectionGridSize;
1779 std::vector<SCH_MARKER*> markers;
1781 for(
SCH_ITEM* item : screen->Items() )
1783 if( item->Type() ==
SCH_LINE_T && item->IsConnectable() )
1791 ercItem->SetItems( line );
1799 ercItem->SetItems( line );
1810 if( ( point.x % gridSize ) != 0
1811 || ( point.y % gridSize ) != 0 )
1814 ercItem->SetItems( entry );
1816 markers.emplace_back(
new SCH_MARKER( std::move( ercItem ), point ) );
1831 if( ( pinPos.
x % gridSize ) != 0 || ( pinPos.
y % gridSize ) != 0 )
1834 ercItem->SetItems(
pin );
1836 markers.emplace_back(
new SCH_MARKER( std::move( ercItem ), pinPos ) );
1845 screen->Append( marker );
1862 if( sheet.GetExcludedFromSim() )
1865 std::vector<SCH_MARKER*> markers;
1889 ercItem->SetErrorMessage( msg );
1890 ercItem->SetItems( symbol );
1898 sheet.LastScreen()->Append( marker );
1916 if( aProgressReporter )
1917 aProgressReporter->
AdvancePhase(
_(
"Checking sheet names..." ) );
1923 if( aProgressReporter )
1924 aProgressReporter->
AdvancePhase(
_(
"Checking conflicts..." ) );
1937 if( aProgressReporter )
1938 aProgressReporter->
AdvancePhase(
_(
"Checking units..." ) );
1943 if( aProgressReporter )
1944 aProgressReporter->
AdvancePhase(
_(
"Checking footprints..." ) );
1957 if( aProgressReporter )
1983 if( aProgressReporter )
1984 aProgressReporter->
AdvancePhase(
_(
"Checking similar labels..." ) );
1991 if( aProgressReporter )
1992 aProgressReporter->
AdvancePhase(
_(
"Checking local and global labels..." ) );
1999 if( aProgressReporter )
2000 aProgressReporter->
AdvancePhase(
_(
"Checking for unresolved variables..." ) );
2007 if( aProgressReporter )
2008 aProgressReporter->
AdvancePhase(
_(
"Checking SPICE models..." ) );
2015 if( aProgressReporter )
2016 aProgressReporter->
AdvancePhase(
_(
"Checking no connect pins for connections..." ) );
2024 if( aProgressReporter )
2025 aProgressReporter->
AdvancePhase(
_(
"Checking for library symbol issues..." ) );
2032 if( aProgressReporter )
2033 aProgressReporter->
AdvancePhase(
_(
"Checking for footprint link issues..." ) );
2040 if( aProgressReporter )
2041 aProgressReporter->
AdvancePhase(
_(
"Checking footprint assignments against footprint filters..." ) );
2048 if( aProgressReporter )
2049 aProgressReporter->
AdvancePhase(
_(
"Checking for off grid pins and wires..." ) );
2056 if( aProgressReporter )
2057 aProgressReporter->
AdvancePhase(
_(
"Checking for four way junctions..." ) );
2064 if( aProgressReporter )
2065 aProgressReporter->
AdvancePhase(
_(
"Checking for labels on more than one wire..." ) );
2072 if( aProgressReporter )
2073 aProgressReporter->
AdvancePhase(
_(
"Checking for undefined netclasses..." ) );
constexpr EDA_IU_SCALE schIUScale
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
constexpr Vec Centre() const
A subgraph is a set of items that are electrically connected on a single sheet.
const std::set< SCH_ITEM * > & GetItems() const
Provide a read-only reference to the items in the subgraph.
const SCH_ITEM * GetNoConnect() const
const SCH_SHEET_PATH & GetSheet() const
Base class to handle basic graphic items.
Store the list of graphic items: rect, lines, polygons and texts to draw/plot the title block and fra...
DS_DRAW_ITEM_BASE * GetFirst()
void BuildDrawItemsList(const PAGE_INFO &aPageInfo, const TITLE_BLOCK &aTitleBlock)
Drawing or plot the drawing sheet.
void SetFileName(const wxString &aFileName)
Set the filename to draw/plot.
void SetSheetName(const wxString &aSheetName)
Set the sheet name to draw/plot.
void SetSheetLayer(const wxString &aSheetLayer)
Set the sheet layer to draw/plot.
void SetSheetCount(int aSheetCount)
Set the value of the count of sheets, for basic inscriptions.
void SetPageNumber(const wxString &aPageNumber)
Set the value of the sheet number.
DS_DRAW_ITEM_BASE * GetNext()
void SetProject(const PROJECT *aProject)
const PAGE_INFO & GetPageInfo()
const TITLE_BLOCK & GetTitleBlock()
virtual VECTOR2I GetPosition() const
KICAD_T Type() const
Returns the type of object.
virtual const wxString & GetText() const
Return the string associated with the text object.
EE_TYPE OfType(KICAD_T aType) const
static std::shared_ptr< ERC_ITEM > Create(int aErrorCode)
Constructs an ERC_ITEM for the given error code.
A class used to associate a SCH_PIN with its owning SCH_SHEET_PATH, in order to handle ERC checks acr...
const SCH_SHEET_PATH & Sheet() const
Get the SCH_SHEET_PATH context for the paired SCH_PIN.
SCH_PIN * Pin() const
Get the SCH_PIN for this context.
int TestLibSymbolIssues()
Test symbols for changed library symbols and broken symbol library links.
int TestStackedPinNotation()
Checks for pin numbers that resemble stacked pin notation but are invalid.
void TestTextVars(DS_PROXY_VIEW_ITEM *aDrawingSheet)
Check for any unresolved text variable references.
int TestPinToPin()
Checks the full netlist against the pin-to-pin connectivity requirements.
int TestSimilarLabels()
Checks for labels that differ only in capitalization.
SCH_MULTI_UNIT_REFERENCE_MAP m_refMap
int TestFootprintLinkIssues(KIFACE *aCvPcb, PROJECT *aProject)
Test footprint links against the current footprint libraries.
int TestOffGridEndpoints()
Test pins and wire ends for being off grid.
int TestDuplicateSheetNames(bool aCreateMarker)
Inside a given sheet, one cannot have sheets with duplicate names (file names can be duplicated).
int TestSameLocalGlobalLabel()
Checks for global and local labels with the same name.
int TestMultUnitPinConflicts()
Checks if shared pins on multi-unit symbols have been connected to different nets.
int TestNoConnectPins()
In KiCad 5 and earlier, you could connect stuff up to pins with NC electrical type.
int TestFootprintFilters()
Test symbols to ensure that assigned footprint passes any given footprint filters.
ERC_SETTINGS & m_settings
int TestFourWayJunction()
Test to see if there are potentially confusing 4-way junctions in the schematic.
int TestMissingNetclasses()
Tests for netclasses that are referenced but not defined.
int TestSimModelIssues()
Test SPICE models for various issues.
SCH_SHEET_LIST m_sheetList
int TestGroundPins()
Checks for ground-labeled pins not on a ground net while another pin is.
void RunTests(DS_PROXY_VIEW_ITEM *aDrawingSheet, SCH_EDIT_FRAME *aEditFrame, KIFACE *aCvPcb, PROJECT *aProject, PROGRESS_REPORTER *aProgressReporter)
int TestMissingUnits()
Test for uninstantiated units of multi unit symbols.
int TestLabelMultipleWires()
Test to see if there are labels that are connected to more than one wire.
int TestMultiunitFootprints()
Test if all units of each multiunit symbol have the same footprint assigned.
bool IsLibraryLoaded(const wxString &aNickname)
std::optional< wxString > GetFullURI(LIBRARY_TABLE_TYPE aType, const wxString &aNickname, bool aSubstituted=false) const
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
std::optional< LIBRARY_TABLE_ROW * > GetRow(LIBRARY_TABLE_TYPE aType, const wxString &aNickname, LIBRARY_TABLE_SCOPE aScope=LIBRARY_TABLE_SCOPE::BOTH) const
A logical library item identifier and consists of various portions much like a URI.
int Parse(const UTF8 &aId, bool aFix=false)
Parse LIB_ID with the information from aId.
const wxString GetUniStringLibItemName() const
Get strings for display messages in dialogs.
const UTF8 & GetLibItemName() const
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Define a library symbol object.
void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction, RECURSE_MODE aMode) override
std::vector< SCH_PIN * > GetGraphicalPins(int aUnit=0, int aBodyStyle=0) const
Graphical pins: Return schematic pin objects as drawn (unexpanded), filtered by unit/body.
int GetUnitCount() const override
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
wxString GetUnitDisplayName(int aUnit, bool aLabel) const override
Return the user-defined display name for aUnit for symbols with units.
virtual LIBRARY_MANAGER & GetLibraryManager() const
A progress reporter interface for use in multi-threaded environments.
virtual void AdvancePhase()=0
Use the next available virtual zone of the dialog progress bar.
static SYMBOL_LIBRARY_ADAPTER * SymbolLibAdapter(PROJECT *aProject)
Accessor for project symbol library manager adapter.
Container for project specific data.
virtual bool HasMessage() const
Returns true if any messages were reported.
std::vector< VECTOR2I > GetConnectionPoints() const override
Add all the connection points for this item to aPoints.
Class for a wire to bus entry.
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
wxString GetNetName() const
Schematic editor (Eeschema) main window.
void RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags, PROGRESS_REPORTER *aProgressReporter=nullptr)
Generate the connection data for the entire schematic hierarchy.
wxString GetCanonicalName() const
Get a non-language-specific name for a field which can be used for storage, variable look-up,...
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
Base class for any item which can be embedded within the SCHEMATIC container class,...
bool ResolveExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const override
std::vector< VECTOR2I > GetConnectionPoints() const override
Add all the connection points for this item to aPoints.
Segment description base class to describe items which have 2 end points (track, wire,...
std::vector< VECTOR2I > GetConnectionPoints() const override
Add all the connection points for this item to aPoints.
VECTOR2I GetEndPoint() const
VECTOR2I GetStartPoint() const
bool IsEndPoint(const VECTOR2I &aPoint) const override
Test if aPt is an end point of this schematic object.
bool IsGraphicLine() const
Return if the line is a graphic (non electrical line)
bool IsStacked(const SCH_PIN *aPin) const
bool IsPower() const
Check if the pin is either a global or local power pin.
ELECTRICAL_PINTYPE GetType() const
Container to create a flattened list of symbols because in a complex hierarchy, a symbol can be used ...
SCH_REFERENCE & GetItem(size_t aIdx)
A helper to define a symbol's reference designator in a schematic.
const SCH_SHEET_PATH & GetSheetPath() const
const wxString GetFootprint() const
SCH_SYMBOL * GetSymbol() const
LIB_SYMBOL * GetLibPart() const
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
EE_RTREE & Items()
Get the full RTree, usually for iterating.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
VECTOR2I GetPosition() const override
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
SCH_SCREEN * LastScreen()
void push_back(SCH_SHEET *aSheet)
Forwarded method from std::vector.
Define a sheet pin (label) used in sheets to create hierarchical schematics.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
std::vector< SCH_FIELD > & GetFields()
Return a reference to the vector holding the sheet's fields.
VECTOR2I GetPosition() const override
std::vector< SCH_SHEET_PIN * > & GetPins()
wxString GetShownName(bool aAllowExtraText) const
const wxString GetValue(bool aResolve, const SCH_SHEET_PATH *aPath, bool aAllowExtraText) const override
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
const wxString GetFootprintFieldText(bool aResolve, const SCH_SHEET_PATH *aPath, bool aAllowExtraText) const
VECTOR2I GetPosition() const override
std::vector< SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet) const
Retrieve a list of the SCH_PINs for the given sheet path.
const LIB_ID & GetLibId() const override
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
virtual wxString GetShownText(const RENDER_SETTINGS *aSettings, const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
VECTOR2I GetPosition() const override
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
virtual wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
SIM_MODEL & CreateModel(SIM_MODEL::TYPE aType, const std::vector< SCH_PIN * > &aPins, REPORTER &aReporter)
An interface to the global shared library manager that is schematic-specific and linked to one projec...
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
const TRANSFORM & GetTransform() const
double Distance(const VECTOR2< extended_type > &aVector) const
Compute the distance between two vectors.
A wrapper for reporting to a wxString object.
const wxString & GetMessages() const
const wxString ExpandEnvVarSubstitutions(const wxString &aString, const PROJECT *aProject)
Replace any environment variable & text variable references with their values.
#define FOR_ERC_DRC
Expand '${var-name}' templates in text.
void CheckDuplicatePins(LIB_SYMBOL *aSymbol, std::vector< wxString > &aMessages, UNITS_PROVIDER *aUnitsProvider)
const wxString CommentERC_V[]
const wxString CommentERC_H[]
const std::set< ELECTRICAL_PINTYPE > DrivenPinTypes
const std::set< ELECTRICAL_PINTYPE > DrivingPinTypes
const std::set< ELECTRICAL_PINTYPE > DrivingPowerPinTypes
@ ERCE_POWERPIN_NOT_DRIVEN
Power input pin connected to some others pins but no power out pin to drive it.
@ ERCE_SIMILAR_POWER
2 power pins are equal for case insensitive comparisons.
@ ERCE_MISSING_POWER_INPUT_PIN
Symbol has power input pins that are not placed on the schematic.
@ ERCE_GROUND_PIN_NOT_GROUND
A ground-labeled pin is not on a ground net while another pin is.
@ ERCE_SIMILAR_LABELS
2 labels are equal for case insensitive comparisons.
@ ERCE_STACKED_PIN_SYNTAX
Pin name resembles stacked pin notation.
@ ERCE_ENDPOINT_OFF_GRID
Pin or wire-end off grid.
@ ERCE_SAME_LOCAL_GLOBAL_LABEL
2 labels are equal for case insensitive comparisons.
@ ERCE_SIMILAR_LABEL_AND_POWER
label and pin are equal for case insensitive comparisons.
@ ERCE_FOOTPRINT_LINK_ISSUES
The footprint link is invalid, or points to a missing (or inactive) footprint or library.
@ ERCE_DUPLICATE_PIN_ERROR
@ ERCE_DIFFERENT_UNIT_NET
Shared pin in a multi-unit symbol is connected to more than one net.
@ ERCE_FOUR_WAY_JUNCTION
A four-way junction was found.
@ ERCE_UNDEFINED_NETCLASS
A netclass was referenced but not defined.
@ ERCE_UNRESOLVED_VARIABLE
A text variable could not be resolved.
@ ERCE_SIMULATION_MODEL
An error was found in the simulation model.
@ ERCE_LIB_SYMBOL_MISMATCH
Symbol doesn't match copy in library.
@ ERCE_DIFFERENT_UNIT_FP
Different units of the same symbol have different footprints assigned.
@ ERCE_NOCONNECT_CONNECTED
A no connect symbol is connected to more than 1 pin.
@ ERCE_PIN_TO_PIN_WARNING
@ ERCE_PIN_NOT_DRIVEN
Pin connected to some others pins but no pin to drive it.
@ ERCE_MISSING_INPUT_PIN
Symbol has input pins that are not placed.
@ ERCE_MISSING_UNIT
Symbol has units that are not placed on the schematic.
@ ERCE_DUPLICATE_SHEET_NAME
Duplicate sheet names within a given sheet.
@ ERCE_MISSING_BIDI_PIN
Symbol has bi-directional pins that are not placed.
@ ERCE_LIB_SYMBOL_ISSUES
Symbol not found in active libraries.
@ ERCE_FOOTPRINT_FILTERS
The assigned footprint doesn't match the footprint filters.
@ ERCE_LABEL_MULTIPLE_WIRES
A label is connected to more than one wire.
PIN_ERROR
The values a pin-to-pin entry in the pin matrix can take on.
@ KIFACE_TEST_FOOTPRINT_LINK_LIBRARY_NOT_ENABLED
@ KIFACE_TEST_FOOTPRINT_LINK
@ KIFACE_TEST_FOOTPRINT_LINK_NO_LIBRARY
@ KIFACE_TEST_FOOTPRINT_LINK_NO_FOOTPRINT
PGM_BASE & Pgm()
The global program "get" accessor.
ELECTRICAL_PINTYPE
The symbol library pin object electrical types used in ERC tests.
@ PT_INPUT
usual pin input: must be connected
@ PT_NC
not connected (must be left open)
@ PT_TRISTATE
tri state bus pin
@ PT_BIDI
input or output (like port for a microprocessor)
@ PT_POWER_OUT
output of a regulator: intended to be connected to power input pins
@ PT_POWER_IN
power input (GND, VCC for ICs). Must be connected to a power output.
@ PT_UNSPECIFIED
unknown electrical properties: creates always a warning when connected
@ PT_PASSIVE
pin for passive symbols: must be connected, and can be connected to any pin.
wxString ElectricalPinTypeGetText(ELECTRICAL_PINTYPE)
static float distance(const SFVEC2UI &a, const SFVEC2UI &b)
wxString UnescapeString(const wxString &aSource)
Implement a participant in the KIWAY alchemy.
virtual void * IfaceOrAddress(int aDataId)=0
Return pointer to the requested object.
VECTOR2< int32_t > VECTOR2I