Commit 00bda3c9 authored by dickelbeck's avatar dickelbeck

beautification

parent 63cf8c53
...@@ -136,12 +136,16 @@ void LoadLibraries( WinEDA_DrawFrame* frame ) ...@@ -136,12 +136,16 @@ void LoadLibraries( WinEDA_DrawFrame* frame )
if( LibName.IsEmpty() ) if( LibName.IsEmpty() )
continue; continue;
FullLibName = MakeFileName( g_RealLibDirBuffer, LibName, g_LibExtBuffer ); FullLibName = MakeFileName( g_RealLibDirBuffer, LibName, g_LibExtBuffer );
msg = wxT( "Loading " ) + FullLibName; msg = wxT( "Loading " ) + FullLibName;
if( LoadLibraryName( frame, FullLibName, LibName ) ) if( LoadLibraryName( frame, FullLibName, LibName ) )
msg += wxT( " OK" ); msg += wxT( " OK" );
else else
msg += wxT( " ->Error" ); msg += wxT( " ->Error" );
frame->PrintMsg( msg ); frame->PrintMsg( msg );
} }
...@@ -348,7 +352,10 @@ EDA_LibComponentStruct* Read_Component_Definition( WinEDA_DrawFrame* frame, char ...@@ -348,7 +352,10 @@ EDA_LibComponentStruct* Read_Component_Definition( WinEDA_DrawFrame* frame, char
*/ */
{ {
int unused; int unused;
char* p, * Name, * Prefix = NULL; char* p;
char* name;
char* prefix = NULL;
EDA_LibComponentStruct* LibEntry = NULL; EDA_LibComponentStruct* LibEntry = NULL;
bool Res; bool Res;
wxString Msg; wxString Msg;
...@@ -366,8 +373,8 @@ EDA_LibComponentStruct* Read_Component_Definition( WinEDA_DrawFrame* frame, char ...@@ -366,8 +373,8 @@ EDA_LibComponentStruct* Read_Component_Definition( WinEDA_DrawFrame* frame, char
char drawnum = 0, drawname = 0; char drawnum = 0, drawname = 0;
LibEntry = new EDA_LibComponentStruct( NULL ); LibEntry = new EDA_LibComponentStruct( NULL );
if( ( Name = strtok( NULL, " \t\n" ) ) == NULL /* Part name: */ if( ( name = strtok( NULL, " \t\n" ) ) == NULL /* Part name: */
|| ( Prefix = strtok( NULL, " \t\n" ) ) == NULL /* Prefix name: */ || ( prefix = strtok( NULL, " \t\n" ) ) == NULL /* Prefix name: */
|| ( p = strtok( NULL, " \t\n" ) ) == NULL /* NumOfPins: */ || ( p = strtok( NULL, " \t\n" ) ) == NULL /* NumOfPins: */
|| sscanf( p, "%d", &unused ) != 1 || sscanf( p, "%d", &unused ) != 1
|| ( p = strtok( NULL, " \t\n" ) ) == NULL /* TextInside: */ || ( p = strtok( NULL, " \t\n" ) ) == NULL /* TextInside: */
...@@ -394,23 +401,24 @@ EDA_LibComponentStruct* Read_Component_Definition( WinEDA_DrawFrame* frame, char ...@@ -394,23 +401,24 @@ EDA_LibComponentStruct* Read_Component_Definition( WinEDA_DrawFrame* frame, char
{ {
LibEntry->m_DrawPinNum = (drawnum == 'N') ? FALSE : TRUE; LibEntry->m_DrawPinNum = (drawnum == 'N') ? FALSE : TRUE;
LibEntry->m_DrawPinName = (drawname == 'N') ? FALSE : TRUE; LibEntry->m_DrawPinName = (drawname == 'N') ? FALSE : TRUE;
/* Copy part name and prefix. */ /* Copy part name and prefix. */
strupper( Name ); strupper( name );
if( Name[0] != '~' ) if( name[0] != '~' )
LibEntry->m_Name.m_Text = CONV_FROM_UTF8( Name ); LibEntry->m_Name.m_Text = CONV_FROM_UTF8( name );
else else
{ {
LibEntry->m_Name.m_Text = CONV_FROM_UTF8( &Name[1] ); LibEntry->m_Name.m_Text = CONV_FROM_UTF8( &name[1] );
LibEntry->m_Name.m_Attributs |= TEXT_NO_VISIBLE; LibEntry->m_Name.m_Attributs |= TEXT_NO_VISIBLE;
} }
if( strcmp( Prefix, "~" ) == 0 ) if( strcmp( prefix, "~" ) == 0 )
{ {
LibEntry->m_Prefix.m_Text.Empty(); LibEntry->m_Prefix.m_Text.Empty();
LibEntry->m_Prefix.m_Attributs |= TEXT_NO_VISIBLE; LibEntry->m_Prefix.m_Attributs |= TEXT_NO_VISIBLE;
} }
else else
LibEntry->m_Prefix.m_Text = CONV_FROM_UTF8( Prefix ); LibEntry->m_Prefix.m_Text = CONV_FROM_UTF8( prefix );
// Copy optional infos // Copy optional infos
if( ( p = strtok( NULL, " \t\n" ) ) != NULL ) // m_UnitSelectionLocked param if( ( p = strtok( NULL, " \t\n" ) ) != NULL ) // m_UnitSelectionLocked param
...@@ -525,7 +533,10 @@ static LibEDA_BaseStruct* GetDrawEntry( WinEDA_DrawFrame* frame, FILE* f, char* ...@@ -525,7 +533,10 @@ static LibEDA_BaseStruct* GetDrawEntry( WinEDA_DrawFrame* frame, FILE* f, char*
&Arc->m_Width, chartmp, &startx, &starty, &endx, &endy ); &Arc->m_Width, chartmp, &startx, &starty, &endx, &endy );
if( nbarg < 8 ) if( nbarg < 8 )
Error = TRUE; Error = TRUE;
Arc->m_Unit = Unit; Arc->m_Convert = Convert;
Arc->m_Unit = Unit;
Arc->m_Convert = Convert;
if( chartmp[0] == 'F' ) if( chartmp[0] == 'F' )
Arc->m_Fill = FILLED_SHAPE; Arc->m_Fill = FILLED_SHAPE;
if( chartmp[0] == 'f' ) if( chartmp[0] == 'f' )
...@@ -625,8 +636,11 @@ static LibEDA_BaseStruct* GetDrawEntry( WinEDA_DrawFrame* frame, FILE* f, char* ...@@ -625,8 +636,11 @@ static LibEDA_BaseStruct* GetDrawEntry( WinEDA_DrawFrame* frame, FILE* f, char*
Pin->m_PinLen = ll; Pin->m_PinLen = ll;
Pin->m_Orient = chartmp1[0] & 255; Pin->m_Orient = chartmp1[0] & 255;
Pin->m_Unit = Unit; Pin->m_Convert = Convert; Pin->m_Unit = Unit;
Pin->m_Convert = Convert;
strncpy( (char*) &Pin->m_PinNum, PinNum, 4 ); strncpy( (char*) &Pin->m_PinNum, PinNum, 4 );
Error = (i != 11 && i != 12); Error = (i != 11 && i != 12);
Pin->m_PinName = CONV_FROM_UTF8( BufName ); Pin->m_PinName = CONV_FROM_UTF8( BufName );
...@@ -672,6 +686,7 @@ static LibEDA_BaseStruct* GetDrawEntry( WinEDA_DrawFrame* frame, FILE* f, char* ...@@ -672,6 +686,7 @@ static LibEDA_BaseStruct* GetDrawEntry( WinEDA_DrawFrame* frame, FILE* f, char*
} }
if( i == 12 ) /* Special Symbole defined */ if( i == 12 ) /* Special Symbole defined */
{
for( jj = strlen( Buffer ); jj > 0; ) for( jj = strlen( Buffer ); jj > 0; )
{ {
switch( Buffer[--jj] ) switch( Buffer[--jj] )
...@@ -700,6 +715,7 @@ static LibEDA_BaseStruct* GetDrawEntry( WinEDA_DrawFrame* frame, FILE* f, char* ...@@ -700,6 +715,7 @@ static LibEDA_BaseStruct* GetDrawEntry( WinEDA_DrawFrame* frame, FILE* f, char*
DisplayError( frame, MsgLine ); break; DisplayError( frame, MsgLine ); break;
} }
} }
}
} }
break; break;
...@@ -852,7 +868,8 @@ static bool GetLibEntryField( EDA_LibComponentStruct* LibEntry, char* line ) ...@@ -852,7 +868,8 @@ static bool GetLibEntryField( EDA_LibComponentStruct* LibEntry, char* line )
if( *line == 0 ) if( *line == 0 )
return 0; return 0;
line++; Text = line; line++;
Text = line;
/* recherche fin de texte */ /* recherche fin de texte */
while( *line && (*line != '"') ) while( *line && (*line != '"') )
...@@ -860,17 +877,23 @@ static bool GetLibEntryField( EDA_LibComponentStruct* LibEntry, char* line ) ...@@ -860,17 +877,23 @@ static bool GetLibEntryField( EDA_LibComponentStruct* LibEntry, char* line )
if( *line == 0 ) if( *line == 0 )
return 0; return 0;
*line = 0; line++; *line = 0;
line++;
FieldUserName[0] = 0; FieldUserName[0] = 0;
nbparam = sscanf( line, " %d %d %d %c %c %c %c", nbparam = sscanf( line, " %d %d %d %c %c %c %c",
&posx, &posy, &size, Char1, Char2, Char3, Char4 ); &posx, &posy, &size, Char1, Char2, Char3, Char4 );
orient = TEXT_ORIENT_HORIZ; if( Char1[0] == 'V' ) orient = TEXT_ORIENT_HORIZ;
if( Char1[0] == 'V' )
orient = TEXT_ORIENT_VERT; orient = TEXT_ORIENT_VERT;
draw = TRUE; if( Char2[0] == 'I' ) draw = TRUE; if( Char2[0] == 'I' )
draw = FALSE; draw = FALSE;
hjustify = GR_TEXT_HJUSTIFY_CENTER; hjustify = GR_TEXT_HJUSTIFY_CENTER;
vjustify = GR_TEXT_VJUSTIFY_CENTER; vjustify = GR_TEXT_VJUSTIFY_CENTER;
if( nbparam >= 6 ) if( nbparam >= 6 )
{ {
if( *Char3 == 'L' ) if( *Char3 == 'L' )
...@@ -898,6 +921,7 @@ static bool GetLibEntryField( EDA_LibComponentStruct* LibEntry, char* line ) ...@@ -898,6 +921,7 @@ static bool GetLibEntryField( EDA_LibComponentStruct* LibEntry, char* line )
default: default:
if( NumOfField >= NUMBER_OF_FIELDS ) if( NumOfField >= NUMBER_OF_FIELDS )
break; break;
Field = new LibDrawField( NumOfField ); Field = new LibDrawField( NumOfField );
Field->Pnext = LibEntry->Fields; Field->Pnext = LibEntry->Fields;
...@@ -910,15 +934,19 @@ static bool GetLibEntryField( EDA_LibComponentStruct* LibEntry, char* line ) ...@@ -910,15 +934,19 @@ static bool GetLibEntryField( EDA_LibComponentStruct* LibEntry, char* line )
Field->m_Pos.x = posx; Field->m_Pos.y = posy; Field->m_Pos.x = posx; Field->m_Pos.y = posy;
Field->m_Orient = orient; Field->m_Orient = orient;
if( draw == FALSE ) if( draw == FALSE )
Field->m_Attributs |= TEXT_NO_VISIBLE; Field->m_Attributs |= TEXT_NO_VISIBLE;
Field->m_Size.x = Field->m_Size.y = size; Field->m_Size.x = Field->m_Size.y = size;
Field->m_Text = CONV_FROM_UTF8( Text ); Field->m_Text = CONV_FROM_UTF8( Text );
if( NumOfField >= FIELD1 ) if( NumOfField >= FIELD1 )
{ {
ReadDelimitedText( FieldUserName, line, sizeof(FieldUserName) ); ReadDelimitedText( FieldUserName, line, sizeof(FieldUserName) );
Field->m_Name = CONV_FROM_UTF8( FieldUserName ); Field->m_Name = CONV_FROM_UTF8( FieldUserName );
} }
Field->m_HJustify = hjustify; Field->m_HJustify = hjustify;
Field->m_VJustify = vjustify; Field->m_VJustify = vjustify;
return TRUE; return TRUE;
...@@ -992,7 +1020,8 @@ int LoadDocLib( WinEDA_DrawFrame* frame, const wxString& FullDocLibName, const w ...@@ -992,7 +1020,8 @@ int LoadDocLib( WinEDA_DrawFrame* frame, const wxString& FullDocLibName, const w
return 0; return 0;
if( GetLine( f, Line, &LineNum, sizeof(Line) ) == NULL ) if( GetLine( f, Line, &LineNum, sizeof(Line) ) == NULL )
{ /* pas de lignes utiles */ {
/* pas de lignes utiles */
fclose( f ); fclose( f );
return 0; return 0;
} }
...@@ -1100,6 +1129,7 @@ void EDA_LibComponentStruct::SortDrawItems() ...@@ -1100,6 +1129,7 @@ void EDA_LibComponentStruct::SortDrawItems()
BufentryBase = BufentryBase =
(LibEDA_BaseStruct**) MyZMalloc( (nbitems + 1) * sizeof(LibEDA_BaseStruct *) ); (LibEDA_BaseStruct**) MyZMalloc( (nbitems + 1) * sizeof(LibEDA_BaseStruct *) );
/* memorisation du chainage : */ /* memorisation du chainage : */
for( Entry = m_Drawings, ii = 0; Entry != NULL; Entry = Entry->Next() ) for( Entry = m_Drawings, ii = 0; Entry != NULL; Entry = Entry->Next() )
BufentryBase[ii++] = Entry; BufentryBase[ii++] = Entry;
......
...@@ -440,7 +440,7 @@ bool WinEDA_SchematicFrame::LoadOneEEFile( SCH_SCREEN* screen, const wxString& F ...@@ -440,7 +440,7 @@ bool WinEDA_SchematicFrame::LoadOneEEFile( SCH_SCREEN* screen, const wxString& F
screen->EEDrawList = Phead; screen->EEDrawList = Phead;
#if defined(DEBUG) #if 0 && defined(DEBUG)
screen->Show( 0, std::cout ); screen->Show( 0, std::cout );
#endif #endif
......
/*******************************************************/ /*******************************************************/
/* Module de generation de la Netliste , selon Formats */ /* Module de generation de la Netliste , selon Formats */
/*******************************************************/ /*******************************************************/
#include "fctsys.h" #include "fctsys.h"
#include "gr_basic.h" #include "gr_basic.h"
...@@ -15,156 +15,163 @@ ...@@ -15,156 +15,163 @@
/* Routines locales */ /* Routines locales */
static void Write_GENERIC_NetList(WinEDA_SchematicFrame * frame, const wxString & FullFileName); static void Write_GENERIC_NetList( WinEDA_SchematicFrame* frame, const wxString& FullFileName );
static void WriteNetListPCBNEW(WinEDA_SchematicFrame * frame, FILE *f, static void WriteNetListPCBNEW( WinEDA_SchematicFrame* frame, FILE* f,
bool with_pcbnew); bool with_pcbnew );
static void WriteNetListCADSTAR(WinEDA_SchematicFrame * frame, FILE *f); static void WriteNetListCADSTAR( WinEDA_SchematicFrame* frame, FILE* f );
static void WriteListOfNetsCADSTAR( FILE * f, ObjetNetListStruct *ObjNet ); static void WriteListOfNetsCADSTAR( FILE* f, ObjetNetListStruct* ObjNet );
static void WriteNetListPspice(WinEDA_SchematicFrame * frame, FILE *f, bool use_netnames); static void WriteNetListPspice( WinEDA_SchematicFrame* frame, FILE* f, bool use_netnames );
static void WriteGENERICListOfNets( FILE * f, ObjetNetListStruct *ObjNet ); static void WriteGENERICListOfNets( FILE* f, ObjetNetListStruct* ObjNet );
static void AddPinToComponentPinList(EDA_SchComponentStruct *Component, static void AddPinToComponentPinList( EDA_SchComponentStruct* Component,
LibDrawPin *PinEntry); LibDrawPin* PinEntry );
static void FindOthersUnits(EDA_SchComponentStruct *Component ); static void FindOthersUnits( EDA_SchComponentStruct* Component );
static int SortPinsByNum(ObjetNetListStruct **Pin1, ObjetNetListStruct **Pin2); static int SortPinsByNum( ObjetNetListStruct** Pin1, ObjetNetListStruct** Pin2 );
static void EraseDuplicatePins(ObjetNetListStruct **TabPin, int NbrPin); static void EraseDuplicatePins( ObjetNetListStruct** TabPin, int NbrPin );
static void ClearUsedFlags(WinEDA_SchematicFrame * frame);
static void ClearUsedFlags( WinEDA_SchematicFrame* frame );
/* Variable locales */ /* Variable locales */
static int s_SortedPinCount; static int s_SortedPinCount;
static ObjetNetListStruct **s_SortedComponentPinList; static ObjetNetListStruct** s_SortedComponentPinList;
/******************************************************************************/ /******************************************************************************/
void WriteNetList(WinEDA_SchematicFrame * frame, const wxString & FileNameNL, void WriteNetList( WinEDA_SchematicFrame* frame, const wxString& FileNameNL,
bool use_netnames) bool use_netnames )
/*******************************************************************************/ /*******************************************************************************/
/* Create the netlist file ( Format is given by g_NetFormat ) /* Create the netlist file ( Format is given by g_NetFormat )
bool use_netnames is used only for Spice netlist * bool use_netnames is used only for Spice netlist
*/ */
{ {
FILE *f = NULL; FILE* f = NULL;
if ( g_NetFormat < NET_TYPE_CUSTOM1 ) if( g_NetFormat < NET_TYPE_CUSTOM1 )
{ {
if ((f = wxFopen(FileNameNL, wxT("wt"))) == NULL) if( ( f = wxFopen( FileNameNL, wxT( "wt" ) ) ) == NULL )
{ {
wxString msg = _("Failed to create file ") + FileNameNL; wxString msg = _( "Failed to create file " ) + FileNameNL;
DisplayError(frame, msg); DisplayError( frame, msg );
return; return;
} }
} }
wxBusyCursor Busy; wxBusyCursor Busy;
switch ( g_NetFormat ) switch( g_NetFormat )
{ {
case NET_TYPE_PCBNEW : case NET_TYPE_PCBNEW:
WriteNetListPCBNEW(frame, f, TRUE); WriteNetListPCBNEW( frame, f, TRUE );
fclose(f); fclose( f );
break; break;
case NET_TYPE_ORCADPCB2 : case NET_TYPE_ORCADPCB2:
WriteNetListPCBNEW(frame, f, FALSE); WriteNetListPCBNEW( frame, f, FALSE );
fclose(f); fclose( f );
break; break;
case NET_TYPE_CADSTAR : case NET_TYPE_CADSTAR:
WriteNetListCADSTAR(frame, f); WriteNetListCADSTAR( frame, f );
fclose(f); fclose( f );
break; break;
case NET_TYPE_SPICE : case NET_TYPE_SPICE:
WriteNetListPspice(frame, f, use_netnames); WriteNetListPspice( frame, f, use_netnames );
fclose(f); fclose( f );
break; break;
case NET_TYPE_CUSTOM1 : case NET_TYPE_CUSTOM1:
case NET_TYPE_CUSTOM2 : case NET_TYPE_CUSTOM2:
case NET_TYPE_CUSTOM3 : case NET_TYPE_CUSTOM3:
case NET_TYPE_CUSTOM4 : case NET_TYPE_CUSTOM4:
case NET_TYPE_CUSTOM5 : case NET_TYPE_CUSTOM5:
case NET_TYPE_CUSTOM6 : case NET_TYPE_CUSTOM6:
case NET_TYPE_CUSTOM7 : case NET_TYPE_CUSTOM7:
case NET_TYPE_CUSTOM8 : case NET_TYPE_CUSTOM8:
Write_GENERIC_NetList(frame, FileNameNL); Write_GENERIC_NetList( frame, FileNameNL );
break; break;
default: default:
DisplayError(frame, wxT("WriteNetList() err: Unknown Netlist Format")); DisplayError( frame, wxT( "WriteNetList() err: Unknown Netlist Format" ) );
break; break;
} }
} }
/****************************************************************************/ /****************************************************************************/
static EDA_SchComponentStruct * FindNextComponentAndCreatPinList( static EDA_SchComponentStruct* FindNextComponentAndCreatPinList(
EDA_BaseStruct * DrawList) EDA_BaseStruct* DrawList )
/****************************************************************************/ /****************************************************************************/
/* Find a "suitable" component from the DrawList
build its pin list s_SortedComponentPinList.
The list is sorted by pin num
A suitable component is a "new" real component (power symbols are not considered)
alloc memory for s_SortedComponentPinList if s_SortedComponentPinList == NULL /* Find a "suitable" component from the DrawList
Must be deallocated by the user * build its pin list s_SortedComponentPinList.
*/ * The list is sorted by pin num
* A suitable component is a "new" real component (power symbols are not considered)
*
* alloc memory for s_SortedComponentPinList if s_SortedComponentPinList == NULL
* Must be deallocated by the user
*/
{ {
EDA_SchComponentStruct * Component = NULL; EDA_SchComponentStruct* Component = NULL;
EDA_LibComponentStruct *Entry; EDA_LibComponentStruct* Entry;
LibEDA_BaseStruct *DEntry; LibEDA_BaseStruct* DEntry;
s_SortedPinCount = 0; s_SortedPinCount = 0;
for ( ; DrawList != NULL; DrawList = DrawList->Next() ) for( ; DrawList != NULL; DrawList = DrawList->Next() )
{ {
if ( DrawList->Type() != DRAW_LIB_ITEM_STRUCT_TYPE ) continue; if( DrawList->Type() != DRAW_LIB_ITEM_STRUCT_TYPE )
Component = (EDA_SchComponentStruct *) DrawList; continue;
Component = (EDA_SchComponentStruct*) DrawList;
/* already tested ? : */ /* already tested ? : */
if( Component->m_FlagControlMulti == 1 ) continue; /* yes */ if( Component->m_FlagControlMulti == 1 )
continue; /* yes */
Entry = FindLibPart(Component->m_ChipName.GetData(), wxEmptyString, FIND_ROOT); Entry = FindLibPart( Component->m_ChipName.GetData(), wxEmptyString, FIND_ROOT );
if( Entry == NULL) continue; if( Entry == NULL )
continue;
/* Power symbol and other component which have the reference starting by /* Power symbol and other component which have the reference starting by
"#" are not included in netlist (pseudo components) */ * "#" are not included in netlist (pseudo components) */
if( Component->m_Field[REFERENCE].m_Text[0] == '#' ) continue; if( Component->m_Field[REFERENCE].m_Text[0] == '#' )
continue;
/* Create the pin table for this component */ /* Create the pin table for this component */
int ii = sizeof(ObjetNetListStruct) * MAXPIN; int ii = sizeof(ObjetNetListStruct) * MAXPIN;
if ( s_SortedComponentPinList == NULL ) if( s_SortedComponentPinList == NULL )
s_SortedComponentPinList = (ObjetNetListStruct **) MyMalloc(ii); s_SortedComponentPinList = (ObjetNetListStruct**) MyMalloc( ii );
memset(s_SortedComponentPinList, 0 , ii); memset( s_SortedComponentPinList, 0, ii );
DEntry = Entry->m_Drawings; DEntry = Entry->m_Drawings;
for ( ;DEntry != NULL; DEntry = DEntry->Next()) for( ; DEntry != NULL; DEntry = DEntry->Next() )
{ {
if ( DEntry->Type() != COMPONENT_PIN_DRAW_TYPE) continue; if( DEntry->Type() != COMPONENT_PIN_DRAW_TYPE )
if( DEntry->m_Unit && continue;
(DEntry->m_Unit != Component->m_Multi) ) continue; if( DEntry->m_Unit
if( DEntry->m_Convert && && (DEntry->m_Unit != Component->m_Multi) )
(DEntry->m_Convert != Component->m_Convert)) continue; continue;
if( DEntry->m_Convert
&& (DEntry->m_Convert != Component->m_Convert) )
continue;
{ {
AddPinToComponentPinList(Component, (LibDrawPin*)DEntry); AddPinToComponentPinList( Component, (LibDrawPin*) DEntry );
} }
} }
Component->m_FlagControlMulti = 1; Component->m_FlagControlMulti = 1;
if (Entry->m_UnitCount > 1) FindOthersUnits(Component); if( Entry->m_UnitCount > 1 )
FindOthersUnits( Component );
/* Tri sur le numero de Pin de TabListePin */ /* Tri sur le numero de Pin de TabListePin */
qsort(s_SortedComponentPinList, s_SortedPinCount, sizeof(ObjetNetListStruct*), qsort( s_SortedComponentPinList, s_SortedPinCount, sizeof(ObjetNetListStruct*),
(int (*)(const void *, const void *)) SortPinsByNum); ( int( * ) ( const void*, const void* ) )SortPinsByNum );
/* Elimination des Pins redondantes du s_SortedComponentPinList */ /* Elimination des Pins redondantes du s_SortedComponentPinList */
EraseDuplicatePins(s_SortedComponentPinList, s_SortedPinCount); EraseDuplicatePins( s_SortedComponentPinList, s_SortedPinCount );
return Component; return Component;
} }
...@@ -172,19 +179,21 @@ LibEDA_BaseStruct *DEntry; ...@@ -172,19 +179,21 @@ LibEDA_BaseStruct *DEntry;
return NULL; return NULL;
} }
/**************************************************************************************/ /**************************************************************************************/
static wxString ReturnPinNetName(ObjetNetListStruct *Pin, static wxString ReturnPinNetName( ObjetNetListStruct* Pin,
const wxString& DefaultFormatNetname) const wxString& DefaultFormatNetname )
/**************************************************************************************/ /**************************************************************************************/
/* Return the net name for the pin Pin. /* Return the net name for the pin Pin.
Net name is: * Net name is:
"?" if pin not connected * "?" if pin not connected
"netname" for global net (like gnd, vcc .. * "netname" for global net (like gnd, vcc ..
"netname_sheetnumber" for the usual nets * "netname_sheetnumber" for the usual nets
*/ */
{ {
int netcode = Pin->m_NetCode; int netcode = Pin->m_NetCode;
wxString NetName; wxString NetName;
if( (netcode == 0 ) || ( Pin->m_FlagOfConnection != CONNECT ) ) if( (netcode == 0 ) || ( Pin->m_FlagOfConnection != CONNECT ) )
{ {
...@@ -193,100 +202,107 @@ wxString NetName; ...@@ -193,100 +202,107 @@ wxString NetName;
else else
{ {
int jj; int jj;
for (jj = 0; jj < g_NbrObjNet; jj++) for( jj = 0; jj < g_NbrObjNet; jj++ )
{ {
if( g_TabObjNet[jj].m_NetCode != netcode) continue; if( g_TabObjNet[jj].m_NetCode != netcode )
if( ( g_TabObjNet[jj].m_Type != NET_GLOBLABEL) && continue;
( g_TabObjNet[jj].m_Type != NET_LABEL) && if( ( g_TabObjNet[jj].m_Type != NET_GLOBLABEL)
( g_TabObjNet[jj].m_Type != NET_PINLABEL) ) continue; && ( g_TabObjNet[jj].m_Type != NET_LABEL)
&& ( g_TabObjNet[jj].m_Type != NET_PINLABEL) )
continue;
NetName = * g_TabObjNet[jj].m_Label; NetName = *g_TabObjNet[jj].m_Label;
break; break;
} }
if( ! NetName.IsEmpty() ) if( !NetName.IsEmpty() )
{ {
if( g_TabObjNet[jj].m_Type != NET_PINLABEL ) if( g_TabObjNet[jj].m_Type != NET_PINLABEL )
NetName << wxT("_") << g_TabObjNet[jj].m_SheetNumber; NetName << wxT( "_" ) << g_TabObjNet[jj].m_SheetNumber;
} }
else else
{ {
NetName.Printf(DefaultFormatNetname.GetData(), netcode); NetName.Printf( DefaultFormatNetname.GetData(), netcode );
} }
} }
return NetName; return NetName;
} }
/***********************************************************************/ /***********************************************************************/
void Write_GENERIC_NetList(WinEDA_SchematicFrame * frame, void Write_GENERIC_NetList( WinEDA_SchematicFrame* frame,
const wxString & FullFileName) const wxString& FullFileName )
/***********************************************************************/ /***********************************************************************/
/* Create a generic netlist, and call an external netlister /* Create a generic netlist, and call an external netlister
to change the netlist syntax and create the file * to change the netlist syntax and create the file
*/ */
{ {
wxString Line, FootprintName; wxString Line, FootprintName;
BASE_SCREEN *CurrScreen; BASE_SCREEN* CurrScreen;
EDA_BaseStruct *DrawList; EDA_BaseStruct* DrawList;
EDA_SchComponentStruct *Component; EDA_SchComponentStruct* Component;
wxString netname; wxString netname;
int ii; int ii;
FILE * tmpfile; FILE* tmpfile;
wxString TmpFullFileName = FullFileName; wxString TmpFullFileName = FullFileName;
ChangeFileNameExt(TmpFullFileName, wxT(".tmp")); ChangeFileNameExt( TmpFullFileName, wxT( ".tmp" ) );
if ((tmpfile = wxFopen(TmpFullFileName, wxT("wt"))) == NULL) if( ( tmpfile = wxFopen( TmpFullFileName, wxT( "wt" ) ) ) == NULL )
{ {
wxString msg = _("Failed to create file ") + TmpFullFileName; wxString msg = _( "Failed to create file " ) + TmpFullFileName;
DisplayError(frame, msg); DisplayError( frame, msg );
return; return;
} }
ClearUsedFlags(frame); /* Reset the flags FlagControlMulti in all schematic files*/ ClearUsedFlags( frame ); /* Reset the flags FlagControlMulti in all schematic files*/
fprintf( tmpfile, "$BeginNetlist\n" ); fprintf( tmpfile, "$BeginNetlist\n" );
/* Create netlist module section */ /* Create netlist module section */
fprintf( tmpfile, "$BeginComponentList\n" ); fprintf( tmpfile, "$BeginComponentList\n" );
for(CurrScreen = ScreenSch; CurrScreen != NULL; CurrScreen = (BASE_SCREEN*)CurrScreen->Pnext ) for( CurrScreen = ScreenSch; CurrScreen != NULL; CurrScreen = (BASE_SCREEN*) CurrScreen->Pnext )
{ {
for ( DrawList = CurrScreen->EEDrawList; DrawList != NULL; DrawList = DrawList->Pnext ) for( DrawList = CurrScreen->EEDrawList; DrawList != NULL; DrawList = DrawList->Pnext )
{ {
DrawList = Component = FindNextComponentAndCreatPinList(DrawList); DrawList = Component = FindNextComponentAndCreatPinList( DrawList );
if ( Component == NULL ) break; // No component left if( Component == NULL )
break; // No component left
FootprintName.Empty(); FootprintName.Empty();
if( ! Component->m_Field[FOOTPRINT].IsVoid() ) if( !Component->m_Field[FOOTPRINT].IsVoid() )
{ {
FootprintName = Component->m_Field[FOOTPRINT].m_Text; FootprintName = Component->m_Field[FOOTPRINT].m_Text;
FootprintName.Replace(wxT(" "), wxT("_")); FootprintName.Replace( wxT( " " ), wxT( "_" ) );
} }
fprintf( tmpfile, "\n$BeginComponent\n" ); fprintf( tmpfile, "\n$BeginComponent\n" );
fprintf(tmpfile, "TimeStamp=%8.8lX\n", Component->m_TimeStamp); fprintf( tmpfile, "TimeStamp=%8.8lX\n", Component->m_TimeStamp );
fprintf(tmpfile, "Footprint=%s\n", CONV_TO_UTF8(FootprintName)); fprintf( tmpfile, "Footprint=%s\n", CONV_TO_UTF8( FootprintName ) );
Line = wxT("Reference=") + Component->m_Field[REFERENCE].m_Text + wxT("\n"); Line = wxT( "Reference=" ) + Component->m_Field[REFERENCE].m_Text + wxT( "\n" );
Line.Replace(wxT(" "), wxT("_")); Line.Replace( wxT( " " ), wxT( "_" ) );
fprintf(tmpfile, CONV_TO_UTF8(Line)); fprintf( tmpfile, CONV_TO_UTF8( Line ) );
Line = Component->m_Field[VALUE].m_Text; Line = Component->m_Field[VALUE].m_Text;
Line.Replace( wxT(" "), wxT("_")); Line.Replace( wxT( " " ), wxT( "_" ) );
fprintf(tmpfile, "Value=%s\n", CONV_TO_UTF8(Line)); fprintf( tmpfile, "Value=%s\n", CONV_TO_UTF8( Line ) );
Line = Component->m_ChipName; Line = Component->m_ChipName;
Line.Replace(wxT(" "), wxT("_")); Line.Replace( wxT( " " ), wxT( "_" ) );
fprintf(tmpfile, "Libref=%s\n", CONV_TO_UTF8(Line)); fprintf( tmpfile, "Libref=%s\n", CONV_TO_UTF8( Line ) );
// Write pin list: // Write pin list:
fprintf( tmpfile, "$BeginPinList\n" ); fprintf( tmpfile, "$BeginPinList\n" );
for (ii = 0; ii < s_SortedPinCount; ii++) for( ii = 0; ii < s_SortedPinCount; ii++ )
{ {
ObjetNetListStruct *Pin = s_SortedComponentPinList[ii]; ObjetNetListStruct* Pin = s_SortedComponentPinList[ii];
if( ! Pin ) continue; if( !Pin )
netname = ReturnPinNetName(Pin, wxT("$-%.6d")); continue;
if ( netname.IsEmpty() ) netname = wxT("?"); netname = ReturnPinNetName( Pin, wxT( "$-%.6d" ) );
fprintf( tmpfile,"%.4s=%s\n",(char *)&Pin->m_PinNum, if( netname.IsEmpty() )
CONV_TO_UTF8(netname)); netname = wxT( "?" );
fprintf( tmpfile, "%.4s=%s\n", (char*) &Pin->m_PinNum,
CONV_TO_UTF8( netname ) );
} }
fprintf( tmpfile, "$EndPinList\n" ); fprintf( tmpfile, "$EndPinList\n" );
...@@ -294,7 +310,7 @@ wxString TmpFullFileName = FullFileName; ...@@ -294,7 +310,7 @@ wxString TmpFullFileName = FullFileName;
} }
} }
MyFree(s_SortedComponentPinList); MyFree( s_SortedComponentPinList );
s_SortedComponentPinList = NULL; s_SortedComponentPinList = NULL;
fprintf( tmpfile, "$EndComponentList\n" ); fprintf( tmpfile, "$EndComponentList\n" );
...@@ -303,42 +319,44 @@ wxString TmpFullFileName = FullFileName; ...@@ -303,42 +319,44 @@ wxString TmpFullFileName = FullFileName;
WriteGENERICListOfNets( tmpfile, g_TabObjNet ); WriteGENERICListOfNets( tmpfile, g_TabObjNet );
fprintf( tmpfile, "$EndNets\n" ); fprintf( tmpfile, "$EndNets\n" );
fprintf( tmpfile, "\n$EndNetlist\n" ); fprintf( tmpfile, "\n$EndNetlist\n" );
fclose(tmpfile); fclose( tmpfile );
// Call the external module (plug in ) // Call the external module (plug in )
if ( g_NetListerCommandLine.IsEmpty() ) return; if( g_NetListerCommandLine.IsEmpty() )
return;
wxString CommandFile; wxString CommandFile;
if ( wxIsAbsolutePath(g_NetListerCommandLine) ) if( wxIsAbsolutePath( g_NetListerCommandLine ) )
CommandFile = g_NetListerCommandLine; CommandFile = g_NetListerCommandLine;
else CommandFile = FindKicadFile(g_NetListerCommandLine); else
CommandFile = FindKicadFile( g_NetListerCommandLine );
CommandFile += wxT(" ") + TmpFullFileName;
CommandFile += wxT(" ") + FullFileName;
wxExecute(CommandFile, wxEXEC_SYNC); CommandFile += wxT( " " ) + TmpFullFileName;
CommandFile += wxT( " " ) + FullFileName;
wxExecute( CommandFile, wxEXEC_SYNC );
} }
/********************************************************/ /********************************************************/
static void ClearUsedFlags(WinEDA_SchematicFrame * frame) static void ClearUsedFlags( WinEDA_SchematicFrame* frame )
/********************************************************/ /********************************************************/
/* Clear flag FlagControlMulti, used in netlist generation */ /* Clear flag FlagControlMulti, used in netlist generation */
{ {
SCH_SCREEN *screen; SCH_SCREEN* screen;
EDA_BaseStruct *DrawList; EDA_BaseStruct* DrawList;
EDA_ScreenList ScreenList( NULL );
EDA_ScreenList ScreenList(NULL); for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() )
for ( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() )
{ {
DrawList = screen->EEDrawList; DrawList = screen->EEDrawList;
while ( DrawList ) while( DrawList )
{ {
if( DrawList->Type() == DRAW_LIB_ITEM_STRUCT_TYPE) if( DrawList->Type() == DRAW_LIB_ITEM_STRUCT_TYPE )
{ {
EDA_SchComponentStruct * Component = (EDA_SchComponentStruct *) DrawList; EDA_SchComponentStruct* Component = (EDA_SchComponentStruct*) DrawList;
Component->m_FlagControlMulti = 0; Component->m_FlagControlMulti = 0;
} }
DrawList = DrawList->Pnext; DrawList = DrawList->Pnext;
...@@ -346,259 +364,294 @@ EDA_BaseStruct *DrawList; ...@@ -346,259 +364,294 @@ EDA_BaseStruct *DrawList;
} }
} }
/*************************************************************/ /*************************************************************/
static void WriteNetListPspice(WinEDA_SchematicFrame * frame, FILE *f, static void WriteNetListPspice( WinEDA_SchematicFrame* frame, FILE* f,
bool use_netnames) bool use_netnames )
/*************************************************************/ /*************************************************************/
/* Routine de generation du fichier netliste ( Format PSPICE )
si use_netnames = TRUE
les nodes sont identifies par le netname
sinon les nodes sont identifies par le netnumber
tous les textes graphiques commenant par [.-+]pspice ou [.-+]gnucap /* Routine de generation du fichier netliste ( Format PSPICE )
sont considrs comme des commandes a placer dans la netliste * si use_netnames = TRUE
[.-]pspice ou gnucap sont en debut * les nodes sont identifies par le netname
* sinon les nodes sont identifies par le netnumber
*
* tous les textes graphiques commenant par [.-+]pspice ou [.-+]gnucap
* sont considrs comme des commandes a placer dans la netliste
* [.-]pspice ou gnucap sont en debut
+pspice et +gnucap sont en fin de netliste +pspice et +gnucap sont en fin de netliste
*/ */
{ {
char Line[1024]; char Line[1024];
SCH_SCREEN *screen; SCH_SCREEN* screen;
EDA_BaseStruct *DrawList; EDA_BaseStruct* DrawList;
EDA_SchComponentStruct *Component; EDA_SchComponentStruct* Component;
int ii, nbitems; int ii, nbitems;
wxString text; wxString text;
wxArrayString SpiceCommandAtBeginFile, SpiceCommandAtEndFile; wxArrayString SpiceCommandAtBeginFile, SpiceCommandAtEndFile;
wxString msg; wxString msg;
#define BUFYPOS_LEN 4 #define BUFYPOS_LEN 4
wxChar bufnum[BUFYPOS_LEN+1]; wxChar bufnum[BUFYPOS_LEN + 1];
DateAndTime(Line); DateAndTime( Line );
fprintf( f, "* %s (Spice format) creation date: %s\n\n", NETLIST_HEAD_STRING, Line ); fprintf( f, "* %s (Spice format) creation date: %s\n\n", NETLIST_HEAD_STRING, Line );
/* Create text list starting by [.-]pspice , or [.-]gnucap (simulator commands) */ /* Create text list starting by [.-]pspice , or [.-]gnucap (simulator commands) */
/* and create text list starting by [+]pspice , or [+]gnucap (simulator commands) */ /* and create text list starting by [+]pspice , or [+]gnucap (simulator commands) */
bufnum[BUFYPOS_LEN] = 0; bufnum[BUFYPOS_LEN] = 0;
EDA_ScreenList ScreenList(NULL); EDA_ScreenList ScreenList( NULL );
for ( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() )
for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() )
{ {
for ( DrawList = screen->EEDrawList; DrawList != NULL; DrawList = DrawList->Pnext ) for( DrawList = screen->EEDrawList; DrawList != NULL; DrawList = DrawList->Pnext )
{ {
wxChar ident; wxChar ident;
if ( DrawList->Type() != DRAW_TEXT_STRUCT_TYPE ) continue; if( DrawList->Type() != DRAW_TEXT_STRUCT_TYPE )
#define DRAWTEXT ((DrawTextStruct *) DrawList) continue;
text = DRAWTEXT->m_Text; if ( text.IsEmpty() ) continue; #define DRAWTEXT ( (DrawTextStruct*) DrawList )
ident = text.GetChar(0); text = DRAWTEXT->m_Text; if( text.IsEmpty() )
if ( ident != '.' && ident != '-' && ident != '+' ) continue; continue;
text.Remove(0,1); //Remove the first char. ident = text.GetChar( 0 );
text.Remove(6); //text contains 6 char. if( ident != '.' && ident != '-' && ident != '+' )
if( ( text == wxT("pspice") ) || ( text == wxT("gnucap") ) ) continue;
text.Remove( 0, 1 ); //Remove the first char.
text.Remove( 6 ); //text contains 6 char.
if( ( text == wxT( "pspice" ) ) || ( text == wxT( "gnucap" ) ) )
{ {
/* Put the Y position as an ascii string, for sort by vertical position, /* Put the Y position as an ascii string, for sort by vertical position,
using usual sort string by alphabetic value */ * using usual sort string by alphabetic value */
int ypos = DRAWTEXT->m_Pos.y; int ypos = DRAWTEXT->m_Pos.y;
for ( ii = 0; ii < BUFYPOS_LEN; ii++ ) for( ii = 0; ii < BUFYPOS_LEN; ii++ )
{ {
bufnum[BUFYPOS_LEN-1-ii] = (ypos & 63) + ' '; ypos >>= 6; bufnum[BUFYPOS_LEN - 1 - ii] = (ypos & 63) + ' '; ypos >>= 6;
} }
text = DRAWTEXT->m_Text.AfterFirst( ' ');
msg.Printf( wxT("%s %s"),bufnum, text.GetData()); // First BUFYPOS_LEN char are the Y position text = DRAWTEXT->m_Text.AfterFirst( ' ' );
if ( ident == '+' ) SpiceCommandAtEndFile.Add(msg); msg.Printf( wxT( "%s %s" ), bufnum, text.GetData() ); // First BUFYPOS_LEN char are the Y position
else SpiceCommandAtBeginFile.Add(msg); if( ident == '+' )
SpiceCommandAtEndFile.Add( msg );
else
SpiceCommandAtBeginFile.Add( msg );
} }
} }
} }
/* Print texts starting by [.-]pspice , ou [.-]gnucap (of course, without the Y position string)*/ /* Print texts starting by [.-]pspice , ou [.-]gnucap (of course, without the Y position string)*/
nbitems = SpiceCommandAtBeginFile.GetCount(); nbitems = SpiceCommandAtBeginFile.GetCount();
if ( nbitems ) if( nbitems )
{ {
SpiceCommandAtBeginFile.Sort(); SpiceCommandAtBeginFile.Sort();
for(ii= 0; ii < nbitems; ii++ ) for( ii = 0; ii < nbitems; ii++ )
{ {
SpiceCommandAtBeginFile[ii].Remove(0, BUFYPOS_LEN); SpiceCommandAtBeginFile[ii].Remove( 0, BUFYPOS_LEN );
SpiceCommandAtBeginFile[ii].Trim(TRUE); SpiceCommandAtBeginFile[ii].Trim( TRUE );
SpiceCommandAtBeginFile[ii].Trim(FALSE); SpiceCommandAtBeginFile[ii].Trim( FALSE );
fprintf( f, "%s\n", CONV_TO_UTF8(SpiceCommandAtBeginFile[ii]) ); fprintf( f, "%s\n", CONV_TO_UTF8( SpiceCommandAtBeginFile[ii] ) );
} }
} }
fprintf( f, "\n" ); fprintf( f, "\n" );
/* Create component list */ /* Create component list */
ClearUsedFlags(frame); /* Reset the flags FlagControlMulti in all schematic files*/ ClearUsedFlags( frame ); /* Reset the flags FlagControlMulti in all schematic files*/
for ( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() )
{ {
for( DrawList = screen->EEDrawList; DrawList != NULL; DrawList = DrawList->Pnext ) for( DrawList = screen->EEDrawList; DrawList != NULL; DrawList = DrawList->Pnext )
{ {
DrawList = Component = FindNextComponentAndCreatPinList(DrawList); DrawList = Component = FindNextComponentAndCreatPinList( DrawList );
if ( Component == NULL ) break; if( Component == NULL )
break;
fprintf(f, "%s ", CONV_TO_UTF8(Component->m_Field[REFERENCE].m_Text)); fprintf( f, "%s ", CONV_TO_UTF8( Component->m_Field[REFERENCE].m_Text ) );
// Write pin list: // Write pin list:
for (ii = 0; ii < s_SortedPinCount; ii++) for( ii = 0; ii < s_SortedPinCount; ii++ )
{ {
ObjetNetListStruct *Pin = s_SortedComponentPinList[ii]; ObjetNetListStruct* Pin = s_SortedComponentPinList[ii];
if( ! Pin ) continue; if( !Pin )
wxString NetName = ReturnPinNetName(Pin, wxT("N-%.6d")); continue;
if ( NetName.IsEmpty() ) NetName = wxT("?"); wxString NetName = ReturnPinNetName( Pin, wxT( "N-%.6d" ) );
if( use_netnames) fprintf( f," %s", CONV_TO_UTF8(NetName)); if( NetName.IsEmpty() )
NetName = wxT( "?" );
if( use_netnames )
fprintf( f, " %s", CONV_TO_UTF8( NetName ) );
else // Use number for net names (with net number = 0 for "GND" else // Use number for net names (with net number = 0 for "GND"
{ {
// NetName = "0" is "GND" net for Spice // NetName = "0" is "GND" net for Spice
if( NetName == wxT("0") || NetName == wxT("GND") ) if( NetName == wxT( "0" ) || NetName == wxT( "GND" ) )
fprintf( f," 0"); fprintf( f, " 0" );
else fprintf( f," %d", Pin->m_NetCode); else
fprintf( f, " %d", Pin->m_NetCode );
} }
} }
fprintf(f, " %s\n", CONV_TO_UTF8(Component->m_Field[VALUE].m_Text));
fprintf( f, " %s\n", CONV_TO_UTF8( Component->m_Field[VALUE].m_Text ) );
} }
} }
MyFree(s_SortedComponentPinList); MyFree( s_SortedComponentPinList );
s_SortedComponentPinList = NULL; s_SortedComponentPinList = NULL;
/* Print texts starting by [+]pspice , ou [+]gnucap */ /* Print texts starting by [+]pspice , ou [+]gnucap */
nbitems = SpiceCommandAtEndFile.GetCount(); nbitems = SpiceCommandAtEndFile.GetCount();
if ( nbitems ) if( nbitems )
{ {
fprintf( f, "\n" ); fprintf( f, "\n" );
SpiceCommandAtEndFile.Sort(); SpiceCommandAtEndFile.Sort();
for(ii= 0; ii < nbitems; ii++ ) for( ii = 0; ii < nbitems; ii++ )
{ {
SpiceCommandAtEndFile[ii].Remove(0, + BUFYPOS_LEN); SpiceCommandAtEndFile[ii].Remove( 0, +BUFYPOS_LEN );
SpiceCommandAtEndFile[ii].Trim(TRUE); SpiceCommandAtEndFile[ii].Trim( TRUE );
SpiceCommandAtEndFile[ii].Trim(FALSE); SpiceCommandAtEndFile[ii].Trim( FALSE );
fprintf( f, "%s\n", CONV_TO_UTF8(SpiceCommandAtEndFile[ii])); fprintf( f, "%s\n", CONV_TO_UTF8( SpiceCommandAtEndFile[ii] ) );
} }
} }
fprintf( f, "\n.end\n" ); fprintf( f, "\n.end\n" );
} }
/*****************************************************************************************/ /*****************************************************************************************/
static void WriteNetListPCBNEW(WinEDA_SchematicFrame * frame, FILE *f, bool with_pcbnew) static void WriteNetListPCBNEW( WinEDA_SchematicFrame* frame, FILE* f, bool with_pcbnew )
/*****************************************************************************************/ /*****************************************************************************************/
/* Routine de generation du fichier netliste ( Format ORCAD PCB 2 ameliore ) /* Routine de generation du fichier netliste ( Format ORCAD PCB 2 ameliore )
si with_pcbnew = FALSE * si with_pcbnew = FALSE
format PCBNEW (OrcadPcb2 + commentaires et liste des nets) * format PCBNEW (OrcadPcb2 + commentaires et liste des nets)
si with_pcbnew = FALSE * si with_pcbnew = FALSE
Format ORCADPCB2 strict * Format ORCADPCB2 strict
*/ */
{ {
wxString Line, FootprintName; wxString Line, FootprintName;
char Buf[256]; char Buf[256];
SCH_SCREEN *CurrScreen; SCH_SCREEN* CurrScreen;
EDA_BaseStruct *DrawList; EDA_BaseStruct* DrawList;
EDA_SchComponentStruct *Component; EDA_SchComponentStruct* Component;
int ii; int ii;
EDA_SchComponentStruct ** CmpList = NULL; EDA_SchComponentStruct** CmpList = NULL;
int CmpListCount = 0, CmpListSize = 1000; int CmpListCount = 0, CmpListSize = 1000;
DateAndTime(Buf); DateAndTime( Buf );
if ( with_pcbnew ) if( with_pcbnew )
fprintf( f, "# %s created %s\n(\n", NETLIST_HEAD_STRING, Buf); fprintf( f, "# %s created %s\n(\n", NETLIST_HEAD_STRING, Buf );
else fprintf( f, "( { %s created %s }\n", NETLIST_HEAD_STRING, Buf ); else
fprintf( f, "( { %s created %s }\n", NETLIST_HEAD_STRING, Buf );
/* Create netlist module section */ /* Create netlist module section */
ClearUsedFlags(frame); /* Reset the flags FlagControlMulti in all schematic files*/ ClearUsedFlags( frame ); /* Reset the flags FlagControlMulti in all schematic files*/
EDA_ScreenList ScreenList( NULL );
EDA_ScreenList ScreenList(NULL); for( CurrScreen = ScreenList.GetFirst(); CurrScreen != NULL; CurrScreen = ScreenList.GetNext() )
for ( CurrScreen = ScreenList.GetFirst(); CurrScreen != NULL; CurrScreen = ScreenList.GetNext() )
{ {
for ( DrawList = CurrScreen->EEDrawList; DrawList != NULL; DrawList = DrawList->Pnext ) for( DrawList = CurrScreen->EEDrawList; DrawList != NULL; DrawList = DrawList->Pnext )
{ {
DrawList = Component = FindNextComponentAndCreatPinList(DrawList); DrawList = Component = FindNextComponentAndCreatPinList( DrawList );
if ( Component == NULL ) break; if( Component == NULL )
break;
/* Get the Component FootprintFilter and put the component in CmpList if filter is not void */ /* Get the Component FootprintFilter and put the component in CmpList if filter is not void */
EDA_LibComponentStruct *Entry; EDA_LibComponentStruct* Entry;
if( (Entry = FindLibPart(Component->m_ChipName.GetData(),wxEmptyString,FIND_ROOT)) != NULL) if( ( Entry = FindLibPart( Component->m_ChipName.GetData(), wxEmptyString,
FIND_ROOT ) ) != NULL )
{ {
if ( Entry->m_FootprintList.GetCount() != 0 ) /* Put in list */ if( Entry->m_FootprintList.GetCount() != 0 ) /* Put in list */
{ {
if ( CmpList == NULL ) if( CmpList == NULL )
CmpList = (EDA_SchComponentStruct **) MyZMalloc(sizeof(EDA_SchComponentStruct *) * CmpListSize); CmpList = (EDA_SchComponentStruct**) MyZMalloc( sizeof(
if ( CmpListCount >= CmpListSize ) EDA_SchComponentStruct
*) * CmpListSize );
if( CmpListCount >= CmpListSize )
{ {
CmpListSize += 1000; CmpListSize += 1000;
CmpList = (EDA_SchComponentStruct **) realloc(CmpList, sizeof(EDA_SchComponentStruct *) * CmpListSize); CmpList = (EDA_SchComponentStruct**) realloc(
CmpList,
sizeof(
EDA_SchComponentStruct*)
* CmpListSize );
} }
CmpList[CmpListCount] = Component; CmpList[CmpListCount] = Component;
CmpListCount++; CmpListCount++;
} }
} }
if( ! Component->m_Field[FOOTPRINT].IsVoid() ) if( !Component->m_Field[FOOTPRINT].IsVoid() )
{ {
FootprintName = Component->m_Field[FOOTPRINT].m_Text; FootprintName = Component->m_Field[FOOTPRINT].m_Text;
FootprintName.Replace( wxT(" "), wxT("_") ); FootprintName.Replace( wxT( " " ), wxT( "_" ) );
} }
else FootprintName = wxT("$noname"); else
FootprintName = wxT( "$noname" );
Line = Component->m_Field[REFERENCE].m_Text; Line = Component->m_Field[REFERENCE].m_Text;
Line.Replace( wxT(" "), wxT("_") ); Line.Replace( wxT( " " ), wxT( "_" ) );
fprintf(f, " ( %8.8lX %s", fprintf( f, " ( %8.8lX %s",
Component->m_TimeStamp, Component->m_TimeStamp,
CONV_TO_UTF8(FootprintName)); CONV_TO_UTF8( FootprintName ) );
fprintf(f, " %s", CONV_TO_UTF8(Line)); fprintf( f, " %s", CONV_TO_UTF8( Line ) );
Line = Component->m_Field[VALUE].m_Text; Line = Component->m_Field[VALUE].m_Text;
Line.Replace( wxT(" "), wxT("_") ); Line.Replace( wxT( " " ), wxT( "_" ) );
fprintf(f, " %s", CONV_TO_UTF8(Line)); fprintf( f, " %s", CONV_TO_UTF8( Line ) );
if ( with_pcbnew ) // Add the lib name for this component if( with_pcbnew ) // Add the lib name for this component
{ {
Line = Component->m_ChipName; Line = Component->m_ChipName;
Line.Replace( wxT(" "), wxT("_") ); Line.Replace( wxT( " " ), wxT( "_" ) );
fprintf(f, " {Lib=%s}", CONV_TO_UTF8(Line)); fprintf( f, " {Lib=%s}", CONV_TO_UTF8( Line ) );
} }
fprintf(f, "\n"); fprintf( f, "\n" );
// Write pin list: // Write pin list:
for (ii = 0; ii < s_SortedPinCount; ii++) for( ii = 0; ii < s_SortedPinCount; ii++ )
{ {
ObjetNetListStruct *Pin = s_SortedComponentPinList[ii]; ObjetNetListStruct* Pin = s_SortedComponentPinList[ii];
if( ! Pin ) continue; if( !Pin )
wxString netname = ReturnPinNetName(Pin, wxT("N-%.6d")); continue;
if ( netname.IsEmpty() ) netname = wxT(" ?"); wxString netname = ReturnPinNetName( Pin, wxT( "N-%.6d" ) );
fprintf( f," ( %4.4s %s )\n",(char *)&Pin->m_PinNum, if( netname.IsEmpty() )
CONV_TO_UTF8(netname)); netname = wxT( " ?" );
fprintf( f, " ( %4.4s %s )\n", (char*) &Pin->m_PinNum,
CONV_TO_UTF8( netname ) );
} }
fprintf(f, " )\n"); fprintf( f, " )\n" );
} }
} }
fprintf( f, ")\n*\n");
MyFree(s_SortedComponentPinList); fprintf( f, ")\n*\n" );
MyFree( s_SortedComponentPinList );
s_SortedComponentPinList = NULL; s_SortedComponentPinList = NULL;
/* Write the allowed footprint list for each component */ /* Write the allowed footprint list for each component */
if ( with_pcbnew && CmpList) if( with_pcbnew && CmpList )
{ {
fprintf( f, "{ Allowed footprints by component:\n" ); fprintf( f, "{ Allowed footprints by component:\n" );
EDA_LibComponentStruct *Entry; EDA_LibComponentStruct* Entry;
for ( ii = 0; ii < CmpListCount; ii ++ ) for( ii = 0; ii < CmpListCount; ii++ )
{ {
Component = CmpList[ii]; Component = CmpList[ii];
Entry = FindLibPart(Component->m_ChipName.GetData(),wxEmptyString,FIND_ROOT); Entry = FindLibPart( Component->m_ChipName.GetData(), wxEmptyString, FIND_ROOT );
Line = Component->m_Field[REFERENCE].m_Text; Line = Component->m_Field[REFERENCE].m_Text;
Line.Replace( wxT(" "), wxT("_") ); Line.Replace( wxT( " " ), wxT( "_" ) );
fprintf(f, "$component %s\n", CONV_TO_UTF8(Line)); fprintf( f, "$component %s\n", CONV_TO_UTF8( Line ) );
/* Write the footprint list */ /* Write the footprint list */
for ( unsigned int jj = 0; jj < Entry->m_FootprintList.GetCount(); jj ++ ) for( unsigned int jj = 0; jj < Entry->m_FootprintList.GetCount(); jj++ )
{ {
fprintf(f, " %s\n", CONV_TO_UTF8(Entry->m_FootprintList[jj])); fprintf( f, " %s\n", CONV_TO_UTF8( Entry->m_FootprintList[jj] ) );
} }
fprintf(f, "$endlist\n");
fprintf( f, "$endlist\n" );
} }
fprintf(f, "$endfootprintlist\n}\n");
fprintf( f, "$endfootprintlist\n}\n" );
} }
if ( CmpList ) free(CmpList); if( CmpList )
free( CmpList );
if ( with_pcbnew ) if( with_pcbnew )
{ {
fprintf( f, "{ Pin List by Nets\n" ); fprintf( f, "{ Pin List by Nets\n" );
WriteGENERICListOfNets( f, g_TabObjNet ); WriteGENERICListOfNets( f, g_TabObjNet );
...@@ -609,28 +662,33 @@ int CmpListCount = 0, CmpListSize = 1000; ...@@ -609,28 +662,33 @@ int CmpListCount = 0, CmpListSize = 1000;
/*************************************************************************************/ /*************************************************************************************/
static void AddPinToComponentPinList( EDA_SchComponentStruct *Component, LibDrawPin *Pin) static void AddPinToComponentPinList( EDA_SchComponentStruct* Component, LibDrawPin* Pin )
/*************************************************************************************/ /*************************************************************************************/
/* Add a new pin description in the pin list s_SortedComponentPinList /* Add a new pin description in the pin list s_SortedComponentPinList
a pin description is a pointer to the corresponding structure * a pin description is a pointer to the corresponding structure
created by BuildNetList() in the table g_TabObjNet * created by BuildNetList() in the table g_TabObjNet
*/ */
{ {
int ii; int ii;
/* Search the PIN description for Pin in g_TabObjNet*/ /* Search the PIN description for Pin in g_TabObjNet*/
for (ii = 0; ii < g_NbrObjNet; ii++) for( ii = 0; ii < g_NbrObjNet; ii++ )
{ {
if ( g_TabObjNet[ii].m_Type != NET_PIN) continue; if( g_TabObjNet[ii].m_Type != NET_PIN )
if ( g_TabObjNet[ii].m_Link != Component) continue; continue;
if ( g_TabObjNet[ii].m_PinNum != Pin->m_PinNum) continue; if( g_TabObjNet[ii].m_Link != Component )
continue;
if( g_TabObjNet[ii].m_PinNum != Pin->m_PinNum )
continue;
{ {
s_SortedComponentPinList[s_SortedPinCount] = & g_TabObjNet[ii]; s_SortedComponentPinList[s_SortedPinCount] = &g_TabObjNet[ii];
s_SortedPinCount++; s_SortedPinCount++;
if (s_SortedPinCount >= MAXPIN) if( s_SortedPinCount >= MAXPIN )
{ {
/* Log message for Internal error */ /* Log message for Internal error */
DisplayError(NULL, wxT("AddPinToComponentPinList err: MAXPIN reached")); return; DisplayError( NULL, wxT( "AddPinToComponentPinList err: MAXPIN reached" ) );
return;
} }
} }
} }
...@@ -638,88 +696,100 @@ int ii; ...@@ -638,88 +696,100 @@ int ii;
/**********************************************************************/ /**********************************************************************/
static void EraseDuplicatePins(ObjetNetListStruct **TabPin, int NbrPin) static void EraseDuplicatePins( ObjetNetListStruct** TabPin, int NbrPin )
/**********************************************************************/ /**********************************************************************/
/* /*
Routine qui elimine les Pins de meme Numero de la liste des objets * Routine qui elimine les Pins de meme Numero de la liste des objets
(Liste des Pins d'un boitier) passee en entree * (Liste des Pins d'un boitier) passee en entree
Ces pins redondantes proviennent des pins (alims... ) communes a plusieurs * Ces pins redondantes proviennent des pins (alims... ) communes a plusieurs
elements d'un boitier a multiple parts. * elements d'un boitier a multiple parts.
*/ */
{ {
int ii, jj; int ii, jj;
for (ii = 0; ii < NbrPin-1; ii++) for( ii = 0; ii < NbrPin - 1; ii++ )
{ {
if( TabPin[ii] == NULL) continue; /* Deja supprime */ if( TabPin[ii] == NULL )
if( TabPin[ii]->m_PinNum != TabPin[ii+1]->m_PinNum) continue; continue; /* Deja supprime */
if( TabPin[ii]->m_PinNum != TabPin[ii + 1]->m_PinNum )
continue;
/* 2 Pins doublees */ /* 2 Pins doublees */
for( jj = ii+1; jj < NbrPin ; jj++ ) for( jj = ii + 1; jj < NbrPin; jj++ )
{ {
if( TabPin[ii]->m_PinNum != TabPin[jj]->m_PinNum) break; if( TabPin[ii]->m_PinNum != TabPin[jj]->m_PinNum )
break;
TabPin[jj] = NULL; TabPin[jj] = NULL;
} }
} }
} }
/**********************************************************************/ /**********************************************************************/
static void FindOthersUnits(EDA_SchComponentStruct *Component ) static void FindOthersUnits( EDA_SchComponentStruct* Component )
/**********************************************************************/ /**********************************************************************/
/* Recherche les autres parts du boitier auquel appartient la part Component, /* Recherche les autres parts du boitier auquel appartient la part Component,
pour les boitiers a parts multiples. * pour les boitiers a parts multiples.
Appelle AddPinToComponentPinList() pour classer les pins des parts trouvees * Appelle AddPinToComponentPinList() pour classer les pins des parts trouvees
*/ */
{ {
EDA_BaseStruct *DrawList; EDA_BaseStruct* DrawList;
EDA_SchComponentStruct *Component2; EDA_SchComponentStruct* Component2;
EDA_LibComponentStruct *Entry; EDA_LibComponentStruct* Entry;
LibEDA_BaseStruct *DEntry; LibEDA_BaseStruct* DEntry;
SCH_SCREEN * screen; SCH_SCREEN* screen;
EDA_ScreenList ScreenList(NULL); EDA_ScreenList ScreenList( NULL );
for ( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() )
for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() )
{ {
DrawList = screen->EEDrawList; DrawList = screen->EEDrawList;
while ( DrawList ) while( DrawList )
{ {
switch( DrawList->Type() ) switch( DrawList->Type() )
{ {
case DRAW_LIB_ITEM_STRUCT_TYPE : case DRAW_LIB_ITEM_STRUCT_TYPE:
Component2 = (EDA_SchComponentStruct *) DrawList; Component2 = (EDA_SchComponentStruct*) DrawList;
if ( Component2->m_FlagControlMulti == 1 ) break; if( Component2->m_FlagControlMulti == 1 )
break;
if ( Component2->m_Field[REFERENCE].m_Text.CmpNoCase( if( Component2->m_Field[REFERENCE].m_Text.CmpNoCase(
Component->m_Field[REFERENCE].m_Text) != 0 ) Component->m_Field[REFERENCE].m_Text ) != 0 )
break; break;
Entry = FindLibPart(Component2->m_ChipName.GetData(), wxEmptyString, FIND_ROOT); Entry = FindLibPart( Component2->m_ChipName.GetData(), wxEmptyString, FIND_ROOT );
if( Entry == NULL) break; if( Entry == NULL )
if( Component2->m_Field[REFERENCE].m_Text[0] == '#' ) break; break;
if( Component2->m_Field[REFERENCE].m_Text[0] == '#' )
break;
if (Entry->m_Drawings != NULL) if( Entry->m_Drawings != NULL )
{ {
DEntry = Entry->m_Drawings; DEntry = Entry->m_Drawings;
for ( ;DEntry != NULL; DEntry = DEntry->Next()) for( ; DEntry != NULL; DEntry = DEntry->Next() )
{ {
if ( DEntry->Type() != COMPONENT_PIN_DRAW_TYPE) continue; if( DEntry->Type() != COMPONENT_PIN_DRAW_TYPE )
if( DEntry->m_Unit && continue;
(DEntry->m_Unit != Component2->m_Multi) ) continue; if( DEntry->m_Unit
if( DEntry->m_Convert && && (DEntry->m_Unit != Component2->m_Multi) )
(DEntry->m_Convert != Component2->m_Convert)) continue; continue;
if( DEntry->m_Convert
&& (DEntry->m_Convert != Component2->m_Convert) )
continue;
{ {
AddPinToComponentPinList(Component2, (LibDrawPin*)DEntry); AddPinToComponentPinList( Component2, (LibDrawPin*) DEntry );
} }
} }
} }
Component2->m_FlagControlMulti = 1; Component2->m_FlagControlMulti = 1;
break; break;
default: break; default:
break;
} }
DrawList = DrawList->Pnext; DrawList = DrawList->Pnext;
} }
} }
...@@ -727,287 +797,309 @@ SCH_SCREEN * screen; ...@@ -727,287 +797,309 @@ SCH_SCREEN * screen;
/**************************************************************************/ /**************************************************************************/
static int SortPinsByNum(ObjetNetListStruct **Pin1, ObjetNetListStruct **Pin2) static int SortPinsByNum( ObjetNetListStruct** Pin1, ObjetNetListStruct** Pin2 )
/**************************************************************************/ /**************************************************************************/
/* Routine de comparaison pour le tri des pins par numero croissant /* Routine de comparaison pour le tri des pins par numero croissant
du tableau des pins s_SortedComponentPinList par qsort() * du tableau des pins s_SortedComponentPinList par qsort()
*/ */
{ {
ObjetNetListStruct * Obj1, * Obj2; ObjetNetListStruct* Obj1, * Obj2;
int Num1, Num2; int Num1, Num2;
char Line[5]; char Line[5];
Obj1 = *Pin1; Obj2 = *Pin2; Obj1 = *Pin1; Obj2 = *Pin2;
Num1 = Obj1->m_PinNum; Num2 = Obj2->m_PinNum; Num1 = Obj1->m_PinNum; Num2 = Obj2->m_PinNum;
Line[4] = 0; memcpy(Line, &Num1, 4 ); Num1 = atoi(Line); Line[4] = 0; memcpy( Line, &Num1, 4 ); Num1 = atoi( Line );
memcpy(Line, &Num2, 4 ); Num2 = atoi(Line); memcpy( Line, &Num2, 4 ); Num2 = atoi( Line );
return (Num1 - Num2); return Num1 - Num2;
} }
/*************************************************************************/ /*************************************************************************/
static void WriteGENERICListOfNets( FILE * f, ObjetNetListStruct *ObjNet ) static void WriteGENERICListOfNets( FILE* f, ObjetNetListStruct* ObjNet )
/*************************************************************************/ /*************************************************************************/
/* Ecrit dans le fichier f la liste des nets ( classee par NetCodes ), et des /* Ecrit dans le fichier f la liste des nets ( classee par NetCodes ), et des
elements qui y sont connectes * elements qui y sont connectes
*/ */
{ {
int ii, jj; int ii, jj;
int NetCode, LastNetCode = -1; int NetCode, LastNetCode = -1;
int SameNetcodeCount = 0; int SameNetcodeCount = 0;
EDA_SchComponentStruct * Cmp; EDA_SchComponentStruct* Cmp;
wxString NetName, CmpRef; wxString NetName, CmpRef;
wxString NetcodeName; wxString NetcodeName;
char FirstItemInNet[1024]; char FirstItemInNet[1024];
for (ii = 0; ii < g_NbrObjNet; ii++) for( ii = 0; ii < g_NbrObjNet; ii++ )
{ {
if( (NetCode = ObjNet[ii].m_NetCode) != LastNetCode ) // New net found, write net id; if( (NetCode = ObjNet[ii].m_NetCode) != LastNetCode ) // New net found, write net id;
{ {
SameNetcodeCount = 0; // Items count for this net SameNetcodeCount = 0; // Items count for this net
NetName.Empty(); NetName.Empty();
for (jj = 0; jj < g_NbrObjNet; jj++) // Find a label (if exists) for this net for( jj = 0; jj < g_NbrObjNet; jj++ ) // Find a label (if exists) for this net
{ {
if( ObjNet[jj].m_NetCode != NetCode) continue; if( ObjNet[jj].m_NetCode != NetCode )
if( ( ObjNet[jj].m_Type != NET_GLOBLABEL) && continue;
( ObjNet[jj].m_Type != NET_LABEL) && if( ( ObjNet[jj].m_Type != NET_GLOBLABEL)
( ObjNet[jj].m_Type != NET_PINLABEL) ) continue; && ( ObjNet[jj].m_Type != NET_LABEL)
&& ( ObjNet[jj].m_Type != NET_PINLABEL) )
continue;
NetName = * g_TabObjNet[jj].m_Label; break; NetName = *g_TabObjNet[jj].m_Label; break;
} }
NetcodeName.Printf( wxT("Net %d "), NetCode); NetcodeName.Printf( wxT( "Net %d " ), NetCode );
NetcodeName += wxT("\""); NetcodeName += wxT( "\"" );
if( ! NetName.IsEmpty() ) if( !NetName.IsEmpty() )
{ {
NetcodeName += NetName; NetcodeName += NetName;
if( g_TabObjNet[jj].m_Type != NET_PINLABEL) // usual net name, add it the sheet number if( g_TabObjNet[jj].m_Type != NET_PINLABEL ) // usual net name, add it the sheet number
NetcodeName << wxT("_") << g_TabObjNet[jj].m_SheetNumber; NetcodeName << wxT( "_" ) << g_TabObjNet[jj].m_SheetNumber;
} }
NetcodeName += wxT("\""); NetcodeName += wxT( "\"" );
LastNetCode = NetCode; LastNetCode = NetCode;
} }
if ( ObjNet[ii].m_Type != NET_PIN ) continue; if( ObjNet[ii].m_Type != NET_PIN )
continue;
Cmp = (EDA_SchComponentStruct*) ObjNet[ii].m_Link; Cmp = (EDA_SchComponentStruct*) ObjNet[ii].m_Link;
CmpRef = Cmp->m_Field[REFERENCE].m_Text; CmpRef = Cmp->m_Field[REFERENCE].m_Text;
if ( CmpRef.StartsWith( wxT("#") ) ) continue; // Pseudo component (Like Power symbol) if( CmpRef.StartsWith( wxT( "#" ) ) )
continue; // Pseudo component (Like Power symbol)
// Print the pin list for this net, if 2 or more items are connected: // Print the pin list for this net, if 2 or more items are connected:
SameNetcodeCount++; SameNetcodeCount++;
if ( SameNetcodeCount == 1 ) /* first item for this net found, if( SameNetcodeCount == 1 ) /* first item for this net found,
Print this connection, when a second item will be found */ * Print this connection, when a second item will be found */
{ {
sprintf(FirstItemInNet, " %s %.4s\n", CONV_TO_UTF8(CmpRef), sprintf( FirstItemInNet, " %s %.4s\n", CONV_TO_UTF8( CmpRef ),
(const char*) & ObjNet[ii].m_PinNum); (const char*) &ObjNet[ii].m_PinNum );
} }
if ( SameNetcodeCount == 2 ) // Second item for this net found, Print the Net name, and the first item if( SameNetcodeCount == 2 ) // Second item for this net found, Print the Net name, and the first item
{ {
fprintf( f, "%s\n", CONV_TO_UTF8(NetcodeName)); fprintf( f, "%s\n", CONV_TO_UTF8( NetcodeName ) );
fputs( FirstItemInNet, f); fputs( FirstItemInNet, f );
} }
if ( SameNetcodeCount >= 2 ) if( SameNetcodeCount >= 2 )
fprintf( f, " %s %.4s\n", CONV_TO_UTF8(CmpRef), fprintf( f, " %s %.4s\n", CONV_TO_UTF8( CmpRef ),
(const char*) & ObjNet[ii].m_PinNum); (const char*) &ObjNet[ii].m_PinNum );
} }
} }
/* Generation des netlistes au format CadStar */ /* Generation des netlistes au format CadStar */
wxString StartLine( wxT(".")); wxString StartLine( wxT( "." ) );
/*********************************************************/ /*********************************************************/
static void WriteNetListCADSTAR(WinEDA_SchematicFrame * frame, FILE *f) static void WriteNetListCADSTAR( WinEDA_SchematicFrame* frame, FILE* f )
/*********************************************************/ /*********************************************************/
/* Routine de generation du fichier netliste ( Format CADSTAR ) /* Routine de generation du fichier netliste ( Format CADSTAR )
Entete: * Entete:
..HEA * ..HEA
..TIM 2004 07 29 16 22 17 * ..TIM 2004 07 29 16 22 17
..APP "Cadstar RINF Output - Version 6.0.2.3" * ..APP "Cadstar RINF Output - Version 6.0.2.3"
..UNI INCH 1000.0 in * ..UNI INCH 1000.0 in
..TYP FULL * ..TYP FULL
*
liste des composants: * liste des composants:
..ADD_COM X1 "CNT D41612 (48PTS MC CONTOUR)" * ..ADD_COM X1 "CNT D41612 (48PTS MC CONTOUR)"
..ADD_COM U2 "74HCT245D" "74HCT245D" * ..ADD_COM U2 "74HCT245D" "74HCT245D"
*
Connexions: * Connexions:
..ADD_TER RR2 6 "$42" * ..ADD_TER RR2 6 "$42"
..TER U1 100 * ..TER U1 100
CA 6 * CA 6
*
..ADD_TER U2 6 "$59" * ..ADD_TER U2 6 "$59"
..TER U7 39 * ..TER U7 39
U6 17 * U6 17
U1 122 * U1 122
*
..ADD_TER P2 1 "$9" * ..ADD_TER P2 1 "$9"
..TER T3 1 * ..TER T3 1
U1 14 * U1 14
*/ */
{ {
wxString StartCmpDesc = StartLine + wxT("ADD_COM"); wxString StartCmpDesc = StartLine + wxT( "ADD_COM" );
wxString msg; wxString msg;
wxString FootprintName; wxString FootprintName;
char Line[1024]; char Line[1024];
BASE_SCREEN *CurrScreen; BASE_SCREEN* CurrScreen;
EDA_BaseStruct *DrawList; EDA_BaseStruct* DrawList;
EDA_SchComponentStruct *Component; EDA_SchComponentStruct* Component;
wxString Title = g_Main_Title + wxT(" ") + GetBuildVersion(); wxString Title = g_Main_Title + wxT( " " ) + GetBuildVersion();
fprintf( f, "%sHEA\n", CONV_TO_UTF8(StartLine)); fprintf( f, "%sHEA\n", CONV_TO_UTF8( StartLine ) );
DateAndTime(Line); DateAndTime( Line );
fprintf( f, "%sTIM %s\n", CONV_TO_UTF8(StartLine), Line ); fprintf( f, "%sTIM %s\n", CONV_TO_UTF8( StartLine ), Line );
fprintf( f, "%sAPP ", CONV_TO_UTF8(StartLine) ); fprintf( f, "%sAPP ", CONV_TO_UTF8( StartLine ) );
fprintf( f, "\"%s\"\n", CONV_TO_UTF8(Title) ); fprintf( f, "\"%s\"\n", CONV_TO_UTF8( Title ) );
fprintf( f, "\n"); fprintf( f, "\n" );
/* Create netlist module section */ /* Create netlist module section */
ClearUsedFlags(frame); /* Reset the flags FlagControlMulti in all schematic files*/ ClearUsedFlags( frame ); /* Reset the flags FlagControlMulti in all schematic files*/
EDA_ScreenList ScreenList(NULL); EDA_ScreenList ScreenList( NULL );
for ( CurrScreen = ScreenList.GetFirst(); CurrScreen != NULL; CurrScreen = ScreenList.GetNext() )
for( CurrScreen = ScreenList.GetFirst(); CurrScreen != NULL; CurrScreen = ScreenList.GetNext() )
{ {
for ( DrawList = CurrScreen->EEDrawList; DrawList != NULL; DrawList = DrawList->Pnext ) for( DrawList = CurrScreen->EEDrawList; DrawList != NULL; DrawList = DrawList->Pnext )
{ {
DrawList = Component = FindNextComponentAndCreatPinList(DrawList); DrawList = Component = FindNextComponentAndCreatPinList( DrawList );
if ( Component == NULL ) break; if( Component == NULL )
break;
if( ! Component->m_Field[FOOTPRINT].IsVoid() ) if( !Component->m_Field[FOOTPRINT].IsVoid() )
{ {
FootprintName = Component->m_Field[FOOTPRINT].m_Text; FootprintName = Component->m_Field[FOOTPRINT].m_Text;
FootprintName.Replace(wxT(" "), wxT("_")); FootprintName.Replace( wxT( " " ), wxT( "_" ) );
} }
else FootprintName = wxT("$noname"); else
FootprintName = wxT( "$noname" );
msg = Component->m_Field[REFERENCE].m_Text; msg = Component->m_Field[REFERENCE].m_Text;
msg.Replace( wxT(" "), wxT("_")); msg.Replace( wxT( " " ), wxT( "_" ) );
fprintf(f, "%s ", CONV_TO_UTF8(StartCmpDesc)); fprintf( f, "%s ", CONV_TO_UTF8( StartCmpDesc ) );
fprintf(f, "%s", CONV_TO_UTF8(msg)); fprintf( f, "%s", CONV_TO_UTF8( msg ) );
msg = Component->m_Field[VALUE].m_Text; msg = Component->m_Field[VALUE].m_Text;
msg.Replace(wxT(" "), wxT("_")); msg.Replace( wxT( " " ), wxT( "_" ) );
fprintf(f, " \"%s\"", CONV_TO_UTF8(msg)); fprintf( f, " \"%s\"", CONV_TO_UTF8( msg ) );
fprintf(f, "\n"); fprintf( f, "\n" );
} }
} }
fprintf( f, "\n");
MyFree(s_SortedComponentPinList); fprintf( f, "\n" );
MyFree( s_SortedComponentPinList );
s_SortedComponentPinList = NULL; s_SortedComponentPinList = NULL;
WriteListOfNetsCADSTAR( f, g_TabObjNet ); WriteListOfNetsCADSTAR( f, g_TabObjNet );
fprintf( f, "\n%sEND\n", CONV_TO_UTF8(StartLine) ); fprintf( f, "\n%sEND\n", CONV_TO_UTF8( StartLine ) );
} }
/*************************************************************************/ /*************************************************************************/
static void WriteListOfNetsCADSTAR( FILE * f, ObjetNetListStruct *ObjNet ) static void WriteListOfNetsCADSTAR( FILE* f, ObjetNetListStruct* ObjNet )
/*************************************************************************/ /*************************************************************************/
/* Ecrit dans le fichier f la liste des nets ( classee par NetCodes ), et des /* Ecrit dans le fichier f la liste des nets ( classee par NetCodes ), et des
pins qui y sont connectes * pins qui y sont connectes
format: * format:
.ADD_TER RR2 6 "$42" * .ADD_TER RR2 6 "$42"
.TER U1 100 * .TER U1 100
CA 6 * CA 6
*/ */
{ {
wxString InitNetDesc = StartLine + wxT("ADD_TER"); wxString InitNetDesc = StartLine + wxT( "ADD_TER" );
wxString StartNetDesc = StartLine + wxT("TER"); wxString StartNetDesc = StartLine + wxT( "TER" );
wxString NetcodeName, InitNetDescLine; wxString NetcodeName, InitNetDescLine;
int ii, jj, print_ter = 0; int ii, jj, print_ter = 0;
int NetCode, LastNetCode = -1; int NetCode, LastNetCode = -1;
EDA_SchComponentStruct * Cmp; EDA_SchComponentStruct* Cmp;
wxString NetName; wxString NetName;
for (ii = 0; ii < g_NbrObjNet; ii++) ObjNet[ii].m_Flag = 0; for( ii = 0; ii < g_NbrObjNet; ii++ )
ObjNet[ii].m_Flag = 0;
for (ii = 0; ii < g_NbrObjNet; ii++) for( ii = 0; ii < g_NbrObjNet; ii++ )
{ {
// Get the NetName of the current net : // Get the NetName of the current net :
if( (NetCode = ObjNet[ii].m_NetCode) != LastNetCode ) if( (NetCode = ObjNet[ii].m_NetCode) != LastNetCode )
{ {
NetName.Empty(); NetName.Empty();
for (jj = 0; jj < g_NbrObjNet; jj++) for( jj = 0; jj < g_NbrObjNet; jj++ )
{ {
if( ObjNet[jj].m_NetCode != NetCode) continue; if( ObjNet[jj].m_NetCode != NetCode )
if( ( ObjNet[jj].m_Type != NET_GLOBLABEL) && continue;
( ObjNet[jj].m_Type != NET_LABEL) && if( ( ObjNet[jj].m_Type != NET_GLOBLABEL)
( ObjNet[jj].m_Type != NET_PINLABEL) ) continue; && ( ObjNet[jj].m_Type != NET_LABEL)
&& ( ObjNet[jj].m_Type != NET_PINLABEL) )
continue;
NetName = * ObjNet[jj].m_Label; break; NetName = *ObjNet[jj].m_Label; break;
} }
NetcodeName = wxT("\"");
if( ! NetName.IsEmpty() ) NetcodeName = wxT( "\"" );
if( !NetName.IsEmpty() )
{ {
NetcodeName += NetName; NetcodeName += NetName;
if( g_TabObjNet[jj].m_Type != NET_PINLABEL) if( g_TabObjNet[jj].m_Type != NET_PINLABEL )
NetcodeName << wxT("_") << g_TabObjNet[jj].m_SheetNumber; NetcodeName << wxT( "_" ) << g_TabObjNet[jj].m_SheetNumber;
} }
else // this net has no name: create a default name $<net number> else // this net has no name: create a default name $<net number>
NetcodeName << wxT("$") << NetCode; NetcodeName << wxT( "$" ) << NetCode;
NetcodeName += wxT("\""); NetcodeName += wxT( "\"" );
LastNetCode = NetCode; LastNetCode = NetCode;
print_ter = 0; print_ter = 0;
} }
if ( ObjNet[ii].m_Type != NET_PIN ) continue; if( ObjNet[ii].m_Type != NET_PIN )
continue;
if ( ObjNet[ii].m_Flag != 0 ) continue; if( ObjNet[ii].m_Flag != 0 )
continue;
Cmp = (EDA_SchComponentStruct*) ObjNet[ii].m_Link; Cmp = (EDA_SchComponentStruct*) ObjNet[ii].m_Link;
if ( Cmp->m_Field[REFERENCE].m_Text[0] == '#' ) if( Cmp->m_Field[REFERENCE].m_Text[0] == '#' )
continue; // Pseudo composant (symboles d'alims) continue; // Pseudo composant (symboles d'alims)
switch ( print_ter ) switch( print_ter )
{ {
case 0: case 0:
{ {
char buf[5]; char buf[5];
wxString str_pinnum; wxString str_pinnum;
strncpy(buf, (char*) & ObjNet[ii].m_PinNum,4); buf[4] = 0; strncpy( buf, (char*) &ObjNet[ii].m_PinNum, 4 ); buf[4] = 0;
str_pinnum = CONV_FROM_UTF8(buf); str_pinnum = CONV_FROM_UTF8( buf );
InitNetDescLine.Printf( wxT("\n%s %s %.4s %s"), InitNetDescLine.Printf( wxT( "\n%s %s %.4s %s" ),
InitNetDesc.GetData(), InitNetDesc.GetData(),
Cmp->m_Field[REFERENCE].m_Text.GetData(), Cmp->m_Field[REFERENCE].m_Text.GetData(),
str_pinnum.GetData(), NetcodeName.GetData()); str_pinnum.GetData(), NetcodeName.GetData() );
} }
print_ter++; print_ter++;
break; break;
case 1: case 1:
fprintf( f, "%s\n", CONV_TO_UTF8(InitNetDescLine)); fprintf( f, "%s\n", CONV_TO_UTF8( InitNetDescLine ) );
fprintf( f, "%s %s %.4s\n", fprintf( f, "%s %s %.4s\n",
CONV_TO_UTF8(StartNetDesc), CONV_TO_UTF8( StartNetDesc ),
CONV_TO_UTF8(Cmp->m_Field[REFERENCE].m_Text), CONV_TO_UTF8( Cmp->m_Field[REFERENCE].m_Text ),
(char*) & ObjNet[ii].m_PinNum ); (char*) &ObjNet[ii].m_PinNum );
print_ter++; print_ter++;
break; break;
default: default:
fprintf( f, " %s %.4s\n", fprintf( f, " %s %.4s\n",
CONV_TO_UTF8(Cmp->m_Field[REFERENCE].m_Text), CONV_TO_UTF8( Cmp->m_Field[REFERENCE].m_Text ),
(char*) & ObjNet[ii].m_PinNum ); (char*) &ObjNet[ii].m_PinNum );
break; break;
} }
ObjNet[ii].m_Flag = 1; ObjNet[ii].m_Flag = 1;
// Recherche des pins redondantes et mise a 1 de m_Flag, // Recherche des pins redondantes et mise a 1 de m_Flag,
// pour ne pas generer plusieurs fois la connexion // pour ne pas generer plusieurs fois la connexion
for (jj = ii + 1; jj < g_NbrObjNet; jj++) for( jj = ii + 1; jj < g_NbrObjNet; jj++ )
{ {
if( ObjNet[jj].m_NetCode != NetCode) break; if( ObjNet[jj].m_NetCode != NetCode )
if( ObjNet[jj].m_Type != NET_PIN ) continue; break;
EDA_SchComponentStruct * tstcmp = if( ObjNet[jj].m_Type != NET_PIN )
(EDA_SchComponentStruct *) ObjNet[jj].m_Link; continue;
if( Cmp->m_Field[REFERENCE].m_Text != tstcmp->m_Field[REFERENCE].m_Text ) continue; EDA_SchComponentStruct* tstcmp =
(EDA_SchComponentStruct*) ObjNet[jj].m_Link;
if( Cmp->m_Field[REFERENCE].m_Text != tstcmp->m_Field[REFERENCE].m_Text )
continue;
if ( ObjNet[jj].m_PinNum == ObjNet[ii].m_PinNum ) ObjNet[jj].m_Flag = 1; if( ObjNet[jj].m_PinNum == ObjNet[ii].m_PinNum )
ObjNet[jj].m_Flag = 1;
} }
} }
} }
...@@ -77,6 +77,8 @@ void ObjetNetListStruct::Show( std::ostream& out, int ndx ) ...@@ -77,6 +77,8 @@ void ObjetNetListStruct::Show( std::ostream& out, int ndx )
if( m_Comp ) if( m_Comp )
m_Comp->Show( 1, out ); m_Comp->Show( 1, out );
else
out << " m_Comp==NULL\n";
out << "</netItem>\n"; out << "</netItem>\n";
} }
...@@ -294,7 +296,7 @@ void* WinEDA_SchematicFrame::BuildNetListBase() ...@@ -294,7 +296,7 @@ void* WinEDA_SchematicFrame::BuildNetListBase()
} }
#if defined(DEBUG) #if 0 && defined(DEBUG)
std::cout << "after sheet local\n"; std::cout << "after sheet local\n";
dumpNetTable(); dumpNetTable();
#endif #endif
...@@ -333,7 +335,7 @@ void* WinEDA_SchematicFrame::BuildNetListBase() ...@@ -333,7 +335,7 @@ void* WinEDA_SchematicFrame::BuildNetListBase()
} }
} }
#if defined(DEBUG) #if 0 && defined(DEBUG)
std::cout << "after sheet global\n"; std::cout << "after sheet global\n";
dumpNetTable(); dumpNetTable();
#endif #endif
...@@ -354,7 +356,7 @@ void* WinEDA_SchematicFrame::BuildNetListBase() ...@@ -354,7 +356,7 @@ void* WinEDA_SchematicFrame::BuildNetListBase()
qsort( g_TabObjNet, g_NbrObjNet, sizeof(ObjetNetListStruct), TriNetCode ); qsort( g_TabObjNet, g_NbrObjNet, sizeof(ObjetNetListStruct), TriNetCode );
#if defined(DEBUG) #if 0 && defined(DEBUG)
std::cout << "after qsort()\n"; std::cout << "after qsort()\n";
dumpNetTable(); dumpNetTable();
#endif #endif
......
...@@ -422,7 +422,7 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay() ...@@ -422,7 +422,7 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay()
SetCurItem( item ); SetCurItem( item );
} }
// If the first item is a pad or moduletext, and the 2nd item is its parent module: // If the count is 2, and first item is a pad or moduletext, and the 2nd item is its parent module:
else if( m_Collector->GetCount() == 2 && else if( m_Collector->GetCount() == 2 &&
( (*m_Collector)[0]->Type() == TYPEPAD || (*m_Collector)[0]->Type() == TYPETEXTEMODULE) && ( (*m_Collector)[0]->Type() == TYPEPAD || (*m_Collector)[0]->Type() == TYPETEXTEMODULE) &&
(*m_Collector)[1]->Type() == TYPEMODULE && (*m_Collector)[0]->GetParent()==(*m_Collector)[1] ) (*m_Collector)[1]->Type() == TYPEMODULE && (*m_Collector)[0]->GetParent()==(*m_Collector)[1] )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment