Ajout au niveau logique des capacites, resistances et inductances.

Modifications de:

typedef struct lofig                               /* logical figure               */
  {
    struct lofig  *NEXT       ;                    /* next figure                  */
    struct chain  *MODELCHAIN ;                    /* list of models               */
    struct locon  *LOCON      ;                    /* connector list head          */
    struct losig  *LOSIG      ;                    /* signal list head             */
    struct ptype  *BKSIG      ;                    /* signal block list head       */
    struct loins  *LOINS      ;                    /* instance list head           */
    struct lotrs  *LOTRS      ;                    /* transistor list head         */
    struct locap  *LOCAP      ;                    /* capacitance list head        */
    struct lores  *LORES      ;                    /* resistance list head         */
    struct loself *LOSELF     ;                    /* inductor list head           */
    char          *NAME       ;                    /* figure name (unique)         */
    char           MODE       ;                    /* 'A' or 'P'                   */
    struct ptype  *USER       ;                    /* Application specific         */
  } lofig_list                ;


Ajout de :

***** LOCAP:

* Structure

typedef struct locap                               /* analog capacitance           */
  {
    struct locap  *NEXT       ;                    /* next capacitor               */
    struct locon  *TCON       ;                    /* top plate connector          */
    struct locon  *BCON       ;                    /* bottom plate connector       */
    char          *NAME       ;                    /* capacitor instance name      */
    double        CAPA        ;                    /* capacitor value (unite FF)   */
    char          TYPE        ;                    /* capacitor type               */
    struct ptype  *USER       ;                    /* application specific         */
  } locap_list                ;

Notes : le TYPE est necessaire pour la generation d'une netlist spice. Il existe plusieurs
types de modeles spice de capacites.

      : Les capacités parasites pourront être attachées aux signaux sur les connecteurs.


* Fonctions:

locap_list *addlocap(lofig_list *ptfig,char type,double capa,losig_list *pttcon,losig_list *ptbcon,char *name)
int dellocap(lofig_list *ptfig,locap_list *ptcap)
locap_list *getlocap(lofig_list *ptfig,const char *name)
void dellocapuser(locap_list *)


***** LORES:

* Structure

typedef struct lores                            /* analog resistor               */
  {
    struct lores  *NEXT  ;                      /* next resistor                 */
    struct locon  *RCON1 ;                      /* first connector               */
    struct locon  *RCON2 ;                      /* second connector              */
    char          *NAME  ;                      /* resistor instance name        */
    double        RESI   ;                      /* resistance value (ohms)       */
    char          TYPE   ;                      /* resistor type                 */
    struct ptype  *USER  ;                      /* application specific          */
} lores_list             ;


Note: Les capacités parasites pourront être attachées aux signaux sur les connecteurs.

* Fonctions

lores_list *addlores(lofig_list *ptfig,double resi,losig_list *ptrcon1,losig_list *ptrcon2,char *name)
int dellores(lofig_list *ptfig,lores_list *ptres)
lores_list *getlores(lofig_list *ptfig,const char *name)
void delloresuser(lores_list *)


***** LOSELF

* Structure

typedef struct loself                           /* analog inductor               */
  {
    struct loself *NEXT  ;                      /* next inductor                 */
    struct locon  *SCON1 ;                      /* first connector               */
    struct locon  *SCON2 ;                      /* second connector              */
    char          *NAME  ;                      /* inductor instance name        */
    double        SELF   ;                      /* inductance value (unite H)    */
    char          TYPE   ;                      /* inductor type                 */
    struct ptype  *USER  ;                      /* application specific          */
} loself_list            ;

Note: Les capacités parasites (PB et les résistances parasites ? le coeff de
      qualité ?) pourront être attachées aux signaux sur les connecteurs.

* Fonctions
loself_list *addloself(lofig_list *ptfig,double self,losig_list *ptscon1,losig_list *ptscon2,char *name)
int delloself(lofig_list *ptfig,loself_list *ptself)
loself_list *getloself(lofig_list *ptfig,const char *name)
void delloselfuser(loself_list *)
This commit is contained in:
Pierre Nguyen Tuong 2002-08-08 19:47:37 +00:00
parent 951d818f0d
commit 8bc0ade869
6 changed files with 1647 additions and 11 deletions

View File

