mirror of
git://projects.qi-hardware.com/eda-tools.git
synced 2024-11-25 21:55:20 +02:00
Werner: we can drop the ERC pin exceptions patches.
They don't quite work anyway and are incompatible with the kicad belief system.
This commit is contained in:
parent
a27777996a
commit
78b197d786
@ -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;
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user