diff --git a/kicad-patches/erc-exceptions.patch b/kicad-patches/erc-exceptions.patch deleted file mode 100644 index cc9258a..0000000 --- a/kicad-patches/erc-exceptions.patch +++ /dev/null @@ -1,275 +0,0 @@ -This patch adds a mechanism to suppress ERC errors and warnings that -are caused by pins incompatibilities. It works by loading a file with -ERC exceptions each time an ERC is performed and then looking for an -entry before issuing a warning or error. - -The file has the same path and name as the .sch file, but ends in .erx -(Electric Rule eXceptions). Each line contains the following four -whitespace-separated fields: - -- component reference of the first component -- pin number of the first component -- component reference of the second component -- pin number of the second component - -# is used as a comment character. Note that the file is reloaded -each time ERC is invoked, so one can edit it in parallel to -running eeschema. - -Known bug: ERC dialog window needs reformatting for displaying the -exception count. - -The patch needs to be applied on top of the TestOthersItems -streamlining patch. - -- Werner - -Updated to rev 1923 - -- Nathael - ---- - -Index: kicad/eeschema/erc.cpp -=================================================================== ---- kicad.orig/eeschema/erc.cpp 2010-04-28 05:40:38.000000000 -0300 -+++ kicad/eeschema/erc.cpp 2010-04-28 05:49:35.000000000 -0300 -@@ -4,6 +4,7 @@ - - #include "fctsys.h" - #include "common.h" -+#include "confirm.h" - #include "class_drawpanel.h" - #include "kicad_string.h" - #include "gestfich.h" -@@ -230,6 +231,173 @@ - } - - -+static struct exception -+{ -+ char* a_ref; -+ char* a_pin; -+ char* b_ref; -+ char* b_pin; -+ char* line; /* pointer to the memory object we've allocated */ -+ struct exception* next; -+}* exceptions; -+ -+ -+ -+static void FreeExceptions( void ) -+{ -+ struct exception* next; -+ -+ while( exceptions ) -+ { -+ next = exceptions->next; -+ MyFree( exceptions->line ); -+ MyFree( exceptions ); -+ exceptions = next; -+ } -+} -+ -+ -+static bool ParseField( char **s, char **field ) -+{ -+ *field = *s; -+ if( ! **s ) -+ return FALSE; -+ while( **s && ! isspace( **s ) ) -+ (*s)++; -+ if( ! **s ) -+ return TRUE; -+ *(*s)++ = 0; -+ while( **s && isspace( **s ) ) -+ (*s)++; -+ return TRUE; -+} -+ -+ -+static bool ParseException( char *s ) -+{ -+ struct exception tmp; -+ struct exception* e; -+ -+ tmp.line = s; -+ -+ if( ! ParseField( &s, &tmp.a_ref)) -+ return FALSE; -+ if( ! ParseField( &s, &tmp.a_pin )) -+ return FALSE; -+ if( ! ParseField( &s, &tmp.b_ref)) -+ return FALSE; -+ if( ! ParseField( &s, &tmp.b_pin )) -+ return FALSE; -+ -+ e = (struct exception*) MyMalloc( sizeof( *e )); -+ *e = tmp; -+ e->next = exceptions; -+ exceptions = e; -+ -+ return TRUE; -+} -+ -+ -+static bool LoadExceptionsByName( const wxString &file_name ) -+{ -+ FILE* file; -+ char buf[200]; /* enough room for chatty comments */ -+ char* s; -+ char* tmp; -+ char* hash; -+ int n = 0; -+ -+ FreeExceptions(); -+ file = wxFopen( file_name, wxT( "r" ) ); -+ if( ! file ) -+ return FALSE; -+ -+ while( 1 ) -+ { -+ s = fgets( buf, sizeof( buf ), file ); -+ if( ! s ) -+ break; -+ -+ n++; -+ -+ // remove comments -+ hash = strchr( s, '#' ); -+ if( hash ) -+ *hash = 0; -+ -+ // skip leading whitespace -+ while( *s && isspace( *s ) ) -+ s++; -+ if( ! *s ) -+ continue; -+ -+ tmp = (char*) MyMalloc( strlen( s ) + 1 ); -+ strcpy( tmp, s ); -+ -+ if( ! ParseException( tmp ) ) -+ { -+ wxString msg; -+ -+ msg.Printf( wxT( "Parse error at %s:%d" ), CONV_TO_UTF8(file_name), n ); -+ DisplayError( NULL, msg ); -+ MyFree( tmp ); -+ break; -+ } -+ } -+ -+ fclose( file ); -+ -+ return TRUE; -+} -+ -+ -+static void LoadExceptions( void ) -+{ -+ wxFileName fn; -+ -+ fn = g_RootSheet->m_AssociatedScreen->m_FileName; -+ fn.SetExt( wxT( "erx" ) ); -+ if ( LoadExceptionsByName( fn.GetFullPath() ) ) -+ g_EESchemaVar.NbExceptionErc = 0; -+} -+ -+ -+static bool FindException( NETLIST_OBJECT* a, NETLIST_OBJECT* b ) -+{ -+ SCH_COMPONENT* a_comp = (SCH_COMPONENT*) a->m_Link; -+ SCH_COMPONENT* b_comp = (SCH_COMPONENT*) b->m_Link; -+ const char* a_ref = CONV_TO_UTF8( a_comp->GetRef( &a->m_SheetList ) ); -+ const char* b_ref = CONV_TO_UTF8( b_comp->GetRef( &b->m_SheetList ) ); -+ const char* a_pin = (char *) &a->m_PinNum; -+ const char* b_pin = (char *) &b->m_PinNum; -+ struct exception* e = exceptions; -+ -+ for( e = exceptions; e; e = e->next ) -+ { -+#if 0 -+fprintf(stderr, "a) %s %4.4s =? %s %4.4s\n", e->a_ref, e->a_pin, a_ref, a_pin); -+fprintf(stderr, "b) %s %4.4s =? %s %4.4s\n", e->b_ref, e->b_pin, b_ref, b_pin); -+#endif -+ if( strcmp( e->a_ref, a_ref ) ) -+ continue; -+ if( strncmp( e->a_pin, a_pin, 4 ) ) -+ continue; -+ if( strcmp( e->b_ref, b_ref ) ) -+ continue; -+ if( strncmp( e->b_pin, b_pin, 4 ) ) -+ continue; -+ return TRUE; -+ } -+ return FALSE; -+} -+ -+ -+static bool IsException( NETLIST_OBJECT* a, NETLIST_OBJECT* b ) -+{ -+ return FindException( a, b ) || FindException( b, a); -+} -+ -+ - void DIALOG_ERC::TestErc( wxArrayString* aMessagesList ) - { - wxFileName fn; -@@ -264,6 +432,7 @@ - - g_EESchemaVar.NbErrorErc = 0; - g_EESchemaVar.NbWarningErc = 0; -+ g_EESchemaVar.NbExceptionErc = -1; /* -1 means "no file" */ - - /* Cleanup the entire hierarchy */ - EDA_ScreenList ScreenList; -@@ -290,6 +459,8 @@ - - m_Parent->BuildNetListBase(); - -+ LoadExceptions(); -+ - /* Reset the flag m_FlagOfConnection, that will be used next, in - * calculations */ - for( unsigned ii = 0; ii < g_NetObjectslist.size(); ii++ ) -@@ -358,7 +529,13 @@ - - // Displays global results: - wxString num; -- num.Printf( wxT( "%d" ), g_EESchemaVar.NbErrorErc ); -+ -+ if( g_EESchemaVar.NbExceptionErc >= 0) -+ num.Printf( wxT( "%d (%d exception%s)" ), g_EESchemaVar.NbErrorErc, -+ g_EESchemaVar.NbExceptionErc, -+ g_EESchemaVar.NbExceptionErc == 1 ? wxT( "" ) : wxT( "s" ) ); -+ else -+ num.Printf( wxT( "%d" ), g_EESchemaVar.NbErrorErc ); - m_TotalErrCount->SetLabel( num ); - - num.Printf( wxT( -@@ -662,6 +839,12 @@ - if( g_NetObjectslist[NetItemTst]->m_FlagOfConnection != 0 ) - break; - -+ if( IsException( g_NetObjectslist[NetItemRef], g_NetObjectslist[NetItemTst] ) ) -+ { -+ g_EESchemaVar.NbExceptionErc++; -+ break; -+ } -+ - Diagnose( panel, - g_NetObjectslist[NetItemRef], - g_NetObjectslist[NetItemTst], -Index: kicad/eeschema/general.h -=================================================================== ---- kicad.orig/eeschema/general.h 2010-04-28 04:34:54.000000000 -0300 -+++ kicad/eeschema/general.h 2010-04-28 05:42:13.000000000 -0300 -@@ -118,6 +118,7 @@ - { - int NbErrorErc; - int NbWarningErc; -+ int NbExceptionErc; - }; - - extern struct EESchemaVariables g_EESchemaVar; diff --git a/kicad-patches/series b/kicad-patches/series index 0f60fc5..5942408 100644 --- a/kicad-patches/series +++ b/kicad-patches/series @@ -7,10 +7,6 @@ fix-pinedit-collision.patch #drag-override.patch #pcbnew-plot-only-mode.patch -# ERC pin exceptions -streamline-erc.patch -erc-exceptions.patch - # cmdline options for eeschema and pcbnew cmdline-new.patch cmdline-common.patch diff --git a/kicad-patches/streamline-erc.patch b/kicad-patches/streamline-erc.patch deleted file mode 100644 index 05f78d5..0000000 --- a/kicad-patches/streamline-erc.patch +++ /dev/null @@ -1,52 +0,0 @@ -streamline TestOthersItems (ERC) - -This patch changes a deeply nested "if" into a series of "breaks", -for better readability and to facilitate future extensions. - -- Werner - ---- - -Index: kicad/eeschema/erc.cpp -=================================================================== ---- kicad.orig/eeschema/erc.cpp 2010-04-28 05:40:28.000000000 -0300 -+++ kicad/eeschema/erc.cpp 2010-04-28 05:40:38.000000000 -0300 -@@ -653,23 +653,22 @@ - break; - - *NetNbItems += 1; -+ if( erc != OK ) -+ break; -+ -+ erc = DiagErc[ref_elect_type][jj]; - if( erc == OK ) -- { -- erc = DiagErc[ref_elect_type][jj]; -- if( erc != OK ) -- { -- if( g_NetObjectslist[NetItemTst]->m_FlagOfConnection == 0 ) -- { -- Diagnose( panel, -- g_NetObjectslist[NetItemRef], -- g_NetObjectslist[NetItemTst], -- 0, -- erc ); -- g_NetObjectslist[NetItemTst]->m_FlagOfConnection = -- NOCONNECT_SYMBOL_PRESENT; -- } -- } -- } -+ break; -+ if( g_NetObjectslist[NetItemTst]->m_FlagOfConnection != 0 ) -+ break; -+ -+ Diagnose( panel, -+ g_NetObjectslist[NetItemRef], -+ g_NetObjectslist[NetItemTst], -+ 0, -+ erc ); -+ g_NetObjectslist[NetItemTst]->m_FlagOfConnection = -+ NOCONNECT_SYMBOL_PRESENT; - break; - } - }