@ -27,9 +27,10 @@
* Author : Frederic Petrot <Frederic.Petrot@lip6.fr> * Author : Frederic Petrot <Frederic.Petrot@lip6.fr>
* Modified by Czo <Olivier.Sirol@lip6.fr> 1997,98 * Modified by Czo <Olivier.Sirol@lip6.fr> 1997,98
* Modified by <Gregoire.Avot@lip6.fr> 1997,98 * Modified by <Gregoire.Avot@lip6.fr> 1997,98
* Modified by pnt <Pierre.Nguyen-Tuong@lip6.fr> 2002
*/ */
#ident "$Id: mbk_lo.c,v 1.1 2002/03/08 13:51:05 fred Exp $" #ident "$Id: mbk_lo.c,v 1.2 2002/08/08 19:47:37 pnt Exp $"
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
@ -73,6 +74,9 @@ char *name;
ptfig->MODELCHAIN = NULL; ptfig->MODELCHAIN = NULL;
ptfig->LOINS = NULL; ptfig->LOINS = NULL;
ptfig->LOTRS = NULL; ptfig->LOTRS = NULL;
ptfig->LOCAP = NULL;
ptfig->LORES = NULL;
ptfig->LOSELF = NULL;
ptfig->LOCON = NULL; ptfig->LOCON = NULL;
ptfig->LOSIG = NULL; ptfig->LOSIG = NULL;
ptfig->BKSIG = NULL; ptfig->BKSIG = NULL;
@ -111,6 +115,9 @@ char *name = namealloc(fname);
fig->MODELCHAIN = NULL; fig->MODELCHAIN = NULL;
fig->LOINS = NULL; fig->LOINS = NULL;
fig->LOTRS = NULL; fig->LOTRS = NULL;
fig->LOCAP = NULL;
fig->LORES = NULL;
fig->LOSELF = NULL;
fig->LOCON = NULL; fig->LOCON = NULL;
fig->LOSIG = NULL; fig->LOSIG = NULL;
fig->BKSIG = NULL; fig->BKSIG = NULL;
@ -443,6 +450,9 @@ losig_list *ptsig;
loins_list *ptins; loins_list *ptins;
locon_list *ptcon; locon_list *ptcon;
lotrs_list *pttrs; lotrs_list *pttrs;
locap_list *ptcap;
lores_list *ptres;
loself_list *ptself;
ptype_list *pt; ptype_list *pt;
char *name = namealloc(fname); char *name = namealloc(fname);
@ -503,6 +513,46 @@ void *ptold=NULL, *ptt;
dellotrsuser( pttrs ); dellotrsuser( pttrs );
mbkfree((void *)pttrs); mbkfree((void *)pttrs);
} }
for(ptcap = ptfig -> LOCAP ; ptcap != NULL ; ptcap = (locap_list *)ptold)
{
delloconuser(ptcap -> TCON) ;
delloconuser(ptcap -> BCON) ;
mbkfree((void *)ptcap -> TCON) ;
mbkfree((void *)ptcap -> BCON) ;
ptold = (void *)ptcap -> NEXT ;
dellocapuser(ptcap) ;
mbkfree((void *)ptcap) ;
}
for(ptres = ptfig -> LORES ; ptres != NULL ; ptres = (lores_list *)ptold)
{
delloconuser(ptres -> RCON1) ;
delloconuser(ptres -> RCON2) ;
mbkfree((void *)ptres -> RCON1) ;
mbkfree((void *)ptres -> RCON2) ;
ptold = (void *)ptres -> NEXT ;
delloresuser(ptres) ;
mbkfree((void *)ptres) ;
}
for(ptself = ptfig -> LOSELF ; ptself != NULL ; ptself = (loself_list *)ptold)
{
delloconuser(ptself -> SCON1) ;
delloconuser(ptself -> SCON2) ;
mbkfree((void *)ptself -> SCON1) ;
mbkfree((void *)ptself -> SCON2) ;
ptold = (void *)ptself -> NEXT ;
delloselfuser(ptself) ;
mbkfree((void *)ptself) ;
}
dellofiguser( ptfig ); dellofiguser( ptfig );
freechain(ptfig->MODELCHAIN); freechain(ptfig->MODELCHAIN);
mbkfree((void *)ptfig); mbkfree((void *)ptfig);
@ -842,6 +892,9 @@ locon_list *ptcon = NULL;
losig_list *ptsig = NULL; losig_list *ptsig = NULL;
loins_list *ptins = NULL; loins_list *ptins = NULL;
lotrs_list *pttrs = NULL; lotrs_list *pttrs = NULL;
locap_list *ptcap = NULL;
lores_list *ptres = NULL;
loself_list *ptself = NULL;
ptype_list *ptype = NULL; ptype_list *ptype = NULL;
if (ptfig->MODE == 'P') { if (ptfig->MODE == 'P') {
@ -903,6 +956,46 @@ ptype_list *ptype = NULL;
(void *)pttrs->BULK); (void *)pttrs->BULK);
} }
} }
/* scan capacitor list */
for(ptcap = ptfig -> LOCAP ; ptcap != NULL ; ptcap = ptcap -> NEXT)
{
ptsig = ptcap -> TCON -> SIG ;
ptype = getptype(ptsig -> USER,(long)LOFIGCHAIN) ;
ptype -> DATA = (void *)addchain((chain_list *)ptype -> DATA,(void *)ptcap -> TCON) ;
ptsig = ptcap -> BCON -> SIG ;
ptype = getptype(ptsig -> USER,(long)LOFIGCHAIN) ;
ptype -> DATA = (void *)addchain((chain_list *)ptype -> DATA,(void *)ptcap -> BCON) ;
}
/* scan resistor list */
for(ptres = ptfig -> LORES ; ptres != NULL ; ptres = ptres -> NEXT)
{
ptsig = ptres -> RCON1 -> SIG ;
ptype = getptype(ptsig -> USER,(long)LOFIGCHAIN) ;
ptype -> DATA = (void *)addchain((chain_list *)ptype -> DATA,(void *)ptres -> RCON1) ;
ptsig = ptres -> RCON2 -> SIG ;
ptype = getptype(ptsig -> USER,(long)LOFIGCHAIN) ;
ptype -> DATA = (void *)addchain((chain_list *)ptype -> DATA,(void *)ptres -> RCON2) ;
}
/* scan inductor list */
for(ptself = ptfig -> LOSELF ; ptself != NULL ; ptself = ptself -> NEXT)
{
ptsig = ptself -> SCON1 -> SIG ;
ptype = getptype(ptsig -> USER,(long)LOFIGCHAIN) ;
ptype -> DATA = (void *)addchain((chain_list *)ptype -> DATA,(void *)ptself -> SCON1) ;
ptsig = ptself -> SCON2 -> SIG ;
ptype = getptype(ptsig -> USER,(long)LOFIGCHAIN) ;
ptype -> DATA = (void *)addchain((chain_list *)ptype -> DATA,(void *)ptself -> SCON2) ;
}
if (DEBUG_MODE == 'Y') if (DEBUG_MODE == 'Y')
(void)printf("--- mbk --- lofigchain %s\n", ptfig -> NAME) ; (void)printf("--- mbk --- lofigchain %s\n", ptfig -> NAME) ;
} }
@ -966,6 +1059,9 @@ locon_list *ptcon;
losig_list *ptsig; losig_list *ptsig;
loins_list *ptins; loins_list *ptins;
lotrs_list *pttrs; lotrs_list *pttrs;
locap_list *ptcap;
lores_list *ptres;
loself_list *ptself;
chain_list *scanchain; chain_list *scanchain;
ptype_list *pt; ptype_list *pt;
@ -1006,6 +1102,42 @@ ptype_list *pt;
else for (pttrs = ptfig->LOTRS; pttrs; pttrs = pttrs->NEXT) else for (pttrs = ptfig->LOTRS; pttrs; pttrs = pttrs->NEXT)
viewlotrs(pttrs); viewlotrs(pttrs);
if(ptfig -> LOCAP == NULL)
{
(void)printf(" |---empty capacitor list\n") ;
}
else
{
for(ptcap = ptfig -> LOCAP ; ptcap ; ptcap = ptcap -> NEXT)
{
viewlocap(ptcap) ;
}
}
if(ptfig -> LORES == NULL)
{
(void)printf(" |---empty resistor list\n") ;
}
else
{
for(ptres = ptfig -> LORES ; ptres ; ptres = ptres -> NEXT)
{
viewlores(ptres) ;
}
}
if(ptfig -> LOSELF == NULL)
{
(void)printf(" |---empty inductor list\n") ;
}
else
{
for(ptself = ptfig -> LOSELF ; ptself ; ptself = ptself -> NEXT)
{
viewloself(ptself) ;
}
}
if (ptfig->USER != NULL) if (ptfig->USER != NULL)
{ {
(void)printf(" |---USER field\n"); (void)printf(" |---USER field\n");
@ -1154,6 +1286,15 @@ num_list *scannum;
case 'T': case 'T':
printf( "(T%c : %s) ",((lotrs_list*)((locon_list*)ptchain->DATA)->ROOT)->TYPE==TRANSN?'N':'P',((lotrs_list*)((locon_list*)ptchain->DATA)->ROOT)->TRNAME ? ((lotrs_list*)((locon_list*)ptchain->DATA)->ROOT)->TRNAME : "No name" ); printf( "(T%c : %s) ",((lotrs_list*)((locon_list*)ptchain->DATA)->ROOT)->TYPE==TRANSN?'N':'P',((lotrs_list*)((locon_list*)ptchain->DATA)->ROOT)->TRNAME ? ((lotrs_list*)((locon_list*)ptchain->DATA)->ROOT)->TRNAME : "No name" );
break; break;
case 'C':
printf( "(C%s : %s) ",((locap_list*)((locon_list*)ptchain->DATA)->ROOT)->TYPE==CAPMIM?"CAPMIM":"CAPPNWELL",((locap_list*)((locon_list*)ptchain->DATA)->ROOT)-> NAME ? ((locap_list*)((locon_list*)ptchain->DATA)->ROOT)->NAME : "No name" );
break;
case 'R':
printf( "(C%s : %s) ",((lores_list*)((locon_list*)ptchain->DATA)->ROOT)->TYPE==RESMIM?"RESMIM":"RESMIM",((lores_list*)((locon_list*)ptchain->DATA)->ROOT)-> NAME ? ((lores_list*)((locon_list*)ptchain->DATA)->ROOT)->NAME : "No name" );
break;
case 'S':
printf( "(C%s : %s) ",((loself_list*)((locon_list*)ptchain->DATA)->ROOT)->TYPE==SELFMIM?"SELFMIM":"SELFMIM",((loself_list*)((locon_list*)ptchain->DATA)->ROOT)-> NAME ? ((loself_list*)((locon_list*)ptchain->DATA)->ROOT)->NAME : "No name" );
break;
case 'I': case 'I':
printf( "(I : %s) ",((loins_list*)((locon_list*)ptchain->DATA)->ROOT)->INSNAME ? ((loins_list*)((locon_list*)ptchain->DATA)->ROOT)->INSNAME : "No name" ); printf( "(I : %s) ",((loins_list*)((locon_list*)ptchain->DATA)->ROOT)->INSNAME ? ((loins_list*)((locon_list*)ptchain->DATA)->ROOT)->INSNAME : "No name" );
break; break;
@ -1293,6 +1434,18 @@ else
(void)printf(" | | |---root : %s\n" , (void)printf(" | | |---root : %s\n" ,
((lotrs_list*)(ptcon->ROOT))->TRNAME?((lotrs_list*)(ptcon->ROOT))->TRNAME:"no transistor name" ); ((lotrs_list*)(ptcon->ROOT))->TRNAME?((lotrs_list*)(ptcon->ROOT))->TRNAME:"no transistor name" );
break; break;
case 'C':
(void)printf(" | | |---root : %s\n" ,
((locap_list*)(ptcon->ROOT))->NAME?((locap_list*)(ptcon->ROOT))->NAME:"no capacitor name" );
break;
case 'R':
(void)printf(" | | |---root : %s\n" ,
((lores_list*)(ptcon->ROOT))->NAME?((lores_list*)(ptcon->ROOT))->NAME:"no resistor name" );
break;
case 'S':
(void)printf(" | | |---root : %s\n" ,
((loself_list*)(ptcon->ROOT))->NAME?((loself_list*)(ptcon->ROOT))->NAME:"no inductor name" );
break;
default: default:
(void)printf(" | | |---root : *** BAD TYPE ***\n" ); (void)printf(" | | |---root : *** BAD TYPE ***\n" );
} }
@ -1572,3 +1725,701 @@ void dellosiguser(losig_list *ptlosig)
prev = scanptype; prev = scanptype;
} }
} }
/***********************************************************************************************/
/*********************************** Analogical World ******************************************/
/***********************************************************************************************/
/*********************************** Capacitor : add *******************************************/
locap_list *addlocap(lofig_list *ptfig,char type,double capa,losig_list *pttplate,
losig_list *ptbplate,char *name)
{
static char *tplate = NULL ;
static char *bplate = NULL ;
locap_list *ptcap = NULL ;
locon_list *ptcon = NULL ;
tplate = namealloc("tplate");
bplate = namealloc("bplate");
if((type != CAPMIM) && (type != CAPPNWELL))
{
(void)fflush(stdout) ;
(void)fprintf(stderr, "*** mbk error ***\n") ;
(void)fprintf(stderr, " illegal capacitor type : %ld\n",(long)type) ;
EXIT(1) ;
}
ptcap = (locap_list *)mbkalloc(sizeof(locap_list)) ;
ptcap -> TYPE = type ;
ptcap -> NEXT = ptfig -> LOCAP ;
ptfig -> LOCAP = ptcap ;
ptcap -> USER = NULL ;
ptcon = (locon_list *)mbkalloc(sizeof(locon_list));
ptcon -> NAME = tplate ;
ptcon -> SIG = pttplate ;
ptcon -> ROOT = (void *)ptcap ;
ptcon -> TYPE = TRANSCV2 ;
ptcon -> DIRECTION = INTERNAL ;
ptcon -> USER = NULL ;
ptcon -> PNODE = NULL ;
ptcap -> TCON = ptcon ;
ptcon = (locon_list *)mbkalloc(sizeof(locon_list)) ;
ptcon -> NAME = bplate ;
ptcon -> SIG = ptbplate ;
ptcon -> ROOT = (void *)ptcap ;
ptcon -> TYPE = TRANSCV2 ;
ptcon -> DIRECTION = INTERNAL ;
ptcon -> USER = NULL ;
ptcon -> PNODE = NULL ;
ptcap -> BCON = ptcon ;
/* No check is done for capacitor name unicity */
ptcap -> NAME = namealloc(name) ;
if(TRACE_MODE == 'Y')
{
(void)fprintf(stdout,"--- mbk --- addlocap : %s\n",type == CAPMIM ? "CAPMIM" : "CAPPNWELL") ;
}
return ptcap ;
}
/*********************************** Capacitor : del *******************************************/
int dellocap(lofig_list *ptfig,locap_list *ptcap)
{
locap_list *pt = NULL ;
locap_list *ptsav = NULL ;
for(pt = ptfig -> LOCAP ; pt != NULL ; pt = pt -> NEXT)
{
if(pt == ptcap)
{
break ;
}
ptsav = pt ;
}
if(pt == NULL)
{
return 0 ;
}
else
{
if(pt == ptfig -> LOCAP)
{
ptfig -> LOCAP = pt -> NEXT ;
}
else
{
ptsav -> NEXT = pt -> NEXT ;
}
}
if(pt -> TCON -> PNODE)
{
delrcnlocon(pt -> TCON) ;
}
delloconuser(pt -> TCON) ;
mbkfree((void *)pt -> TCON) ;
if(pt -> BCON -> PNODE)
{
delrcnlocon(pt -> BCON) ;
}
delloconuser(pt -> BCON) ;
mbkfree((void *)pt -> BCON) ;
dellocapuser(pt) ;
mbkfree((void *)pt) ;
if(TRACE_MODE == 'Y')
{
(void)fprintf(stdout, "--- mbk --- dellocap : \n") ;
}
return 1 ;
}
/*********************************** Capacitor : getlocap **************************************/
locap_list *getlocap(lofig_list *ptfig, const char *cname)
{
locap_list *ptcap = NULL ;
char *name = namealloc(cname) ;
for(ptcap = ptfig -> LOCAP ; ptcap != NULL ; ptcap = ptcap -> NEXT)
{
if(ptcap -> NAME == name)
{
return ptcap ;
}
}
(void)fflush(stdout) ;
(void)fprintf(stderr,"*** mbk error ***\n") ;
(void)fprintf(stderr,"getlocap impossible :\n") ;
(void)fprintf(stderr,"capacitor %s doesn't exist in figure %s\n",name,ptfig -> NAME) ;
EXIT(1) ;
return NULL ; /* never reached */
}
/*********************************** Capacitor : viewlocap *************************************/
void viewlocap(locap_list *ptcap)
{
(void)printf(" |---capacitor\n") ;
(void)printf(" | |---type : %s\n",IsCapMIM(ptcap->TYPE)?"MIM":"POLY/NWELL") ;
if(ptcap -> NAME != NULL)
{
(void)printf(" | |---name : %s\n", ptcap -> NAME) ;
}
else
{
(void)printf(" | |---no name\n") ;
}
if(ptcap -> TCON == NULL)
{
(void)printf(" | |--- !!! no signal on top plate !!! \n") ;
}
else
{
viewloinscon(ptcap -> TCON) ;
}
if(ptcap -> BCON == NULL)
{
(void)printf(" | |--- !!! no signal on bottom plate !!! \n") ;
}
else
{
viewloinscon(ptcap -> BCON) ;
}
(void)printf(" | |---capa : %ld\n", ptcap -> CAPA) ;
if(ptcap -> USER != NULL)
{
(void)printf(" | |---non empty USER field\n") ;
}
(void)printf(" |\n") ;
}
/*********************************** Capacitor : dellocapuser **********************************/
void dellocapuser(locap_list *ptlocap)
{
ptype_list *scanptype = NULL ;
ptype_list *next = NULL ;
ptype_list *prev = NULL ;
int del = 0 ;
for(scanptype = ptlocap -> USER ; scanptype != NULL ; scanptype = next)
{
next = scanptype -> NEXT ;
del = 0 ;
switch(scanptype -> TYPE)
{
case LOCAP_INFO : mbkfree(scanptype -> DATA) ;
del = 1 ;
break ;
default :
#ifdef MBK_TRACE_BAD_PTYPE
fprintf( stderr, "WARNING in delloconuser() : unknown ptype %ld\n",scanptype -> TYPE) ;
#endif
}
if(del)
{
if(prev != NULL)
{
ptlocap -> USER = next ;
}
else
{
prev -> NEXT = next ;
}
scanptype -> NEXT = NULL ;
freeptype(scanptype ) ;
}
else
{
prev = scanptype ;
}
}
}
/*********************************** Resistor : add ********************************************/
lores_list *addlores(lofig_list *ptfig,char type,double resi,losig_list *ptrcon1,
losig_list *ptrcon2,char *name)
{
static char *rcon1 = NULL ;
static char *rcon2 = NULL ;
lores_list *ptres = NULL ;
locon_list *ptcon = NULL ;
rcon1 = namealloc("rcon1");
rcon2 = namealloc("rcon2");
if((type != RESMIM) && (type != RESMIM))
{
(void)fflush(stdout) ;
(void)fprintf(stderr, "*** mbk error ***\n") ;
(void)fprintf(stderr, " illegal resistor type : %ld\n",(long)type) ;
EXIT(1) ;
}
ptres = (lores_list *)mbkalloc(sizeof(lores_list)) ;
ptres -> TYPE = type ;
ptres -> NEXT = ptfig -> LORES ;
ptfig -> LORES = ptres ;
ptres -> USER = NULL ;
ptcon = (locon_list *)mbkalloc(sizeof(locon_list));
ptcon -> NAME = rcon1 ;
ptcon -> SIG = ptrcon1 ;
ptcon -> ROOT = (void *)ptres ;
ptcon -> TYPE = TRANSCV3 ;
ptcon -> DIRECTION = INTERNAL ;
ptcon -> USER = NULL ;
ptcon -> PNODE = NULL ;
ptres -> RCON1 = ptcon ;
ptcon = (locon_list *)mbkalloc(sizeof(locon_list)) ;
ptcon -> NAME = rcon2 ;
ptcon -> SIG = ptrcon2 ;
ptcon -> ROOT = (void *)ptres ;
ptcon -> TYPE = TRANSCV3 ;
ptcon -> DIRECTION = INTERNAL ;
ptcon -> USER = NULL ;
ptcon -> PNODE = NULL ;
ptres -> RCON2 = ptcon ;
/* No check is done for resistor name unicity */
ptres -> NAME = namealloc(name) ;
if(TRACE_MODE == 'Y')
{
(void)fprintf(stdout,"--- mbk --- addlores : %s\n",type == RESMIM ? "RESMIM" : "RESMIM") ;
}
return ptres ;
}
/*********************************** Resistor : del ********************************************/
int dellores(lofig_list *ptfig,lores_list *ptres)
{
lores_list *pt = NULL ;
lores_list *ptsav = NULL ;
for(pt = ptfig -> LORES ; pt != NULL ; pt = pt -> NEXT)
{
if(pt == ptres)
{
break ;
}
ptsav = pt ;
}
if(pt == NULL)
{
return 0 ;
}
else
{
if(pt == ptfig -> LORES)
{
ptfig -> LORES = pt -> NEXT ;
}
else
{
ptsav -> NEXT = pt -> NEXT ;
}
}
if(pt -> RCON1 -> PNODE)
{
delrcnlocon(pt -> RCON1) ;
}
delloconuser(pt -> RCON1) ;
mbkfree((void *)pt -> RCON1) ;
if(pt -> RCON2 -> PNODE)
{
delrcnlocon(pt -> RCON2) ;
}
delloconuser(pt -> RCON2) ;
mbkfree((void *)pt -> RCON2) ;
delloresuser(pt) ;
mbkfree((void *)pt) ;
if(TRACE_MODE == 'Y')
{
(void)fprintf(stdout, "--- mbk --- dellores : \n") ;
}
return 1 ;
}
/*********************************** Resistor : getlores ***************************************/
lores_list *getlores(lofig_list *ptfig, const char *cname)
{
lores_list *ptres = NULL ;
char *name = namealloc(cname) ;
for(ptres = ptfig -> LORES ; ptres != NULL ; ptres = ptres -> NEXT)
{
if(ptres -> NAME == name)
{
return ptres ;
}
}
(void)fflush(stdout) ;
(void)fprintf(stderr,"*** mbk error ***\n") ;
(void)fprintf(stderr,"getlores impossible :\n") ;
(void)fprintf(stderr,"resistor %s doesn't exist in figure %s\n",name,ptfig -> NAME) ;
EXIT(1) ;
return NULL ; /* never reached */
}
/*********************************** Resistor : viewlores ***************************************/
void viewlores(lores_list *ptres)
{
(void)printf(" |---resistor\n") ;
(void)printf(" | |---type : %s\n",IsResMIM(ptres->TYPE)?"MIM":"POLY/NWELL") ;
if(ptres -> NAME != NULL)
{
(void)printf(" | |---name : %s\n", ptres -> NAME) ;
}
else
{
(void)printf(" | |---no name\n") ;
}
if(ptres -> RCON1 == NULL)
{
(void)printf(" | |--- !!! no signal on first connector !!! \n") ;
}
else
{
viewloinscon(ptres -> RCON1) ;
}
if(ptres -> RCON2 == NULL)
{
(void)printf(" | |--- !!! no signal on second connector !!! \n") ;
}
else
{
viewloinscon(ptres -> RCON2) ;
}
(void)printf(" | |---resi : %ld\n", ptres -> RESI) ;
if(ptres -> USER != NULL)
{
(void)printf(" | |---non empty USER field\n") ;
}
(void)printf(" |\n") ;
}
/*********************************** Resistor : delloresuser ***********************************/
void delloresuser(lores_list *ptlores)
{
ptype_list *scanptype = NULL ;
ptype_list *next = NULL ;
ptype_list *prev = NULL ;
int del = 0 ;
for(scanptype = ptlores -> USER ; scanptype != NULL ; scanptype = next)
{
next = scanptype -> NEXT ;
del = 0 ;
switch(scanptype -> TYPE)
{
case LORES_INFO : mbkfree(scanptype -> DATA) ;
del = 1 ;
break ;
default :
#ifdef MBK_TRACE_BAD_PTYPE
fprintf( stderr, "WARNING in delloconuser() : unknown ptype %ld\n",scanptype -> TYPE) ;
#endif
}
if(del)
{
if(prev != NULL)
{
ptlores -> USER = next ;
}
else
{
prev -> NEXT = next ;
}
scanptype -> NEXT = NULL ;
freeptype(scanptype ) ;
}
else
{
prev = scanptype ;
}
}
}
/*********************************** Inductor : add ********************************************/
loself_list *addloself(lofig_list *ptfig,char type,double self,losig_list *ptscon1,
losig_list *ptscon2,char *name)
{
static char *scon1 = NULL ;
static char *scon2 = NULL ;
loself_list *ptself = NULL ;
locon_list *ptcon = NULL ;
scon1 = namealloc("scon1");
scon2 = namealloc("scon2");
if((type != SELFMIM) && (type != SELFMIM))
{
(void)fflush(stdout) ;
(void)fprintf(stderr, "*** mbk error ***\n") ;
(void)fprintf(stderr, " illegal inductor type : %ld\n",(long)type) ;
EXIT(1) ;
}
ptself = (loself_list *)mbkalloc(sizeof(loself_list)) ;
ptself -> TYPE = type ;
ptself -> NEXT = ptfig -> LOSELF ;
ptfig -> LOSELF = ptself ;
ptself -> USER = NULL ;
ptcon = (locon_list *)mbkalloc(sizeof(locon_list));
ptcon -> NAME = scon1 ;
ptcon -> SIG = ptscon1 ;
ptcon -> ROOT = (void *)ptself ;
ptcon -> TYPE = TRANSCV4 ;
ptcon -> DIRECTION = INTERNAL ;
ptcon -> USER = NULL ;
ptcon -> PNODE = NULL ;
ptself -> SCON1 = ptcon ;
ptcon = (locon_list *)mbkalloc(sizeof(locon_list)) ;
ptcon -> NAME = scon2 ;
ptcon -> SIG = ptscon2 ;
ptcon -> ROOT = (void *)ptself ;
ptcon -> TYPE = TRANSCV4 ;
ptcon -> DIRECTION = INTERNAL ;
ptcon -> USER = NULL ;
ptcon -> PNODE = NULL ;
ptself -> SCON2 = ptcon ;
/* No check is done for inductor name unicity */
ptself -> NAME = namealloc(name) ;
if(TRACE_MODE == 'Y')
{
(void)fprintf(stdout,"--- mbk --- addloself : %s\n",type == SELFMIM ? "SELFMIM" : "SELFMIM") ;
}
return ptself ;
}
/*********************************** Inductor : del ********************************************/
int delloself(lofig_list *ptfig,loself_list *ptself)
{
loself_list *pt = NULL ;
loself_list *ptsav = NULL ;
for(pt = ptfig -> LOSELF ; pt != NULL ; pt = pt -> NEXT)
{
if(pt == ptself)
{
break ;
}
ptsav = pt ;
}
if(pt == NULL)
{
return 0 ;
}
else
{
if(pt == ptfig -> LOSELF)
{
ptfig -> LOSELF = pt -> NEXT ;
}
else
{
ptsav -> NEXT = pt -> NEXT ;
}
}
if(pt -> SCON1 -> PNODE)
{
delrcnlocon(pt -> SCON1) ;
}
delloconuser(pt -> SCON1) ;
mbkfree((void *)pt -> SCON1) ;
if(pt -> SCON2 -> PNODE)
{
delrcnlocon(pt -> SCON2) ;
}
delloconuser(pt -> SCON2) ;
mbkfree((void *)pt -> SCON2) ;
delloselfuser(pt) ;
mbkfree((void *)pt) ;
if(TRACE_MODE == 'Y')
{
(void)fprintf(stdout, "--- mbk --- delloself : \n") ;
}
return 1 ;
}
/*********************************** Inductor : getloself ***************************************/
loself_list *getloself(lofig_list *ptfig, const char *cname)
{
loself_list *ptself = NULL ;
char *name = namealloc(cname) ;
for(ptself = ptfig -> LOSELF ; ptself != NULL ; ptself = ptself -> NEXT)
{
if(ptself -> NAME == name)
{
return ptself ;
}
}
(void)fflush(stdout) ;
(void)fprintf(stderr,"*** mbk error ***\n") ;
(void)fprintf(stderr,"getloself impossible :\n") ;
(void)fprintf(stderr,"inductor %s doesn't exist in figure %s\n",name,ptfig -> NAME) ;
EXIT(1) ;
return NULL ; /* never reached */
}
/*********************************** Inductor : viewloself ***************************************/
void viewloself(loself_list *ptself)
{
(void)printf(" |---inductor\n") ;
(void)printf(" | |---type : %s\n",IsSelfMIM(ptself->TYPE)?"MIM":"POLY/NWELL") ;
if(ptself -> NAME != NULL)
{
(void)printf(" | |---name : %s\n", ptself -> NAME) ;
}
else
{
(void)printf(" | |---no name\n") ;
}
if(ptself -> SCON1 == NULL)
{
(void)printf(" | |--- !!! no signal on first connector !!! \n") ;
}
else
{
viewloinscon(ptself -> SCON1) ;
}
if(ptself -> SCON2 == NULL)
{
(void)printf(" | |--- !!! no signal on second connector !!! \n") ;
}
else
{
viewloinscon(ptself -> SCON2) ;
}
(void)printf(" | |---self : %ld\n", ptself -> SELF) ;
if(ptself -> USER != NULL)
{
(void)printf(" | |---non empty USER field\n") ;
}
(void)printf(" |\n") ;
}
/*********************************** Inductor : delloselfuser ***********************************/
void delloselfuser(loself_list *ptloself)
{
ptype_list *scanptype = NULL ;
ptype_list *next = NULL ;
ptype_list *prev = NULL ;
int del = 0 ;
for(scanptype = ptloself -> USER ; scanptype != NULL ; scanptype = next)
{
next = scanptype -> NEXT ;
del = 0 ;
switch(scanptype -> TYPE)
{
default :
#ifdef MBK_TRACE_BAD_PTYPE
fprintf( stderr, "WARNING in delloconuser() : unknown ptype %ld\n",scanptype -> TYPE) ;
#endif
}
if(del)
{
if(prev != NULL)
{
ptloself -> USER = next ;
}
else
{
prev -> NEXT = next ;
}
scanptype -> NEXT = NULL ;
freeptype(scanptype ) ;
}
else
{
prev = scanptype ;
}
}
}

