82    _( 
"Bidirectional Pin" ),
 
   86    _( 
"Unspecified Pin" ),
 
   87    _( 
"Power Input Pin" ),
 
   88    _( 
"Power Output Pin" ),
 
   89    _( 
"Open Collector" ),
 
 
   99    _( 
"Bidirectional Pin" ),
 
  100    _( 
"Tri-State Pin" ),
 
  103    _( 
"Unspecified Pin" ),
 
  104    _( 
"Power Input Pin" ),
 
  105    _( 
"Power Output Pin" ),
 
  106    _( 
"Open Collector" ),
 
 
  148        std::vector<SCH_SHEET*> list;
 
  151            list.push_back( 
static_cast<SCH_SHEET*
>( item ) );
 
  153        for( 
size_t i = 0; i < list.size(); i++ )
 
  157            for( 
size_t j = i + 1; j < list.size(); j++ )
 
  169                        ercItem->SetItems( sheet, test_item );
 
  172                        screen->Append( marker );
 
 
  190            [
this]( wxString str )
 
  193                return str.Matches( wxS( 
"*${*}*" ) );
 
  200                static wxRegEx warningExpr( wxS( 
"^\\$\\{ERC_WARNING\\s*([^}]*)\\}(.*)$" ) );
 
  201                static wxRegEx errorExpr( wxS( 
"^\\$\\{ERC_ERROR\\s*([^}]*)\\}(.*)$" ) );
 
  203                if( warningExpr.Matches( 
text ) )
 
  206                    wxString                  ercText = warningExpr.GetMatch( 
text, 1 );
 
  209                        ercItem->SetItems( item );
 
  211                        ercText += 
_( 
" (in drawing sheet)" );
 
  213                    ercItem->SetSheetSpecificPath( sheet );
 
  214                    ercItem->SetErrorMessage( ercText );
 
  217                    screen->Append( marker );
 
  222                if( errorExpr.Matches( 
text ) )
 
  225                    wxString                  ercText = errorExpr.GetMatch( 
text, 1 );
 
  228                        ercItem->SetItems( item );
 
  230                        ercText += 
