2000-04-27 22:03:57 +02:00
|
|
|
/*
|
|
|
|
|
* MW. Include for spice
|
|
|
|
|
*/
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
|
|
#include "datadef.h"
|
|
|
|
|
|
|
|
|
|
static int whatdline(char *tbuf, char *firstname);
|
|
|
|
|
static int whatlline(char *tbuf, char *name);
|
|
|
|
|
|
|
|
|
|
extern int bsizer;
|
|
|
|
|
extern char buf[BSIZE];
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Read deck and search for *MOD, *LIB, *SUB commands
|
|
|
|
|
*/
|
|
|
|
|
int
|
|
|
|
|
readdeck(FILE * tdeck, struct LSData *lib, \
|
|
|
|
|
struct LSData *sub, struct LSData *mod)
|
|
|
|
|
{
|
|
|
|
|
char firstname[BSIZE];
|
|
|
|
|
char *names, *smlp;
|
|
|
|
|
struct LSData *which;
|
|
|
|
|
|
|
|
|
|
while (fgets(buf, bsizer, tdeck))
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
smlp = buf;
|
|
|
|
|
/*
|
|
|
|
|
* Ignore control chars at the end of line
|
|
|
|
|
*/
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
smlp++;
|
|
|
|
|
}
|
|
|
|
|
while ((!(iscntrl(*smlp))) && (*smlp != '\0'));
|
|
|
|
|
*smlp = '\0';
|
|
|
|
|
|
|
|
|
|
switch (whatdline(buf, firstname))
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
case LIBDLINE:
|
|
|
|
|
lib->flag = IS_LIB;
|
|
|
|
|
which = lib;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case SUBDLINE:
|
|
|
|
|
sub->flag = IS_SUB;
|
|
|
|
|
which = sub;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case MODDLINE:
|
|
|
|
|
mod->flag = IS_MOD;
|
|
|
|
|
which = mod;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
which = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* If we finded something
|
|
|
|
|
*/
|
|
|
|
|
if (which)
|
|
|
|
|
{
|
|
|
|
|
names = buf;
|
|
|
|
|
strsep(&names, " ");
|
|
|
|
|
|
|
|
|
|
while (smlp = strsep(&names, " "))
|
|
|
|
|
{
|
|
|
|
|
if (*smlp)
|
|
|
|
|
{
|
|
|
|
|
which = LSinsert(NULL, which);
|
|
|
|
|
strcpy(which->name, smlp);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return ((lib->flag != IS_LIB) && (mod->flag != IS_MOD) \
|
|
|
|
|
&&(sub->flag != IS_SUB)) ? FAILED : SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Read library and write specififed models/subckts to tmplib
|
|
|
|
|
*/
|
|
|
|
|
int
|
|
|
|
|
readlib(struct LSData *lib, FILE * tlib, \
|
|
|
|
|
struct LSData *sub, struct LSData *mod)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
char name[BSIZE];
|
2000-10-10 14:11:56 +02:00
|
|
|
int numi, wflag, nextsub;
|
2000-04-27 22:03:57 +02:00
|
|
|
|
|
|
|
|
numi = 0;
|
|
|
|
|
wflag = NOWRITE;
|
2000-10-10 14:11:56 +02:00
|
|
|
nextsub = 0;
|
2000-04-27 22:03:57 +02:00
|
|
|
|
|
|
|
|
while (fgets(buf, bsizer, lib->filedes))
|
|
|
|
|
{
|
|
|
|
|
/*
|
|
|
|
|
* Now we must check what line is it and if it should be written to tmplib
|
|
|
|
|
*/
|
|
|
|
|
switch (whatlline(buf, name))
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
case (MODLLINE):
|
|
|
|
|
if (wflag == WRITESUB)
|
|
|
|
|
fputs(buf, tlib);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
if (mod)
|
|
|
|
|
{
|
|
|
|
|
if (checkname(mod, name))
|
|
|
|
|
{
|
|
|
|
|
wflag = WRITEMOD;
|
|
|
|
|
numi++;
|
|
|
|
|
fprintf(tlib, "* Model: %s, from: %s.\n", \
|
|
|
|
|
name, lib->name);
|
|
|
|
|
fputs(buf, tlib);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case (SUBLLINE):
|
|
|
|
|
if (sub)
|
|
|
|
|
{
|
2000-10-10 14:11:56 +02:00
|
|
|
if (wflag==WRITESUB)
|
|
|
|
|
{
|
|
|
|
|
/* subckt inside subckt
|
|
|
|
|
not so funny */
|
|
|
|
|
nextsub++;
|
|
|
|
|
fputs(buf, tlib);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (checkname(sub, name))
|
2000-04-27 22:03:57 +02:00
|
|
|
{
|
|
|
|
|
wflag = WRITESUB;
|
|
|
|
|
numi++;
|
|
|
|
|
fprintf(tlib, "* Subckt: %s, from: %s.\n", \
|
|
|
|
|
name, lib->name);
|
|
|
|
|
fputs(buf, tlib);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case (NORMLINE):
|
|
|
|
|
if (wflag == WRITEMOD)
|
|
|
|
|
{
|
|
|
|
|
wflag = NOWRITE;
|
|
|
|
|
fputs("\n* End Model.\n\n", tlib);
|
|
|
|
|
}
|
|
|
|
|
if (wflag == WRITESUB)
|
|
|
|
|
fputs(buf, tlib);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case (ENDSLLINE):
|
2000-10-10 14:11:56 +02:00
|
|
|
if (nextsub)
|
|
|
|
|
{
|
|
|
|
|
nextsub--;
|
|
|
|
|
fputs(buf, tlib);
|
|
|
|
|
break;
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
if (wflag == WRITESUB)
|
2000-04-27 22:03:57 +02:00
|
|
|
{
|
|
|
|
|
fprintf(tlib, "%s\n* End Subckt\n\n", buf);
|
|
|
|
|
}
|
|
|
|
|
wflag = NOWRITE;
|
|
|
|
|
break;
|
2000-10-10 14:11:56 +02:00
|
|
|
}
|
2000-04-27 22:03:57 +02:00
|
|
|
|
|
|
|
|
case (CONTLLINE):
|
|
|
|
|
if (wflag != NOWRITE)
|
|
|
|
|
fputs(buf, tlib);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
return numi;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Check what line in deck it is
|
|
|
|
|
*/
|
|
|
|
|
int
|
|
|
|
|
whatdline(char *tbuf, char *firstname)
|
|
|
|
|
{
|
|
|
|
|
if (sscanf(tbuf, "*LIB %s", firstname) == 1)
|
|
|
|
|
return LIBDLINE;
|
|
|
|
|
if (sscanf(tbuf, "*SUB %s", firstname) == 1)
|
|
|
|
|
return SUBDLINE;
|
|
|
|
|
if (sscanf(tbuf, "*MOD %s", firstname) == 1)
|
|
|
|
|
return MODDLINE;
|
|
|
|
|
return NORMLINE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Check what line it is. If we have model or subckt line we also read its name
|
|
|
|
|
*/
|
|
|
|
|
int
|
|
|
|
|
whatlline(char *tbuf, char *name)
|
|
|
|
|
{
|
|
|
|
|
if (sscanf(tbuf, ".SUBCKT %s %*s", name) == 1)
|
|
|
|
|
return SUBLLINE;
|
|
|
|
|
if (sscanf(tbuf, ".MODEL %s %*s", name) == 1)
|
|
|
|
|
return MODLLINE;
|
|
|
|
|
if (sscanf(tbuf, ".ENDS%c", name) == 1)
|
|
|
|
|
return ENDSLLINE;
|
|
|
|
|
if (sscanf(tbuf, "+%s", name) == 1)
|
|
|
|
|
return CONTLLINE;
|
|
|
|
|
return NORMLINE;
|
|
|
|
|
}
|