80 _(
"Bidirectional Pin" ),
84 _(
"Unspecified Pin" ),
85 _(
"Power Input Pin" ),
86 _(
"Power Output Pin" ),
87 _(
"Open Collector" ),
97 _(
"Bidirectional Pin" ),
101 _(
"Unspecified Pin" ),
102 _(
"Power Input Pin" ),
103 _(
"Power Output Pin" ),
104 _(
"Open Collector" ),
146 std::vector<SCH_SHEET*> list;
149 list.push_back(
static_cast<SCH_SHEET*
>( item ) );
151 for(
size_t i = 0; i < list.size(); i++ )
155 for(
size_t j = i + 1; j < list.size(); j++ )
167 ercItem->SetItems( sheet, test_item );
170 screen->Append( marker );
188 [
this]( wxString str )
191 return str.Matches( wxS(
"*${*}*" ) );
198 static wxRegEx warningExpr( wxS(
"^\\$\\{ERC_WARNING\\s*([^}]*)\\}(.*)$" ) );
199 static wxRegEx errorExpr( wxS(
"^\\$\\{ERC_ERROR\\s*([^}]*)\\}(.*)$" ) );
201 if( warningExpr.Matches(
text ) )
204 wxString ercText = warningExpr.GetMatch(
text, 1 );
207 ercItem->SetItems( item );
209 ercText +=
_(
" (in drawing sheet)" );
211 ercItem->SetSheetSpecificPath( sheet );
212 ercItem->SetErrorMessage( ercText );
215 screen->Append( marker );
220 if( errorExpr.Matches(
text ) )
223 wxString ercText = errorExpr.GetMatch(
text, 1 );
226 ercItem->SetItems( item );
228 ercText +=
_(
" (in drawing sheet)" );
230 ercItem->SetSheetSpecificPath( sheet );
231 ercItem->SetErrorMessage( ercText );
234 screen->Append( marker );
265 if( unresolved( field.GetShownText( &sheet,
true ) ) )
268 ercItem->SetItems( symbol );
269 ercItem->SetSheetSpecificPath( sheet );
275 testAssertion( &field, sheet, screen, field.GetText(), field.
GetPosition() );
291 if( unresolved( textItem->
GetShownText( &sheet,
true ) ) )
294 ercItem->SetItems( symbol );
295 ercItem->SetSheetSpecificPath( sheet );
305 testAssertion( symbol, sheet, screen, textItem->
GetText(),
312 if( unresolved( textboxItem->
GetShownText(
nullptr, &sheet,
true ) ) )
315 ercItem->SetItems( symbol );
316 ercItem->SetSheetSpecificPath( sheet );
326 testAssertion( symbol, sheet, screen, textboxItem->
GetText(),
335 for(
SCH_FIELD& field : label->GetFields() )
337 if( unresolved( field.GetShownText( &sheet,
true ) ) )
340 ercItem->SetItems( label );
341 ercItem->SetSheetSpecificPath( sheet );
347 testAssertion( &field, sheet, screen, field.GetText(), field.
GetPosition() );
356 if( unresolved( field.GetShownText( &sheet,
true ) ) )
359 ercItem->SetItems( subSheet );
360 ercItem->SetSheetSpecificPath( sheet );
366 testAssertion( &field, sheet, screen, field.GetText(), field.
GetPosition() );
374 if(
pin->GetShownText( &subSheetPath,
true ).Matches( wxS(
"*${*}*" ) ) )
377 ercItem->SetItems(
pin );
378 ercItem->SetSheetSpecificPath( sheet );
387 if(
text->GetShownText( &sheet,
true ).Matches( wxS(
"*${*}*" ) ) )
390 ercItem->SetItems(
text );
391 ercItem->SetSheetSpecificPath( sheet );
397 testAssertion(
text, sheet, screen,
text->GetText(),
text->GetPosition() );
401 if( textBox->GetShownText(
nullptr, &sheet,
true ).Matches( wxS(
"*${*}*" ) ) )
404 ercItem->SetItems( textBox );
405 ercItem->SetSheetSpecificPath( sheet );
411 testAssertion( textBox, sheet, screen, textBox->GetText(), textBox->
GetPosition() );
419 if( testAssertion(
nullptr, sheet, screen,
text->GetText(),
text->GetPosition() ) )
423 else if(
text->GetShownText(
true ).Matches( wxS(
"*${*}*" ) ) )
426 ercItem->SetErrorMessage(
_(
"Unresolved text variable in drawing sheet" ) );
427 ercItem->SetSheetSpecificPath( sheet );
452 wxString trimmedFieldName = field.GetName();
453 trimmedFieldName.Trim();
454 trimmedFieldName.Trim(
false );
456 if( field.GetName() != trimmedFieldName )
459 ercItem->SetItems( symbol, &field );
460 ercItem->SetItemsSheetPaths( sheet, sheet );
461 ercItem->SetSheetSpecificPath( sheet );
462 ercItem->SetErrorMessage(
464 _(
"Field name has leading or trailing whitespace: '%s'" ),
480 wxString trimmedFieldName = field.GetName();
481 trimmedFieldName.Trim();
482 trimmedFieldName.Trim(
false );
484 if( field.GetName() != trimmedFieldName )
487 ercItem->SetItems( subSheet, &field );
488 ercItem->SetItemsSheetPaths( sheet, sheet );
489 ercItem->SetSheetSpecificPath( sheet );
490 ercItem->SetErrorMessage(
492 _(
"Field name has leading or trailing whitespace: '%s'" ),
511 for( std::pair<const wxString, SCH_REFERENCE_LIST>& symbol :
m_refMap )
526 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
531 if( !unitFP.IsEmpty() )
534 unitName = unit->
GetRef( &sheetPath,
true );
539 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
547 if( unit && !secondFp.IsEmpty() && unitFP != secondFp )
549 msg.Printf(
_(
"Different footprints assigned to %s and %s" ),
550 unitName, secondName );
553 ercItem->SetErrorMessage( msg );
554 ercItem->SetItems( unit, secondUnit );
572 for( std::pair<const wxString, SCH_REFERENCE_LIST>& symbol :
m_refMap )
576 wxCHECK2( refList.
GetCount(),
continue );
586 std::set<int> lib_units;
587 std::set<int> instance_units;
588 std::set<int> missing_units;
591 [&]( std::set<int>& aMissingUnits,
const wxString& aErrorMsg,
int aErrorCode )
594 wxString missing_pin_units = wxS(
"[ " );
597 for(
int missing_unit : aMissingUnits )
601 missing_pin_units += wxS(
"..." );
608 missing_pin_units.Truncate( missing_pin_units.length() - 2 );
609 missing_pin_units += wxS(
" ]" );
611 msg.Printf( aErrorMsg, symbol.first, missing_pin_units );
614 ercItem->SetErrorMessage( msg );
615 ercItem->SetItems( unit );
616 ercItem->SetSheetSpecificPath( base_ref.
GetSheetPath() );
625 for(
int ii = 1; ii <= libSymbol->
GetUnitCount(); ++ii )
626 lib_units.insert( lib_units.end(), ii );
628 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
629 instance_units.insert( instance_units.end(), refList.
GetItem( ii ).
GetUnit() );
631 std::set_difference( lib_units.begin(), lib_units.end(),
632 instance_units.begin(), instance_units.end(),
633 std::inserter( missing_units, missing_units.begin() ) );
640 std::set<int> missing_power;
641 std::set<int> missing_input;
642 std::set<int> missing_bidi;
644 for(
int missing_unit : missing_units )
648 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
659 switch(
pin->GetType() )
662 missing_power.insert( missing_unit );
666 missing_bidi.insert( missing_unit );
670 missing_input.insert( missing_unit );
681 report( missing_power,
_(
"Symbol %s has input power pins in units %s that are not placed" ),
687 report( missing_input,
_(
"Symbol %s has input pins in units %s that are not placed" ),
693 report( missing_bidi,
_(
"Symbol %s has bidirectional pins in units %s that are not placed" ),
705 std::shared_ptr<NET_SETTINGS>& settings =
m_schematic->Project().GetProjectFile().NetSettings();
706 wxString defaultNetclass = settings->GetDefaultNetclass()->GetName();
715 ercItem->SetItems( item );
716 ercItem->SetErrorMessage( wxString::Format(
_(
"Netclass %s is not defined" ), netclass ) );
735 wxString netclass = field->
GetShownText( &sheet,
false );
737 if( !netclass.empty() && !netclass.IsSameAs( defaultNetclass )
738 && !settings->HasNetclass( netclass ) )
740 logError( sheet, item, netclass );
761 std::map<VECTOR2I, std::vector<SCH_ITEM*>> connMap;
768 connMap[pt].emplace_back( label );
771 for(
const std::pair<
const VECTOR2I, std::vector<SCH_ITEM*>>& pair : connMap )
773 std::vector<SCH_ITEM*> lines;
775 for(
SCH_ITEM* item : sheet.LastScreen()->Items().Overlapping(
SCH_LINE_T, pair.first ) )
784 lines.emplace_back( line );
787 if( lines.size() > 1 )
793 wxString msg = wxString::Format(
_(
"Label connects more than one wire at %d, %d" ),
794 pair.first.x, pair.first.y );
796 ercItem->SetItems( pair.second.front(), lines[0], lines[1], lines[2] );
797 ercItem->SetErrorMessage( msg );
798 ercItem->SetSheetSpecificPath( sheet );
801 sheet.LastScreen()->Append( marker );
814 auto pinStackAlreadyRepresented =
815 [](
SCH_PIN*
pin, std::vector<SCH_ITEM*>& collection ) ->
bool
819 if( item->Type() ==
SCH_PIN_T && item->GetParentSymbol() ==
pin->GetParentSymbol() )
833 std::map<VECTOR2I, std::vector<SCH_ITEM*>> connMap;
842 std::vector<SCH_ITEM*>& entry = connMap[
pin->GetPosition()];
845 if( pinStackAlreadyRepresented(
pin, entry ) )
848 entry.emplace_back(
pin );
860 connMap[pt].emplace_back( line );
863 for(
const std::pair<
const VECTOR2I, std::vector<SCH_ITEM*>>& pair : connMap )
865 if( pair.second.size() >= 4 )
871 ercItem->SetItems( pair.second[0], pair.second[1], pair.second[2], pair.second[3] );
873 wxString msg = wxString::Format(
_(
"Four items connected at %d, %d" ),
874 pair.first.x, pair.first.y );
875 ercItem->SetErrorMessage( msg );
877 ercItem->SetSheetSpecificPath( sheet );
880 sheet.LastScreen()->Append( marker );
895 std::map<VECTOR2I, std::vector<SCH_ITEM*>> pinMap;
900 if( pinMap.count( pt ) )
901 pinMap[pt].emplace_back( aOther );
911 pinMap[
pin->GetPosition()].emplace_back(
pin );
915 for(
SCH_ITEM* item : sheet.LastScreen()->Items() )
924 addOther(
pin->GetPosition(),
pin );
929 for(
const VECTOR2I& pt : item->GetConnectionPoints() )
930 addOther( pt, item );
934 for(
const std::pair<
const VECTOR2I, std::vector<SCH_ITEM*>>& pair : pinMap )
936 if( pair.second.size() > 1 )
964 ercItem->SetItems( pair.second[0], pair.second[1],
965 pair.second.size() > 2 ? pair.second[2] :
nullptr,
966 pair.second.size() > 3 ? pair.second[3] :
nullptr );
967 ercItem->SetErrorMessage(
_(
"Pin with 'no connection' type is connected" ) );
968 ercItem->SetSheetSpecificPath( sheet );
971 sheet.LastScreen()->Append( marker );
986 std::unordered_map<wxString, std::vector<ERC_SCH_PIN_CONTEXT>> netToPins;
990 using iterator_t = std::vector<ERC_SCH_PIN_CONTEXT>::iterator;
991 std::vector<ERC_SCH_PIN_CONTEXT> pins;
992 std::unordered_map<EDA_ITEM*, SCH_SCREEN*> pinToScreenMap;
993 bool has_noconnect =
false;
998 has_noconnect =
true;
1004 pins.emplace_back(
static_cast<SCH_PIN*
>( item ), subgraph->
GetSheet() );
1005 netToPins[ net.first.Name ].emplace_back(
static_cast<SCH_PIN*
>( item ), subgraph->
GetSheet() );
1011 std::sort( pins.begin(), pins.end(),
1014 int ret = StrNumCmp( lhs.Pin()->GetParentSymbol()->GetRef( &lhs.Sheet() ),
1015 rhs.Pin()->GetParentSymbol()->GetRef( &rhs.Sheet() ) );
1018 ret = StrNumCmp( lhs.Pin()->GetNumber(), rhs.Pin()->GetNumber() );
1028 bool hasDriver =
false;
1029 std::vector<ERC_SCH_PIN_CONTEXT*> pinsNeedingDrivers;
1030 std::vector<ERC_SCH_PIN_CONTEXT*> nonPowerPinsNeedingDrivers;
1031 std::vector<ERC_SCH_PIN_CONTEXT*> powerInPinsNeedingDrivers;
1036 bool ispowerNet =
false;
1047 std::vector<std::tuple<iterator_t, iterator_t, PIN_ERROR>> pin_mismatches;
1048 std::map<iterator_t, int> pin_mismatch_counts;
1050 for(
auto refIt = pins.begin(); refIt != pins.end(); ++refIt )
1060 pinsNeedingDrivers.push_back( &refPin );
1063 nonPowerPinsNeedingDrivers.push_back( &refPin );
1066 powerInPinsNeedingDrivers.push_back( &refPin );
1068 if( !needsDriver.
Pin()
1073 needsDriver = refPin;
1074 needsDriverType = needsDriver.
Pin()->
GetType();
1083 for(
auto testIt = refIt + 1; testIt != pins.end(); ++testIt )
1107 pin_mismatches.emplace_back( std::tuple<iterator_t, iterator_t, PIN_ERROR>{ refIt, testIt,
erc } );
1111 pin_mismatch_counts[refIt] =
m_settings.GetPinTypeWeight( ( *refIt ).Pin()->GetType() );
1112 pin_mismatch_counts[testIt] =
m_settings.GetPinTypeWeight( ( *testIt ).Pin()->GetType() );
1116 if( !pin_mismatch_counts.contains( testIt ) )
1117 pin_mismatch_counts.emplace( testIt, 1 );
1119 pin_mismatch_counts[testIt]++;
1121 if( !pin_mismatch_counts.contains( refIt ) )
1122 pin_mismatch_counts.emplace( refIt, 1 );
1124 pin_mismatch_counts[refIt]++;
1130 std::multimap<size_t, iterator_t, std::greater<size_t>> pins_dsc;
1132 std::transform( pin_mismatch_counts.begin(), pin_mismatch_counts.end(),
1133 std::inserter( pins_dsc, pins_dsc.begin() ),
1136 return std::pair<size_t, iterator_t>( p.second, p.first );
1139 for(
const auto& [amount, pinItBind] : pins_dsc )
1141 auto& pinIt = pinItBind;
1143 if( pin_mismatches.empty() )
1149 iterator_t nearest_pin = pins.end();
1150 double smallest_distance = std::numeric_limits<double>::infinity();
1155 [&](
const auto& tuple )
1159 if( pinIt == std::get<0>( tuple ) )
1160 other = std::get<1>( tuple );
1161 else if( pinIt == std::get<1>( tuple ) )
1162 other = std::get<0>( tuple );
1166 if( ( *pinIt ).Sheet().Cmp( ( *other ).Sheet() ) != 0 )
1168 if( std::isinf( smallest_distance ) )
1170 nearest_pin = other;
1171 erc = std::get<2>( tuple );
1178 if( std::isinf( smallest_distance ) ||
distance < smallest_distance )
1181 nearest_pin = other;
1182 erc = std::get<2>( tuple );
1189 if( nearest_pin != pins.end() )
1191 SCH_PIN* other_pin = ( *nearest_pin ).Pin();
1195 ercItem->SetItems(
pin, other_pin );
1196 ercItem->SetSheetSpecificPath( ( *pinIt ).Sheet() );
1197 ercItem->SetItemsSheetPaths( ( *pinIt ).Sheet(), ( *nearest_pin ).Sheet() );
1199 ercItem->SetErrorMessage( wxString::Format(
_(
"Pins of type %s and %s are connected" ),
1204 pinToScreenMap[
pin]->Append( marker );
1209 if( needsDriver.
Pin() && !hasDriver && !has_noconnect )
1217 bool suppressForNetChainDriver =
false;
1221 const wxString& thisNetName = net.first.Name;
1222 const auto& netChains =
m_schematic->ConnectionGraph()->GetCommittedNetChains();
1224 auto netHasPowerDriver = [&](
const wxString& aNetName ) ->
bool
1227 for(
const auto& n :
m_nets )
1229 if( n.first.Name != aNetName )
1251 for(
const auto& sig : netChains )
1256 const auto& sigNets = sig->GetNets();
1257 bool containsThisNet = std::find( sigNets.begin(), sigNets.end(), thisNetName ) != sigNets.end();
1259 if( !containsThisNet )
1263 for(
const wxString& otherNet : sigNets )
1265 if( otherNet == thisNetName )
1268 if( netHasPowerDriver( otherNet ) )
1270 suppressForNetChainDriver =
true;
1279 if( !suppressForNetChainDriver &&
m_settings.IsTestEnabled( err_code ) )
1281 std::vector<ERC_SCH_PIN_CONTEXT*> pinsToMark;
1290 if( ispowerNet && !powerInPinsNeedingDrivers.empty() )
1291 pinsToMark = powerInPinsNeedingDrivers;
1292 else if( !nonPowerPinsNeedingDrivers.empty() )
1293 pinsToMark = nonPowerPinsNeedingDrivers;
1295 pinsToMark = pinsNeedingDrivers;
1299 if( ispowerNet && !powerInPinsNeedingDrivers.empty() )
1300 pinsToMark.push_back( powerInPinsNeedingDrivers.front() );
1302 pinsToMark.push_back( &needsDriver );
1309 ercItem->SetItems( pinCtx->Pin() );
1310 ercItem->SetSheetSpecificPath( pinCtx->Sheet() );
1311 ercItem->SetItemsSheetPaths( pinCtx->Sheet() );
1314 pinToScreenMap[pinCtx->Pin()]->Append( marker );
1329 auto& netChains =
m_schematic->ConnectionGraph()->GetCommittedNetChains();
1330 wxLogTrace(
traceSchNetChain,
"ERC TestPinToPin: cross-chain phase start chains=%zu",
1333 for(
const auto& sig : netChains )
1338 const wxString chainName = sig->GetName();
1339 const auto& sigNets = sig->GetNets();
1342 std::vector<ERC_SCH_PIN_CONTEXT> netChainPins;
1343 netChainPins.reserve( sigNets.size() * 4 );
1345 for(
const wxString& n : sigNets )
1347 auto it = netToPins.find( n );
1348 if( it != netToPins.end() )
1350 const auto& vec = it->second;
1351 netChainPins.insert( netChainPins.end(), vec.begin(), vec.end() );
1355 if( netChainPins.size() < 2 )
1359 "ERC TestPinToPin: chain '%s' nets=%zu collectedPins=%zu",
1360 TO_UTF8( chainName ), sigNets.size(), netChainPins.size() );
1363 std::sort( netChainPins.begin(), netChainPins.end(),
1366 int ret = StrNumCmp( lhs.Pin()->GetParentSymbol()->GetRef( &lhs.Sheet() ),
1367 rhs.Pin()->GetParentSymbol()->GetRef( &rhs.Sheet() ) );
1369 ret = StrNumCmp( lhs.Pin()->GetNumber(), rhs.Pin()->GetNumber() );
1376 std::unordered_map<SCH_PIN*, wxString> pinNet;
1377 for(
const auto& netEntry : netToPins )
1378 for(
const auto& ctx : netEntry.second )
1379 pinNet[ ctx.Pin() ] = netEntry.first;
1381 for(
size_t i = 0; i < netChainPins.size(); ++i )
1383 SCH_PIN* aPin = netChainPins[i].Pin();
1385 const wxString& aNet = pinNet[aPin];
1387 for(
size_t j = i + 1; j < netChainPins.size(); ++j )
1389 SCH_PIN* bPin = netChainPins[j].Pin();
1390 const wxString& bNet = pinNet[bPin];
1405 ercItem->SetItems( aPin, bPin );
1406 ercItem->SetSheetSpecificPath( netChainPins[i].Sheet() );
1407 ercItem->SetItemsSheetPaths( netChainPins[i].Sheet(), netChainPins[j].Sheet() );
1408 ercItem->SetErrorMessage( wxString::Format(
1409 _(
"Pins of type %s and %s are connected via net chain %s" ),
1414 netChainPins[i].Sheet().LastScreen()->Append( marker );
1430 std::unordered_map<wxString, std::pair<wxString, SCH_PIN*>> pinToNetMap;
1434 const wxString& netName = net.first.Name;
1445 if( !
pin->GetParentSymbol()->IsMultiUnit() )
1448 wxString
name =
pin->GetParentSymbol()->GetRef( &sheet ) +
":" +
pin->GetShownNumber();
1450 if( !pinToNetMap.count(
name ) )
1452 pinToNetMap[
name] = std::make_pair( netName,
pin );
1454 else if( pinToNetMap[
name].first != netName )
1458 ercItem->SetErrorMessage( wxString::Format(
_(
"Pin %s is connected to both %s and %s" ),
1459 pin->GetShownNumber(),
1461 pinToNetMap[
name].first ) );
1463 ercItem->SetItems(
pin, pinToNetMap[
name].second );
1464 ercItem->SetSheetSpecificPath( sheet );
1465 ercItem->SetItemsSheetPaths( sheet, sheet );
1499 std::vector<SCH_PIN*> pins = symbol->
GetPins( &sheet );
1501 std::map<wxString, std::vector<std::pair<SCH_PIN*, wxString>>> pinsByNumber;
1506 wxString netName = conn ? conn->
GetNetName() : wxString();
1508 pinsByNumber[
pin->GetNumber()].emplace_back(
pin, netName );
1511 for(
const auto& [pinNumber, pinNetPairs] : pinsByNumber )
1513 if( pinNetPairs.size() < 2 )
1516 wxString firstNet = pinNetPairs[0].second;
1517 bool hasDifferentNets =
false;
1518 SCH_PIN* conflictPin =
nullptr;
1520 for(
size_t i = 1; i < pinNetPairs.size(); i++ )
1522 if( pinNetPairs[i].second != firstNet )
1524 hasDifferentNets =
true;
1525 conflictPin = pinNetPairs[i].first;
1530 if( hasDifferentNets )
1535 msg.Printf(
_(
"Pin %s on symbol '%s' is connected to different nets: %s and %s" ),
1537 symbol->
GetRef( &sheet ),
1538 firstNet.IsEmpty() ?
_(
"<no net>" ) : firstNet,
1539 pinNetPairs[1].second.IsEmpty() ?
_(
"<no net>" ) : pinNetPairs[1].second );
1541 ercItem->SetErrorMessage( msg );
1542 ercItem->SetItems( pinNetPairs[0].first, conflictPin );
1543 ercItem->SetSheetSpecificPath( sheet );
1544 ercItem->SetItemsSheetPaths( sheet, sheet );
1547 pinNetPairs[0].first->GetPosition() );
1548 screen->
Append( marker );
1564 [](
const wxString& txt )
1566 wxString upper = txt.Upper();
1568 return upper.Contains( wxT(
"GND" ) )
1569 || upper == wxT(
"EARTH" ) || upper.StartsWith( wxT(
"EARTH_" ) )
1570 || upper == wxT(
"VSS" ) || upper == wxT(
"VSSA" );
1580 bool hasGroundNet =
false;
1581 std::vector<SCH_PIN*> mismatched;
1586 wxString net = conn ? conn->
GetNetName() : wxString();
1587 bool netIsGround = isGround( net );
1597 hasGroundNet =
true;
1599 if( isGround(
pin->GetShownName() ) && !netIsGround )
1600 mismatched.push_back(
pin );
1609 ercItem->SetErrorMessage( wxString::Format(
_(
"Pin %s not connected to ground net" ),
1610 pin->GetShownName() ) );
1611 ercItem->SetItems(
pin );
1612 ercItem->SetSheetSpecificPath( sheet );
1613 ercItem->SetItemsSheetPaths( sheet );
1616 screen->
Append( marker );
1642 pin->GetStackedPinNumbers( &valid );
1647 ercItem->SetItems(
pin );
1648 ercItem->SetSheetSpecificPath( sheet );
1649 ercItem->SetItemsSheetPaths( sheet );
1652 screen->
Append( marker );
1667 std::unordered_map<wxString, std::pair<SCH_ITEM*, SCH_SHEET_PATH>> globalLabels;
1668 std::unordered_map<wxString, std::pair<SCH_ITEM*, SCH_SHEET_PATH>> localLabels;
1683 auto& map = item->Type() ==
SCH_LABEL_T ? localLabels : globalLabels;
1685 if( !map.count(
text ) )
1687 map[
text] = std::make_pair( label, sheet );
1694 if( !
pin->IsPower() )
1703 ?
pin->GetShownName()
1704 : symbol->
GetValue(
true, &sheet,
false );
1706 auto& map =
pin->IsGlobalPower() ? globalLabels : localLabels;
1708 if( !map.count(
text ) )
1710 map[
text] = std::make_pair(
pin, sheet );
1717 for(
auto& [globalText, globalItem] : globalLabels )
1719 for(
auto& [localText, localItem] : localLabels )
1721 if( globalText == localText )
1731 ercItem->SetItems( globalItem.first, localItem.first );
1732 ercItem->SetSheetSpecificPath( globalItem.second );
1733 ercItem->SetItemsSheetPaths( globalItem.second, localItem.second );
1736 globalItem.second.LastScreen()->Append( marker );
1750 std::unordered_map<wxString, std::vector<std::tuple<wxString, SCH_ITEM*, SCH_SHEET_PATH>>> generalMap;
1754 const std::tuple<wxString, SCH_ITEM*, SCH_SHEET_PATH>& other )
1756 auto& [otherText, otherItem, otherSheet] = other;
1776 ercItem->SetItems( item, otherItem );
1777 ercItem->SetSheetSpecificPath( sheet );
1778 ercItem->SetItemsSheetPaths( sheet, otherSheet );
1781 sheet.LastScreen()->Append( marker );
1792 switch( item->Type() )
1799 wxString unnormalized = label->
GetShownText( &sheet,
false );
1800 wxString normalized = unnormalized.Lower();
1802 generalMap[normalized].emplace_back( std::make_tuple( unnormalized, label, sheet ) );
1804 for(
const auto& otherTuple : generalMap.at( normalized ) )
1806 const auto& [otherText, otherItem, otherSheet] = otherTuple;
1808 if( unnormalized != otherText )
1812 && sheet != otherSheet )
1817 logError( normalized, label, sheet, otherTuple );
1828 if( !
pin->IsPower() )
1832 wxString unnormalized = symbol->
GetValue(
true, &sheet,
false );
1833 wxString normalized = unnormalized.Lower();
1835 generalMap[normalized].emplace_back( std::make_tuple( unnormalized,
pin, sheet ) );
1837 for(
const auto& otherTuple : generalMap.at( normalized ) )
1839 const auto& [otherText, otherItem, otherSheet] = otherTuple;
1841 if( unnormalized != otherText )
1843 logError( normalized,
pin, sheet, otherTuple );
1873 std::vector<SCH_MARKER*> markers;
1880 if( !libSymbolInSchematic )
1885 std::optional<const LIBRARY_TABLE_ROW*> optRow =
1888 if( !optRow || ( *optRow )->Disabled() )
1893 ercItem->SetItems( symbol );
1894 msg.Printf(
_(
"The current configuration does not include the symbol library '%s'" ),
1896 ercItem->SetErrorMessage( msg );
1908 std::optional<wxString> uri =
1910 wxCHECK2( uri.has_value(), uri = wxEmptyString );
1911 ercItem->SetItems( symbol );
1912 msg.Printf(
_(
"The symbol library '%s' was not found at '%s'" ),
1914 ercItem->SetErrorMessage( msg );
1925 if( libSymbol ==
nullptr )
1930 ercItem->SetItems( symbol );
1931 msg.Printf(
_(
"Symbol '%s' not found in symbol library '%s'" ),
1934 ercItem->SetErrorMessage( msg );
1942 std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->
Flatten();
1951 std::vector<wxString> messages;
1959 if( messages.empty() && flattenedSymbol->Compare( *libSymbolInSchematic, flags ) != 0 )
1962 ercItem->SetItems( symbol );
1963 msg.Printf(
_(
"Symbol '%s' doesn't match copy in library '%s'" ),
1966 ercItem->SetErrorMessage( msg );
1975 screen->Append( marker );
1988 if( std::optional<LIBRARY_MANAGER_ADAPTER*> adapter =
1991 ( *adapter )->BlockUntilLoaded();
1997 typedef int (*TESTER_FN_PTR)(
const wxString&,
PROJECT* );
2003 std::vector<SCH_MARKER*> markers;
2010 if( footprint.IsEmpty() )
2015 if( fpID.
Parse( footprint,
true ) >= 0 )
2018 msg.Printf(
_(
"'%s' is not a valid footprint identifier" ), footprint );
2019 ercItem->SetErrorMessage( msg );
2020 ercItem->SetItems( symbol );
2027 int ret = (linkTester)( footprint, aProject );
2032 msg.Printf(
_(
"The current configuration does not include the footprint library '%s'" ),
2034 ercItem->SetErrorMessage( msg );
2035 ercItem->SetItems( symbol );
2041 msg.Printf(
_(
"The footprint library '%s' is not enabled in the current configuration" ),
2043 ercItem->SetErrorMessage( msg );
2044 ercItem->SetItems( symbol );
2050 msg.Printf(
_(
"Footprint '%s' not found in library '%s'" ),
2053 ercItem->SetErrorMessage( msg );
2054 ercItem->SetItems( symbol );
2061 sheet.LastScreen()->Append( marker );
2079 std::vector<SCH_MARKER*> markers;
2084 std::unique_ptr<LIB_SYMBOL>& lib_symbol = sch_symbol->
GetLibSymbolRef();
2089 wxArrayString filters = lib_symbol->GetFPFilters();
2091 if( filters.empty() )
2097 if( footprint.
Parse( lowerId ) > 0 )
2103 for( wxString
filter : filters )
2108 if(
filter.Contains( wxS(
":" ) ) )
2109 found |= lowerId.Matches(
filter );
2111 found |= lowerItemName.Matches(
filter );
2120 msg.Printf(
_(
"Assigned footprint (%s) doesn't match footprint filters (%s)" ),
2122 wxJoin( filters,
' ' ) );
2123 ercItem->SetErrorMessage( msg );
2124 ercItem->SetItems( sch_symbol );
2131 sheet.LastScreen()->Append( marker );
2142 const int gridSize =
m_schematic->Settings().m_ConnectionGridSize;
2147 std::vector<SCH_MARKER*> markers;
2149 for(
SCH_ITEM* item : screen->Items() )
2151 if( item->Type() ==
SCH_LINE_T && item->IsConnectable() )
2159 ercItem->SetItems( line );
2167 ercItem->SetItems( line );
2178 if( ( point.x % gridSize ) != 0
2179 || ( point.y % gridSize ) != 0 )
2182 ercItem->SetItems( entry );
2184 markers.emplace_back(
new SCH_MARKER( std::move( ercItem ), point ) );
2199 if( ( pinPos.
x % gridSize ) != 0 || ( pinPos.
y % gridSize ) != 0 )
2202 ercItem->SetItems(
pin );
2204 markers.emplace_back(
new SCH_MARKER( std::move( ercItem ), pinPos ) );
2213 screen->Append( marker );
2227 wxString variant =
m_schematic->GetCurrentVariant();
2231 if( sheet.GetExcludedFromSim( variant ) )
2234 std::vector<SCH_MARKER*> markers;
2252 wxString msg =
reporter.GetMessages();
2258 ercItem->SetErrorMessage( msg );
2259 ercItem->SetItems( symbol );
2267 sheet.LastScreen()->Append( marker );
2285 if( aProgressReporter )
2286 aProgressReporter->
AdvancePhase(
_(
"Checking sheet names..." ) );
2292 if( aProgressReporter )
2293 aProgressReporter->
AdvancePhase(
_(
"Checking conflicts..." ) );
2306 if( aProgressReporter )
2307 aProgressReporter->
AdvancePhase(
_(
"Checking units..." ) );
2312 if( aProgressReporter )
2313 aProgressReporter->
AdvancePhase(
_(
"Checking footprints..." ) );
2326 if( aProgressReporter )
2356 if( aProgressReporter )
2357 aProgressReporter->
AdvancePhase(
_(
"Checking similar labels..." ) );
2365 if( aProgressReporter )
2366 aProgressReporter->
AdvancePhase(
_(
"Checking local and global labels..." ) );
2373 if( aProgressReporter )
2374 aProgressReporter->
AdvancePhase(
_(
"Checking for unresolved variables..." ) );
2381 if( aProgressReporter )
2382 aProgressReporter->
AdvancePhase(
_(
"Checking field names..." ) );
2389 if( aProgressReporter )
2390 aProgressReporter->
AdvancePhase(
_(
"Checking SPICE models..." ) );
2397 if( aProgressReporter )
2398 aProgressReporter->
AdvancePhase(
_(
"Checking no connect pins for connections..." ) );
2406 if( aProgressReporter )
2407 aProgressReporter->
AdvancePhase(
_(
"Checking for library symbol issues..." ) );
2414 if( aProgressReporter )
2415 aProgressReporter->
AdvancePhase(
_(
"Checking for footprint link issues..." ) );
2422 if( aProgressReporter )
2423 aProgressReporter->
AdvancePhase(
_(
"Checking footprint assignments against footprint filters..." ) );
2430 if( aProgressReporter )
2431 aProgressReporter->
AdvancePhase(
_(
"Checking for off grid pins and wires..." ) );
2438 if( aProgressReporter )
2439 aProgressReporter->
AdvancePhase(
_(
"Checking for four way junctions..." ) );
2446 if( aProgressReporter )
2447 aProgressReporter->
AdvancePhase(
_(
"Checking for labels on more than one wire..." ) );
2454 if( aProgressReporter )
2455 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.
int TestFieldNameWhitespace()
Check for field names with leading or trailing whitespace.
int TestDuplicatePinNets()
Checks if duplicate pin numbers within a symbol are connected to different nets.
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)
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)
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< const SCH_PIN * > GetGraphicalPins(int aUnit=0, int aBodyStyle=0) const
Graphical pins: Return schematic pin objects as drawn (unexpanded), filtered by unit/body.
void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction, RECURSE_MODE aMode) override
int GetUnitCount() const override
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
bool GetDuplicatePinNumbersAreJumpers() const
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.
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 wxString &aVariantName=wxEmptyString) 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
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
std::vector< const SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet) const
Retrieve a list of the SCH_PINs for the given sheet path.
bool IsGlobalPower() const override
const wxString GetValue(bool aResolve, const SCH_SHEET_PATH *aPath, bool aAllowExtraText, const wxString &aVariantName=wxEmptyString) 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 wxString &aVariantName=wxEmptyString) const
VECTOR2I GetPosition() const override
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 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_SAME_LOCAL_GLOBAL_POWER
Local power port and global power port have the same name.
@ 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_FIELD_NAME_WHITESPACE
Field name has leading or trailing whitespace.
@ 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.
const wxChar *const traceSchNetChain
Flag to enable tracing of schematic net chain rebuild and ERC cross-chain checks.
@ 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)
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Implement a participant in the KIWAY alchemy.
virtual void * IfaceOrAddress(int aDataId)=0
Return pointer to the requested object.
IbisParser parser & reporter
wxLogTrace helper definitions.
VECTOR2< int32_t > VECTOR2I