84 _(
"Bidirectional Pin" ),
88 _(
"Unspecified Pin" ),
89 _(
"Power Input Pin" ),
90 _(
"Power Output Pin" ),
91 _(
"Open Collector" ),
101 _(
"Bidirectional Pin" ),
102 _(
"Tri-State Pin" ),
105 _(
"Unspecified Pin" ),
106 _(
"Power Input Pin" ),
107 _(
"Power Output Pin" ),
108 _(
"Open Collector" ),
150 std::vector<SCH_SHEET*> list;
153 list.push_back(
static_cast<SCH_SHEET*
>( item ) );
155 for(
size_t i = 0; i < list.size(); i++ )
159 for(
size_t j = i + 1; j < list.size(); j++ )
171 ercItem->SetItems( sheet, test_item );
174 screen->Append( marker );
192 [
this]( wxString str )
195 return str.Matches( wxS(
"*${*}*" ) );
202 static wxRegEx warningExpr( wxS(
"^\\$\\{ERC_WARNING\\s*([^}]*)\\}(.*)$" ) );
203 static wxRegEx errorExpr( wxS(
"^\\$\\{ERC_ERROR\\s*([^}]*)\\}(.*)$" ) );
205 if( warningExpr.Matches(
text ) )
208 wxString ercText = warningExpr.GetMatch(
text, 1 );
211 ercItem->SetItems( item );
213 ercText +=
_(
" (in drawing sheet)" );
215 ercItem->SetSheetSpecificPath( sheet );
216 ercItem->SetErrorMessage( ercText );
219 screen->Append( marker );
224 if( errorExpr.Matches(
text ) )
227 wxString ercText = errorExpr.GetMatch(
text, 1 );
230 ercItem->SetItems( item );
232 ercText +=
_(
" (in drawing sheet)" );
234 ercItem->SetSheetSpecificPath( sheet );
235 ercItem->SetErrorMessage( ercText );
238 screen->Append( marker );
269 if( unresolved( field.GetShownText( &sheet,
true ) ) )
272 ercItem->SetItems( symbol );
273 ercItem->SetSheetSpecificPath( sheet );
279 testAssertion( &field, sheet, screen, field.GetText(), field.
GetPosition() );
295 if( unresolved( textItem->
GetShownText( &sheet,
true ) ) )
298 ercItem->SetItems( symbol );
299 ercItem->SetSheetSpecificPath( sheet );
309 testAssertion( symbol, sheet, screen, textItem->
GetText(),
316 if( unresolved( textboxItem->
GetShownText(
nullptr, &sheet,
true ) ) )
319 ercItem->SetItems( symbol );
320 ercItem->SetSheetSpecificPath( sheet );
330 testAssertion( symbol, sheet, screen, textboxItem->
GetText(),
339 for(
SCH_FIELD& field : label->GetFields() )
341 if( unresolved( field.GetShownText( &sheet,
true ) ) )
344 ercItem->SetItems( label );
345 ercItem->SetSheetSpecificPath( sheet );
351 testAssertion( &field, sheet, screen, field.GetText(), field.
GetPosition() );
360 if( unresolved( field.GetShownText( &sheet,
true ) ) )
363 ercItem->SetItems( subSheet );
364 ercItem->SetSheetSpecificPath( sheet );
370 testAssertion( &field, sheet, screen, field.GetText(), field.
GetPosition() );
378 if(
pin->GetShownText( &subSheetPath,
true ).Matches( wxS(
"*${*}*" ) ) )
381 ercItem->SetItems(
pin );
382 ercItem->SetSheetSpecificPath( sheet );
391 if(
text->GetShownText( &sheet,
true ).Matches( wxS(
"*${*}*" ) ) )
394 ercItem->SetItems(
text );
395 ercItem->SetSheetSpecificPath( sheet );
401 testAssertion(
text, sheet, screen,
text->GetText(),
text->GetPosition() );
405 if( textBox->GetShownText(
nullptr, &sheet,
true ).Matches( wxS(
"*${*}*" ) ) )
408 ercItem->SetItems( textBox );
409 ercItem->SetSheetSpecificPath( sheet );
415 testAssertion( textBox, sheet, screen, textBox->GetText(), textBox->
GetPosition() );
423 if( testAssertion(
nullptr, sheet, screen,
text->GetText(),
text->GetPosition() ) )
427 else if(
text->GetShownText(
true ).Matches( wxS(
"*${*}*" ) ) )
430 ercItem->SetErrorMessage(
_(
"Unresolved text variable in drawing sheet" ) );
431 ercItem->SetSheetSpecificPath( sheet );
456 wxString trimmedFieldName = field.GetName();
457 trimmedFieldName.Trim();
458 trimmedFieldName.Trim(
false );
460 if( field.GetName() != trimmedFieldName )
463 ercItem->SetItems( symbol, &field );
464 ercItem->SetItemsSheetPaths( sheet, sheet );
465 ercItem->SetSheetSpecificPath( sheet );
466 ercItem->SetErrorMessage(
468 _(
"Field name has leading or trailing whitespace: '%s'" ),
484 wxString trimmedFieldName = field.GetName();
485 trimmedFieldName.Trim();
486 trimmedFieldName.Trim(
false );
488 if( field.GetName() != trimmedFieldName )
491 ercItem->SetItems( subSheet, &field );
492 ercItem->SetItemsSheetPaths( sheet, sheet );
493 ercItem->SetSheetSpecificPath( sheet );
494 ercItem->SetErrorMessage(
496 _(
"Field name has leading or trailing whitespace: '%s'" ),
515 for( std::pair<const wxString, SCH_REFERENCE_LIST>& symbol :
m_refMap )
530 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
535 if( !unitFP.IsEmpty() )
538 unitName = unit->
GetRef( &sheetPath,
true );
543 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
551 if( unit && !secondFp.IsEmpty() && unitFP != secondFp )
553 msg.Printf(
_(
"Different footprints assigned to %s and %s" ),
554 unitName, secondName );
557 ercItem->SetErrorMessage( msg );
558 ercItem->SetItems( unit, secondUnit );
576 for( std::pair<const wxString, SCH_REFERENCE_LIST>& symbol :
m_refMap )
580 wxCHECK2( refList.
GetCount(),
continue );
590 std::set<int> lib_units;
591 std::set<int> instance_units;
592 std::set<int> missing_units;
595 [&]( std::set<int>& aMissingUnits,
const wxString& aErrorMsg,
int aErrorCode )
598 wxString missing_pin_units = wxS(
"[ " );
601 for(
int missing_unit : aMissingUnits )
605 missing_pin_units += wxS(
"..." );
612 missing_pin_units.Truncate( missing_pin_units.length() - 2 );
613 missing_pin_units += wxS(
" ]" );
615 msg.Printf( aErrorMsg, symbol.first, missing_pin_units );
618 ercItem->SetErrorMessage( msg );
619 ercItem->SetItems( unit );
620 ercItem->SetSheetSpecificPath( base_ref.
GetSheetPath() );
629 for(
int ii = 1; ii <= libSymbol->
GetUnitCount(); ++ii )
630 lib_units.insert( lib_units.end(), ii );
632 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
633 instance_units.insert( instance_units.end(), refList.
GetItem( ii ).
GetUnit() );
635 std::set_difference( lib_units.begin(), lib_units.end(),
636 instance_units.begin(), instance_units.end(),
637 std::inserter( missing_units, missing_units.begin() ) );
644 std::set<int> missing_power;
645 std::set<int> missing_input;
646 std::set<int> missing_bidi;
648 for(
int missing_unit : missing_units )
652 for(
size_t ii = 0; ii < refList.
GetCount(); ++ii )
663 switch(
pin->GetType() )
666 missing_power.insert( missing_unit );
670 missing_bidi.insert( missing_unit );
674 missing_input.insert( missing_unit );
685 report( missing_power,
_(
"Symbol %s has input power pins in units %s that are not placed" ),
691 report( missing_input,
_(
"Symbol %s has input pins in units %s that are not placed" ),
697 report( missing_bidi,
_(
"Symbol %s has bidirectional pins in units %s that are not placed" ),
709 std::shared_ptr<NET_SETTINGS>& settings =
m_schematic->Project().GetProjectFile().NetSettings();
710 wxString defaultNetclass = settings->GetDefaultNetclass()->GetName();
719 ercItem->SetItems( item );
720 ercItem->SetErrorMessage( wxString::Format(
_(
"Netclass %s is not defined" ), netclass ) );
739 wxString netclass = field->
GetShownText( &sheet,
false );
741 if( !netclass.empty() && !netclass.IsSameAs( defaultNetclass )
742 && !settings->HasNetclass( netclass ) )
744 logError( sheet, item, netclass );
765 std::map<VECTOR2I, std::vector<SCH_ITEM*>> connMap;
772 connMap[pt].emplace_back( label );
775 for(
const std::pair<
const VECTOR2I, std::vector<SCH_ITEM*>>& pair : connMap )
777 std::vector<SCH_ITEM*> lines;
779 for(
SCH_ITEM* item : sheet.LastScreen()->Items().Overlapping(
SCH_LINE_T, pair.first ) )
788 lines.emplace_back( line );
791 if( lines.size() > 1 )
797 wxString msg = wxString::Format(
_(
"Label connects more than one wire at %d, %d" ),
798 pair.first.x, pair.first.y );
800 ercItem->SetItems( pair.second.front(), lines[0], lines[1], lines[2] );
801 ercItem->SetErrorMessage( msg );
802 ercItem->SetSheetSpecificPath( sheet );
805 sheet.LastScreen()->Append( marker );
818 auto pinStackAlreadyRepresented =
819 [](
SCH_PIN*
pin, std::vector<SCH_ITEM*>& collection ) ->
bool
823 if( item->Type() ==
SCH_PIN_T && item->GetParentSymbol() ==
pin->GetParentSymbol() )
837 std::map<VECTOR2I, std::vector<SCH_ITEM*>> connMap;
846 std::vector<SCH_ITEM*>& entry = connMap[
pin->GetPosition()];
849 if( pinStackAlreadyRepresented(
pin, entry ) )
852 entry.emplace_back(
pin );
864 connMap[pt].emplace_back( line );
867 for(
const std::pair<
const VECTOR2I, std::vector<SCH_ITEM*>>& pair : connMap )
869 if( pair.second.size() >= 4 )
875 ercItem->SetItems( pair.second[0], pair.second[1], pair.second[2], pair.second[3] );
877 wxString msg = wxString::Format(
_(
"Four items connected at %d, %d" ),
878 pair.first.x, pair.first.y );
879 ercItem->SetErrorMessage( msg );
881 ercItem->SetSheetSpecificPath( sheet );
884 sheet.LastScreen()->Append( marker );
899 std::map<VECTOR2I, std::vector<SCH_ITEM*>> pinMap;
904 if( pinMap.count( pt ) )
905 pinMap[pt].emplace_back( aOther );
915 pinMap[
pin->GetPosition()].emplace_back(
pin );
919 for(
SCH_ITEM* item : sheet.LastScreen()->Items() )
928 addOther(
pin->GetPosition(),
pin );
933 for(
const VECTOR2I& pt : item->GetConnectionPoints() )
934 addOther( pt, item );
938 for(
const std::pair<
const VECTOR2I, std::vector<SCH_ITEM*>>& pair : pinMap )
940 if( pair.second.size() > 1 )
968 ercItem->SetItems( pair.second[0], pair.second[1],
969 pair.second.size() > 2 ? pair.second[2] :
nullptr,
970 pair.second.size() > 3 ? pair.second[3] :
nullptr );
971 ercItem->SetErrorMessage(
_(
"Pin with 'no connection' type is connected" ) );
972 ercItem->SetSheetSpecificPath( sheet );
975 sheet.LastScreen()->Append( marker );
990 std::unordered_map<wxString, std::vector<ERC_SCH_PIN_CONTEXT>> netToPins;
994 using iterator_t = std::vector<ERC_SCH_PIN_CONTEXT>::iterator;
995 std::vector<ERC_SCH_PIN_CONTEXT> pins;
996 std::unordered_map<EDA_ITEM*, SCH_SCREEN*> pinToScreenMap;
997 bool has_noconnect =
false;
1002 has_noconnect =
true;
1008 pins.emplace_back(
static_cast<SCH_PIN*
>( item ), subgraph->
GetSheet() );
1009 netToPins[ net.first.Name ].emplace_back(
static_cast<SCH_PIN*
>( item ), subgraph->
GetSheet() );
1015 std::sort( pins.begin(), pins.end(),
1018 int ret = StrNumCmp( lhs.Pin()->GetParentSymbol()->GetRef( &lhs.Sheet() ),
1019 rhs.Pin()->GetParentSymbol()->GetRef( &rhs.Sheet() ) );
1022 ret = StrNumCmp( lhs.Pin()->GetNumber(), rhs.Pin()->GetNumber() );
1032 bool hasDriver =
false;
1033 std::vector<ERC_SCH_PIN_CONTEXT*> pinsNeedingDrivers;
1034 std::vector<ERC_SCH_PIN_CONTEXT*> nonPowerPinsNeedingDrivers;
1035 std::vector<ERC_SCH_PIN_CONTEXT*> powerInPinsNeedingDrivers;
1040 bool ispowerNet =
false;
1051 std::vector<std::tuple<iterator_t, iterator_t, PIN_ERROR>> pin_mismatches;
1052 std::map<iterator_t, int> pin_mismatch_counts;
1054 for(
auto refIt = pins.begin(); refIt != pins.end(); ++refIt )
1064 pinsNeedingDrivers.push_back( &refPin );
1067 nonPowerPinsNeedingDrivers.push_back( &refPin );
1070 powerInPinsNeedingDrivers.push_back( &refPin );
1072 if( !needsDriver.
Pin()
1077 needsDriver = refPin;
1078 needsDriverType = needsDriver.
Pin()->
GetType();
1087 for(
auto testIt = refIt + 1; testIt != pins.end(); ++testIt )
1111 pin_mismatches.emplace_back( std::tuple<iterator_t, iterator_t, PIN_ERROR>{ refIt, testIt,
erc } );
1115 pin_mismatch_counts[refIt] =
m_settings.GetPinTypeWeight( ( *refIt ).Pin()->GetType() );
1116 pin_mismatch_counts[testIt] =
m_settings.GetPinTypeWeight( ( *testIt ).Pin()->GetType() );
1120 if( !pin_mismatch_counts.contains( testIt ) )
1121 pin_mismatch_counts.emplace( testIt, 1 );
1123 pin_mismatch_counts[testIt]++;
1125 if( !pin_mismatch_counts.contains( refIt ) )
1126 pin_mismatch_counts.emplace( refIt, 1 );
1128 pin_mismatch_counts[refIt]++;
1134 std::multimap<size_t, iterator_t, std::greater<size_t>> pins_dsc;
1136 std::transform( pin_mismatch_counts.begin(), pin_mismatch_counts.end(),
1137 std::inserter( pins_dsc, pins_dsc.begin() ),
1140 return std::pair<size_t, iterator_t>( p.second, p.first );
1143 for(
const auto& [amount, pinItBind] : pins_dsc )
1145 auto& pinIt = pinItBind;
1147 if( pin_mismatches.empty() )
1153 iterator_t nearest_pin = pins.end();
1154 double smallest_distance = std::numeric_limits<double>::infinity();
1159 [&](
const auto& tuple )
1163 if( pinIt == std::get<0>( tuple ) )
1164 other = std::get<1>( tuple );
1165 else if( pinIt == std::get<1>( tuple ) )
1166 other = std::get<0>( tuple );
1170 if( ( *pinIt ).Sheet().Cmp( ( *other ).Sheet() ) != 0 )
1172 if( std::isinf( smallest_distance ) )
1174 nearest_pin = other;
1175 erc = std::get<2>( tuple );
1182 if( std::isinf( smallest_distance ) ||
distance < smallest_distance )
1185 nearest_pin = other;
1186 erc = std::get<2>( tuple );
1193 if( nearest_pin != pins.end() )
1195 SCH_PIN* other_pin = ( *nearest_pin ).Pin();
1199 ercItem->SetItems(
pin, other_pin );
1200 ercItem->SetSheetSpecificPath( ( *pinIt ).Sheet() );
1201 ercItem->SetItemsSheetPaths( ( *pinIt ).Sheet(), ( *nearest_pin ).Sheet() );
1203 ercItem->SetErrorMessage( wxString::Format(
_(
"Pins of type %s and %s are connected" ),
1208 pinToScreenMap[
pin]->Append( marker );
1213 if( needsDriver.
Pin() && !hasDriver && !has_noconnect )
1221 bool suppressForNetChainDriver =
false;
1225 const wxString& thisNetName = net.first.Name;
1226 const auto& netChains =
m_schematic->ConnectionGraph()->GetCommittedNetChains();
1228 auto netHasPowerDriver = [&](
const wxString& aNetName ) ->
bool
1231 for(
const auto& n :
m_nets )
1233 if( n.first.Name != aNetName )
1255 for(
const auto& sig : netChains )
1260 const auto& sigNets = sig->GetNets();
1261 bool containsThisNet = std::find( sigNets.begin(), sigNets.end(), thisNetName ) != sigNets.end();
1263 if( !containsThisNet )
1267 for(
const wxString& otherNet : sigNets )
1269 if( otherNet == thisNetName )
1272 if( netHasPowerDriver( otherNet ) )
1274 suppressForNetChainDriver =
true;
1283 if( !suppressForNetChainDriver &&
m_settings.IsTestEnabled( err_code ) )
1285 std::vector<ERC_SCH_PIN_CONTEXT*> pinsToMark;
1294 if( ispowerNet && !powerInPinsNeedingDrivers.empty() )
1295 pinsToMark = powerInPinsNeedingDrivers;
1296 else if( !nonPowerPinsNeedingDrivers.empty() )
1297 pinsToMark = nonPowerPinsNeedingDrivers;
1299 pinsToMark = pinsNeedingDrivers;
1303 if( ispowerNet && !powerInPinsNeedingDrivers.empty() )
1304 pinsToMark.push_back( powerInPinsNeedingDrivers.front() );
1306 pinsToMark.push_back( &needsDriver );
1313 ercItem->SetItems( pinCtx->Pin() );
1314 ercItem->SetSheetSpecificPath( pinCtx->Sheet() );
1315 ercItem->SetItemsSheetPaths( pinCtx->Sheet() );
1318 pinToScreenMap[pinCtx->Pin()]->Append( marker );
1333 auto& netChains =
m_schematic->ConnectionGraph()->GetCommittedNetChains();
1334 wxLogTrace(
traceSchNetChain,
"ERC TestPinToPin: cross-chain phase start chains=%zu",
1337 for(
const auto& sig : netChains )
1342 const wxString chainName = sig->GetName();
1343 const auto& sigNets = sig->GetNets();
1346 std::vector<ERC_SCH_PIN_CONTEXT> netChainPins;
1347 netChainPins.reserve( sigNets.size() * 4 );
1349 for(
const wxString& n : sigNets )
1351 auto it = netToPins.find( n );
1352 if( it != netToPins.end() )
1354 const auto& vec = it->second;
1355 netChainPins.insert( netChainPins.end(), vec.begin(), vec.end() );
1359 if( netChainPins.size() < 2 )
1363 "ERC TestPinToPin: chain '%s' nets=%zu collectedPins=%zu",
1364 TO_UTF8( chainName ), sigNets.size(), netChainPins.size() );
1367 std::sort( netChainPins.begin(), netChainPins.end(),
1370 int ret = StrNumCmp( lhs.Pin()->GetParentSymbol()->GetRef( &lhs.Sheet() ),
1371 rhs.Pin()->GetParentSymbol()->GetRef( &rhs.Sheet() ) );
1373 ret = StrNumCmp( lhs.Pin()->GetNumber(), rhs.Pin()->GetNumber() );
1380 std::unordered_map<SCH_PIN*, wxString> pinNet;
1381 for(
const auto& netEntry : netToPins )
1382 for(
const auto& ctx : netEntry.second )
1383 pinNet[ ctx.Pin() ] = netEntry.first;
1385 for(
size_t i = 0; i < netChainPins.size(); ++i )
1387 SCH_PIN* aPin = netChainPins[i].Pin();
1389 const wxString& aNet = pinNet[aPin];
1391 for(
size_t j = i + 1; j < netChainPins.size(); ++j )
1393 SCH_PIN* bPin = netChainPins[j].Pin();
1394 const wxString& bNet = pinNet[bPin];
1409 ercItem->SetItems( aPin, bPin );
1410 ercItem->SetSheetSpecificPath( netChainPins[i].Sheet() );
1411 ercItem->SetItemsSheetPaths( netChainPins[i].Sheet(), netChainPins[j].Sheet() );
1412 ercItem->SetErrorMessage( wxString::Format(
1413 _(
"Pins of type %s and %s are connected via net chain %s" ),
1418 netChainPins[i].Sheet().LastScreen()->Append( marker );
1434 std::unordered_map<wxString, std::pair<wxString, SCH_PIN*>> pinToNetMap;
1438 const wxString& netName = net.first.Name;
1449 if( !
pin->GetParentSymbol()->IsMultiUnit() )
1452 wxString
name =
pin->GetParentSymbol()->GetRef( &sheet ) +
":" +
pin->GetShownNumber();
1454 if( !pinToNetMap.count(
name ) )
1456 pinToNetMap[
name] = std::make_pair( netName,
pin );
1458 else if( pinToNetMap[
name].first != netName )
1462 ercItem->SetErrorMessage( wxString::Format(
_(
"Pin %s is connected to both %s and %s" ),
1463 pin->GetShownNumber(),
1465 pinToNetMap[
name].first ) );
1467 ercItem->SetItems(
pin, pinToNetMap[
name].second );
1468 ercItem->SetSheetSpecificPath( sheet );
1469 ercItem->SetItemsSheetPaths( sheet, sheet );
1503 std::vector<SCH_PIN*> pins = symbol->
GetPins( &sheet );
1505 std::map<wxString, std::vector<std::pair<SCH_PIN*, wxString>>> pinsByNumber;
1510 wxString netName = conn ? conn->
GetNetName() : wxString();
1512 pinsByNumber[
pin->GetNumber()].emplace_back(
pin, netName );
1515 for(
const auto& [pinNumber, pinNetPairs] : pinsByNumber )
1517 if( pinNetPairs.size() < 2 )
1520 wxString firstNet = pinNetPairs[0].second;
1521 bool hasDifferentNets =
false;
1522 SCH_PIN* conflictPin =
nullptr;
1524 for(
size_t i = 1; i < pinNetPairs.size(); i++ )
1526 if( pinNetPairs[i].second != firstNet )
1528 hasDifferentNets =
true;
1529 conflictPin = pinNetPairs[i].first;
1534 if( hasDifferentNets )
1539 msg.Printf(
_(
"Pin %s on symbol '%s' is connected to different nets: %s and %s" ),
1541 symbol->
GetRef( &sheet ),
1542 firstNet.IsEmpty() ?
_(
"<no net>" ) : firstNet,
1543 pinNetPairs[1].second.IsEmpty() ?
_(
"<no net>" ) : pinNetPairs[1].second );
1545 ercItem->SetErrorMessage( msg );
1546 ercItem->SetItems( pinNetPairs[0].first, conflictPin );
1547 ercItem->SetSheetSpecificPath( sheet );
1548 ercItem->SetItemsSheetPaths( sheet, sheet );
1551 pinNetPairs[0].first->GetPosition() );
1552 screen->
Append( marker );
1568 [](
const wxString& txt )
1570 wxString upper = txt.Upper();
1571 return upper.Contains( wxT(
"GND" ) );
1581 bool hasGroundNet =
false;
1582 std::vector<SCH_PIN*> mismatched;
1587 wxString net = conn ? conn->
GetNetName() : wxString();
1588 bool netIsGround = isGround( net );
1598 hasGroundNet =
true;
1600 if( isGround(
pin->GetShownName() ) && !netIsGround )
1601 mismatched.push_back(
pin );
1610 ercItem->SetErrorMessage( wxString::Format(
_(
"Pin %s not connected to ground net" ),
1611 pin->GetShownName() ) );
1612 ercItem->SetItems(
pin );
1613 ercItem->SetSheetSpecificPath( sheet );
1614 ercItem->SetItemsSheetPaths( sheet );
1617 screen->
Append( marker );
1643 pin->GetStackedPinNumbers( &valid );
1648 ercItem->SetItems(
pin );
1649 ercItem->SetSheetSpecificPath( sheet );
1650 ercItem->SetItemsSheetPaths( sheet );
1653 screen->
Append( marker );
1668 std::unordered_map<wxString, std::pair<SCH_ITEM*, SCH_SHEET_PATH>> globalLabels;
1669 std::unordered_map<wxString, std::pair<SCH_ITEM*, SCH_SHEET_PATH>> localLabels;
1684 auto& map = item->Type() ==
SCH_LABEL_T ? localLabels : globalLabels;
1686 if( !map.count(
text ) )
1688 map[
text] = std::make_pair( label, sheet );
1695 if( !
pin->IsPower() )
1704 ?
pin->GetShownName()
1705 : symbol->
GetValue(
true, &sheet,
false );
1707 auto& map =
pin->IsGlobalPower() ? globalLabels : localLabels;
1709 if( !map.count(
text ) )
1711 map[
text] = std::make_pair(
pin, sheet );
1718 for(
auto& [globalText, globalItem] : globalLabels )
1720 for(
auto& [localText, localItem] : localLabels )
1722 if( globalText == localText )
1732 ercItem->SetItems( globalItem.first, localItem.first );
1733 ercItem->SetSheetSpecificPath( globalItem.second );
1734 ercItem->SetItemsSheetPaths( globalItem.second, localItem.second );
1737 globalItem.second.LastScreen()->Append( marker );
1751 std::unordered_map<wxString, std::vector<std::tuple<wxString, SCH_ITEM*, SCH_SHEET_PATH>>> generalMap;
1755 const std::tuple<wxString, SCH_ITEM*, SCH_SHEET_PATH>& other )
1757 auto& [otherText, otherItem, otherSheet] = other;
1777 ercItem->SetItems( item, otherItem );
1778 ercItem->SetSheetSpecificPath( sheet );
1779 ercItem->SetItemsSheetPaths( sheet, otherSheet );
1782 sheet.LastScreen()->Append( marker );
1793 switch( item->Type() )
1800 wxString unnormalized = label->
GetShownText( &sheet,
false );
1801 wxString normalized = unnormalized.Lower();
1803 generalMap[normalized].emplace_back( std::make_tuple( unnormalized, label, sheet ) );
1805 for(
const auto& otherTuple : generalMap.at( normalized ) )
1807 const auto& [otherText, otherItem, otherSheet] = otherTuple;
1809 if( unnormalized != otherText )
1813 && sheet != otherSheet )
1818 logError( normalized, label, sheet, otherTuple );
1829 if( !
pin->IsPower() )
1833 wxString unnormalized = symbol->
GetValue(
true, &sheet,
false );
1834 wxString normalized = unnormalized.Lower();
1836 generalMap[normalized].emplace_back( std::make_tuple( unnormalized,
pin, sheet ) );
1838 for(
const auto& otherTuple : generalMap.at( normalized ) )
1840 const auto& [otherText, otherItem, otherSheet] = otherTuple;
1842 if( unnormalized != otherText )
1844 logError( normalized,
pin, sheet, otherTuple );
1874 std::vector<SCH_MARKER*> markers;
1881 if( !libSymbolInSchematic )
1886 std::optional<const LIBRARY_TABLE_ROW*> optRow =
1889 if( !optRow || ( *optRow )->Disabled() )
1894 ercItem->SetItems( symbol );
1895 msg.Printf(
_(
"The current configuration does not include the symbol library '%s'" ),
1897 ercItem->SetErrorMessage( msg );
1909 std::optional<wxString> uri =
1911 wxCHECK2( uri.has_value(), uri = wxEmptyString );
1912 ercItem->SetItems( symbol );
1913 msg.Printf(
_(
"The symbol library '%s' was not found at '%s'" ),
1915 ercItem->SetErrorMessage( msg );
1926 if( libSymbol ==
nullptr )
1931 ercItem->SetItems( symbol );
1932 msg.Printf(
_(
"Symbol '%s' not found in symbol library '%s'" ),
1935 ercItem->SetErrorMessage( msg );
1943 std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->
Flatten();
1952 std::vector<wxString> messages;
1960 if( messages.empty() && flattenedSymbol->Compare( *libSymbolInSchematic, flags ) != 0 )
1963 ercItem->SetItems( symbol );
1964 msg.Printf(
_(
"Symbol '%s' doesn't match copy in library '%s'" ),
1967 ercItem->SetErrorMessage( msg );
1976 screen->Append( marker );
1989 if( std::optional<LIBRARY_MANAGER_ADAPTER*> adapter =
1992 ( *adapter )->BlockUntilLoaded();
1998 typedef int (*TESTER_FN_PTR)(
const wxString&,
PROJECT* );
2004 std::vector<SCH_MARKER*> markers;
2011 if( footprint.IsEmpty() )
2016 if( fpID.
Parse( footprint,
true ) >= 0 )
2019 msg.Printf(
_(
"'%s' is not a valid footprint identifier" ), footprint );
2020 ercItem->SetErrorMessage( msg );
2021 ercItem->SetItems( symbol );
2028 int ret = (linkTester)( footprint, aProject );
2033 msg.Printf(
_(
"The current configuration does not include the footprint library '%s'" ),
2035 ercItem->SetErrorMessage( msg );
2036 ercItem->SetItems( symbol );
2042 msg.Printf(
_(
"The footprint library '%s' is not enabled in the current configuration" ),
2044 ercItem->SetErrorMessage( msg );
2045 ercItem->SetItems( symbol );
2051 msg.Printf(
_(
"Footprint '%s' not found in library '%s'" ),
2054 ercItem->SetErrorMessage( msg );
2055 ercItem->SetItems( symbol );
2062 sheet.LastScreen()->Append( marker );
2080 std::vector<SCH_MARKER*> markers;
2085 std::unique_ptr<LIB_SYMBOL>& lib_symbol = sch_symbol->
GetLibSymbolRef();
2090 wxArrayString filters = lib_symbol->GetFPFilters();
2092 if( filters.empty() )
2098 if( footprint.
Parse( lowerId ) > 0 )
2104 for( wxString
filter : filters )
2109 if(
filter.Contains( wxS(
":" ) ) )
2110 found |= lowerId.Matches(
filter );
2112 found |= lowerItemName.Matches(
filter );
2121 msg.Printf(
_(
"Assigned footprint (%s) doesn't match footprint filters (%s)" ),
2123 wxJoin( filters,
' ' ) );
2124 ercItem->SetErrorMessage( msg );
2125 ercItem->SetItems( sch_symbol );
2132 sheet.LastScreen()->Append( marker );
2143 const int gridSize =
m_schematic->Settings().m_ConnectionGridSize;
2148 std::vector<SCH_MARKER*> markers;
2150 for(
SCH_ITEM* item : screen->Items() )
2152 if( item->Type() ==
SCH_LINE_T && item->IsConnectable() )
2160 ercItem->SetItems( line );
2168 ercItem->SetItems( line );
2179 if( ( point.x % gridSize ) != 0
2180 || ( point.y % gridSize ) != 0 )
2183 ercItem->SetItems( entry );
2185 markers.emplace_back(
new SCH_MARKER( std::move( ercItem ), point ) );
2200 if( ( pinPos.
x % gridSize ) != 0 || ( pinPos.
y % gridSize ) != 0 )
2203 ercItem->SetItems(
pin );
2205 markers.emplace_back(
new SCH_MARKER( std::move( ercItem ), pinPos ) );
2214 screen->Append( marker );
2228 wxString variant =
m_schematic->GetCurrentVariant();
2232 if( sheet.GetExcludedFromSim( variant ) )
2235 std::vector<SCH_MARKER*> markers;
2253 wxString msg =
reporter.GetMessages();
2259 ercItem->SetErrorMessage( msg );
2260 ercItem->SetItems( symbol );
2268 sheet.LastScreen()->Append( marker );
2286 if( aProgressReporter )
2287 aProgressReporter->
AdvancePhase(
_(
"Checking sheet names..." ) );
2293 if( aProgressReporter )
2294 aProgressReporter->
AdvancePhase(
_(
"Checking conflicts..." ) );
2307 if( aProgressReporter )
2308 aProgressReporter->
AdvancePhase(
_(
"Checking units..." ) );
2313 if( aProgressReporter )
2314 aProgressReporter->
AdvancePhase(
_(
"Checking footprints..." ) );
2327 if( aProgressReporter )
2357 if( aProgressReporter )
2358 aProgressReporter->
AdvancePhase(
_(
"Checking similar labels..." ) );
2366 if( aProgressReporter )
2367 aProgressReporter->
AdvancePhase(
_(
"Checking local and global labels..." ) );
2374 if( aProgressReporter )
2375 aProgressReporter->
AdvancePhase(
_(
"Checking for unresolved variables..." ) );
2382 if( aProgressReporter )
2383 aProgressReporter->
AdvancePhase(
_(
"Checking field names..." ) );
2390 if( aProgressReporter )
2391 aProgressReporter->
AdvancePhase(
_(
"Checking SPICE models..." ) );
2398 if( aProgressReporter )
2399 aProgressReporter->
AdvancePhase(
_(
"Checking no connect pins for connections..." ) );
2407 if( aProgressReporter )
2408 aProgressReporter->
AdvancePhase(
_(
"Checking for library symbol issues..." ) );
2415 if( aProgressReporter )
2416 aProgressReporter->
AdvancePhase(
_(
"Checking for footprint link issues..." ) );
2423 if( aProgressReporter )
2424 aProgressReporter->
AdvancePhase(
_(
"Checking footprint assignments against footprint filters..." ) );
2431 if( aProgressReporter )
2432 aProgressReporter->
AdvancePhase(
_(
"Checking for off grid pins and wires..." ) );
2439 if( aProgressReporter )
2440 aProgressReporter->
AdvancePhase(
_(
"Checking for four way junctions..." ) );
2447 if( aProgressReporter )
2448 aProgressReporter->
AdvancePhase(
_(
"Checking for labels on more than one wire..." ) );
2455 if( aProgressReporter )
2456 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