_( 
" (in drawing sheet)" );
 
  232                    ercItem->SetSheetSpecificPath( sheet );
 
  233                    ercItem->SetErrorMessage( ercText );
 
  236                    screen->Append( marker );
 
  267                    if( unresolved( field.GetShownText( &sheet, 
true ) ) )
 
  270                        ercItem->SetItems( symbol );
 
  271                        ercItem->SetSheetSpecificPath( sheet );
 
  277                    testAssertion( &field, sheet, screen, field.GetText(), field.
GetPosition() );
 
  293                                    if( unresolved( textItem->
GetShownText( &sheet, 
true ) ) )
 
  296                                        ercItem->SetItems( symbol );
 
  297                                        ercItem->SetSheetSpecificPath( sheet );
 
  307                                    testAssertion( symbol, sheet, screen, textItem->
GetText(),
 
  314                                    if( unresolved( textboxItem->
GetShownText( 
nullptr, &sheet, 
true ) ) )
 
  317                                        ercItem->SetItems( symbol );
 
  318                                        ercItem->SetSheetSpecificPath( sheet );
 
  328                                    testAssertion( symbol, sheet, screen, textboxItem->
GetText(),
 
  337                for( 
SCH_FIELD& field : label->GetFields() )
 
  339                    if( unresolved( field.GetShownText( &sheet, 
true ) ) )
 
  342                        ercItem->SetItems( label );
 
  343                        ercItem->SetSheetSpecificPath( sheet );
 
  349                    testAssertion( &field, sheet, screen, field.GetText(), field.
GetPosition() );
 
  358                    if( unresolved( field.GetShownText( &sheet, 
true ) ) )
 
  361                        ercItem->SetItems( subSheet );
 
  362                        ercItem->SetSheetSpecificPath( sheet );
 
  368                    testAssertion( &field, sheet, screen, field.GetText(), field.
GetPosition() );
 
  376                    if( 
pin->GetShownText( &subSheetPath, 
true ).Matches( wxS( 
"*${*}*" ) ) )
 
  379                        ercItem->SetItems( 
pin );
 
  380                        ercItem->SetSheetSpecificPath( sheet );
 
  389                if( 
text->GetShownText( &sheet, 
true ).Matches( wxS( 
"*${*}*" ) ) )
 
  392                    ercItem->SetItems( 
text );
 
  393                    ercItem->SetSheetSpecificPath( sheet );
 
  399                testAssertion( 
text, sheet, screen, 
text->GetText(), 
text->GetPosition() );
 
  403                if( textBox->GetShownText( 
nullptr, &sheet, 
true ).Matches( wxS( 
"*${*}*" ) ) )
 
  406                    ercItem->SetItems( textBox );
 
  407                    ercItem->SetSheetSpecificPath( sheet );
 
  413                testAssertion( textBox, sheet, screen, textBox->GetText(), textBox->
GetPosition() );
 
  421                if( testAssertion( 
nullptr, sheet, screen, 
text->GetText(), 
text->GetPosition() ) )
 
  425                else if( 
text->GetShownText( 
true ).Matches( wxS( 
"*${*}*" ) ) )
 
  428                    ercItem->SetErrorMessage( 
_( 
"Unresolved text variable in drawing sheet" ) );
 
  429                    ercItem->SetSheetSpecificPath( sheet );
 
 
  444    for( std::pair<const wxString, SCH_REFERENCE_LIST>& symbol : 
m_refMap )
 
  459        for( 
size_t ii = 0; ii < refList.
GetCount(); ++ii )
 
  464            if( !unitFP.IsEmpty() )
 
  467                unitName = unit->
GetRef( &sheetPath, 
true );
 
  472        for( 
size_t ii = 0; ii < refList.
GetCount(); ++ii )
 
  480            if( unit && !secondFp.IsEmpty() && unitFP != secondFp )
 
  482                msg.Printf( 
_( 
"Different footprints assigned to %s and %s" ),
 
  483                            unitName, secondName );
 
  486                ercItem->SetErrorMessage( msg );
 
  487                ercItem->SetItems( unit, secondUnit );
 
 
  505    for( std::pair<const wxString, SCH_REFERENCE_LIST>& symbol : 
m_refMap )
 
  509        wxCHECK2( refList.
GetCount(), 
continue );
 
  519        std::set<int> lib_units;
 
  520        std::set<int> instance_units;
 
  521        std::set<int> missing_units;
 
  524                [&]( std::set<int>& aMissingUnits, 
const wxString& aErrorMsg, 
int aErrorCode )
 
  527                    wxString missing_pin_units = wxS( 
"[ " );
 
  530                    for( 
int missing_unit : aMissingUnits )
 
  534                            missing_pin_units += wxS( 
"..." );
 
  541                    missing_pin_units.Truncate( missing_pin_units.length() - 2 );
 
  542                    missing_pin_units += wxS( 
" ]" );
 
  544                    msg.Printf( aErrorMsg, symbol.first, missing_pin_units );
 
  547                    ercItem->SetErrorMessage( msg );
 
  548                    ercItem->SetItems( unit );
 
  549                    ercItem->SetSheetSpecificPath( base_ref.
GetSheetPath() );
 
  558        for( 
int ii = 1; ii <= libSymbol->
GetUnitCount(); ++ii )
 
  559            lib_units.insert( lib_units.end(), ii );
 
  561        for( 
size_t ii = 0; ii < refList.
GetCount(); ++ii )
 
  562            instance_units.insert( instance_units.end(), refList.
GetItem( ii ).
GetUnit() );
 
  564        std::set_difference( lib_units.begin(), lib_units.end(),
 
  565                             instance_units.begin(), instance_units.end(),
 
  566                             std::inserter( missing_units, missing_units.begin() ) );
 
  573        std::set<int> missing_power;
 
  574        std::set<int> missing_input;
 
  575        std::set<int> missing_bidi;
 
  577        for( 
int missing_unit : missing_units )
 
  581            for( 
size_t ii = 0; ii < refList.
GetCount(); ++ii )
 
  592                switch( 
pin->GetType() )
 
  595                    missing_power.insert( missing_unit );
 
  599                    missing_bidi.insert( missing_unit );
 
  603                    missing_input.insert( missing_unit );
 
  614            report( missing_power, 
_( 
"Symbol %s has input power pins in units %s that are not placed" ),
 
  620           report( missing_input, 
_( 
"Symbol %s has input pins in units %s that are not placed" ),
 
  626            report( missing_bidi, 
_( 
"Symbol %s has bidirectional pins in units %s that are not placed" ),
 
 
  638    std::shared_ptr<NET_SETTINGS>& settings = 
m_schematic->Project().GetProjectFile().NetSettings();
 
  639    wxString                       defaultNetclass = settings->GetDefaultNetclass()->GetName();
 
  648                ercItem->SetItems( item );
 
  649                ercItem->SetErrorMessage( wxString::Format( 
_( 
"Netclass %s is not defined" ), netclass ) );
 
  668                                wxString netclass = field->
GetShownText( &sheet, 
false );
 
  670                                if( !netclass.empty() && !netclass.IsSameAs( defaultNetclass )
 
  671                                    && !settings->HasNetclass( netclass ) )
 
  673                                    logError( sheet, item, netclass );
 
 
  694        std::map<VECTOR2I, std::vector<SCH_ITEM*>> connMap;
 
  701                connMap[pt].emplace_back( label );
 
  704        for( 
const std::pair<
const VECTOR2I, std::vector<SCH_ITEM*>>& pair : connMap )
 
  706            std::vector<SCH_ITEM*> lines;
 
  708            for( 
SCH_ITEM* item : sheet.LastScreen()->Items().Overlapping( 
SCH_LINE_T, pair.first ) )
 
  717                    lines.emplace_back( line );
 
  720            if( lines.size() > 1 )
 
  726                wxString msg = wxString::Format( 
_( 
"Label connects more than one wire at %d, %d" ),
 
  727                                                 pair.first.x, pair.first.y );
 
  729                ercItem->SetItems( pair.second.front(), lines[0], lines[1], lines[2] );
 
  730                ercItem->SetErrorMessage( msg );
 
  731                ercItem->SetSheetSpecificPath( sheet );
 
  734                sheet.LastScreen()->Append( marker );
 
 
  747    auto pinStackAlreadyRepresented =
 
  748            []( 
SCH_PIN* 
pin, std::vector<SCH_ITEM*>& collection ) -> 
bool 
  752                    if( item->Type() == 
SCH_PIN_T && item->GetParentSymbol() == 
pin->GetParentSymbol() )
 
  766        std::map<VECTOR2I, std::vector<SCH_ITEM*>> connMap;
 
  775                std::vector<SCH_ITEM*>& entry = connMap[
pin->GetPosition()];
 
  778                if( pinStackAlreadyRepresented( 
pin, entry ) )
 
  781                entry.emplace_back( 
pin );
 
  793                connMap[pt].emplace_back( line );
 
  796        for( 
const std::pair<
const VECTOR2I, std::vector<SCH_ITEM*>>& pair : connMap )
 
  798            if( pair.second.size() >= 4 )
 
  804                ercItem->SetItems( pair.second[0], pair.second[1], pair.second[2], pair.second[3] );
 
  806                wxString msg = wxString::Format( 
_( 
"Four items connected at %d, %d" ),
 
  807                                                 pair.first.x, pair.first.y );
 
  808                ercItem->SetErrorMessage( msg );
 
  810                ercItem->SetSheetSpecificPath( sheet );
 
  813                sheet.LastScreen()->Append( marker );
 
 
  828        std::map<VECTOR2I, std::vector<SCH_ITEM*>> pinMap;
 
  833                    if( pinMap.count( pt ) )
 
  834                        pinMap[pt].emplace_back( aOther );
 
  844                    pinMap[
pin->GetPosition()].emplace_back( 
pin );
 
  848        for( 
SCH_ITEM* item : sheet.LastScreen()->Items() )
 
  857                        addOther( 
pin->GetPosition(), 
pin );
 
  862                for( 
const VECTOR2I& pt : item->GetConnectionPoints() )
 
  863                    addOther( pt, item );
 
  867        for( 
const std::pair<
const VECTOR2I, std::vector<SCH_ITEM*>>& pair : pinMap )
 
  869            if( pair.second.size() > 1 )
 
  875                ercItem->SetItems( pair.second[0], pair.second[1],
 
  876                                   pair.second.size() > 2 ? pair.second[2] : 
nullptr,
 
  877                                   pair.second.size() > 3 ? pair.second[3] : 
nullptr );
 
  878                ercItem->SetErrorMessage( 
_( 
"Pin with 'no connection' type is connected" ) );
 
  879                ercItem->SetSheetSpecificPath( sheet );
 
  882                sheet.LastScreen()->Append( marker );
 
 
  897        using iterator_t = std::vector<ERC_SCH_PIN_CONTEXT>::iterator;
 
  898        std::vector<ERC_SCH_PIN_CONTEXT>           pins;
 
  899        std::unordered_map<EDA_ITEM*, SCH_SCREEN*> pinToScreenMap;
 
  900        bool has_noconnect = 
false;
 
  905                has_noconnect = 
true;
 
  911                    pins.emplace_back( 
static_cast<SCH_PIN*
>( item ), subgraph->
GetSheet() );
 
  917        std::sort( pins.begin(), pins.end(),
 
  920                       int ret = StrNumCmp( lhs.Pin()->GetParentSymbol()->GetRef( &lhs.Sheet() ),
 
  921                                            rhs.Pin()->GetParentSymbol()->GetRef( &rhs.Sheet() ) );
 
  924                           ret = StrNumCmp( lhs.Pin()->GetNumber(), rhs.Pin()->GetNumber() );
 
  934        bool                hasDriver = 
false;
 
  939        bool     ispowerNet  = 
false;
 
  950        std::vector<std::tuple<iterator_t, iterator_t, PIN_ERROR>> pin_mismatches;
 
  951        std::map<iterator_t, int>                                  pin_mismatch_counts;
 
  953        for( 
auto refIt = pins.begin(); refIt != pins.end(); ++refIt )
 
  963                if( !needsDriver.
Pin()
 
  968                    needsDriver = refPin;
 
  969                    needsDriverType = needsDriver.
Pin()->
GetType();
 
  978            for( 
auto testIt = refIt + 1; testIt != pins.end(); ++testIt )
 
  999                    pin_mismatches.emplace_back( std::tuple<iterator_t, iterator_t, PIN_ERROR>{ refIt, testIt, 
erc } );
 
 1003                        pin_mismatch_counts[refIt] = 
m_settings.GetPinTypeWeight( ( *refIt ).Pin()->GetType() );
 
 1004                        pin_mismatch_counts[testIt] = 
m_settings.GetPinTypeWeight( ( *testIt ).Pin()->GetType() );
 
 1008                        if( !pin_mismatch_counts.contains( testIt ) )
 
 1009                            pin_mismatch_counts.emplace( testIt, 1 );
 
 1011                            pin_mismatch_counts[testIt]++;
 
 1013                        if( !pin_mismatch_counts.contains( refIt ) )
 
 1014                            pin_mismatch_counts.emplace( refIt, 1 );
 
 1016                            pin_mismatch_counts[refIt]++;
 
 1022        std::multimap<size_t, iterator_t, std::greater<size_t>> pins_dsc;
 
 1024        std::transform( pin_mismatch_counts.begin(), pin_mismatch_counts.end(),
 
 1025                        std::inserter( pins_dsc, pins_dsc.begin() ),
 
 1028                            return std::pair<size_t, iterator_t>( p.second, p.first );
 
 1031        for( 
const auto& [amount, pinItBind] : pins_dsc )
 
 1033            auto& pinIt = pinItBind;
 
 1035            if( pin_mismatches.empty() )
 
 1041            iterator_t nearest_pin = pins.end();
 
 1042            double     smallest_distance = std::numeric_limits<double>::infinity();
 
 1047                    [&]( 
const auto& tuple )
 
 1051                        if( pinIt == std::get<0>( tuple ) )
 
 1052                            other = std::get<1>( tuple );
 
 1053                        else if( pinIt == std::get<1>( tuple ) )
 
 1054                            other = std::get<0>( tuple );
 
 1058                        if( ( *pinIt ).Sheet().Cmp( ( *other ).Sheet() ) != 0 )
 
 1060                            if( std::isinf( smallest_distance ) )
 
 1062                                nearest_pin = other;
 
 1063                                erc = std::get<2>( tuple );
 
 1070                            if( std::isinf( smallest_distance ) || 
distance < smallest_distance )
 
 1073                                nearest_pin = other;
 
 1074                                erc = std::get<2>( tuple );
 
 1081            if( nearest_pin != pins.end() )
 
 1083                SCH_PIN* other_pin = ( *nearest_pin ).Pin();
 
 1087                ercItem->SetItems( 
pin, other_pin );
 
 1088                ercItem->SetSheetSpecificPath( ( *pinIt ).Sheet() );
 
 1089                ercItem->SetItemsSheetPaths( ( *pinIt ).Sheet(), ( *nearest_pin ).Sheet() );
 
 1091                ercItem->SetErrorMessage( wxString::Format( 
_( 
"Pins of type %s and %s are connected" ),
 
 1096                pinToScreenMap[
pin]->Append( marker );
 
 1101        if( needsDriver.
Pin() && !hasDriver && !has_noconnect )
 
 1109                ercItem->SetItems( needsDriver.
Pin() );
 
 1110                ercItem->SetSheetSpecificPath( needsDriver.
Sheet() );
 
 1111                ercItem->SetItemsSheetPaths( needsDriver.
Sheet() );
 
 1114                pinToScreenMap[needsDriver.
Pin()]->Append( marker );
 
 
 1128    std::unordered_map<wxString, std::pair<wxString, SCH_PIN*>> pinToNetMap;
 
 1132        const wxString& netName = net.first.Name;
 
 1143                    if( !
pin->GetParentSymbol()->IsMultiUnit() )
 
 1146                    wxString 
name = 
pin->GetParentSymbol()->GetRef( &sheet ) + 
":" + 
pin->GetShownNumber();
 
 1148                    if( !pinToNetMap.count( 
name ) )
 
 1150                        pinToNetMap[
name] = std::make_pair( netName, 
pin );
 
 1152                    else if( pinToNetMap[
name].first != netName )
 
 1156                        ercItem->SetErrorMessage( wxString::Format( 
_( 
"Pin %s is connected to both %s and %s" ),
 
 1157                                                                    pin->GetShownNumber(),
 
 1159                                                                    pinToNetMap[
name].first ) );
 
 1161                        ercItem->SetItems( 
pin, pinToNetMap[
name].second );
 
 1162                        ercItem->SetSheetSpecificPath( sheet );
 
 1163                        ercItem->SetItemsSheetPaths( sheet, sheet );
 
 
 1183            []( 
const wxString& txt )
 
 1185                wxString upper = txt.Upper();
 
 1186                return upper.Contains( wxT( 
"GND" ) );
 
 1196            bool        hasGroundNet = 
false;
 
 1197            std::vector<SCH_PIN*> mismatched;
 
 1202                wxString        net = conn ? conn->
GetNetName() : wxString();
 
 1203                bool            netIsGround = isGround( net );
 
 1213                    hasGroundNet = 
true;
 
 1215                if( isGround( 
pin->GetShownName() ) && !netIsGround )
 
 1216                    mismatched.push_back( 
pin );
 
 1225                    ercItem->SetErrorMessage( wxString::Format( 
_( 
"Pin %s not connected to ground net" ),
 
 1226                                                                pin->GetShownName() ) );
 
 1227                    ercItem->SetItems( 
pin );
 
 1228                    ercItem->SetSheetSpecificPath( sheet );
 
 1229                    ercItem->SetItemsSheetPaths( sheet );
 
 1232                    screen->
Append( marker );
 
 
 1258                pin->GetStackedPinNumbers( &valid );
 
 1263                    ercItem->SetItems( 
pin );
 
 1264                    ercItem->SetSheetSpecificPath( sheet );
 
 1265                    ercItem->SetItemsSheetPaths( sheet );
 
 1268                    screen->
Append( marker );
 
 
 1283    std::unordered_map<wxString, std::pair<SCH_ITEM*, SCH_SHEET_PATH>> globalLabels;
 
 1284    std::unordered_map<wxString, std::pair<SCH_ITEM*, SCH_SHEET_PATH>> localLabels;
 
 1299                    auto& map = item->Type() == 
SCH_LABEL_T ? localLabels : globalLabels;
 
 1301                    if( !map.count( 
text ) )
 
 1303                        map[
text] = std::make_pair( label, sheet );
 
 1310    for( 
auto& [globalText, globalItem] : globalLabels )
 
 1312        for( 
auto& [localText, localItem] : localLabels )
 
 1314            if( globalText == localText )
 
 1317                ercItem->SetItems( globalItem.first, localItem.first );
 
 1318                ercItem->SetSheetSpecificPath( globalItem.second );
 
 1319                ercItem->SetItemsSheetPaths( globalItem.second, localItem.second );
 
 1322                globalItem.second.LastScreen()->Append( marker );
 
 
 1336    std::unordered_map<wxString, std::vector<std::tuple<wxString, SCH_ITEM*, SCH_SHEET_PATH>>> generalMap;
 
 1340                 const std::tuple<wxString, SCH_ITEM*, SCH_SHEET_PATH>& other )
 
 1342                auto& [otherText, otherItem, otherSheet] = other;
 
 1362                ercItem->SetItems( item, otherItem );
 
 1363                ercItem->SetSheetSpecificPath( sheet );
 
 1364                ercItem->SetItemsSheetPaths( sheet, otherSheet );
 
 1367                sheet.LastScreen()->Append( marker );
 
 1378                switch( item->Type() )
 
 1385                    wxString        unnormalized = label->
GetShownText( &sheet, 
false );
 
 1386                    wxString        normalized = unnormalized.Lower();
 
 1388                    generalMap[normalized].emplace_back( std::make_tuple( unnormalized, label, sheet ) );
 
 1390                    for( 
const auto& otherTuple : generalMap.at( normalized ) )
 
 1392                        const auto& [otherText, otherItem, otherSheet] = otherTuple;
 
 1394                        if( unnormalized != otherText )
 
 1398                                    && sheet != otherSheet )
 
 1403                            logError( normalized, label, sheet, otherTuple );
 
 1414                    if( !
pin->IsPower() )
 
 1418                    wxString    unnormalized = symbol->
GetValue( 
true, &sheet, 
false );
 
 1419                    wxString    normalized = unnormalized.Lower();
 
 1421                    generalMap[normalized].emplace_back( std::make_tuple( unnormalized, 
pin, sheet ) );
 
 1423                    for( 
const auto& otherTuple : generalMap.at( normalized ) )
 
 1425                        const auto& [otherText, otherItem, otherSheet] = otherTuple;
 
 1427                        if( unnormalized != otherText )
 
 1429                            logError( normalized, 
pin, sheet, otherTuple );
 
 
 1459        std::vector<SCH_MARKER*> markers;
 
 1466            if( !libSymbolInSchematic )
 
 1471            std::optional<const LIBRARY_TABLE_ROW*> optRow =
 
 1474            if( !optRow || ( *optRow )->Disabled() )
 
 1479                    ercItem->SetItems( symbol );
 
 1480                    msg.Printf( 
_( 
"The current configuration does not include the symbol library '%s'" ),
 
 1482                    ercItem->SetErrorMessage( msg );
 
 1494                    std::optional<wxString> uri =
 
 1496                    wxCHECK2( uri.has_value(), uri = wxEmptyString );
 
 1497                    ercItem->SetItems( symbol );
 
 1498                    msg.Printf( 
_( 
"The symbol library '%s' was not found at '%s'" ),
 
 1500                    ercItem->SetErrorMessage( msg );
 
 1511            if( libSymbol == 
nullptr )
 
 1516                    ercItem->SetItems( symbol );
 
 1517                    msg.Printf( 
_( 
"Symbol '%s' not found in symbol library '%s'" ),
 
 1520                    ercItem->SetErrorMessage( msg );
 
 1528            std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->
Flatten();
 
 1534                std::vector<wxString> messages;
 
 1538                if( !messages.empty() )
 
 1541                    ercItem->SetItems( symbol );
 
 1542                    msg.Printf( 
_( 
"Symbol '%s' has multiple pins with the same pin number" ),
 
 1544                    ercItem->SetErrorMessage( msg );
 
 1548                else if( flattenedSymbol->Compare( *libSymbolInSchematic, flags ) != 0 )
 
 1551                    ercItem->SetItems( symbol );
 
 1552                    msg.Printf( 
_( 
"Symbol '%s' doesn't match copy in library '%s'" ),
 
 1555                    ercItem->SetErrorMessage( msg );
 
 1564            screen->Append( marker );
 
 
 1580    typedef int (*TESTER_FN_PTR)( 
const wxString&, 
PROJECT* );
 
 1586        std::vector<SCH_MARKER*> markers;
 
 1593            if( footprint.IsEmpty() )
 
 1598            if( fpID.
Parse( footprint, 
true ) >= 0 )
 
 1601                msg.Printf( 
_( 
"'%s' is not a valid footprint identifier" ), footprint );
 
 1602                ercItem->SetErrorMessage( msg );
 
 1603                ercItem->SetItems( symbol );
 
 1610            int      ret = (linkTester)( footprint, aProject );
 
 1615                msg.Printf( 
_( 
"The current configuration does not include the footprint library '%s'" ),
 
 1617                ercItem->SetErrorMessage( msg );
 
 1618                ercItem->SetItems( symbol );
 
 1624                msg.Printf( 
_( 
"The footprint library '%s' is not enabled in the current configuration" ),
 
 1626                ercItem->SetErrorMessage( msg );
 
 1627                ercItem->SetItems( symbol );
 
 1633                msg.Printf( 
_( 
"Footprint '%s' not found in library '%s'" ),
 
 1636                ercItem->SetErrorMessage( msg );
 
 1637                ercItem->SetItems( symbol );
 
 1644            sheet.LastScreen()->Append( marker );
 
 
 1662        std::vector<SCH_MARKER*> markers;
 
 1667            std::unique_ptr<LIB_SYMBOL>& lib_symbol = sch_symbol->
GetLibSymbolRef();
 
 1672            wxArrayString filters = lib_symbol->GetFPFilters();
 
 1674            if( filters.empty() )
 
 1680            if( footprint.
Parse( lowerId ) > 0 )
 
 1686            for( wxString 
filter : filters )
 
 1691                if( 
filter.Contains( wxS( 
":" ) ) )
 
 1692                    found |= lowerId.Matches( 
filter );
 
 1694                    found |= lowerItemName.Matches( 
filter );
 
 1703                msg.Printf( 
_( 
"Assigned footprint (%s) doesn't match footprint filters (%s)" ),
 
 1705                            wxJoin( filters, 
' ' ) );
 
 1706                ercItem->SetErrorMessage( msg );
 
 1707                ercItem->SetItems( sch_symbol );
 
 1714            sheet.LastScreen()->Append( marker );
 
 
 1725    const int gridSize = 
m_schematic->Settings().m_ConnectionGridSize;
 
 1730        std::vector<SCH_MARKER*> markers;
 
 1732        for( 
SCH_ITEM* item : screen->Items() )
 
 1734            if( item->Type() == 
SCH_LINE_T && item->IsConnectable() )
 
 1742                    ercItem->SetItems( line );
 
 1750                    ercItem->SetItems( line );
 
 1761                    if( ( point.x % gridSize ) != 0
 
 1762                        || ( point.y % gridSize ) != 0 )
 
 1765                        ercItem->SetItems( entry );
 
 1767                        markers.emplace_back( 
new SCH_MARKER( std::move( ercItem ), point ) );
 
 1782                    if( ( pinPos.
x % gridSize ) != 0 || ( pinPos.
y % gridSize ) != 0 )
 
 1785                        ercItem->SetItems( 
pin );
 
 1787                        markers.emplace_back( 
new SCH_MARKER( std::move( ercItem ), pinPos ) );
 
 1796            screen->Append( marker );
 
 
 1813        if( sheet.GetExcludedFromSim() )
 
 1816        std::vector<SCH_MARKER*> markers;
 
 1840                ercItem->SetErrorMessage( msg );
 
 1841                ercItem->SetItems( symbol );
 
 1849            sheet.LastScreen()->Append( marker );
 
 
 1867        if( aProgressReporter )
 
 1868            aProgressReporter->
AdvancePhase( 
_( 
"Checking sheet names..." ) );
 
 1874    if( aProgressReporter )
 
 1875        aProgressReporter->
AdvancePhase( 
_( 
"Checking conflicts..." ) );
 
 1888    if( aProgressReporter )
 
 1889        aProgressReporter->
AdvancePhase( 
_( 
"Checking units..." ) );
 
 1894        if( aProgressReporter )
 
 1895            aProgressReporter->
AdvancePhase( 
_( 
"Checking footprints..." ) );
 
 1908    if( aProgressReporter )
 
 1934        if( aProgressReporter )
 
 1935            aProgressReporter->
AdvancePhase( 
_( 
"Checking similar labels..." ) );
 
 1942        if( aProgressReporter )
 
 1943            aProgressReporter->
AdvancePhase( 
_( 
"Checking local and global labels..." ) );
 
 1950        if( aProgressReporter )
 
 1951            aProgressReporter->
AdvancePhase( 
_( 
"Checking for unresolved variables..." ) );
 
 1958        if( aProgressReporter )
 
 1959            aProgressReporter->
AdvancePhase( 
_( 
"Checking SPICE models..." ) );
 
 1966        if( aProgressReporter )
 
 1967            aProgressReporter->
AdvancePhase( 
_( 
"Checking no connect pins for connections..." ) );
 
 1975        if( aProgressReporter )
 
 1976            aProgressReporter->
AdvancePhase( 
_( 
"Checking for library symbol issues..." ) );
 
 1983        if( aProgressReporter )
 
 1984            aProgressReporter->
AdvancePhase( 
_( 
"Checking for footprint link issues..." ) );
 
 1991        if( aProgressReporter )
 
 1992            aProgressReporter->
AdvancePhase( 
_( 
"Checking footprint assignments against footprint filters..." ) );
 
 1999        if( aProgressReporter )
 
 2000            aProgressReporter->
AdvancePhase( 
_( 
"Checking for off grid pins and wires..." ) );
 
 2007        if( aProgressReporter )
 
 2008            aProgressReporter->
AdvancePhase( 
_( 
"Checking for four way junctions..." ) );
 
 2015        if( aProgressReporter )
 
 2016            aProgressReporter->
AdvancePhase( 
_( 
"Checking for labels on more than one wire..." ) );
 
 2023        if( aProgressReporter )
 
 2024            aProgressReporter->
AdvancePhase( 
_( 
"Checking for undefined netclasses..." ) );
 
 
constexpr EDA_IU_SCALE schIUScale
 
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
 
constexpr Vec Centre() const
 
A subgraph is a set of items that are electrically connected on a single sheet.
 
const std::set< SCH_ITEM * > & GetItems() const
Provide a read-only reference to the items in the subgraph.
 
const SCH_ITEM * GetNoConnect() const
 
const SCH_SHEET_PATH & GetSheet() const
 
Base class to handle basic graphic items.
 
Store the list of graphic items: rect, lines, polygons and texts to draw/plot the title block and fra...
 
DS_DRAW_ITEM_BASE * GetFirst()
 
void BuildDrawItemsList(const PAGE_INFO &aPageInfo, const TITLE_BLOCK &aTitleBlock)
Drawing or plot the drawing sheet.
 
void SetFileName(const wxString &aFileName)
Set the filename to draw/plot.
 
void SetSheetName(const wxString &aSheetName)
Set the sheet name to draw/plot.
 
void SetSheetLayer(const wxString &aSheetLayer)
Set the sheet layer to draw/plot.
 
void SetSheetCount(int aSheetCount)
Set the value of the count of sheets, for basic inscriptions.
 
void SetPageNumber(const wxString &aPageNumber)
Set the value of the sheet number.
 
DS_DRAW_ITEM_BASE * GetNext()
 
void SetProject(const PROJECT *aProject)
 
const PAGE_INFO & GetPageInfo()
 
const TITLE_BLOCK & GetTitleBlock()
 
virtual VECTOR2I GetPosition() const
 
KICAD_T Type() const
Returns the type of object.
 
virtual const wxString & GetText() const
Return the string associated with the text object.
 
EE_TYPE OfType(KICAD_T aType) const
 
static std::shared_ptr< ERC_ITEM > Create(int aErrorCode)
Constructs an ERC_ITEM for the given error code.
 
A class used to associate a SCH_PIN with its owning SCH_SHEET_PATH, in order to handle ERC checks acr...
 
const SCH_SHEET_PATH & Sheet() const
Get the SCH_SHEET_PATH context for the paired SCH_PIN.
 
SCH_PIN * Pin() const
Get the SCH_PIN for this context.
 
int TestLibSymbolIssues()
Test symbols for changed library symbols and broken symbol library links.
 
int TestStackedPinNotation()
Checks for pin numbers that resemble stacked pin notation but are invalid.
 
void TestTextVars(DS_PROXY_VIEW_ITEM *aDrawingSheet)
Check for any unresolved text variable references.
 
int TestPinToPin()
Checks the full netlist against the pin-to-pin connectivity requirements.
 
int TestSimilarLabels()
Checks for labels that differ only in capitalization.
 
SCH_MULTI_UNIT_REFERENCE_MAP m_refMap
 
int TestFootprintLinkIssues(KIFACE *aCvPcb, PROJECT *aProject)
Test footprint links against the current footprint libraries.
 
int TestOffGridEndpoints()
Test pins and wire ends for being off grid.
 
int TestDuplicateSheetNames(bool aCreateMarker)
Inside a given sheet, one cannot have sheets with duplicate names (file names can be duplicated).
 
int TestSameLocalGlobalLabel()
Checks for global and local labels with the same name.
 
int TestMultUnitPinConflicts()
Checks if shared pins on multi-unit symbols have been connected to different nets.
 
int TestNoConnectPins()
In KiCad 5 and earlier, you could connect stuff up to pins with NC electrical type.
 
int TestFootprintFilters()
Test symbols to ensure that assigned footprint passes any given footprint filters.
 
ERC_SETTINGS & m_settings
 
int TestFourWayJunction()
Test to see if there are potentially confusing 4-way junctions in the schematic.
 
int TestMissingNetclasses()
Tests for netclasses that are referenced but not defined.
 
int TestSimModelIssues()
Test SPICE models for various issues.
 
SCH_SHEET_LIST m_sheetList
 
int TestGroundPins()
Checks for ground-labeled pins not on a ground net while another pin is.
 
void RunTests(DS_PROXY_VIEW_ITEM *aDrawingSheet, SCH_EDIT_FRAME *aEditFrame, KIFACE *aCvPcb, PROJECT *aProject, PROGRESS_REPORTER *aProgressReporter)
 
int TestMissingUnits()
Test for uninstantiated units of multi unit symbols.
 
int TestLabelMultipleWires()
Test to see if there are labels that are connected to more than one wire.
 
int TestMultiunitFootprints()
Test if all units of each multiunit symbol have the same footprint assigned.
 
bool IsLibraryLoaded(const wxString &aNickname)
 
std::optional< wxString > GetFullURI(LIBRARY_TABLE_TYPE aType, const wxString &aNickname, bool aSubstituted=false) const
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
 
std::optional< LIBRARY_TABLE_ROW * > GetRow(LIBRARY_TABLE_TYPE aType, const wxString &aNickname, LIBRARY_TABLE_SCOPE aScope=LIBRARY_TABLE_SCOPE::BOTH) const
 
A logical library item identifier and consists of various portions much like a URI.
 
int Parse(const UTF8 &aId, bool aFix=false)
Parse LIB_ID with the information from aId.
 
const wxString GetUniStringLibItemName() const
Get strings for display messages in dialogs.
 
const UTF8 & GetLibItemName() const
 
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
 
Define a library symbol object.
 
void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction, RECURSE_MODE aMode) override
 
std::vector< SCH_PIN * > GetGraphicalPins(int aUnit=0, int aBodyStyle=0) const
Graphical pins: Return schematic pin objects as drawn (unexpanded), filtered by unit/body.
 
int GetUnitCount() const override
 
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
 
wxString GetUnitDisplayName(int aUnit, bool aLabel) const override
Return the user-defined display name for aUnit for symbols with units.
 
virtual LIBRARY_MANAGER & GetLibraryManager() const
 
A progress reporter interface for use in multi-threaded environments.
 
virtual void AdvancePhase()=0
Use the next available virtual zone of the dialog progress bar.
 
static SYMBOL_LIBRARY_ADAPTER * SymbolLibAdapter(PROJECT *aProject)
Accessor for project symbol library manager adapter.
 
Container for project specific data.
 
virtual bool HasMessage() const
Returns true if any messages were reported.
 
std::vector< VECTOR2I > GetConnectionPoints() const override
Add all the connection points for this item to aPoints.
 
Class for a wire to bus entry.
 
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
 
wxString GetNetName() const
 
Schematic editor (Eeschema) main window.
 
void RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags, PROGRESS_REPORTER *aProgressReporter=nullptr)
Generate the connection data for the entire schematic hierarchy.
 
wxString GetCanonicalName() const
Get a non-language-specific name for a field which can be used for storage, variable look-up,...
 
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
 
Base class for any item which can be embedded within the SCHEMATIC container class,...
 
bool ResolveExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const
 
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const override
 
std::vector< VECTOR2I > GetConnectionPoints() const override
Add all the connection points for this item to aPoints.
 
Segment description base class to describe items which have 2 end points (track, wire,...
 
std::vector< VECTOR2I > GetConnectionPoints() const override
Add all the connection points for this item to aPoints.
 
VECTOR2I GetEndPoint() const
 
VECTOR2I GetStartPoint() const
 
bool IsEndPoint(const VECTOR2I &aPoint) const override
Test if aPt is an end point of this schematic object.
 
bool IsGraphicLine() const
Return if the line is a graphic (non electrical line)
 
VECTOR2I GetPosition() const override
 
bool IsStacked(const SCH_PIN *aPin) const
 
ELECTRICAL_PINTYPE GetType() const
 
Container to create a flattened list of symbols because in a complex hierarchy, a symbol can be used ...
 
SCH_REFERENCE & GetItem(size_t aIdx)
 
A helper to define a symbol's reference designator in a schematic.
 
const SCH_SHEET_PATH & GetSheetPath() const
 
const wxString GetFootprint() const
 
SCH_SYMBOL * GetSymbol() const
 
LIB_SYMBOL * GetLibPart() const
 
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
 
EE_RTREE & Items()
Get the full RTree, usually for iterating.
 
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
 
VECTOR2I GetPosition() const override
 
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
 
SCH_SCREEN * LastScreen()
 
void push_back(SCH_SHEET *aSheet)
Forwarded method from std::vector.
 
Define a sheet pin (label) used in sheets to create hierarchical schematics.
 
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
 
std::vector< SCH_FIELD > & GetFields()
Return a reference to the vector holding the sheet's fields.
 
VECTOR2I GetPosition() const override
 
std::vector< SCH_SHEET_PIN * > & GetPins()
 
wxString GetShownName(bool aAllowExtraText) const
 
const wxString GetValue(bool aResolve, const SCH_SHEET_PATH *aPath, bool aAllowExtraText) const override
 
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
 
const wxString GetFootprintFieldText(bool aResolve, const SCH_SHEET_PATH *aPath, bool aAllowExtraText) const
 
VECTOR2I GetPosition() const override
 
std::vector< SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet) const
Retrieve a list of the SCH_PINs for the given sheet path.
 
const LIB_ID & GetLibId() const override
 
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
 
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
 
virtual wxString GetShownText(const RENDER_SETTINGS *aSettings, const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
 
VECTOR2I GetPosition() const override
 
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
 
virtual wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
 
SIM_MODEL & CreateModel(SIM_MODEL::TYPE aType, const std::vector< SCH_PIN * > &aPins, REPORTER &aReporter)
 
An interface to the global shared library manager that is schematic-specific and linked to one projec...
 
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
 
const TRANSFORM & GetTransform() const
 
double Distance(const VECTOR2< extended_type > &aVector) const
Compute the distance between two vectors.
 
A wrapper for reporting to a wxString object.
 
const wxString & GetMessages() const
 
const wxString ExpandEnvVarSubstitutions(const wxString &aString, const PROJECT *aProject)
Replace any environment variable & text variable references with their values.
 
#define FOR_ERC_DRC
Expand '${var-name}' templates in text.
 
void CheckDuplicatePins(LIB_SYMBOL *aSymbol, std::vector< wxString > &aMessages, UNITS_PROVIDER *aUnitsProvider)
 
const wxString CommentERC_V[]
 
const wxString CommentERC_H[]
 
const std::set< ELECTRICAL_PINTYPE > DrivenPinTypes
 
const std::set< ELECTRICAL_PINTYPE > DrivingPinTypes
 
const std::set< ELECTRICAL_PINTYPE > DrivingPowerPinTypes
 
@ ERCE_POWERPIN_NOT_DRIVEN
Power input pin connected to some others pins but no power out pin to drive it.
 
@ ERCE_SIMILAR_POWER
2 power pins are equal for case insensitive comparisons.
 
@ ERCE_MISSING_POWER_INPUT_PIN
Symbol has power input pins that are not placed on the schematic.
 
@ ERCE_GROUND_PIN_NOT_GROUND
A ground-labeled pin is not on a ground net while another pin is.
 
@ ERCE_SIMILAR_LABELS
2 labels are equal for case insensitive comparisons.
 
@ ERCE_STACKED_PIN_SYNTAX
Pin name resembles stacked pin notation.
 
@ ERCE_ENDPOINT_OFF_GRID
Pin or wire-end off grid.
 
@ ERCE_SAME_LOCAL_GLOBAL_LABEL
2 labels are equal for case insensitive comparisons.
 
@ ERCE_SIMILAR_LABEL_AND_POWER
label and pin are equal for case insensitive comparisons.
 
@ ERCE_FOOTPRINT_LINK_ISSUES
The footprint link is invalid, or points to a missing (or inactive) footprint or library.
 
@ ERCE_DUPLICATE_PIN_ERROR
 
@ ERCE_DIFFERENT_UNIT_NET
Shared pin in a multi-unit symbol is connected to more than one net.
 
@ ERCE_FOUR_WAY_JUNCTION
A four-way junction was found.
 
@ ERCE_UNDEFINED_NETCLASS
A netclass was referenced but not defined.
 
@ ERCE_UNRESOLVED_VARIABLE
A text variable could not be resolved.
 
@ ERCE_SIMULATION_MODEL
An error was found in the simulation model.
 
@ ERCE_LIB_SYMBOL_MISMATCH
Symbol doesn't match copy in library.
 
@ ERCE_DIFFERENT_UNIT_FP
Different units of the same symbol have different footprints assigned.
 
@ ERCE_NOCONNECT_CONNECTED
A no connect symbol is connected to more than 1 pin.
 
@ ERCE_PIN_TO_PIN_WARNING
 
@ ERCE_PIN_NOT_DRIVEN
Pin connected to some others pins but no pin to drive it.
 
@ ERCE_MISSING_INPUT_PIN
Symbol has input pins that are not placed.
 
@ ERCE_MISSING_UNIT
Symbol has units that are not placed on the schematic.
 
@ ERCE_DUPLICATE_SHEET_NAME
Duplicate sheet names within a given sheet.
 
@ ERCE_MISSING_BIDI_PIN
Symbol has bi-directional pins that are not placed.
 
@ ERCE_LIB_SYMBOL_ISSUES
Symbol not found in active libraries.
 
@ ERCE_FOOTPRINT_FILTERS
The assigned footprint doesn't match the footprint filters.
 
@ ERCE_LABEL_MULTIPLE_WIRES
A label is connected to more than one wire.
 
PIN_ERROR
The values a pin-to-pin entry in the pin matrix can take on.
 
@ KIFACE_TEST_FOOTPRINT_LINK_LIBRARY_NOT_ENABLED
 
@ KIFACE_TEST_FOOTPRINT_LINK
 
@ KIFACE_TEST_FOOTPRINT_LINK_NO_LIBRARY
 
@ KIFACE_TEST_FOOTPRINT_LINK_NO_FOOTPRINT
 
PGM_BASE & Pgm()
The global program "get" accessor.
 
ELECTRICAL_PINTYPE
The symbol library pin object electrical types used in ERC tests.
 
@ PT_INPUT
usual pin input: must be connected
 
@ PT_NC
not connected (must be left open)
 
@ PT_TRISTATE
tri state bus pin
 
@ PT_BIDI
input or output (like port for a microprocessor)
 
@ PT_POWER_OUT
output of a regulator: intended to be connected to power input pins
 
@ PT_POWER_IN
power input (GND, VCC for ICs). Must be connected to a power output.
 
@ PT_UNSPECIFIED
unknown electrical properties: creates always a warning when connected
 
@ PT_PASSIVE
pin for passive symbols: must be connected, and can be connected to any pin.
 
wxString ElectricalPinTypeGetText(ELECTRICAL_PINTYPE)
 
static float distance(const SFVEC2UI &a, const SFVEC2UI &b)
 
wxString UnescapeString(const wxString &aSource)
 
Implement a participant in the KIWAY alchemy.
 
virtual void * IfaceOrAddress(int aDataId)=0
Return pointer to the requested object.
 
VECTOR2< int32_t > VECTOR2I