kicad/cvpcb/viewlogi.cpp

423 lines
10 KiB
C++
Raw Blame History

/********************************************************/
/* 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)
/************************************************/
int WinEDA_CvpcbFrame::ReadViewlogicWirList()
/************************************************/
{
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;
wxString msg;
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);
}
/****************************************************************/
static int ReadVLDescrCmp( char * Line, STORECMP * Cmp, int Type)
/****************************************************************/
/* 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;
}
}
}