View File

@ -26,7 +26,8 @@
* Date : 18/12/91 * Date : 18/12/91
* Author : Frederic Petrot <Frederic.Petrot@lip6.fr> * Author : Frederic Petrot <Frederic.Petrot@lip6.fr>
* Modified by Czo <Olivier.Sirol@lip6.fr> 1997,98 * Modified by Czo <Olivier.Sirol@lip6.fr> 1997,98
* $Id: mbk_lo.h,v 1.1 2002/03/08 13:51:05 fred Exp $ * Modified by pnt <Pierre.Nguyen-Tuong@lip6.fr> 2002
* $Id: mbk_lo.h,v 1.2 2002/08/08 19:47:37 pnt Exp $
*/ */
#ifndef _MBK_LO_H_ #ifndef _MBK_LO_H_
@ -68,6 +69,30 @@
extern void viewlosig __P((losig_list *ptsig)); extern void viewlosig __P((losig_list *ptsig));
extern void viewlotrs __P((lotrs_list *pttrs)); extern void viewlotrs __P((lotrs_list *pttrs));
/*************************** Analogical world ***************************************/
extern locap_list *addlocap __P((lofig_list *ptfig,char type,double capa,losig_list *pttplate,
losig_list *ptbplate,char *name)) ;
extern int dellocap __P((lofig_list *ptfig,locap_list *ptcap)) ;
extern locap_list *getlocap __P((lofig_list *ptfig,const char *name)) ;
extern void dellocapuser __P((locap_list *)) ;
extern void viewlocap __P((locap_list *ptcap)) ;
extern lores_list *addlores __P((lofig_list *ptfig,char type,double resi,losig_list *ptrcon1,
losig_list *ptrcon2,char *name)) ;
extern int dellores __P((lofig_list *ptfig,lores_list *ptres)) ;
extern lores_list *getlores __P((lofig_list *ptfig,const char *name)) ;
extern void delloresuser __P((lores_list *)) ;
extern void viewlores __P((lores_list *ptres)) ;
extern loself_list *addloself __P((lofig_list *ptfig,char type,double self,losig_list *ptscon1,
losig_list *ptscon2,char *name)) ;
extern int delloself __P((lofig_list *ptfig,loself_list *ptself)) ;
extern loself_list *getloself __P((lofig_list *ptfig,const char *name)) ;
extern void delloselfuser __P((loself_list *)) ;
extern void viewloself __P((loself_list *ptself)) ;
/************************************************************************************/
#endif #endif

