81 _(
"Bidirectional Pin" ),
85 _(
"Unspecified Pin" ),
86 _(
"Power Input Pin" ),
87 _(
"Power Output Pin" ),
88 _(
"Open Collector" ),
98 _(
"Bidirectional Pin" ),
102 _(
"Unspecified Pin" ),
103 _(
"Power Input Pin" ),
104 _(
"Power Output Pin" ),
105 _(
"Open Collector" ),
147 std::vector<SCH_SHEET*> list;
150 list.push_back(
static_cast<SCH_SHEET*
>( item ) );
152 for(
size_t i = 0; i < list.size(); i++ )
156 for(
size_t j = i + 1; j < list.size(); j++ )
168 ercItem->SetItems( sheet, test_item );
171 screen->Append( marker );
189 [
this]( wxString str )
192 return str.Matches( wxS(
"*${*}*" ) );
199 static wxRegEx warningExpr( wxS(
"^\\$\\{ERC_WARNING\\s*([^}]*)\\}(.*)$" ) );
200 static wxRegEx errorExpr( wxS(
"^\\$\\{ERC_ERROR\\s*([^}]*)\\}(.*)$" ) );
202 if( warningExpr.Matches(
text ) )
205 wxString ercText = warningExpr.GetMatch(
text, 1 );
208 ercItem->SetItems( item );
210 ercText +=
_(
" (in drawing sheet)" );
212 ercItem->SetSheetSpecificPath( sheet );
213 ercItem->SetErrorMessage( ercText );
216 screen->Append( marker );
221 if( errorExpr.Matches(
text ) )
224 wxString ercText = errorExpr.GetMatch(
text, 1 );
227 ercItem->SetItems( item );
229 ercText +=
_(
" (in drawing sheet)" );
231 ercItem->SetSheetSpecificPath( sheet );
232 ercItem->SetErrorMessage( ercText );
235 screen->Append( marker );
266 if( unresolved( field.GetShownText( &sheet,
true ) ) )
269 ercItem->SetItems( symbol );
270 ercItem->SetSheetSpecificPath( sheet );
276 testAssertion( &field, sheet, screen, field.GetText(), field.
GetPosition() );
292 if( unresolved( textItem->
GetShownText( &sheet,
true ) ) )
295 ercItem->SetItems( symbol );
296 ercItem->SetSheetSpecificPath( sheet );
306 testAssertion( symbol, sheet, screen, textItem->
GetText(),
313 if( unresolved( textboxItem->
GetShownText(
nullptr, &sheet,
true ) ) )
316 ercItem->SetItems( symbol );
317 ercItem->SetSheetSpecificPath( sheet );
327 testAssertion( symbol, sheet, screen, textboxItem->
GetText(),
336 for(
SCH_FIELD& field : label->GetFields() )
338 if( unresolved( field.GetShownText( &sheet,
true ) ) )
341 ercItem->SetItems( label );
342 ercItem->SetSheetSpecificPath( sheet );
348 testAssertion( &field, sheet, screen, field.GetText(), field.
GetPosition() );
357 if( unresolved( field.GetShownText( &sheet,
true ) ) )
360 ercItem->SetItems( subSheet );
361 ercItem->SetSheetSpecificPath( sheet );
367 testAssertion( &field, sheet, screen, field.GetText(), field.
GetPosition() );
375 if(
pin->GetShownText( &subSheetPath,
true ).Matches( wxS(
"*${*}*" ) ) )
378 ercItem->SetItems(
pin );
379 ercItem->SetSheetSpecificPath( sheet );
388 if(
text->GetShownText( &sheet,
true ).Matches( wxS(
"*${*}*" ) ) )
391 ercItem->SetItems(
text );
392 ercItem->SetSheetSpecificPath( sheet );
398 testAssertion(
text, sheet, screen,
text->GetText(),
text->GetPosition() );
402 if( textBox->GetShownText(
nullptr, &sheet,
true ).Matches( wxS(
"*${*}*" ) ) )
405 ercItem->SetItems( textBox );
406 ercItem->SetSheetSpecificPath( sheet );
412 testAssertion( textBox, sheet, screen, textBox->GetText(), textBox->
GetPosition() );
420 if( testAssertion(
nullptr, sheet, screen,
text->GetText(),
text->GetPosition() ) )
424 else if(
text->GetShownText(
true ).Matches( wxS(
"*${*}*" ) ) )
427 ercItem->SetErrorMessage(
_(
"Unresolved text variable in drawing sheet" ) );
428 ercItem->SetSheetSpecificPath( sheet );
443 for( std::pair<const wxString, SCH_REFERENCE_LIST>& symbol :
m_refMap )
458 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
463 if( !unitFP.IsEmpty() )
466 unitName = unit->
GetRef( &sheetPath,
true );
471 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
479 if( unit && !secondFp.IsEmpty() && unitFP != secondFp )
481 msg.Printf(
_(
"Different footprints assigned to %s and %s" ),
482 unitName, secondName );
485 ercItem->SetErrorMessage( msg );
486 ercItem->SetItems( unit, secondUnit );
504 for( std::pair<const wxString, SCH_REFERENCE_LIST>& symbol :
m_refMap )
508 wxCHECK2( refList.
GetCount(),
continue );
518 std::set<int> lib_units;
519 std::set<int> instance_units;
520 std::set<int> missing_units;
523 [&]( std::set<int>& aMissingUnits,
const wxString& aErrorMsg,
int aErrorCode )
526 wxString missing_pin_units = wxS(
"[ " );
529 for(
int missing_unit : aMissingUnits )
533 missing_pin_units += wxS(
"..." );
540 missing_pin_units.Truncate( missing_pin_units.length() - 2 );
541 missing_pin_units += wxS(
" ]" );
543 msg.Printf( aErrorMsg, symbol.first, missing_pin_units );
546 ercItem->SetErrorMessage( msg );
547 ercItem->SetItems( unit );
548 ercItem->SetSheetSpecificPath( base_ref.
GetSheetPath() );
557 for(
int ii = 1; ii <= libSymbol->
GetUnitCount(); ++ii )
558 lib_units.insert( lib_units.end(), ii );
560 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
561 instance_units.insert( instance_units.end(), refList.
GetItem( ii ).
GetUnit() );
563 std::set_difference( lib_units.begin(), lib_units.end(),
564 instance_units.begin(), instance_units.end(),
565 std::inserter( missing_units, missing_units.begin() ) );
572 std::set<int> missing_power;
573 std::set<int> missing_input;
574 std::set<int> missing_bidi;
576 for(
int missing_unit : missing_units )
580 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
591 switch(
pin->GetType() )
594 missing_power.insert( missing_unit );
598 missing_bidi.insert( missing_unit );
602 missing_input.insert( missing_unit );
613 report( missing_power,
_(
"Symbol %s has input power pins in units %s that are not placed" ),
619 report( missing_input,
_(
"Symbol %s has input pins in units %s that are not placed" ),
625 report( missing_bidi,
_(
"Symbol %s has bidirectional pins in units %s that are not placed" ),
637 std::shared_ptr<NET_SETTINGS>& settings =
m_schematic->Project().GetProjectFile().NetSettings();
638 wxString defaultNetclass = settings->GetDefaultNetclass()->GetName();
647 ercItem->SetItems( item );
648 ercItem->SetErrorMessage( wxString::Format(
_(
"Netclass %s is not defined" ), netclass ) );
667 wxString netclass = field->
GetShownText( &sheet,
false );
669 if( !netclass.empty() && !netclass.IsSameAs( defaultNetclass )
670 && !settings->HasNetclass( netclass ) )
672 logError( sheet, item, netclass );
693 std::map<VECTOR2I, std::vector<SCH_ITEM*>> connMap;
700 connMap[pt].emplace_back( label );
703 for(
const std::pair<
const VECTOR2I, std::vector<SCH_ITEM*>>& pair : connMap )
705 std::vector<SCH_ITEM*> lines;
707 for(
SCH_ITEM* item : sheet.LastScreen()->Items().Overlapping(
SCH_LINE_T, pair.first ) )
716 lines.emplace_back( line );
719 if( lines.size() > 1 )
725 wxString msg = wxString::Format(
_(
"Label connects more than one wire at %d, %d" ),
726 pair.first.x, pair.first.y );
728 ercItem->SetItems( pair.second.front(), lines[0], lines[1], lines[2] );
729 ercItem->SetErrorMessage( msg );
730 ercItem->SetSheetSpecificPath( sheet );
733 sheet.LastScreen()->Append( marker );
746 auto pinStackAlreadyRepresented =
747 [](
SCH_PIN*
pin, std::vector<SCH_ITEM*>& collection ) ->
bool
751 if( item->Type() ==
SCH_PIN_T && item->GetParentSymbol() ==
pin->GetParentSymbol() )
765 std::map<VECTOR2I, std::vector<SCH_ITEM*>> connMap;
774 std::vector<SCH_ITEM*>& entry = connMap[
pin->GetPosition()];
777 if( pinStackAlreadyRepresented(
pin, entry ) )
780 entry.emplace_back(
pin );
792 connMap[pt].emplace_back( line );
795 for(
const std::pair<
const VECTOR2I, std::vector<SCH_ITEM*>>& pair : connMap )
797 if( pair.second.size() >= 4 )
803 ercItem->SetItems( pair.second[0], pair.second[1], pair.second[2], pair.second[3] );
805 wxString msg = wxString::Format(
_(
"Four items connected at %d, %d" ),
806 pair.first.x, pair.first.y );
807 ercItem->SetErrorMessage( msg );
809 ercItem->SetSheetSpecificPath( sheet );
812 sheet.LastScreen()->Append( marker );
827 std::map<VECTOR2I, std::vector<SCH_ITEM*>> pinMap;
832 if( pinMap.count( pt ) )
833 pinMap[pt].emplace_back( aOther );
843 pinMap[
pin->GetPosition()].emplace_back(
pin );
847 for(
SCH_ITEM* item : sheet.LastScreen()->Items() )
856 addOther(
pin->GetPosition(),
pin );
861 for(
const VECTOR2I& pt : item->GetConnectionPoints() )
862 addOther( pt, item );
866 for(
const std::pair<
const VECTOR2I, std::vector<SCH_ITEM*>>& pair : pinMap )
868 if( pair.second.size() > 1 )
874 ercItem->SetItems( pair.second[0], pair.second[1],
875 pair.second.size() > 2 ? pair.second[2] :
nullptr,
876 pair.second.size() > 3 ? pair.second[3] :
nullptr );
877 ercItem->SetErrorMessage(
_(
"Pin with 'no connection' type is connected" ) );
878 ercItem->SetSheetSpecificPath( sheet );
881 sheet.LastScreen()->Append( marker );
896 using iterator_t = std::vector<ERC_SCH_PIN_CONTEXT>::iterator;
897 std::vector<ERC_SCH_PIN_CONTEXT> pins;
898 std::unordered_map<EDA_ITEM*, SCH_SCREEN*> pinToScreenMap;
899 bool has_noconnect =
false;
904 has_noconnect =
true;
910 pins.emplace_back(
static_cast<SCH_PIN*
>( item ), subgraph->
GetSheet() );
916 std::sort( pins.begin(), pins.end(),
919 int ret = StrNumCmp( lhs.Pin()->GetParentSymbol()->GetRef( &lhs.Sheet() ),
920 rhs.Pin()->GetParentSymbol()->GetRef( &rhs.Sheet() ) );
923 ret = StrNumCmp( lhs.Pin()->GetNumber(), rhs.Pin()->GetNumber() );
933 bool hasDriver =
false;
938 bool ispowerNet =
false;
949 std::vector<std::tuple<iterator_t, iterator_t, PIN_ERROR>> pin_mismatches;
950 std::map<iterator_t, int> pin_mismatch_counts;
952 for(
auto refIt = pins.begin(); refIt != pins.end(); ++refIt )
962 if( !needsDriver.
Pin()
967 needsDriver = refPin;
968 needsDriverType = needsDriver.
Pin()->
GetType();
977 for(
auto testIt = refIt + 1; testIt != pins.end(); ++testIt )
998 pin_mismatches.emplace_back( std::tuple<iterator_t, iterator_t, PIN_ERROR>{ refIt, testIt,
erc } );
1002 pin_mismatch_counts[refIt] =
m_settings.GetPinTypeWeight( ( *refIt ).Pin()->GetType() );
1003 pin_mismatch_counts[testIt] =
m_settings.GetPinTypeWeight( ( *testIt ).Pin()->GetType() );
1007 if( !pin_mismatch_counts.contains( testIt ) )
1008 pin_mismatch_counts.emplace( testIt, 1 );
1010 pin_mismatch_counts[testIt]++;
1012 if( !pin_mismatch_counts.contains( refIt ) )
1013 pin_mismatch_counts.emplace( refIt, 1 );
1015 pin_mismatch_counts[refIt]++;
1021 std::multimap<size_t, iterator_t, std::greater<size_t>> pins_dsc;
1023 std::transform( pin_mismatch_counts.begin(), pin_mismatch_counts.end(),
1024 std::inserter( pins_dsc, pins_dsc.begin() ),
1027 return std::pair<size_t, iterator_t>( p.second, p.first );
1030 for(
const auto& [amount, pinItBind] : pins_dsc )
1032 auto& pinIt = pinItBind;
1034 if( pin_mismatches.empty() )
1040 iterator_t nearest_pin = pins.end();
1041 double smallest_distance = std::numeric_limits<double>::infinity();
1046 [&](
const auto& tuple )
1050 if( pinIt == std::get<0>( tuple ) )
1051 other = std::get<1>( tuple );
1052 else if( pinIt == std::get<1>( tuple ) )
1053 other = std::get<0>( tuple );
1057 if( ( *pinIt ).Sheet().Cmp( ( *other ).Sheet() ) != 0 )
1059 if( std::isinf( smallest_distance ) )
1061 nearest_pin = other;
1062 erc = std::get<2>( tuple );
1069 if( std::isinf( smallest_distance ) ||
distance < smallest_distance )
1072 nearest_pin = other;
1073 erc = std::get<2>( tuple );
1080 if( nearest_pin != pins.end() )
1082 SCH_PIN* other_pin = ( *nearest_pin ).Pin();
1086 ercItem->SetItems(
pin, other_pin );
1087 ercItem->SetSheetSpecificPath( ( *pinIt ).Sheet() );
1088 ercItem->SetItemsSheetPaths( ( *pinIt ).Sheet(), ( *nearest_pin ).Sheet() );
1090 ercItem->SetErrorMessage( wxString::Format(
_(
"Pins of type %s and %s are connected" ),
1095 pinToScreenMap[
pin]->Append( marker );
1100 if( needsDriver.
Pin() && !hasDriver && !has_noconnect )
1108 ercItem->SetItems( needsDriver.
Pin() );
1109 ercItem->SetSheetSpecificPath( needsDriver.
Sheet() );
1110 ercItem->SetItemsSheetPaths( needsDriver.
Sheet() );
1113 pinToScreenMap[needsDriver.
Pin()]->Append( marker );
1127 std::unordered_map<wxString, std::pair<wxString, SCH_PIN*>> pinToNetMap;
1131 const wxString& netName = net.first.Name;
1142 if( !
pin->GetParentSymbol()->IsMultiUnit() )
1145 wxString
name =
pin->GetParentSymbol()->GetRef( &sheet ) +
":" +
pin->GetShownNumber();
1147 if( !pinToNetMap.count(
name ) )
1149 pinToNetMap[
name] = std::make_pair( netName,
pin );
1151 else if( pinToNetMap[
name].first != netName )
1155 ercItem->SetErrorMessage( wxString::Format(
_(
"Pin %s is connected to both %s and %s" ),
1156 pin->GetShownNumber(),
1158 pinToNetMap[
name].first ) );
1160 ercItem->SetItems(
pin, pinToNetMap[
name].second );
1161 ercItem->SetSheetSpecificPath( sheet );
1162 ercItem->SetItemsSheetPaths( sheet, sheet );
1181 auto isGround = [](
const wxString& txt )
1183 wxString upper = txt.Upper();
1184 return upper.Contains( wxT(
"GND" ) );
1194 bool hasGroundNet =
false;
1195 std::vector<SCH_PIN*> mismatched;
1200 wxString net = conn ? conn->
GetNetName() : wxString();
1201 bool netIsGround = isGround( net );
1211 hasGroundNet =
true;
1213 if( isGround(
pin->GetShownName() ) && !netIsGround )
1214 mismatched.push_back(
pin );
1223 ercItem->SetErrorMessage( wxString::Format(
_(
"Pin %s not connected to ground net" ),
1224 pin->GetShownName() ) );
1225 ercItem->SetItems(
pin );
1226 ercItem->SetSheetSpecificPath( sheet );
1227 ercItem->SetItemsSheetPaths( sheet );
1230 screen->
Append( marker );
1256 pin->GetStackedPinNumbers( &valid );
1261 ercItem->SetItems(
pin );
1262 ercItem->SetSheetSpecificPath( sheet );
1263 ercItem->SetItemsSheetPaths( sheet );
1266 screen->
Append( marker );
1281 std::unordered_map<wxString, std::pair<SCH_ITEM*, SCH_SHEET_PATH>> globalLabels;
1282 std::unordered_map<wxString, std::pair<SCH_ITEM*, SCH_SHEET_PATH>> localLabels;
1297 auto& map = item->Type() ==
SCH_LABEL_T ? localLabels : globalLabels;
1299 if( !map.count(
text ) )
1301 map[
text] = std::make_pair( label, sheet );
1308 for(
auto& [globalText, globalItem] : globalLabels )
1310 for(
auto& [localText, localItem] : localLabels )
1312 if( globalText == localText )
1315 ercItem->SetItems( globalItem.first, localItem.first );
1316 ercItem->SetSheetSpecificPath( globalItem.second );
1317 ercItem->SetItemsSheetPaths( globalItem.second, localItem.second );
1320 globalItem.second.LastScreen()->Append( marker );
1334 std::unordered_map<wxString, std::vector<std::tuple<wxString, SCH_ITEM*, SCH_SHEET_PATH>>> generalMap;
1338 const std::tuple<wxString, SCH_ITEM*, SCH_SHEET_PATH>& other )
1340 auto& [otherText, otherItem, otherSheet] = other;
1360 ercItem->SetItems( item, otherItem );
1361 ercItem->SetSheetSpecificPath( sheet );
1362 ercItem->SetItemsSheetPaths( sheet, otherSheet );
1365 sheet.LastScreen()->Append( marker );
1376 switch( item->Type() )
1383 wxString unnormalized = label->
GetShownText( &sheet,
false );
1384 wxString normalized = unnormalized.Lower();
1386 generalMap[normalized].emplace_back( std::make_tuple( unnormalized, label, sheet ) );
1388 for(
const auto& otherTuple : generalMap.at( normalized ) )
1390 const auto& [otherText, otherItem, otherSheet] = otherTuple;
1392 if( unnormalized != otherText )
1396 && sheet != otherSheet )
1401 logError( normalized, label, sheet, otherTuple );
1412 if( !
pin->IsPower() )
1416 wxString unnormalized = symbol->
GetValue(
true, &sheet,
false );
1417 wxString normalized = unnormalized.Lower();
1419 generalMap[normalized].emplace_back( std::make_tuple( unnormalized,
pin, sheet ) );
1421 for(
const auto& otherTuple : generalMap.at( normalized ) )
1423 const auto& [otherText, otherItem, otherSheet] = otherTuple;
1425 if( unnormalized != otherText )
1427 logError( normalized,
pin, sheet, otherTuple );
1456 std::vector<SCH_MARKER*> markers;
1463 if( !libSymbolInSchematic )
1474 ercItem->SetItems( symbol );
1475 msg.Printf(
_(
"The current configuration does not include the symbol library '%s'" ),
1477 ercItem->SetErrorMessage( msg );
1484 else if( !libTable->
HasLibrary( libName,
true ) )
1489 ercItem->SetItems( symbol );
1490 msg.Printf(
_(
"The symbol library '%s' is not enabled in the current configuration" ),
1492 ercItem->SetErrorMessage( msg );
1504 ercItem->SetItems( symbol );
1505 msg.Printf(
_(
"The symbol library '%s' was not found at '%s'" ),
1508 ercItem->SetErrorMessage( msg );
1519 if( libSymbol ==
nullptr )
1524 ercItem->SetItems( symbol );
1525 msg.Printf(
_(
"Symbol '%s' not found in symbol library '%s'" ),
1528 ercItem->SetErrorMessage( msg );
1536 std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->
Flatten();
1542 std::vector<wxString> messages;
1546 if( !messages.empty() )
1549 ercItem->SetItems( symbol );
1550 msg.Printf(
_(
"Symbol '%s' has multiple pins with the same pin number" ),
1552 ercItem->SetErrorMessage( msg );
1556 else if( flattenedSymbol->Compare( *libSymbolInSchematic, flags ) != 0 )
1559 ercItem->SetItems( symbol );
1560 msg.Printf(
_(
"Symbol '%s' doesn't match copy in library '%s'" ),
1563 ercItem->SetErrorMessage( msg );
1572 screen->Append( marker );
1588 typedef int (*TESTER_FN_PTR)(
const wxString&,
PROJECT* );
1594 std::vector<SCH_MARKER*> markers;
1601 if( footprint.IsEmpty() )
1606 if( fpID.
Parse( footprint,
true ) >= 0 )
1609 msg.Printf(
_(
"'%s' is not a valid footprint identifier" ), footprint );
1610 ercItem->SetErrorMessage( msg );
1611 ercItem->SetItems( symbol );
1618 int ret = (linkTester)( footprint, aProject );
1623 msg.Printf(
_(
"The current configuration does not include the footprint library '%s'" ),
1625 ercItem->SetErrorMessage( msg );
1626 ercItem->SetItems( symbol );
1632 msg.Printf(
_(
"The footprint library '%s' is not enabled in the current configuration" ),
1634 ercItem->SetErrorMessage( msg );
1635 ercItem->SetItems( symbol );
1641 msg.Printf(
_(
"Footprint '%s' not found in library '%s'" ),
1644 ercItem->SetErrorMessage( msg );
1645 ercItem->SetItems( symbol );
1652 sheet.LastScreen()->Append( marker );
1670 std::vector<SCH_MARKER*> markers;
1675 std::unique_ptr<LIB_SYMBOL>& lib_symbol = sch_symbol->
GetLibSymbolRef();
1680 wxArrayString filters = lib_symbol->GetFPFilters();
1682 if( filters.empty() )
1688 if( footprint.
Parse( lowerId ) > 0 )
1694 for( wxString
filter : filters )
1699 if(
filter.Contains( wxS(
":" ) ) )
1700 found |= lowerId.Matches(
filter );
1702 found |= lowerItemName.Matches(
filter );
1711 msg.Printf(
_(
"Assigned footprint (%s) doesn't match footprint filters (%s)" ),
1713 wxJoin( filters,
' ' ) );
1714 ercItem->SetErrorMessage( msg );
1715 ercItem->SetItems( sch_symbol );
1722 sheet.LastScreen()->Append( marker );
1733 const int gridSize =
m_schematic->Settings().m_ConnectionGridSize;
1738 std::vector<SCH_MARKER*> markers;
1740 for(
SCH_ITEM* item : screen->Items() )
1742 if( item->Type() ==
SCH_LINE_T && item->IsConnectable() )
1750 ercItem->SetItems( line );
1758 ercItem->SetItems( line );
1769 if( ( point.x % gridSize ) != 0
1770 || ( point.y % gridSize ) != 0 )
1773 ercItem->SetItems( entry );
1775 markers.emplace_back(
new SCH_MARKER( std::move( ercItem ), point ) );
1790 if( ( pinPos.
x % gridSize ) != 0 || ( pinPos.
y % gridSize ) != 0 )
1793 ercItem->SetItems(
pin );
1795 markers.emplace_back(
new SCH_MARKER( std::move( ercItem ), pinPos ) );
1804 screen->Append( marker );
1821 if( sheet.GetExcludedFromSim() )
1824 std::vector<SCH_MARKER*> markers;
1848 ercItem->SetErrorMessage( msg );
1849 ercItem->SetItems( symbol );
1857 sheet.LastScreen()->Append( marker );
1875 if( aProgressReporter )
1876 aProgressReporter->
AdvancePhase(
_(
"Checking sheet names..." ) );
1882 if( aProgressReporter )
1883 aProgressReporter->
AdvancePhase(
_(
"Checking conflicts..." ) );
1896 if( aProgressReporter )
1897 aProgressReporter->
AdvancePhase(
_(
"Checking units..." ) );
1902 if( aProgressReporter )
1903 aProgressReporter->
AdvancePhase(
_(
"Checking footprints..." ) );
1916 if( aProgressReporter )
1942 if( aProgressReporter )
1943 aProgressReporter->
AdvancePhase(
_(
"Checking similar labels..." ) );
1950 if( aProgressReporter )
1951 aProgressReporter->
AdvancePhase(
_(
"Checking local and global labels..." ) );
1958 if( aProgressReporter )
1959 aProgressReporter->
AdvancePhase(
_(
"Checking for unresolved variables..." ) );
1966 if( aProgressReporter )
1967 aProgressReporter->
AdvancePhase(
_(
"Checking SPICE models..." ) );
1974 if( aProgressReporter )
1975 aProgressReporter->
AdvancePhase(
_(
"Checking no connect pins for connections..." ) );
1983 if( aProgressReporter )
1984 aProgressReporter->
AdvancePhase(
_(
"Checking for library symbol issues..." ) );
1991 if( aProgressReporter )
1992 aProgressReporter->
AdvancePhase(
_(
"Checking for footprint link issues..." ) );
1999 if( aProgressReporter )
2000 aProgressReporter->
AdvancePhase(
_(
"Checking footprint assignments against footprint filters..." ) );
2007 if( aProgressReporter )
2008 aProgressReporter->
AdvancePhase(
_(
"Checking for off grid pins and wires..." ) );
2015 if( aProgressReporter )
2016 aProgressReporter->
AdvancePhase(
_(
"Checking for four way junctions..." ) );
2023 if( aProgressReporter )
2024 aProgressReporter->
AdvancePhase(
_(
"Checking for labels on more than one wire..." ) );
2031 if( aProgressReporter )
2032 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.
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.
Hold a record identifying a library accessed by the appropriate plug in object in the LIB_TABLE.
virtual bool LibraryExists() const =0
const wxString GetFullURI(bool aSubstituted=false) const
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library table.
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_LIB_TABLE * SchSymbolLibTable(PROJECT *aProject)
Accessor for project symbol library table.
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)
VECTOR2I GetPosition() const override
bool IsStacked(const SCH_PIN *aPin) const
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)
SYMBOL_LIB_TABLE_ROW * FindRow(const wxString &aNickName, bool aCheckIfEnabled=false)
Return an SYMBOL_LIB_TABLE_ROW if aNickName is found in this table or in any chained fallBack table f...
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
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)
LIB_SYMBOL * SchGetLibSymbol(const LIB_ID &aLibId, SYMBOL_LIB_TABLE *aLibTable, SYMBOL_LIB *aCacheLib, wxWindow *aParent, bool aShowErrorMsg)
Load symbol from symbol library table.
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