78 _(
"Bidirectional Pin" ),
82 _(
"Unspecified Pin" ),
83 _(
"Power Input Pin" ),
84 _(
"Power Output Pin" ),
85 _(
"Open Collector" ),
95 _(
"Bidirectional Pin" ),
99 _(
"Unspecified Pin" ),
100 _(
"Power Input Pin" ),
101 _(
"Power Output Pin" ),
102 _(
"Open Collector" ),
144 std::vector<SCH_SHEET*> list;
147 list.push_back(
static_cast<SCH_SHEET*
>( item ) );
149 for(
size_t i = 0; i < list.size(); i++ )
153 for(
size_t j = i + 1; j < list.size(); j++ )
165 ercItem->SetItems( sheet, test_item );
168 screen->Append( marker );
186 [
this]( wxString str )
189 return str.Matches( wxS(
"*${*}*" ) );
194 const wxString&
text )
196 static wxRegEx warningExpr( wxS(
"^\\$\\{ERC_WARNING\\s*([^}]*)\\}(.*)$" ) );
197 static wxRegEx errorExpr( wxS(
"^\\$\\{ERC_ERROR\\s*([^}]*)\\}(.*)$" ) );
199 if( warningExpr.Matches(
text ) )
203 ercItem->SetItems( item );
204 ercItem->SetSheetSpecificPath( sheet );
205 ercItem->SetErrorMessage( warningExpr.GetMatch(
text, 1 ) );
208 screen->Append( marker );
211 if( errorExpr.Matches(
text ) )
215 ercItem->SetItems( item );
216 ercItem->SetSheetSpecificPath( sheet );
217 ercItem->SetErrorMessage( errorExpr.GetMatch(
text, 1 ) );
220 screen->Append( marker );
247 if( unresolved( field.GetShownText( &sheet,
true ) ) )
250 ercItem->SetItems( symbol );
251 ercItem->SetSheetSpecificPath( sheet );
257 testAssertion( &field, sheet, screen, field.GetText() );
269 SCH_TEXT* textItem = static_cast<SCH_TEXT*>( child );
271 if( unresolved( textItem->GetShownText( &sheet, true ) ) )
273 auto ercItem = ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE );
274 ercItem->SetItems( symbol );
275 ercItem->SetSheetSpecificPath( sheet );
277 BOX2I bbox = textItem->GetBoundingBox();
278 bbox = symbol->GetTransform().TransformCoordinate( bbox );
279 VECTOR2I pos = bbox.Centre() + symbol->GetPosition();
281 SCH_MARKER* marker = new SCH_MARKER( ercItem, pos );
282 screen->Append( marker );
285 testAssertion( symbol, sheet, screen, textItem->GetText() );
289 SCH_TEXTBOX* textboxItem = static_cast<SCH_TEXTBOX*>( child );
291 if( unresolved( textboxItem->GetShownText( &sheet, true ) ) )
293 auto ercItem = ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE );
294 ercItem->SetItems( symbol );
295 ercItem->SetSheetSpecificPath( sheet );
297 BOX2I bbox = textboxItem->GetBoundingBox();
298 bbox = symbol->GetTransform().TransformCoordinate( bbox );
299 VECTOR2I pos = bbox.Centre() + symbol->GetPosition();
301 SCH_MARKER* marker = new SCH_MARKER( ercItem, pos );
302 screen->Append( marker );
305 testAssertion( symbol, sheet, screen, textboxItem->GetText() );
311 for(
SCH_FIELD& field : label->GetFields() )
313 if( unresolved( field.GetShownText( &sheet,
true ) ) )
316 ercItem->SetItems( label );
317 ercItem->SetSheetSpecificPath( sheet );
320 screen->Append( marker );
323 testAssertion( &field, sheet, screen, field.GetText() );
332 if( unresolved( field.GetShownText( &sheet,
true ) ) )
335 ercItem->SetItems( subSheet );
336 ercItem->SetSheetSpecificPath( sheet );
339 screen->Append( marker );
342 testAssertion( &field, sheet, screen, field.GetText() );
350 if(
pin->GetShownText( &subSheetPath,
true ).Matches( wxS(
"*${*}*" ) ) )
353 ercItem->SetItems(
pin );
354 ercItem->SetSheetSpecificPath( sheet );
357 screen->Append( marker );
363 if(
text->GetShownText( &sheet,
true ).Matches( wxS(
"*${*}*" ) ) )
366 ercItem->SetItems(
text );
367 ercItem->SetSheetSpecificPath( sheet );
370 screen->Append( marker );
373 testAssertion(
text, sheet, screen,
text->GetText() );
377 if( textBox->GetShownText( &sheet,
true ).Matches( wxS(
"*${*}*" ) ) )
380 ercItem->SetItems( textBox );
381 ercItem->SetSheetSpecificPath( sheet );
384 screen->Append( marker );
387 testAssertion( textBox, sheet, screen, textBox->GetText() );
391 for(
DS_DRAW_ITEM_BASE* item = wsItems.GetFirst(); item; item = wsItems.GetNext() )
395 if(
text->GetShownText(
true ).Matches( wxS(
"*${*}*" ) ) )
398 erc->SetErrorMessage(
_(
"Unresolved text variable in drawing sheet" ) );
399 erc->SetSheetSpecificPath( sheet );
402 screen->Append( marker );
414 std::vector<std::shared_ptr<BUS_ALIAS>> aliases;
418 const auto& screen_aliases = screen->GetBusAliases();
420 for(
const std::shared_ptr<BUS_ALIAS>& alias : screen_aliases )
422 std::vector<wxString> aliasMembers = alias->Members();
423 std::sort( aliasMembers.begin(), aliasMembers.end() );
425 for(
const std::shared_ptr<BUS_ALIAS>&
test : aliases )
427 std::vector<wxString> testMembers =
test->Members();
428 std::sort( testMembers.begin(), testMembers.end() );
430 if( alias->GetName() ==
test->GetName() && aliasMembers != testMembers )
432 msg.Printf(
_(
"Bus alias %s has conflicting definitions on %s and %s" ),
434 alias->GetParent()->GetFileName(),
435 test->GetParent()->GetFileName() );
438 ercItem->SetErrorMessage( msg );
441 test->GetParent()->Append( marker );
448 aliases.insert( aliases.end(), screen_aliases.begin(), screen_aliases.end() );
459 for( std::pair<const wxString, SCH_REFERENCE_LIST>& symbol :
m_refMap )
474 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
479 if( !unitFP.IsEmpty() )
482 unitName = unit->
GetRef( &sheetPath,
true );
487 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
495 if( unit && !secondFp.IsEmpty() && unitFP != secondFp )
497 msg.Printf(
_(
"Different footprints assigned to %s and %s" ),
498 unitName, secondName );
501 ercItem->SetErrorMessage( msg );
502 ercItem->SetItems( unit, secondUnit );
520 for( std::pair<const wxString, SCH_REFERENCE_LIST>& symbol :
m_refMap )
524 wxCHECK2( refList.
GetCount(),
continue );
534 std::set<int> lib_units;
535 std::set<int> instance_units;
536 std::set<int> missing_units;
539 [&]( std::set<int>& aMissingUnits,
const wxString& aErrorMsg,
int aErrorCode )
542 wxString missing_pin_units = wxS(
"[ " );
545 for(
int missing_unit : aMissingUnits )
549 missing_pin_units += wxS(
"....." );
556 missing_pin_units.Truncate( missing_pin_units.length() - 2 );
557 missing_pin_units += wxS(
" ]" );
559 msg.Printf( aErrorMsg, symbol.first, missing_pin_units );
562 ercItem->SetErrorMessage( msg );
563 ercItem->SetItems( unit );
564 ercItem->SetSheetSpecificPath( base_ref.
GetSheetPath() );
573 for(
int ii = 1; ii <= libSymbol->
GetUnitCount(); ++ii )
574 lib_units.insert( lib_units.end(), ii );
576 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
577 instance_units.insert( instance_units.end(), refList.
GetItem( ii ).
GetUnit() );
579 std::set_difference( lib_units.begin(), lib_units.end(),
580 instance_units.begin(), instance_units.end(),
581 std::inserter( missing_units, missing_units.begin() ) );
588 std::set<int> missing_power;
589 std::set<int> missing_input;
590 std::set<int> missing_bidi;
592 for(
int missing_unit : missing_units )
596 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
607 switch(
pin->GetType() )
609 case ELECTRICAL_PINTYPE::PT_POWER_IN:
610 missing_power.insert( missing_unit );
613 case ELECTRICAL_PINTYPE::PT_BIDI:
614 missing_bidi.insert( missing_unit );
617 case ELECTRICAL_PINTYPE::PT_INPUT:
618 missing_input.insert( missing_unit );
629 report( missing_power,
630 _(
"Symbol %s has input power pins in units %s that are not placed." ),
636 report( missing_input,
637 _(
"Symbol %s has input pins in units %s that are not placed." ),
643 report( missing_bidi,
644 _(
"Symbol %s has bidirectional pins in units %s that are not placed." ),
657 wxString defaultNetclass = settings->GetDefaultNetclass()->GetName();
666 ercItem->SetItems( item );
667 ercItem->SetErrorMessage( wxString::Format(
_(
"Netclass %s is not defined" ),
683 SCH_FIELD* field = static_cast<SCH_FIELD*>( aChild );
685 if( field->GetCanonicalName() == wxT(
"Netclass" ) )
687 wxString netclass = field->GetShownText( &sheet, false );
689 if( !netclass.IsSameAs( defaultNetclass )
690 && !settings->HasNetclass( netclass ) )
692 logError( sheet, item, netclass );
712 std::map<VECTOR2I, std::vector<SCH_ITEM*>> connMap;
719 connMap[pt].emplace_back( label );
722 for(
const std::pair<
const VECTOR2I, std::vector<SCH_ITEM*>>& pair : connMap )
724 std::vector<SCH_ITEM*> lines;
726 for(
SCH_ITEM* item : sheet.LastScreen()->Items().Overlapping(
SCH_LINE_T, pair.first ) )
735 lines.emplace_back( line );
738 if( lines.size() > 1 )
744 wxString msg = wxString::Format(
_(
"Label connects more than one wire at %d, %d" ),
745 pair.first.x, pair.first.y );
747 ercItem->SetItems( pair.second.front(), lines[0], lines[1], lines[2] );
748 ercItem->SetErrorMessage( msg );
749 ercItem->SetSheetSpecificPath( sheet );
752 sheet.LastScreen()->Append( marker );
767 std::map<VECTOR2I, std::vector<SCH_ITEM*>> connMap;
775 connMap[
pin->GetPosition()].emplace_back(
pin );
786 connMap[pt].emplace_back( line );
789 for(
const std::pair<
const VECTOR2I, std::vector<SCH_ITEM*>>& pair : connMap )
791 if( pair.second.size() >= 4 )
797 ercItem->SetItems( pair.second[0], pair.second[1], pair.second[2], pair.second[3] );
799 wxString msg = wxString::Format(
_(
"Four items connected at %d, %d" ),
800 pair.first.x, pair.first.y );
801 ercItem->SetErrorMessage( msg );
803 ercItem->SetSheetSpecificPath( sheet );
806 sheet.LastScreen()->Append( marker );
821 std::map<VECTOR2I, std::vector<SCH_ITEM*>> pinMap;
826 if( pinMap.count( pt ) )
827 pinMap[pt].emplace_back( aOther );
836 if(
pin->GetLibPin()->GetType() == ELECTRICAL_PINTYPE::PT_NC )
837 pinMap[
pin->GetPosition()].emplace_back(
pin );
841 for(
SCH_ITEM* item : sheet.LastScreen()->Items() )
849 if(
pin->GetLibPin()->GetType() != ELECTRICAL_PINTYPE::PT_NC )
850 addOther(
pin->GetPosition(),
pin );
853 else if( item->IsConnectable() )
855 for(
const VECTOR2I& pt : item->GetConnectionPoints() )
856 addOther( pt, item );
860 for(
const std::pair<
const VECTOR2I, std::vector<SCH_ITEM*>>& pair : pinMap )
862 if( pair.second.size() > 1 )
868 ercItem->SetItems( pair.second[0], pair.second[1],
869 pair.second.size() > 2 ? pair.second[2] :
nullptr,
870 pair.second.size() > 3 ? pair.second[3] :
nullptr );
871 ercItem->SetErrorMessage(
_(
"Pin with 'no connection' type is connected" ) );
872 ercItem->SetSheetSpecificPath( sheet );
875 sheet.LastScreen()->Append( marker );
890 std::vector<ERC_SCH_PIN_CONTEXT> pins;
891 std::unordered_map<EDA_ITEM*, SCH_SCREEN*> pinToScreenMap;
892 bool has_noconnect =
false;
897 has_noconnect =
true;
903 pins.emplace_back(
static_cast<SCH_PIN*
>( item ), subgraph->
GetSheet() );
909 std::sort( pins.begin(), pins.end(),
912 int ret = StrNumCmp( lhs.Pin()->GetParentSymbol()->GetRef( &lhs.Sheet() ),
913 rhs.Pin()->GetParentSymbol()->GetRef( &rhs.Sheet() ) );
916 ret = StrNumCmp( lhs.Pin()->GetNumber(), rhs.Pin()->GetNumber() );
926 bool hasDriver =
false;
931 bool ispowerNet =
false;
935 if( refPin.Pin()->GetType() == ELECTRICAL_PINTYPE::PT_POWER_IN )
942 for(
auto refIt = pins.begin(); refIt != pins.end(); ++refIt )
952 if( !needsDriver.
Pin()
954 || ( ispowerNet != ( needsDriverType == ELECTRICAL_PINTYPE::PT_POWER_IN )
955 && ispowerNet == ( refType == ELECTRICAL_PINTYPE::PT_POWER_IN ) ) )
957 needsDriver = refPin;
958 needsDriverType = needsDriver.
Pin()->
GetType();
967 for(
auto testIt = refIt + 1; testIt != pins.end(); ++testIt )
988 std::shared_ptr<ERC_ITEM> ercItem =
991 ercItem->SetItems( refPin.
Pin(), testPin.
Pin() );
992 ercItem->SetSheetSpecificPath( refPin.
Sheet() );
993 ercItem->SetItemsSheetPaths( refPin.
Sheet(), testPin.
Sheet() );
995 ercItem->SetErrorMessage(
996 wxString::Format(
_(
"Pins of type %s and %s are connected" ),
1001 pinToScreenMap[refPin.
Pin()]->Append( marker );
1007 if( needsDriver.
Pin() && !hasDriver && !has_noconnect )
1015 ercItem->SetItems( needsDriver.
Pin() );
1016 ercItem->SetSheetSpecificPath( needsDriver.
Sheet() );
1017 ercItem->SetItemsSheetPaths( needsDriver.
Sheet() );
1020 pinToScreenMap[needsDriver.
Pin()]->Append( marker );
1034 std::unordered_map<wxString, std::pair<wxString, SCH_PIN*>> pinToNetMap;
1038 const wxString& netName = net.first.Name;
1049 if( !
pin->GetLibPin()->GetParentSymbol()->IsMulti() )
1052 wxString
name =
pin->GetParentSymbol()->GetRef( &sheet ) +
1053 +
":" +
pin->GetShownNumber();
1055 if( !pinToNetMap.count(
name ) )
1057 pinToNetMap[
name] = std::make_pair( netName,
pin );
1059 else if( pinToNetMap[
name].first != netName )
1061 std::shared_ptr<ERC_ITEM> ercItem =
1064 ercItem->SetErrorMessage( wxString::Format(
1065 _(
"Pin %s is connected to both %s and %s" ),
1066 pin->GetShownNumber(),
1068 pinToNetMap[
name].first ) );
1070 ercItem->SetItems(
pin, pinToNetMap[
name].second );
1071 ercItem->SetSheetSpecificPath( sheet );
1072 ercItem->SetItemsSheetPaths( sheet, sheet );
1091 std::unordered_map<wxString, std::pair<SCH_ITEM*, SCH_SHEET_PATH>> globalLabels;
1092 std::unordered_map<wxString, std::pair<SCH_ITEM*, SCH_SHEET_PATH>> localLabels;
1107 auto& map = item->Type() ==
SCH_LABEL_T ? localLabels : globalLabels;
1109 if( !map.count(
text ) )
1111 map[
text] = std::make_pair( label, sheet );
1118 for(
auto& [globalText, globalItem] : globalLabels )
1120 for(
auto& [localText, localItem] : localLabels )
1122 if( globalText == localText )
1124 std::shared_ptr<ERC_ITEM> ercItem =
1126 ercItem->SetItems( globalItem.first, localItem.first );
1127 ercItem->SetSheetSpecificPath( globalItem.second );
1128 ercItem->SetItemsSheetPaths( globalItem.second, localItem.second );
1131 globalItem.second.LastScreen()->Append( marker );
1145 std::unordered_map<wxString, std::tuple<wxString, SCH_ITEM*, SCH_SHEET_PATH>> generalMap;
1149 auto& [otherText, otherItem, otherSheet] = generalMap.at( normalized );
1169 ercItem->SetItems( item, otherItem );
1170 ercItem->SetSheetSpecificPath( sheet );
1171 ercItem->SetItemsSheetPaths( sheet, otherSheet );
1174 sheet.LastScreen()->Append( marker );
1185 switch( item->Type() )
1192 wxString unnormalized = label->
GetShownText( &sheet,
false );
1193 wxString normalized = unnormalized.Lower();
1195 if( !generalMap.count( normalized ) )
1197 generalMap[normalized] = std::make_tuple( unnormalized, label, sheet );
1200 auto& [otherText, otherItem, otherSheet] = generalMap.at( normalized );
1202 if( unnormalized != otherText )
1204 logError( normalized, label, sheet );
1214 if( !
pin->IsGlobalPower() )
1220 wxString unnormalized = symbol->
GetValue(
true, &sheet,
false );
1221 wxString normalized = unnormalized.Lower();
1223 if( !generalMap.count( normalized ) )
1225 generalMap[normalized] = std::make_tuple( unnormalized,
pin, sheet );
1228 auto& [otherText, otherItem, otherSheet] = generalMap.at( normalized );
1230 if( unnormalized != otherText )
1232 logError( normalized,
pin, sheet );
1259 std::vector<SCH_MARKER*> markers;
1266 wxCHECK2( libSymbolInSchematic,
continue );
1276 ercItem->SetItems( symbol );
1277 msg.Printf(
_(
"The current configuration does not include the symbol library '%s'" ),
1279 ercItem->SetErrorMessage( msg );
1286 else if( !libTable->
HasLibrary( libName,
true ) )
1291 ercItem->SetItems( symbol );
1292 msg.Printf(
_(
"The library '%s' is not enabled in the current configuration" ),
1294 ercItem->SetErrorMessage( msg );
1305 if( libSymbol ==
nullptr )
1310 ercItem->SetItems( symbol );
1311 msg.Printf(
_(
"Symbol '%s' not found in symbol library '%s'" ),
1314 ercItem->SetErrorMessage( msg );
1322 std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->
Flatten();
1328 std::vector<wxString> messages;
1332 if( !messages.empty() )
1335 ercItem->SetItems( symbol );
1336 msg.Printf(
_(
"Symbol '%s' has multiple pins with the same pin number" ),
1338 ercItem->SetErrorMessage( msg );
1342 else if( flattenedSymbol->Compare( *libSymbolInSchematic, flags ) != 0 )
1345 ercItem->SetItems( symbol );
1346 msg.Printf(
_(
"Symbol '%s' doesn't match copy in library '%s'" ),
1349 ercItem->SetErrorMessage( msg );
1358 screen->Append( marker );
1374 typedef int (*TESTER_FN_PTR)(
const wxString&,
PROJECT* );
1380 std::vector<SCH_MARKER*> markers;
1387 if( footprint.IsEmpty() )
1392 if( fpID.
Parse( footprint,
true ) >= 0 )
1395 msg.Printf(
_(
"'%s' is not a valid footprint identifier." ), footprint );
1396 ercItem->SetErrorMessage( msg );
1397 ercItem->SetItems( symbol );
1404 int ret = (linkTester)( footprint, aProject );
1409 msg.Printf(
_(
"The current configuration does not include the footprint library '%s'." ),
1411 ercItem->SetErrorMessage( msg );
1412 ercItem->SetItems( symbol );
1418 msg.Printf(
_(
"The footprint library '%s' is not enabled in the current configuration." ),
1420 ercItem->SetErrorMessage( msg );
1421 ercItem->SetItems( symbol );
1427 msg.Printf(
_(
"Footprint '%s' not found in library '%s'." ),
1430 ercItem->SetErrorMessage( msg );
1431 ercItem->SetItems( symbol );
1438 sheet.LastScreen()->Append( marker );
1456 std::vector<SCH_MARKER*> markers;
1461 std::unique_ptr<LIB_SYMBOL>& lib_symbol = sch_symbol->
GetLibSymbolRef();
1466 wxArrayString filters = lib_symbol->GetFPFilters();
1468 if( filters.empty() )
1479 for(
const wxString&
filter : filters )
1481 found |= footprintName.Matches(
filter );
1490 msg.Printf(
_(
"Assigned footprint (%s) doesn't match footprint filters (%s)." ),
1492 wxJoin( filters,
' ' ) );
1493 ercItem->SetErrorMessage( msg );
1494 ercItem->SetItems( sch_symbol );
1501 sheet.LastScreen()->Append( marker );
1517 std::vector<SCH_MARKER*> markers;
1519 for(
SCH_ITEM* item : screen->Items() )
1521 if( item->Type() ==
SCH_LINE_T && item->IsConnectable() )
1529 ercItem->SetItems( line );
1537 ercItem->SetItems( line );
1550 if( ( pinPos.
x % gridSize ) != 0 || ( pinPos.
y % gridSize ) != 0 )
1553 ercItem->SetItems(
pin );
1555 markers.emplace_back(
new SCH_MARKER( ercItem, pinPos ) );
1564 screen->Append( marker );
1581 if( sheet.GetExcludedFromSim() )
1584 std::vector<SCH_MARKER*> markers;
1608 ercItem->SetErrorMessage( msg );
1609 ercItem->SetItems( symbol );
1617 sheet.LastScreen()->Append( marker );
1635 if( aProgressReporter )
1636 aProgressReporter->
AdvancePhase(
_(
"Checking sheet names..." ) );
1643 if( aProgressReporter )
1644 aProgressReporter->
AdvancePhase(
_(
"Checking bus conflicts..." ) );
1650 if( aProgressReporter )
1651 aProgressReporter->
AdvancePhase(
_(
"Checking conflicts..." ) );
1664 if( aProgressReporter )
1665 aProgressReporter->
AdvancePhase(
_(
"Checking units..." ) );
1670 if( aProgressReporter )
1671 aProgressReporter->
AdvancePhase(
_(
"Checking footprints..." ) );
1684 if( aProgressReporter )
1705 if( aProgressReporter )
1706 aProgressReporter->
AdvancePhase(
_(
"Checking labels..." ) );
1714 if( aProgressReporter )
1715 aProgressReporter->
AdvancePhase(
_(
"Checking for unresolved variables..." ) );
1722 if( aProgressReporter )
1723 aProgressReporter->
AdvancePhase(
_(
"Checking SPICE models..." ) );
1730 if( aProgressReporter )
1731 aProgressReporter->
AdvancePhase(
_(
"Checking no connect pins for connections..." ) );
1739 if( aProgressReporter )
1740 aProgressReporter->
AdvancePhase(
_(
"Checking for library symbol issues..." ) );
1747 if( aProgressReporter )
1748 aProgressReporter->
AdvancePhase(
_(
"Checking for footprint link issues..." ) );
1755 if( aProgressReporter )
1756 aProgressReporter->
AdvancePhase(
_(
"Checking footprint assignments against footprint filters..." ) );
1763 if( aProgressReporter )
1764 aProgressReporter->
AdvancePhase(
_(
"Checking for off grid pins and wires..." ) );
1771 if( aProgressReporter )
1772 aProgressReporter->
AdvancePhase(
_(
"Checking for four way junctions..." ) );
1779 if( aProgressReporter )
1780 aProgressReporter->
AdvancePhase(
_(
"Checking for labels on more than one wire..." ) );
1787 if( aProgressReporter )
1788 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.
int RunERC()
Run electrical rule checks on the connectivity graph.
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...
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.
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.
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.
bool IsTestEnabled(int aErrorCode) const
PIN_ERROR GetPinMapValue(int aFirstType, int aSecondType) const
int TestLibSymbolIssues()
Test symbols for changed library symbols and broken symbol library links.
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 TestConflictingBusAliases()
Check that there are no conflicting bus alias definitions in the schematic.
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
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.
std::vector< SCH_PIN * > GetPins(int aUnit=0, int aBodyStyle=0) const
Return a list of pin object pointers from the draw item list.
wxString GetUnitDisplayName(int aUnit) override
Return the user-defined display name for aUnit for symbols with units.
int GetUnitCount() const override
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
Hold a record identifying a library accessed by the appropriate plug in object in the LIB_TABLE.
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.
std::shared_ptr< NET_SETTINGS > & NetSettings()
static SYMBOL_LIB_TABLE * SchSymbolLibTable(PROJECT *aProject)
Accessor for project symbol library table.
Container for project specific data.
virtual PROJECT_FILE & GetProjectFile() const
void ResolveERCExclusionsPostUpdate()
Update markers to match recorded exclusions.
SCHEMATIC_SETTINGS & Settings() const
CONNECTION_GRAPH * ConnectionGraph() const override
PROJECT & Prj() const override
Return a reference to the project this schematic is part of.
Schematic editor (Eeschema) main window.
void RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags)
Generate the connection data for the entire schematic hierarchy.
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
Base class for any item which can be embedded within the SCHEMATIC container class,...
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
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()
Gets the full RTree, usually for iterating.
void AnnotatePowerSymbols()
Silently annotate the not yet annotated power symbols of the entire hierarchy of the sheet path list.
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()
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
std::vector< SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve a list of the SCH_PINs for the given sheet path.
const wxString GetFootprintFieldText(bool aResolve, const SCH_SHEET_PATH *aPath, bool aAllowExtraText) const
VECTOR2I GetPosition() const override
const LIB_ID & GetLibId() const override
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with SCH_FIELDs.
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
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...
bool GetExcludedFromSim() const override
A wrapper for reporting to a wxString object.
bool HasMessage() const override
Returns true if the reporter client is non-empty.
const wxString & GetMessages() const
const wxString ExpandEnvVarSubstitutions(const wxString &aString, const PROJECT *aProject)
Replace any environment variable & text variable references with their values.
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_SIMILAR_LABELS
2 labels are equal for case insensitive comparisons.
@ 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_BUS_ALIAS_CONFLICT
Conflicting bus alias definitions across sheets.
@ 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
wxString ElectricalPinTypeGetText(ELECTRICAL_PINTYPE aType)
ELECTRICAL_PINTYPE
The symbol library pin object electrical types used in ERC tests.
@ PT_INPUT
usual pin input: must be connected
@ PT_TRISTATE
tris 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_PASSIVE
pin for passive symbols: must be connected, and can be connected to any pin
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