View File

@ -28,7 +28,7 @@
* Modified by Czo <Olivier.Sirol@lip6.fr> 1997,98 * Modified by Czo <Olivier.Sirol@lip6.fr> 1997,98
*/ */
#ident "$Id: mbk_lo_util.c,v 1.1 2002/03/08 13:51:05 fred Exp $" #ident "$Id: mbk_lo_util.c,v 1.2 2002/08/08 19:47:37 pnt Exp $"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -71,6 +71,9 @@ char *figname = namealloc(fname);
ptfig->MODELCHAIN = NULL; ptfig->MODELCHAIN = NULL;
ptfig->LOINS = NULL; ptfig->LOINS = NULL;
ptfig->LOTRS = NULL; ptfig->LOTRS = NULL;
ptfig->LOCAP = NULL;
ptfig->LORES = NULL;
ptfig->LOSELF = NULL;
ptfig->LOCON = NULL; ptfig->LOCON = NULL;
ptfig->LOSIG = NULL; ptfig->LOSIG = NULL;
ptfig->BKSIG = NULL; ptfig->BKSIG = NULL;
@ -186,6 +189,9 @@ void flattenlofig(lofig_list *ptfig, const char *iname, char concat)
int verif; int verif;
lotrs_list *scantrs; lotrs_list *scantrs;
locap_list *scancap;
lores_list *scanres;
loself_list *scanself;
loins_list *scanins; loins_list *scanins;
int i; int i;
@ -941,6 +947,90 @@ while(ptfig->LOINS != NULL)
scanchain->DATA = concatname( insname, (char*)(scanchain->DATA) ); scanchain->DATA = concatname( insname, (char*)(scanchain->DATA) );
} }
} }
for(scancap = figins -> LOCAP ; scancap != NULL ; scancap = scancap -> NEXT)
{
if(scancap -> NAME != NULL)
{
scancap -> NAME = concatname(insname,scancap -> NAME) ;
}
ptptype = getptype(scancap -> TCON -> USER,PNODENAME) ;
if(ptptype)
{
for(scanchain = (chain_list *)(ptptype -> DATA) ; scanchain ; scanchain = scanchain->NEXT)
{
scanchain -> DATA = concatname(insname,(char *)(scanchain -> DATA)) ;
}
}
ptptype = getptype( scancap -> BCON -> USER,PNODENAME) ;
if(ptptype)
{
for(scanchain = (chain_list *)(ptptype -> DATA) ; scanchain ; scanchain = scanchain->NEXT)
{
scanchain -> DATA = concatname(insname,(char *)(scanchain -> DATA)) ;
}
}
}
for(scanres = figins -> LORES ; scanres != NULL ; scanres = scanres -> NEXT)
{
if(scanres -> NAME != NULL)
{
scanres -> NAME = concatname(insname,scanres -> NAME) ;
}
ptptype = getptype(scanres -> RCON1 -> USER,PNODENAME) ;
if(ptptype)
{
for(scanchain = (chain_list *)(ptptype -> DATA) ; scanchain ; scanchain = scanchain->NEXT)
{
scanchain -> DATA = concatname(insname,(char *)(scanchain -> DATA)) ;
}
}
ptptype = getptype( scanres -> RCON2 -> USER,PNODENAME) ;
if(ptptype)
{
for(scanchain = (chain_list *)(ptptype -> DATA) ; scanchain ; scanchain = scanchain->NEXT)
{
scanchain -> DATA = concatname(insname,(char *)(scanchain -> DATA)) ;
}
}
}
for(scanself = figins -> LOSELF ; scanself != NULL ; scanself = scanself -> NEXT)
{
if(scanself -> NAME != NULL)
{
scanself -> NAME = concatname(insname,scanself -> NAME) ;
}
ptptype = getptype(scanself -> SCON1 -> USER,PNODENAME) ;
if(ptptype)
{
for(scanchain = (chain_list *)(ptptype -> DATA) ; scanchain ; scanchain = scanchain->NEXT)
{
scanchain -> DATA = concatname(insname,(char *)(scanchain -> DATA)) ;
}
}
ptptype = getptype( scanself -> SCON2 -> USER,PNODENAME) ;
if(ptptype)
{
for(scanchain = (chain_list *)(ptptype -> DATA) ; scanchain ; scanchain = scanchain->NEXT)
{
scanchain -> DATA = concatname(insname,(char *)(scanchain -> DATA)) ;
}
}
}
} }
for( scanins = figins->LOINS ; scanins ; scanins = scanins->NEXT ) for( scanins = figins->LOINS ; scanins ; scanins = scanins->NEXT )
@ -959,9 +1049,23 @@ while(ptfig->LOINS != NULL)
ptfig->LOTRS = (lotrs_list*)append( (chain_list*)figins->LOTRS, ptfig->LOTRS = (lotrs_list*)append( (chain_list*)figins->LOTRS,
(chain_list*)ptfig->LOTRS ); (chain_list*)ptfig->LOTRS );
ptfig->LOCAP = (locap_list*)append( (chain_list*)figins->LOCAP,
(chain_list*)ptfig->LOCAP );
ptfig->LORES = (lores_list*)append( (chain_list*)figins->LORES,
(chain_list*)ptfig->LORES );
ptfig->LOSELF = (loself_list*)append( (chain_list*)figins->LOSELF,
(chain_list*)ptfig->LOSELF );
figins->LOINS = NULL; figins->LOINS = NULL;
figins->LOTRS = NULL; figins->LOTRS = NULL;
figins->LOCAP = NULL;
figins->LORES = NULL;
figins->LOSELF = NULL;
for( scanlocon = figins->LOCON ; scanlocon ; scanlocon = nextlocon ) for( scanlocon = figins->LOCON ; scanlocon ; scanlocon = nextlocon )
{ {
nextlocon = scanlocon->NEXT; nextlocon = scanlocon->NEXT;
@ -989,6 +1093,9 @@ while(ptfig->LOINS != NULL)
figins->BKSIG || figins->BKSIG ||
figins->LOINS || figins->LOINS ||
figins->LOTRS || figins->LOTRS ||
figins->LOCAP ||
figins->LORES ||
figins->LOSELF ||
figins->USER ) figins->USER )
{ {
fflush( stdout ); fflush( stdout );
@ -2124,7 +2231,18 @@ struct typoin /* structure used by dast_dbg */
#define VHD_ptypeDFN 34 #define VHD_ptypeDFN 34
#define VHD_dataDFN 35 #define VHD_dataDFN 35
#define VHD_MAXDFN 37 #define VHD_locapDFN 36
#define VHD_loresDFN 37
#define VHD_loselfDFN 38
#define VHD_tconDFN 39
#define VHD_bconDFN 40
#define VHD_rcon1DFN 41
#define VHD_rcon2DFN 42
#define VHD_scon1DFN 43
#define VHD_scon2DFN 44
#define VHD_MAXDFN 45
static int vhd_getcmd(); static int vhd_getcmd();
static int vhd_hash(); static int vhd_hash();
@ -2162,6 +2280,10 @@ char *stru_name;
struct loins *loins_pnt; struct loins *loins_pnt;
struct lotrs *lotrs_pnt; struct lotrs *lotrs_pnt;
struct locap *locap_pnt;
struct lores *lores_pnt;
struct loself *loself_pnt;
key[VHD_lofigDFN] = vhd_hash ("lofig"); key[VHD_lofigDFN] = vhd_hash ("lofig");
key[VHD_nextDFN] = vhd_hash ("next"); key[VHD_nextDFN] = vhd_hash ("next");
key[VHD_modelchainDFN] = vhd_hash ("modelchain"); key[VHD_modelchainDFN] = vhd_hash ("modelchain");
@ -2193,6 +2315,16 @@ key[VHD_capaDFN] = vhd_hash ("capa");
key[VHD_indexDFN] = vhd_hash ("index"); key[VHD_indexDFN] = vhd_hash ("index");
key[VHD_ptypeDFN] = vhd_hash ("ptype"); key[VHD_ptypeDFN] = vhd_hash ("ptype");
key[VHD_locapDFN] = vhd_hash ("locap");
key[VHD_loresDFN] = vhd_hash ("lores");
key[VHD_loselfDFN] = vhd_hash ("loself");
key[VHD_tconDFN] = vhd_hash ("tcon");
key[VHD_bconDFN] = vhd_hash ("bcon");
key[VHD_rcon1DFN] = vhd_hash ("rcon1");
key[VHD_rcon2DFN] = vhd_hash ("rcon2");
key[VHD_scon1DFN] = vhd_hash ("scon1");
key[VHD_scon2DFN] = vhd_hash ("scon2");
/* ###------------------------------------------------------### */ /* ###------------------------------------------------------### */
/* Set of predefined commands */ /* Set of predefined commands */
/* ###------------------------------------------------------### */ /* ###------------------------------------------------------### */
@ -2311,6 +2443,27 @@ key[VHD_ptypeDFN] = vhd_hash ("ptype");
nxt[VHD_lotrsDFN] = (void *)lofig_pnt->LOTRS; nxt[VHD_lotrsDFN] = (void *)lofig_pnt->LOTRS;
typ[VHD_lotrsDFN] = VHD_lotrsDFN; typ[VHD_lotrsDFN] = VHD_lotrsDFN;
} }
if (lofig_pnt->LOCAP != NULL)
{
tab[VHD_locapDFN] = avail;
nxt[VHD_locapDFN] = (void *)lofig_pnt->LOCAP;
typ[VHD_locapDFN] = VHD_locapDFN;
}
if (lofig_pnt->LORES != NULL)
{
tab[VHD_loresDFN] = avail;
nxt[VHD_loresDFN] = (void *)lofig_pnt->LORES;
typ[VHD_loresDFN] = VHD_loresDFN;
}
if (lofig_pnt->LOSELF != NULL)
{
tab[VHD_loselfDFN] = avail;
nxt[VHD_loselfDFN] = (void *)lofig_pnt->LOSELF;
typ[VHD_loselfDFN] = VHD_loselfDFN;
}
if (lofig_pnt->USER != NULL) if (lofig_pnt->USER != NULL)
{ {
tab[VHD_userDFN] = avail; tab[VHD_userDFN] = avail;
@ -2333,6 +2486,11 @@ key[VHD_ptypeDFN] = vhd_hash ("ptype");
(void)printf ("-> bksig : %s\n",tab[VHD_bksigDFN]); (void)printf ("-> bksig : %s\n",tab[VHD_bksigDFN]);
(void)printf ("-> loins : %s\n",tab[VHD_loinsDFN]); (void)printf ("-> loins : %s\n",tab[VHD_loinsDFN]);
(void)printf ("-> lotrs : %s\n",tab[VHD_lotrsDFN]); (void)printf ("-> lotrs : %s\n",tab[VHD_lotrsDFN]);
(void)printf ("-> locap : %s\n",tab[VHD_locapDFN]);
(void)printf ("-> lores : %s\n",tab[VHD_loresDFN]);
(void)printf ("-> loself : %s\n",tab[VHD_loselfDFN]);
(void)printf ("-> user : %s\n",tab[VHD_userDFN]); (void)printf ("-> user : %s\n",tab[VHD_userDFN]);
(void)printf ("-> next : %s\n",tab[VHD_nextDFN]); (void)printf ("-> next : %s\n",tab[VHD_nextDFN]);
@ -2395,6 +2553,126 @@ key[VHD_ptypeDFN] = vhd_hash ("ptype");
break; break;
case (VHD_locapDFN):
/* ###--------- locap ---------### */
locap_pnt = (struct locap *)(current_pnt.data);
if (locap_pnt->NEXT != NULL)
{
tab[VHD_nextDFN] = avail;
nxt[VHD_nextDFN] = (void *)locap_pnt->NEXT;
typ[VHD_nextDFN] = VHD_locapDFN;
}
if (locap_pnt->TCON != NULL)
{
tab[VHD_tconDFN] = avail;
nxt[VHD_tconDFN] = (void *)locap_pnt->TCON;
typ[VHD_tconDFN] = VHD_loconDFN;
}
if (locap_pnt->BCON != NULL)
{
tab[VHD_bconDFN] = avail;
nxt[VHD_bconDFN] = (void *)locap_pnt->BCON;
typ[VHD_bconDFN] = VHD_loconDFN;
}
if (locap_pnt->USER != NULL)
{
tab[VHD_userDFN] = avail;
nxt[VHD_userDFN] = (void *)locap_pnt->USER;
typ[VHD_userDFN] = VHD_ptypeDFN;
}
(void)printf ("-> tcon : %s\n",tab[VHD_tconDFN]);
(void)printf ("-> bcon : %s\n",tab[VHD_bconDFN]);
(void)printf (" type : %c\n",locap_pnt->TYPE);
(void)printf ("-> user : %s\n",tab[VHD_userDFN]);
(void)printf ("-> next : %s\n",tab[VHD_nextDFN]);
break;
case (VHD_loresDFN):
/* ###--------- lores ---------### */
lores_pnt = (struct lores *)(current_pnt.data);
if (lores_pnt->NEXT != NULL)
{
tab[VHD_nextDFN] = avail;
nxt[VHD_nextDFN] = (void *)lores_pnt->NEXT;
typ[VHD_nextDFN] = VHD_loresDFN;
}
if (lores_pnt->RCON1 != NULL)
{
tab[VHD_rcon1DFN] = avail;
nxt[VHD_rcon1DFN] = (void *)lores_pnt->RCON1;
typ[VHD_rcon1DFN] = VHD_loconDFN;
}
if (lores_pnt->RCON2 != NULL)
{
tab[VHD_rcon2DFN] = avail;
nxt[VHD_rcon2DFN] = (void *)lores_pnt->RCON2;
typ[VHD_rcon2DFN] = VHD_loconDFN;
}
if (lores_pnt->USER != NULL)
{
tab[VHD_userDFN] = avail;
nxt[VHD_userDFN] = (void *)lores_pnt->USER;
typ[VHD_userDFN] = VHD_ptypeDFN;
}
(void)printf ("-> rcon1 : %s\n",tab[VHD_rcon1DFN]);
(void)printf ("-> rcon2 : %s\n",tab[VHD_rcon2DFN]);
(void)printf (" type : %c\n",lores_pnt->TYPE);
(void)printf ("-> user : %s\n",tab[VHD_userDFN]);
(void)printf ("-> next : %s\n",tab[VHD_nextDFN]);
break;
case (VHD_loselfDFN):
/* ###--------- loself ---------### */
loself_pnt = (struct loself *)(current_pnt.data);
if (loself_pnt->NEXT != NULL)
{
tab[VHD_nextDFN] = avail;
nxt[VHD_nextDFN] = (void *)loself_pnt->NEXT;
typ[VHD_nextDFN] = VHD_loselfDFN;
}
if (loself_pnt->SCON1 != NULL)
{
tab[VHD_scon1DFN] = avail;
nxt[VHD_scon1DFN] = (void *)loself_pnt->SCON1;
typ[VHD_scon1DFN] = VHD_loconDFN;
}
if (loself_pnt->SCON2 != NULL)
{
tab[VHD_scon2DFN] = avail;
nxt[VHD_scon2DFN] = (void *)loself_pnt->SCON2;
typ[VHD_scon2DFN] = VHD_loconDFN;
}
if (loself_pnt->USER != NULL)
{
tab[VHD_userDFN] = avail;
nxt[VHD_userDFN] = (void *)loself_pnt->USER;
typ[VHD_userDFN] = VHD_ptypeDFN;
}
(void)printf ("-> scon1 : %s\n",tab[VHD_scon1DFN]);
(void)printf ("-> scon2 : %s\n",tab[VHD_scon2DFN]);
(void)printf (" type : %c\n",loself_pnt->TYPE);
(void)printf ("-> user : %s\n",tab[VHD_userDFN]);
(void)printf ("-> next : %s\n",tab[VHD_nextDFN]);
break;
case (VHD_loinsDFN): case (VHD_loinsDFN):
/* ###--------- loins ---------### */ /* ###--------- loins ---------### */
@ -2974,7 +3252,7 @@ lofig_list *lofig_ptr;
/* contents : duplicate a lofig and return a pointer on the new */ /* contents : duplicate a lofig and return a pointer on the new */
/* structure. */ /* structure. */
/* called func. : mbkalloc(), dupchainlst(), */ /* called func. : mbkalloc(), dupchainlst(), */
/* note : the LOCON, LOSIG, BKSIG, LOINS, LOTRS pointers are */ /* note : the LOCON, LOSIG, BKSIG, LOINS, LOTRS, LOCAP, LORES, LOSELF pointers are */
/* also duplicated */ /* also duplicated */
/*##------------------------------------------------------------------##*/ /*##------------------------------------------------------------------##*/
@ -2994,6 +3272,9 @@ lofig_list *lofig_ptr;
lofig_rpt->BKSIG = lofig_ptr->BKSIG; lofig_rpt->BKSIG = lofig_ptr->BKSIG;
lofig_rpt->LOINS = lofig_ptr->LOINS; lofig_rpt->LOINS = lofig_ptr->LOINS;
lofig_rpt->LOTRS = lofig_ptr->LOTRS; lofig_rpt->LOTRS = lofig_ptr->LOTRS;
lofig_rpt->LOCAP = lofig_ptr->LOCAP;
lofig_rpt->LORES = lofig_ptr->LORES;
lofig_rpt->LOSELF = lofig_ptr->LOSELF;
lofig_rpt->NAME = lofig_ptr->NAME; lofig_rpt->NAME = lofig_ptr->NAME;
lofig_rpt->MODE = lofig_ptr->MODE; lofig_rpt->MODE = lofig_ptr->MODE;
@ -3017,6 +3298,9 @@ lofig_list *lofig_ptr;
locon_list *locon_pt = NULL; locon_list *locon_pt = NULL;
loins_list *loins_pt = NULL; loins_list *loins_pt = NULL;
lotrs_list *lotrs_pt = NULL; lotrs_list *lotrs_pt = NULL;
locap_list *locap_pt = NULL;
lores_list *lores_pt = NULL;
loself_list *loself_pt = NULL;
losig_list *losig_pt = NULL; losig_list *losig_pt = NULL;
chain_list *headctc; chain_list *headctc;
chain_list *scanchain; chain_list *scanchain;
@ -3030,6 +3314,10 @@ lofig_list *lofig_ptr;
lofig_rpt->LOINS = duploinslst(lofig_rpt->LOINS); lofig_rpt->LOINS = duploinslst(lofig_rpt->LOINS);
lofig_rpt->LOTRS = duplotrslst(lofig_rpt->LOTRS); lofig_rpt->LOTRS = duplotrslst(lofig_rpt->LOTRS);
lofig_rpt->LOCAP = duplocaplst(lofig_rpt->LOCAP);
lofig_rpt->LORES = duploreslst(lofig_rpt->LORES);
lofig_rpt->LOSELF = duploselflst(lofig_rpt->LOSELF);
/* Now verify and restitute the coherence of the figure */ /* Now verify and restitute the coherence of the figure */
/* Restitute coherence in the LOTRS List */ /* Restitute coherence in the LOTRS List */
@ -3090,6 +3378,146 @@ lofig_list *lofig_ptr;
lotrs_pt = lotrs_pt->NEXT; lotrs_pt = lotrs_pt->NEXT;
} }
/* Restitute coherence in the LOCAP List */
locap_pt = lofig_rpt->LOCAP;
while(locap_pt != NULL)
{
locap_pt->TCON = duplocon(locap_pt->TCON);
locon_pt = locap_pt->TCON;
while(locon_pt != NULL)
{
index = (locon_pt->SIG)->INDEX;
locon_pt->SIG = getlosig(lofig_rpt, index);
locon_pt->ROOT = (void *)locap_pt;
locon_pt = locon_pt->NEXT;
}
locap_pt->BCON = duplocon(locap_pt->BCON);
locon_pt = locap_pt->BCON;
while(locon_pt != NULL)
{
index = (locon_pt->SIG)->INDEX;
locon_pt->SIG = getlosig(lofig_rpt, index);
locon_pt->ROOT = (void *)locap_pt;
locon_pt = locon_pt->NEXT;
}
while(locon_pt != NULL)
{
if( locon_pt->SIG )
{
index = (locon_pt->SIG)->INDEX;
locon_pt->SIG = getlosig(lofig_rpt, index);
}
else
{
locon_pt->SIG = NULL;
}
locon_pt->ROOT = (void *)locap_pt;
locon_pt = locon_pt->NEXT;
}
locap_pt = locap_pt->NEXT;
}
/* Restitute coherence in the LORES List */
lores_pt = lofig_rpt->LORES;
while(lores_pt != NULL)
{
lores_pt->RCON1 = duplocon(lores_pt->RCON1);
locon_pt = lores_pt->RCON1;
while(locon_pt != NULL)
{
index = (locon_pt->SIG)->INDEX;
locon_pt->SIG = getlosig(lofig_rpt, index);
locon_pt->ROOT = (void *)lores_pt;
locon_pt = locon_pt->NEXT;
}
lores_pt->RCON2 = duplocon(lores_pt->RCON2);
locon_pt = lores_pt->RCON2;
while(locon_pt != NULL)
{
index = (locon_pt->SIG)->INDEX;
locon_pt->SIG = getlosig(lofig_rpt, index);
locon_pt->ROOT = (void *)lores_pt;
locon_pt = locon_pt->NEXT;
}
while(locon_pt != NULL)
{
if( locon_pt->SIG )
{
index = (locon_pt->SIG)->INDEX;
locon_pt->SIG = getlosig(lofig_rpt, index);
}
else
{
locon_pt->SIG = NULL;
}
locon_pt->ROOT = (void *)lores_pt;
locon_pt = locon_pt->NEXT;
}
lores_pt = lores_pt->NEXT;
}
/* Selftitute coherence in the LOSELF List */
loself_pt = lofig_rpt->LOSELF;
while(loself_pt != NULL)
{
loself_pt->SCON1 = duplocon(loself_pt->SCON1);
locon_pt = loself_pt->SCON1;
while(locon_pt != NULL)
{
index = (locon_pt->SIG)->INDEX;
locon_pt->SIG = getlosig(lofig_rpt, index);
locon_pt->ROOT = (void *)loself_pt;
locon_pt = locon_pt->NEXT;
}
loself_pt->SCON2 = duplocon(loself_pt->SCON2);
locon_pt = loself_pt->SCON2;
while(locon_pt != NULL)
{
index = (locon_pt->SIG)->INDEX;
locon_pt->SIG = getlosig(lofig_rpt, index);
locon_pt->ROOT = (void *)loself_pt;
locon_pt = locon_pt->NEXT;
}
while(locon_pt != NULL)
{
if( locon_pt->SIG )
{
index = (locon_pt->SIG)->INDEX;
locon_pt->SIG = getlosig(lofig_rpt, index);
}
else
{
locon_pt->SIG = NULL;
}
locon_pt->ROOT = (void *)loself_pt;
locon_pt = locon_pt->NEXT;
}
loself_pt = loself_pt->NEXT;
}
/* Restitute coherence in the LOINS List */ /* Restitute coherence in the LOINS List */
loins_pt = lofig_rpt->LOINS; loins_pt = lofig_rpt->LOINS;
while(loins_pt != NULL) while(loins_pt != NULL)
@ -3337,3 +3765,162 @@ its_first:
delht(table); delht(table);
return 0; return 0;
} }
/*************************** Analogical world ***************************************/
/*##------------------------------------------------------------------##*/
/* Function : duplocaplst() */
/* contents : duplicate a locap list and return a pointer on the new */
/* structure. */
/* called func. : duplocap(), reverse(), */
/*##------------------------------------------------------------------##*/
locap_list *duplocaplst(locap_ptr)
locap_list *locap_ptr;
{
locap_list *locap_rpt = NULL; /* Returned locap pointer */
locap_list *locap_tmpptr = NULL; /* Temporary pointer */
while(locap_ptr != NULL)
{
locap_tmpptr = duplocap(locap_ptr);
locap_tmpptr->NEXT = locap_rpt;
locap_rpt = locap_tmpptr;
locap_ptr = locap_ptr->NEXT;
}
locap_rpt = (locap_list *)reverse((chain_list *)locap_rpt);
return(locap_rpt);
}
/*##------------------------------------------------------------------##*/
/* Function : duplocap() */
/* contents : duplicate a locap and return a pointer on the new */
/* structure. */
/* called func. : mbkalloc(), duplocon() */
/* note : the TCON, BCON pointers are also duplicated */
/*##------------------------------------------------------------------##*/
locap_list *duplocap(locap_ptr)
locap_list *locap_ptr;
{
locap_list *locap_rpt = NULL; /* Returned locap pointer */
locap_rpt = (locap_list *)mbkalloc(sizeof(locap_list));
locap_rpt->NEXT = NULL;
locap_rpt->NAME = locap_ptr->NAME;
locap_rpt->TCON = locap_ptr->TCON;
locap_rpt->BCON = locap_ptr->BCON;
locap_rpt->TYPE = locap_ptr->TYPE;
locap_rpt->CAPA = locap_ptr->CAPA;
locap_rpt->USER = NULL; /* The ptype_list is not duplicated */
return(locap_rpt);
}
/*##------------------------------------------------------------------##*/
/* Function : duploreslst() */
/* contents : duplicate a lores list and return a pointer on the new */
/* structure. */
/* called func. : duplores(), reverse(), */
/*##------------------------------------------------------------------##*/
lores_list *duploreslst(lores_ptr)
lores_list *lores_ptr;
{
lores_list *lores_rpt = NULL; /* Returned lores pointer */
lores_list *lores_tmpptr = NULL; /* Temporary pointer */
while(lores_ptr != NULL)
{
lores_tmpptr = duplores(lores_ptr);
lores_tmpptr->NEXT = lores_rpt;
lores_rpt = lores_tmpptr;
lores_ptr = lores_ptr->NEXT;
}
lores_rpt = (lores_list *)reverse((chain_list *)lores_rpt);
return(lores_rpt);
}
/*##------------------------------------------------------------------##*/
/* Function : duplores() */
/* contents : duplicate a lores and return a pointer on the new */
/* structure. */
/* called func. : mbkalloc(), duplocon() */
/* note : the RCON1, RCON2 pointers are also duplicated */
/*##------------------------------------------------------------------##*/
lores_list *duplores(lores_ptr)
lores_list *lores_ptr;
{
lores_list *lores_rpt = NULL; /* Returned lores pointer */
lores_rpt = (lores_list *)mbkalloc(sizeof(lores_list));
lores_rpt->NEXT = NULL;
lores_rpt->NAME = lores_ptr->NAME;
lores_rpt->RCON1 = lores_ptr->RCON1;
lores_rpt->RCON2 = lores_ptr->RCON2;
lores_rpt->TYPE = lores_ptr->TYPE;
lores_rpt->RESI = lores_ptr->RESI;
lores_rpt->USER = NULL; /* The ptype_list is not duplicated */
return(lores_rpt);
}
/*##------------------------------------------------------------------##*/
/* Function : duploselflst() */
/* contents : duplicate a loself list and return a pointer on the new */
/* structure. */
/* called func. : duploself(), reverse(), */
/*##------------------------------------------------------------------##*/
loself_list *duploselflst(loself_ptr)
loself_list *loself_ptr;
{
loself_list *loself_rpt = NULL; /* Returned loself pointer */
loself_list *loself_tmpptr = NULL; /* Temporary pointer */
while(loself_ptr != NULL)
{
loself_tmpptr = duploself(loself_ptr);
loself_tmpptr->NEXT = loself_rpt;
loself_rpt = loself_tmpptr;
loself_ptr = loself_ptr->NEXT;
}
loself_rpt = (loself_list *)reverse((chain_list *)loself_rpt);
return(loself_rpt);
}
/*##------------------------------------------------------------------##*/
/* Function : duploself() */
/* contents : duplicate a loself and return a pointer on the new */
/* structure. */
/* called func. : mbkalloc(), duplocon() */
/* note : the RCON1, RCON2 pointers are also duplicated */
/*##------------------------------------------------------------------##*/
loself_list *duploself(loself_ptr)
loself_list *loself_ptr;
{
loself_list *loself_rpt = NULL; /* Returned loself pointer */
loself_rpt = (loself_list *)mbkalloc(sizeof(loself_list));
loself_rpt->NEXT = NULL;
loself_rpt->NAME = loself_ptr->NAME;
loself_rpt->SCON1 = loself_ptr->SCON1;
loself_rpt->SCON2 = loself_ptr->SCON2;
loself_rpt->TYPE = loself_ptr->TYPE;
loself_rpt->SELF = loself_ptr->SELF;
loself_rpt->USER = NULL; /* The ptype_list is not duplicated */
return(loself_rpt);
}

