2007-06-05 12:10:51 +00:00
|
|
|
|
/********************************************************/
|
|
|
|
|
/* Traitement des netlistes VIEWLOGIC , Format WIRELIST */
|
|
|
|
|
/********************************************************/
|
|
|
|
|
|
|
|
|
|
/* Traite la netliste VIEWLOGIC au format WIRELIST
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "fctsys.h"
|
|
|
|
|
|
|
|
|
|
#include "common.h"
|
|
|
|
|
#include "cvpcb.h"
|
|
|
|
|
|
|
|
|
|
#include "protos.h"
|
|
|
|
|
|
|
|
|
|
/* routines locales : */
|
|
|
|
|
static int ReadVLDescrCmp( char * Line, STORECMP * Cmp, int Type);
|
|
|
|
|
static int ReadReelNumPin( char * Line, STORECMP * Cmp, int Type);
|
|
|
|
|
static int RegroupeUnitsComposant( STORECMP * BaseCmp );
|
|
|
|
|
static STORECMP *TraitePseudoCmp(char * Text, STORECMP *PseudoCmp, int Header);
|
|
|
|
|
static void MergePseudoCmp(STORECMP * BaseCmp, STORECMP * BasePseudoCmp);
|
|
|
|
|
|
|
|
|
|
/* Variables Locales */
|
|
|
|
|
STORECMP * BasePseudoCmp; /* Stockage des descriptions generales */
|
|
|
|
|
|
|
|
|
|
/* Identificateurs de debut de ligne */
|
|
|
|
|
#define API ( (('A'&255) << 16) | (('P'&255) << 8 ) | ('I'&255) )
|
|
|
|
|
#define AP_ ( (('A'&255) << 8) | ('P'&255) )
|
|
|
|
|
#define AS_ ( (('A'&255) << 8) | ('S'&255) )
|
|
|
|
|
#define A__ ('A' & 255)
|
|
|
|
|
#define W__ ('W' & 255)
|
|
|
|
|
#define M__ ('M' & 255)
|
|
|
|
|
#define I__ ('I' & 255)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/************************************************/
|
2007-09-13 11:55:46 +00:00
|
|
|
|
int WinEDA_CvpcbFrame::ReadViewlogicWirList()
|
2007-06-05 12:10:51 +00:00
|
|
|
|
/************************************************/
|
|
|
|
|
{
|
|
|
|
|
int ii, Type = 0, error, Header;
|
|
|
|
|
char RefDes[40], val[40], LocalRef[40], Generic[40] ;
|
|
|
|
|
char Line[1024], *Text;
|
|
|
|
|
STORECMP * Cmp, *NextCmp;
|
|
|
|
|
STORECMP * PseudoCmp = NULL;
|
2007-05-06 16:03:28 +00:00
|
|
|
|
wxString msg;
|
2007-06-05 12:10:51 +00:00
|
|
|
|
|
|
|
|
|
modified = 0;
|
|
|
|
|
Rjustify = 1;
|
|
|
|
|
|
|
|
|
|
/* Raz buffer et variable de gestion */
|
|
|
|
|
if( g_BaseListeCmp ) FreeMemoryComponants();
|
|
|
|
|
|
|
|
|
|
Cmp = NULL;
|
|
|
|
|
|
|
|
|
|
/* Ouverture du fichier source */
|
|
|
|
|
msg = _("Netlist file ") + FFileName;
|
|
|
|
|
SetStatusText(msg,0);
|
|
|
|
|
|
|
|
|
|
source = wxFopen(FFileName, wxT("rt"));
|
|
|
|
|
if (source == 0)
|
|
|
|
|
{
|
|
|
|
|
msg = _("File not found ") + FFileName;
|
|
|
|
|
DisplayError(this, msg); return(-1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Lecture entete qui doit etre "| Wirelist ..*/
|
|
|
|
|
fgets(Line,1024,source) ;
|
|
|
|
|
ii = strncmp(Line,"| Wirelist",3) ; /* net type Viewlogic */
|
|
|
|
|
|
|
|
|
|
if ( ii != 0 )
|
|
|
|
|
{
|
|
|
|
|
wxString Lineconv = CONV_FROM_UTF8(Line);
|
|
|
|
|
msg.Printf( _("Unknown file format <%s>"), Lineconv.GetData());
|
|
|
|
|
fclose(source); return(-3) ;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SetStatusText( wxT("Format Netliste ViewLogic wirelist"), 0);
|
|
|
|
|
|
|
|
|
|
/* Lecture de la liste */
|
|
|
|
|
for ( ;; )
|
|
|
|
|
{
|
|
|
|
|
if ( fgets(Line,1024,source) == 0 ) break ;
|
|
|
|
|
Text = StrPurge(Line);
|
|
|
|
|
|
|
|
|
|
Header = *Text & 255; /* Header est la copie du 1er mot de la ligne */
|
|
|
|
|
for( ii = 1; ii < 3 ; ii++ )
|
|
|
|
|
{
|
|
|
|
|
if( Text[ii] <= ' ' ) break;
|
|
|
|
|
Header <<= 8; Header |= Text[ii] & 255;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch( Header )
|
|
|
|
|
{
|
|
|
|
|
case AP_ :
|
|
|
|
|
case AS_ :
|
|
|
|
|
PseudoCmp = TraitePseudoCmp(Text, PseudoCmp, Header);
|
|
|
|
|
Type = 0;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case API :
|
|
|
|
|
if( (nbcomp <= 0 ) || (Cmp == NULL) )
|
|
|
|
|
{
|
|
|
|
|
DisplayError(NULL, wxT("Description API inattendue"), 20);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
error = ReadReelNumPin( Text, Cmp, Type );
|
|
|
|
|
if( error < 0 )
|
|
|
|
|
{
|
|
|
|
|
msg.Printf( wxT("Erreur %d ligne API"), -error );
|
|
|
|
|
DisplayError(NULL, msg,10 );
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case I__ : /* Lecture descr 1 composant */
|
|
|
|
|
if( nbcomp <= 0 )
|
|
|
|
|
{
|
|
|
|
|
DisplayError(NULL, wxT("Description Composant inattendue"), 20);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
*RefDes = 0; *val = 0;
|
|
|
|
|
ReadVLDescrCmp( Text, Cmp, Type);
|
|
|
|
|
Type = 1; /* pour lecture num pins */
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case W__ :
|
|
|
|
|
case M__ :
|
|
|
|
|
Cmp = new STORECMP();
|
|
|
|
|
Cmp->Pnext = g_BaseListeCmp;
|
|
|
|
|
g_BaseListeCmp = Cmp;
|
|
|
|
|
nbcomp++ ;
|
|
|
|
|
Type = Header;
|
|
|
|
|
Text = strtok(NULL, " \t\n\r");
|
|
|
|
|
if( Text == NULL ) break;
|
|
|
|
|
strncpy(Generic, Text, 40);
|
|
|
|
|
Text = strtok(NULL, " \n\r");
|
|
|
|
|
if( Text == NULL ) break;
|
|
|
|
|
strncpy(LocalRef, Text, 40);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
Type = 0;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fclose(source);
|
|
|
|
|
|
|
|
|
|
/* reclassement alpab<61>tique : */
|
|
|
|
|
g_BaseListeCmp = TriListeComposantss( g_BaseListeCmp, nbcomp);
|
|
|
|
|
nbcomp -= RegroupeUnitsComposant( g_BaseListeCmp );
|
|
|
|
|
|
|
|
|
|
/* Addition des renseignements issus des pseudo composants */
|
|
|
|
|
MergePseudoCmp( g_BaseListeCmp, BasePseudoCmp);
|
|
|
|
|
|
|
|
|
|
/* Renumerotation des composants */
|
|
|
|
|
Cmp = g_BaseListeCmp;
|
|
|
|
|
for( ii = 1; Cmp != NULL; ii++, Cmp = Cmp->Pnext)
|
|
|
|
|
{
|
|
|
|
|
Cmp->m_Num = ii;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Liberation memoire */
|
|
|
|
|
Cmp = BasePseudoCmp;
|
|
|
|
|
for( ; Cmp != NULL; Cmp = NextCmp )
|
|
|
|
|
{
|
|
|
|
|
NextCmp = Cmp->Pnext; delete Cmp;
|
|
|
|
|
}
|
|
|
|
|
BasePseudoCmp = NULL;
|
|
|
|
|
|
|
|
|
|
return(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/****************************************************************/
|
2007-05-06 16:03:28 +00:00
|
|
|
|
static int ReadVLDescrCmp( char * Line, STORECMP * Cmp, int Type)
|
2007-06-05 12:10:51 +00:00
|
|
|
|
/****************************************************************/
|
|
|
|
|
/* Lecture de la description d'un composant
|
|
|
|
|
(ligne commencant par I ...)
|
|
|
|
|
*/
|
|
|
|
|
{
|
|
|
|
|
char * Text, *Ident;
|
|
|
|
|
int nbpins = 0;
|
|
|
|
|
char numpin[9];
|
|
|
|
|
STOREPIN * Pin = NULL;
|
|
|
|
|
STOREPIN ** LastPin = & Cmp->m_Pins;
|
|
|
|
|
|
|
|
|
|
Text = strtok(Line, " \n\t\r`");
|
|
|
|
|
|
|
|
|
|
Text = strtok(NULL, " \n\t\r`"); /* Text pointe 1er mot utile */
|
|
|
|
|
|
|
|
|
|
Ident = strtok(NULL, " \n\t\r`"); /* Ident pointe identificateur */
|
|
|
|
|
Cmp->m_Repere = CONV_FROM_UTF8(Ident);
|
|
|
|
|
|
|
|
|
|
while ( Text )
|
|
|
|
|
{
|
|
|
|
|
Text = strtok(NULL, " \t\n\r`");
|
|
|
|
|
if( Text == NULL ) break;
|
|
|
|
|
|
|
|
|
|
if( strncmp(Text, "VALUE=" ,6) == 0 )
|
|
|
|
|
{
|
|
|
|
|
Cmp->m_Valeur = CONV_FROM_UTF8(Text+6);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if( strncmp(Text, "REFDES=",7 ) == 0 )
|
|
|
|
|
{
|
|
|
|
|
Cmp->m_Reference = CONV_FROM_UTF8(Text+7);
|
|
|
|
|
if( !isdigit(Cmp->m_Reference.Last() ) )
|
|
|
|
|
Cmp->m_Reference.RemoveLast();
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Lecture d'un net pin */
|
|
|
|
|
nbpins++;
|
|
|
|
|
Pin = (STOREPIN *)MyZMalloc( sizeof(STOREPIN) );
|
|
|
|
|
*LastPin = Pin; LastPin = &Pin->Pnext;
|
|
|
|
|
sprintf(numpin,"%d", nbpins);
|
|
|
|
|
Pin->m_Index = nbpins;
|
|
|
|
|
Pin->m_PinNum = CONV_FROM_UTF8(numpin);
|
|
|
|
|
Pin->m_PinNet = CONV_FROM_UTF8(Text);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if( Cmp->m_Valeur.IsEmpty())
|
|
|
|
|
{
|
|
|
|
|
Cmp->m_Valeur = CONV_FROM_UTF8(Ident);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Mise en place du TimeStamp init a 0 */
|
|
|
|
|
Cmp->m_TimeStamp = wxT("00000000");
|
|
|
|
|
|
|
|
|
|
/* Analyse du type */
|
|
|
|
|
switch( Type )
|
|
|
|
|
{
|
|
|
|
|
case M__: return(0);
|
|
|
|
|
case W__: return(0);
|
|
|
|
|
default: break;
|
|
|
|
|
}
|
|
|
|
|
return(-1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*********************************************************************/
|
|
|
|
|
/* int ReadReelNumPin( char * Line, STORECMP * Cmp, int Type) */
|
|
|
|
|
/*********************************************************************/
|
|
|
|
|
|
|
|
|
|
/* Lit les lignes commencant par "API" pour recuperer le vrai numero de pin
|
|
|
|
|
*/
|
|
|
|
|
static int ReadReelNumPin( char * Line, STORECMP * Cmp, int Type)
|
|
|
|
|
{
|
|
|
|
|
char * Text, *Ident;
|
|
|
|
|
int numpin;
|
|
|
|
|
STOREPIN * Pin;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if( Type != 1 ) return (-1);
|
|
|
|
|
|
|
|
|
|
Text = strtok(Line, " \n\t\r");
|
|
|
|
|
|
|
|
|
|
Ident = strtok(NULL, " \n\t\r"); /* Ident pointe identificateur */
|
|
|
|
|
|
|
|
|
|
Text = strtok(NULL, " \n\t\r"); /* Text pointe type composant */
|
|
|
|
|
|
|
|
|
|
Text = strtok(NULL, " \n\t\r"); /* pointe numero d'ordre */
|
|
|
|
|
if( Text == NULL ) return(-2);;
|
|
|
|
|
|
|
|
|
|
numpin = atoi(Text);
|
|
|
|
|
|
|
|
|
|
Text = strtok(NULL, " \n\t\r"); /* pointe Reel NumPin */
|
|
|
|
|
if( Text == NULL ) return(-3);
|
|
|
|
|
|
|
|
|
|
if( strncmp(Text, "#=" ,2) ) return (-4);
|
|
|
|
|
|
|
|
|
|
for(Pin = Cmp->m_Pins ; Pin != NULL; Pin = Pin->Pnext )
|
|
|
|
|
{
|
|
|
|
|
if( Pin->m_Type != STRUCT_PIN ) return(-5);
|
|
|
|
|
if( Pin->m_Index != numpin ) continue;
|
|
|
|
|
Pin->m_PinNum = CONV_FROM_UTF8(Text+2);
|
|
|
|
|
return(0);
|
|
|
|
|
}
|
|
|
|
|
return(-6 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************************/
|
|
|
|
|
/* int RegroupeComposant( STORECMP * BaseCmp ) */
|
|
|
|
|
/***********************************************/
|
|
|
|
|
|
|
|
|
|
/* Regroupe les pins des differentes Unites d'un meme composant
|
|
|
|
|
et modifie le chainage
|
|
|
|
|
*/
|
|
|
|
|
static int RegroupeUnitsComposant( STORECMP * BaseCmp )
|
|
|
|
|
{
|
|
|
|
|
STORECMP * Cmp = BaseCmp;
|
|
|
|
|
STORECMP * NextCmp = Cmp->Pnext;
|
|
|
|
|
STOREPIN * Pin;
|
|
|
|
|
int Deleted = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if( NextCmp == NULL ) return(0);
|
|
|
|
|
|
|
|
|
|
for( ; NextCmp != NULL; Cmp = NextCmp, NextCmp = NextCmp->Pnext )
|
|
|
|
|
{
|
|
|
|
|
if( Cmp->m_Reference != NextCmp->m_Reference ) continue;
|
|
|
|
|
/* 2 composants identiques : Pins a regrouper */
|
|
|
|
|
Deleted++;
|
|
|
|
|
Pin = Cmp->m_Pins;
|
|
|
|
|
if( Pin == NULL ) Cmp->m_Pins = NextCmp->m_Pins;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
while(Pin->Pnext) Pin = Pin->Pnext;
|
|
|
|
|
Pin->Pnext = NextCmp->m_Pins;
|
|
|
|
|
}
|
|
|
|
|
NextCmp->m_Pins = NULL;
|
|
|
|
|
Cmp->Pnext = NextCmp->Pnext;
|
|
|
|
|
(Cmp->Pnext)->Pback = Cmp;
|
|
|
|
|
delete NextCmp;
|
|
|
|
|
NextCmp = Cmp;
|
|
|
|
|
}
|
|
|
|
|
return(Deleted);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/****************************************************************************/
|
|
|
|
|
static STORECMP *TraitePseudoCmp(char * Line, STORECMP *PseudoCmp, int Header)
|
|
|
|
|
/****************************************************************************/
|
|
|
|
|
{
|
|
|
|
|
STORECMP * Cmp = PseudoCmp;
|
|
|
|
|
STOREPIN * Pin;
|
|
|
|
|
char *Text;
|
|
|
|
|
wxString Name;
|
|
|
|
|
|
|
|
|
|
Text = strtok(Line," \t\n\r");
|
|
|
|
|
Text = strtok(NULL," \t\n\r"); /* Pointe Name */
|
|
|
|
|
Name = CONV_FROM_UTF8(Text);
|
|
|
|
|
Text = strtok(NULL," \t\n\r"); /* Pointe partie utile */
|
|
|
|
|
|
|
|
|
|
if( Cmp == NULL )
|
|
|
|
|
{
|
|
|
|
|
Cmp = BasePseudoCmp = new STORECMP();
|
|
|
|
|
Cmp->m_Repere = Name;
|
|
|
|
|
Cmp->m_Valeur = Name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
else if( Name != Cmp->m_Valeur ) /* Nouveau pseudo composant */
|
|
|
|
|
{
|
|
|
|
|
Cmp = new STORECMP();
|
|
|
|
|
PseudoCmp->Pnext = Cmp;
|
|
|
|
|
Cmp->m_Valeur = Name;
|
|
|
|
|
Cmp->m_Repere = Name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch ( Header )
|
|
|
|
|
{
|
|
|
|
|
case AS_ :
|
|
|
|
|
if( strnicmp(Text,"PKG_TYPE=",9) == 0 )
|
|
|
|
|
{
|
|
|
|
|
Cmp->m_Module = CONV_FROM_UTF8(Text+9);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if( strnicmp(Text,"PARTS =",7) == 0 )
|
|
|
|
|
{
|
|
|
|
|
Cmp->m_Multi = atoi(Text+7);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if( strnicmp(Text,"REFDES=",7) == 0 )
|
|
|
|
|
{
|
|
|
|
|
Cmp->m_Reference = CONV_FROM_UTF8(Text+7);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if( strnicmp(Text,"SIGNAL=",7) == 0 )
|
|
|
|
|
{
|
|
|
|
|
Text = strtok(Text," ;=\t\n\r");
|
|
|
|
|
Text = strtok(NULL," ;=\t\n\r"); /* Pointe partie utile */
|
|
|
|
|
Pin = new STOREPIN();
|
|
|
|
|
Pin->Pnext = Cmp->m_Pins;
|
|
|
|
|
Cmp->m_Pins = Pin;
|
|
|
|
|
Pin->m_PinNet = CONV_FROM_UTF8(Text);
|
|
|
|
|
Text = strtok(NULL," ;=\t\n\r"); /* Pointe partie utile */
|
|
|
|
|
Pin->m_PinNum = CONV_FROM_UTF8(Text);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case AP_ :
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return(Cmp);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*********************************************************************/
|
|
|
|
|
static void MergePseudoCmp(STORECMP * BaseCmp, STORECMP * BasePseudoCmp)
|
|
|
|
|
/*********************************************************************/
|
|
|
|
|
/* Additionne aux composants standards les renseignements contenus
|
|
|
|
|
dans les descriptions generales
|
|
|
|
|
*/
|
|
|
|
|
{
|
|
|
|
|
STORECMP * Cmp, * PseudoCmp;
|
|
|
|
|
STOREPIN * Pin, * PseudoPin;
|
|
|
|
|
|
|
|
|
|
Cmp = BaseCmp;
|
|
|
|
|
for( ; Cmp != NULL; Cmp = Cmp->Pnext)
|
|
|
|
|
{
|
|
|
|
|
PseudoCmp = BasePseudoCmp;
|
|
|
|
|
for( ; PseudoCmp != NULL; PseudoCmp = PseudoCmp->Pnext)
|
|
|
|
|
{
|
|
|
|
|
if( Cmp->m_Repere != PseudoCmp->m_Repere ) continue;
|
|
|
|
|
/* Description trouvee, transfert des infos */
|
|
|
|
|
Cmp->m_Multi = PseudoCmp->m_Multi;
|
|
|
|
|
PseudoPin = PseudoCmp->m_Pins;
|
|
|
|
|
for ( ; PseudoPin != NULL; PseudoPin = PseudoPin->Pnext)
|
|
|
|
|
{
|
|
|
|
|
Pin = new STOREPIN(*PseudoPin);
|
|
|
|
|
Pin->Pnext = Cmp->m_Pins; Cmp->m_Pins = Pin;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|