kicad/cvpcb/genorcad.cpp

176 lines
4.4 KiB
C++

/*****************/
/* genorcad.cpp */
/*****************/
/*
* Create the netlist (* NET) by placing the *.lib ref FORMAT ORCADPCB
* The value (share value) is truncated to 16 letters.
*/
#include "fctsys.h"
#include "common.h"
#include "cvpcb.h"
#include "protos.h"
#define MAX_LEN_NETNAME 16
static void TriPinsModule( COMPONENT* CurrentCmp );
static void ChangePinNet( wxString& PinNet, bool rightJustify );
int NetNumCode; /* Number of used for NetNames created during
* reallocation of NetNames. */
int genorcad( bool rightJustify )
{
char Line[1024];
PIN* Pin;
COMPONENT* CurrentCmp;
wxString Title = wxGetApp().GetAppName() + wxT( " " ) + GetBuildVersion();
NetNumCode = 1; DateAndTime( Line );
fprintf( dest, "( { Netlist by %s, date = %s }\n",
CONV_TO_UTF8( Title ), Line );
CurrentCmp = BaseListeCmp;
for( ; CurrentCmp != NULL; CurrentCmp = CurrentCmp->Pnext )
{
fprintf( dest, " ( %s ", CONV_TO_UTF8( CurrentCmp->m_TimeStamp ) );
if( !CurrentCmp->m_Module.IsEmpty() )
fprintf( dest, CONV_TO_UTF8( CurrentCmp->m_Module ) );
else
fprintf( dest, "$noname$" );
fprintf( dest, " %s ", CONV_TO_UTF8( CurrentCmp->m_Reference ) );
fprintf( dest, "%s\n", CONV_TO_UTF8( CurrentCmp->m_Value ) );
/* Sort pins. */
TriPinsModule( CurrentCmp );
Pin = CurrentCmp->m_Pins;
for( ; Pin != NULL; Pin = Pin->Pnext )
{
if( Pin->m_PinNet.Len() > MAX_LEN_NETNAME )
ChangePinNet( Pin->m_PinNet, rightJustify );
if( !Pin->m_PinNet.IsEmpty() )
fprintf( dest, " ( %s %s )\n",
CONV_TO_UTF8( Pin->m_PinNum ),
CONV_TO_UTF8( Pin->m_PinNet ) );
else
fprintf( dest, " ( %s ? )\n", CONV_TO_UTF8( Pin->m_PinNum ) );
}
fprintf( dest, " )\n" );
}
fprintf( dest, ")\n*\n" );
fclose( dest );
return 0;
}
/* Sort pins */
static void TriPinsModule( COMPONENT* CurrentCmp )
{
PIN* Pin, * NextPin, ** BasePin;
int nbpins = 0, ii;
Pin = CurrentCmp->m_Pins;
if( Pin == NULL )
return;
for( ; Pin != NULL; Pin = Pin->Pnext )
nbpins++;
BasePin = (PIN**) MyZMalloc( nbpins * sizeof(PIN*) );
Pin = CurrentCmp->m_Pins;
for( ii = 0; ii < nbpins; ii++, Pin = Pin->Pnext )
{
BasePin[ii] = Pin;
}
qsort( BasePin, nbpins, sizeof( COMPONENT*), PinCompare );
for( ii = 0; ii < nbpins - 1; ii++ )
{
BasePin[ii]->Pnext = BasePin[ii + 1];
}
BasePin[ii]->Pnext = NULL;
CurrentCmp->m_Pins = BasePin[0];
MyFree( BasePin );
/* Remove duplicate pins. */
Pin = CurrentCmp->m_Pins;
while( Pin != NULL )
{
NextPin = Pin->Pnext;
if( NextPin == NULL )
break;
if( Pin->m_PinNum != NextPin->m_PinNum )
{
Pin = Pin->Pnext; continue;
}
/* Successive 2 pins have the same number. */
if( Pin->m_PinNet != NextPin->m_PinNet )
{
wxString msg;
msg.Printf( _( "%s %s pin %s : Different Nets" ),
CurrentCmp->m_Reference.GetData(),
CurrentCmp->m_Value.GetData(),
Pin->m_PinNum.GetData() );
DisplayError( NULL, msg, 60 );
}
Pin->Pnext = NextPin->Pnext;
delete NextPin;
}
}
/* ???
*
* Change le NetName PinNet par un nom compose des 8 derniers codes de PinNet
* suivi de _Xnnnnn ou nnnnn est un nom de 0 a 99999
*/
static void ChangePinNet( wxString& PinNet, bool rightJustify )
{
PIN* Pin;
COMPONENT* CurrentCmp;
int ii;
wxString OldName;
wxString NewName;
OldName = PinNet;
ii = PinNet.Len();
if( rightJustify ) /* Retain the last 8 letters of the name. */
{
NewName = OldName.Right( 8 ); NewName << NetNumCode;
}
else /* Retains the 8 first letters of the name. */
{
NewName = OldName.Left( 8 ); NewName << NetNumCode;
}
NetNumCode++;
CurrentCmp = BaseListeCmp;
for( ; CurrentCmp != NULL; CurrentCmp = CurrentCmp->Pnext )
{
Pin = CurrentCmp->m_Pins;
for( ; Pin != NULL; Pin = Pin->Pnext )
{
if( Pin->m_PinNet != OldName )
continue;
Pin->m_PinNet = NewName;
}
}
}