View File

@ -26,10 +26,11 @@
* Date : 06/03/92 * Date : 06/03/92
* Author : Frederic Petrot <Frederic.Petrot@lip6.fr> * Author : Frederic Petrot <Frederic.Petrot@lip6.fr>
* Modified by Czo <Olivier.Sirol@lip6.fr> 1997,98 * Modified by Czo <Olivier.Sirol@lip6.fr> 1997,98
* $Id: mbk_lo_util.h,v 1.1 2002/03/08 13:51:05 fred Exp $ * Modified by pnt <Pierre.Nguyen-Tuong@lip6.fr> 2002
* $Id: mbk_lo_util.h,v 1.2 2002/08/08 19:47:37 pnt Exp $
*/ */
/* $Id: mbk_lo_util.h,v 1.1 2002/03/08 13:51:05 fred Exp $ */ /* $Id: mbk_lo_util.h,v 1.2 2002/08/08 19:47:37 pnt Exp $ */
#ifndef _MBK_LO_UTIL_H_ #ifndef _MBK_LO_UTIL_H_
#define _MBK_LO_UTIL_H_ #define _MBK_LO_UTIL_H_
@ -62,5 +63,16 @@ lofig_list *givelofig();
extern lofig_list * duplofig __P((lofig_list *lofig_ptr)); extern lofig_list * duplofig __P((lofig_list *lofig_ptr));
extern lofig_list * rduplofig __P((lofig_list *lofig_ptr)); extern lofig_list * rduplofig __P((lofig_list *lofig_ptr));
/*************************** Analogical world ***************************************/
extern locap_list *duplocaplst __P((locap_list *locap_ptr)) ;
extern locap_list *duplocap __P((locap_list *locap_ptr)) ;
extern lores_list *duploreslst __P((lores_list *lores_ptr)) ;
extern lores_list *duplores __P((lores_list *lores_ptr)) ;
extern loself_list *duploselflst __P((loself_list *loself_ptr)) ;
extern loself_list *duploself __P((loself_list *loself_ptr)) ;
/************************************************************************************/
#endif #endif

View File

@ -26,7 +26,8 @@
* Date : 05/08/93 * Date : 05/08/93
* Author : Frederic Petrot <Frederic.Petrot@lip6.fr> * Author : Frederic Petrot <Frederic.Petrot@lip6.fr>
* Modified by Czo <Olivier.Sirol@lip6.fr> 1997,98 * Modified by Czo <Olivier.Sirol@lip6.fr> 1997,98
* $Id: mlo.h,v 1.3 2002/06/01 15:51:29 ac Exp $ * Modified by pnt <Pierre.Nguyen-Tuong@lip6.fr> 2002
* $Id: mlo.h,v 1.4 2002/08/08 19:47:37 pnt Exp $
*/ */
#ifndef _MLO_H_ #ifndef _MLO_H_
@ -73,6 +74,9 @@ extern "C" {
#define UNKNOWN 'X' #define UNKNOWN 'X'
#define TRISTATE 'Z' #define TRISTATE 'Z'
#define TRANSCV 'T' #define TRANSCV 'T'
#define TRANSCV2 'C'
#define TRANSCV3 'R'
#define TRANSCV4 'S'
/******************************************************************************* /*******************************************************************************
* netlist structures types * * netlist structures types *
@ -86,6 +90,9 @@ struct losig *LOSIG; /* signal list head */
struct ptype *BKSIG; /* signal block list head */ struct ptype *BKSIG; /* signal block list head */
struct loins *LOINS; /* instance list head */ struct loins *LOINS; /* instance list head */
struct lotrs *LOTRS; /* transistor list head */ struct lotrs *LOTRS; /* transistor list head */
struct locap *LOCAP ; /* capacitance list head */
struct lores *LORES ; /* resistance list head */
struct loself *LOSELF ; /* inductor list head */
char *NAME; /* figure name (unique) */ char *NAME; /* figure name (unique) */
char MODE; /* 'A' or 'P' */ char MODE; /* 'A' or 'P' */
struct ptype *USER; /* Application specific */ struct ptype *USER; /* Application specific */
@ -143,6 +150,126 @@ struct ptype *USER; /* application specific */
} }
losig_list; losig_list;
/************************************************************************************/
/************************* Analogical specific structures ***************************/
/************************************************************************************/
/********************** Complementary transitor informations ************************/
/* The structure is put in the USER field of the transistor */
/* with the LOTRS_INFO ptype */
#define LOTRS_INFO 200208071 /* USER field code */
typedef struct s_lotrs_info
{
double AS,AD ; /* Source and drain area */
double PS,PD ; /* Source and drain perimeter */
int M ; /* Number of fingers */
} lotrs_info ;
/********************************* Capacitance **************************************/
#define CAPMIM 0 /* Metal-Inter-Metal type */
#define CAPPNWELL 1 /* Poly-NWell type */
#define IsCapMIM(type) ((type == CAPMIM) ? 1 : 0)
#define IsCapPNWELL(type) ((type == CAPPNWELL) ? 1 : 0)
typedef struct locap /* analog capacitance */
{
struct locap *NEXT ; /* next capacitor */
struct locon *TCON ; /* top plate connector */
struct locon *BCON ; /* bottom plate connector */
char *NAME ; /* capacitor instance name */
double CAPA ; /* capacitor value (unite FF) */
char TYPE ; /* capacitor type */
struct ptype *USER ; /* application specific */
} locap_list ;
/************************* Complementary capacitance information ********************/
/* The structure is put in the USER field of the capacitance */
/* with the LOCAP_INFO ptype */
#define LOCAP_INFO 200208072 /* USER field code */
typedef struct s_locap_info
{
union
{
struct
{
double AT,AB ; /* Top and bottom plate area */
double PT,PB ; /* Top et bottom plate perimeter */
} mim ;
struct
{
double L,W ; /* POLY/NWELL capacitance */
} pnwell ;
} data ;
} locap_info ;
/*********************************** Resistor ***************************************/
#define RESMIM 0 /* Metal-Inter-Metal type */
#define IsResMIM(type) ((type == RESMIM) ? 1 : 0)
typedef struct lores /* analog resistor */
{
struct lores *NEXT ; /* next resistor */
struct locon *RCON1 ; /* first connector */
struct locon *RCON2 ; /* second connector */
char *NAME ; /* resistor instance name */
double RESI ; /* resistance value (ohms) */
char TYPE ; /* resistor type */
struct ptype *USER ; /* application specific */
} lores_list ;
/*************************** Complementary resistor information *********************/
/* The structure is put in the USER field of the resistor */
/* with the LORES_INFO ptype */
#define LORES_INFO 200208073 /* USER field code */
typedef struct s_lores_info
{
double L,W ;
} lores_info ;
/************************************ Inductor **************************************/
#define SELFMIM 0 /* Metal-Inter-Metal type */
#define IsSelfMIM(type) ((type == SELFMIM) ? 1 : 0)
typedef struct loself /* analog inductor */
{
struct loself *NEXT ; /* next inductor */
struct locon *SCON1 ; /* first connector */
struct locon *SCON2 ; /* second connector */
char *NAME ; /* inductor instance name */
double SELF ; /* inductance value (unite H) */
char TYPE ; /* inductor type */
struct ptype *USER ; /* application specific */
} loself_list ;
/************************************************************************************/
/************************************************************************************/
/************************************************************************************/
/******************************************************************************* /*******************************************************************************
* externals for mbk netlist view * * externals for mbk netlist view *
*******************************************************************************/ *******************************************************************************/
@ -179,6 +306,28 @@ losig_list;
extern void delloconuser __P((locon_list*)); extern void delloconuser __P((locon_list*));
extern void dellofiguser __P((lofig_list*)); extern void dellofiguser __P((lofig_list*));
/*************************** Analogical world ***************************************/
extern locap_list *addlocap __P((lofig_list *ptfig,char type,double capa,losig_list *pttplate,
losig_list *ptbplate,char *name)) ;
extern int dellocap __P((lofig_list *ptfig,locap_list *ptcap)) ;
extern locap_list *getlocap __P((lofig_list *ptfig,const char *name)) ;
extern void dellocapuser __P((locap_list *)) ;
extern lores_list *addlores __P((lofig_list *ptfig,char type,double resi,losig_list *ptrcon1,
losig_list *ptrcon2,char *name)) ;
extern int dellores __P((lofig_list *ptfig,lores_list *ptres)) ;
extern lores_list *getlores __P((lofig_list *ptfig,const char *name)) ;
extern void delloresuser __P((lores_list *)) ;
extern loself_list *addloself __P((lofig_list *ptfig,char type,double self,losig_list *ptscon1,
losig_list *ptscon2,char *name)) ;
extern int delloself __P((lofig_list *ptfig,loself_list *ptself)) ;
extern loself_list *getloself __P((lofig_list *ptfig,const char *name)) ;
extern void delloselfuser __P((loself_list *)) ;
/************************************************************************************/
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif /* __cplusplus */

View File

@ -26,7 +26,8 @@
* Date : 05/08/93 * Date : 05/08/93
* Author : Frederic Petrot <Frederic.Petrot@lip6.fr> * Author : Frederic Petrot <Frederic.Petrot@lip6.fr>
* Modified by Czo <Olivier.Sirol@lip6.fr> 1997,98 * Modified by Czo <Olivier.Sirol@lip6.fr> 1997,98
* $Id: mlu.h,v 1.3 2002/06/01 15:51:29 ac Exp $ * Modified by pnt <Pierre.Nguyen-Tuong@lip6.fr> 2002
* $Id: mlu.h,v 1.4 2002/08/08 19:47:37 pnt Exp $
*/ */
#ifndef _MLU_H_ #ifndef _MLU_H_
@ -70,6 +71,17 @@ extern "C" {
extern int guessextdir __P((lofig_list *lof)); extern int guessextdir __P((lofig_list *lof));
extern int restorealldir __P((lofig_list *lf)); extern int restorealldir __P((lofig_list *lf));
/*************************** Analogical world ***************************************/
extern locap_list *duplocaplst __P((locap_list *locap_ptr)) ;
extern locap_list *duplocap __P((locap_list *locap_ptr)) ;
extern lores_list *duploreslst __P((lores_list *lores_ptr)) ;
extern lores_list *duplores __P((lores_list *lores_ptr)) ;
extern loself_list *duploselflst __P((loself_list *loself_ptr)) ;
extern loself_list *duploself __P((loself_list *loself_ptr)) ;
/************************************************************************************/
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif /* __cplusplus */