22 changed files with 0 additions and 2075 deletions
-
17contrib/ChangeLog
-
5contrib/mslib/COPYING
-
87contrib/mslib/datadef.h
-
93contrib/mslib/inc_LSD.c
-
217contrib/mslib/inc_inp.c
-
208contrib/mslib/inc_main.c
-
77contrib/mslib/liblook
-
70contrib/mslib/libprm
-
13contrib/mslib/libprm_readme
-
15contrib/mslib/makefile
-
31contrib/mslib/mslib_readme
-
5contrib/scripts/COPYING
-
77contrib/scripts/liblook
-
9contrib/scripts/liblook_readme
-
58contrib/scripts/libprm
-
13contrib/scripts/libprm_readme
-
25contrib/spiceprm/CHANGES
-
339contrib/spiceprm/COPYING
-
176contrib/spiceprm/EXAMPLES
-
216contrib/spiceprm/README
-
305contrib/spiceprm/spiceprm
-
19contrib/spiceprm/spiceprm-0.11.lsm
@ -1,17 +0,0 @@ |
|||
2000-10-10 Arno W. Peters <A.W.Peters@ieee.org> |
|||
|
|||
* mslib, spiceprm: Michael Widlok released new version of his |
|||
programs. |
|||
|
|||
2000-03-22 Paolo Nenzi <p.nenzi@ieee.org> |
|||
|
|||
* mslib: Major update. M. Widlok sent the new version of it's |
|||
programs. |
|||
|
|||
* spiceprm: Major update. See above line. |
|||
|
|||
1999-09-14 Arno W. Peters <A.W.Peters@ieee.org> |
|||
|
|||
* mslib: Added. |
|||
|
|||
* spiceprm: Added. |
|||
@ -1,5 +0,0 @@ |
|||
Mslib is free for everyone who think that it might by useful for |
|||
him. If someone makes it better please e-mail me. |
|||
|
|||
Michael Widlok |
|||
widlok@uci.agh.edu.pl |
|||
@ -1,87 +0,0 @@ |
|||
/* |
|||
* MW. Include for spice |
|||
*/ |
|||
|
|||
#ifndef ngspice_DATADEF_H |
|||
#define ngspice_DATADEF_H |
|||
|
|||
/* |
|||
* Program defaults |
|||
* |
|||
* *Directory for input file and input libraries |
|||
*/ |
|||
#define DECKPATH "./" |
|||
#define LIBPATH "/usr/local/lib/" |
|||
|
|||
/* |
|||
* Name for output library file |
|||
*/ |
|||
#define TMPLIBNAME ".lib" /* |
|||
* * * * actual name is "deck.TMPLIBNAME" |
|||
*/ |
|||
|
|||
/* |
|||
* Command for libraries, subckts and models declaration |
|||
*/ |
|||
#define LIBINVL "*LIB" |
|||
#define SUBINVL "*SUB" |
|||
#define MODINVL "*MOD" |
|||
|
|||
/* |
|||
* Keywords for subckt start, end and model |
|||
*/ |
|||
#define SUBLINE ".SUBCKT" |
|||
#define SUBEND ".ENDS" |
|||
#define MODLINE ".MODEL" |
|||
#define MODEND |
|||
|
|||
#define LIBMESSAGE "* MW Library include for Spice" |
|||
|
|||
#define BSIZE 255 |
|||
#define MODDLINE 1 |
|||
#define SUBDLINE 4 |
|||
#define LIBDLINE 8 |
|||
#define SUBLLINE 16 |
|||
#define MODLLINE 32 |
|||
#define ENDSLLINE 64 |
|||
#define CONTLLINE 128 |
|||
#define NORMLINE 0 |
|||
#define WRITESUB 0xffff |
|||
#define WRITEMOD 0x1111 |
|||
#define NOWRITE 0x0 |
|||
#define FAILED 0xffffff |
|||
#define SUCCESS 0 |
|||
|
|||
#define IS_LIB 0x1 |
|||
#define LIB_OPEN 0x2 |
|||
|
|||
#define IS_MOD 0x10 |
|||
#define IS_SUB 0x100 |
|||
#define FINDED 0x400 |
|||
#define DUPLICATE 0x800 |
|||
|
|||
#define DECK_OPEN 0x20000 |
|||
#define TLIB_OPEN 0x100000 |
|||
|
|||
#define NAMEVALID 0xfff |
|||
#define NAMENOTV 0x0 |
|||
|
|||
struct LSData |
|||
{ |
|||
char name[BSIZE]; |
|||
FILE *filedes; |
|||
int flag; |
|||
struct LSData *prevLS; |
|||
struct LSData *nextLS; |
|||
}; |
|||
|
|||
struct LSData *LSinsert(struct LSData *LS, struct LSData *where); |
|||
struct LSData *LSclear(struct LSData *LS); |
|||
struct LSData *Backfree(struct LSData *LS); |
|||
int readdeck(FILE * tdeck, struct LSData *lib, \ |
|||
struct LSData *sub, struct LSData *mod); |
|||
int readlib(struct LSData *lib, FILE * tlib, \ |
|||
struct LSData *firstSUB, struct LSData *firstMOD); |
|||
int checkname(struct LSData *smp, char *name); |
|||
|
|||
#endif |
|||
@ -1,93 +0,0 @@ |
|||
/* |
|||
* MW. Include for spice - LSData functions |
|||
*/ |
|||
|
|||
#include <stdlib.h> |
|||
#include <stdio.h> |
|||
#include <sys/types.h> |
|||
#include <string.h> |
|||
|
|||
#include "datadef.h" |
|||
|
|||
char *Message = "Michael Widlok, all rights reserved \n" |
|||
"mslib - MW include for Spice models/subckts\n"; |
|||
|
|||
/* |
|||
* Add or cretate new LS structure just after where pointer |
|||
*/ |
|||
struct LSData * |
|||
LSinsert(struct LSData *LS, struct LSData *where) |
|||
{ |
|||
|
|||
if (!(LS)) |
|||
{ |
|||
LS = (struct LSData *) malloc(sizeof(struct LSData)); |
|||
|
|||
if (!(LS)) |
|||
{ |
|||
fprintf(stderr, "LSinsert: Can't allocate LSData srtucture.\n"); |
|||
exit(FAILED); |
|||
} |
|||
LS->filedes = NULL; |
|||
} |
|||
/* |
|||
* If where is given we must set nextLS and prevLS correctly |
|||
*/ |
|||
if (where) |
|||
{ |
|||
LS->prevLS = where; |
|||
if (LS->nextLS = where->nextLS) |
|||
where->nextLS->prevLS = LS; |
|||
where->nextLS = LS; |
|||
} else |
|||
LS->nextLS = LS->prevLS = NULL; |
|||
return LS; |
|||
} |
|||
|
|||
/* |
|||
* Clear all LS list from end. This also closes opened files |
|||
*/ |
|||
struct LSData * |
|||
LSclear(struct LSData *LS) |
|||
{ |
|||
while (LS->nextLS) |
|||
LS = LS->nextLS; |
|||
return Backfree(LS); |
|||
} |
|||
|
|||
/* |
|||
* Used by LSclear |
|||
*/ |
|||
struct LSData * |
|||
Backfree(struct LSData *LS) |
|||
{ |
|||
if (LS->filedes) |
|||
fclose(LS->filedes); |
|||
return (LS->prevLS) ? Backfree(LS->prevLS) : free(LS), LS; |
|||
} |
|||
|
|||
/* |
|||
* Check if sub/mod name should by included |
|||
*/ |
|||
int |
|||
checkname(struct LSData *smp, char *name) |
|||
{ |
|||
do |
|||
{ |
|||
if (!(strcmp(smp->name, name))) |
|||
{ |
|||
if (smp->flag != FINDED) |
|||
{ |
|||
smp->flag = FINDED; |
|||
return NAMEVALID; |
|||
} else |
|||
{ |
|||
smp->flag = DUPLICATE; |
|||
return NAMEVALID; |
|||
} |
|||
} |
|||
smp = smp->nextLS; |
|||
} |
|||
while (smp); |
|||
return NAMENOTV; |
|||
} |
|||
@ -1,217 +0,0 @@ |
|||
/* |
|||
* 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]; |
|||
int numi, wflag, nextsub; |
|||
|
|||
numi = 0; |
|||
wflag = NOWRITE; |
|||
nextsub = 0; |
|||
|
|||
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) |
|||
{ |
|||
if (wflag==WRITESUB) |
|||
{ |
|||
/* subckt inside subckt |
|||
not so funny */ |
|||
nextsub++; |
|||
fputs(buf, tlib); |
|||
break; |
|||
} |
|||
|
|||
if (checkname(sub, name)) |
|||
{ |
|||
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): |
|||
if (nextsub) |
|||
{ |
|||
nextsub--; |
|||
fputs(buf, tlib); |
|||
break; |
|||
} else { |
|||
|
|||
if (wflag == WRITESUB) |
|||
{ |
|||
fprintf(tlib, "%s\n* End Subckt\n\n", buf); |
|||
} |
|||
wflag = NOWRITE; |
|||
break; |
|||
} |
|||
|
|||
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; |
|||
} |
|||
@ -1,208 +0,0 @@ |
|||
/* |
|||
* MW. Include - main functions |
|||
*/ |
|||
|
|||
#include <stdlib.h> |
|||
#include <stdio.h> |
|||
#include <unistd.h> |
|||
#include <string.h> |
|||
|
|||
#include "datadef.h" |
|||
|
|||
struct LSData *firstLIB; |
|||
struct LSData *firstSUB; |
|||
struct LSData *firstMOD; |
|||
struct LSData *deck; |
|||
struct LSData *tmplib; |
|||
int bsize, bsizer; |
|||
char buf[BSIZE]; |
|||
|
|||
int |
|||
main(int argc, char *argv[]) |
|||
{ |
|||
|
|||
/* |
|||
* Initialize everything |
|||
*/ |
|||
struct LSData *subp, *libp, *modp; |
|||
char tch[BSIZE]; |
|||
int mswritten; |
|||
|
|||
tmplib = LSinsert(NULL, NULL); |
|||
deck = LSinsert(NULL, NULL); |
|||
*tch = '\0'; |
|||
mswritten = 0; |
|||
|
|||
switch (argc) |
|||
{ |
|||
|
|||
case 3: |
|||
strcpy(tmplib->name, argv[--argc]); |
|||
strcpy(tch, tmplib->name); |
|||
|
|||
case 2: |
|||
strcpy(deck->name, argv[--argc]); |
|||
if (!(*tch)) |
|||
{ |
|||
sprintf(tmplib->name, "%s%s", deck->name, TMPLIBNAME); |
|||
strcpy(tch, tmplib->name); |
|||
} |
|||
break; |
|||
|
|||
case 1: |
|||
fprintf(stdout, "Usage: mslib deck [tmplib]\n"); |
|||
return FAILED; |
|||
|
|||
default: |
|||
fprintf(stderr, "mslib: Incorrect parameters count.\n"); |
|||
return FAILED; |
|||
} |
|||
|
|||
/* |
|||
* Open deck |
|||
*/ |
|||
if (!(deck->filedes = fopen(deck->name, "r"))) |
|||
{ |
|||
sprintf(deck->name, "%s%s", DECKPATH, argv[1]); |
|||
sprintf(tmplib->name, "%s%s", DECKPATH, tch); |
|||
|
|||
if (!(deck->filedes = fopen(deck->name, "r"))) |
|||
{ |
|||
fprintf(stderr, "mslib: Can't open deck %s.\n", deck->name); |
|||
LSclear(deck); |
|||
LSclear(tmplib); |
|||
return FAILED; |
|||
} |
|||
} |
|||
bsizer = BSIZE; |
|||
bsize = bsizer--; |
|||
|
|||
deck->flag = DECK_OPEN; |
|||
|
|||
/* |
|||
* Create tmplib and write first line to it |
|||
*/ |
|||
if (!(tmplib->filedes = fopen(tmplib->name, "w"))) |
|||
{ |
|||
fprintf(stderr, "mslib: Can't creat tmplib %s.\n", tmplib->name); |
|||
LSclear(tmplib); |
|||
LSclear(deck); |
|||
return FAILED; |
|||
} |
|||
tmplib->flag = TLIB_OPEN; |
|||
fprintf(tmplib->filedes, "%s\n* Tmp library: %s,\n* For deck: %s.\n\n", \ |
|||
LIBMESSAGE, tmplib->name, deck->name); |
|||
|
|||
firstLIB = LSinsert(NULL, NULL); |
|||
firstSUB = LSinsert(NULL, NULL); |
|||
firstMOD = LSinsert(NULL, NULL); |
|||
|
|||
/* |
|||
* Find commands in deck |
|||
*/ |
|||
readdeck(deck->filedes, firstLIB, firstSUB, firstMOD); |
|||
|
|||
if (firstLIB->flag = IS_LIB) |
|||
{ |
|||
|
|||
libp = firstLIB->nextLS; |
|||
do |
|||
{ |
|||
if (!(libp->filedes = fopen(libp->name, "r"))) |
|||
{ |
|||
strcpy(tch, libp->name); |
|||
sprintf(libp->name, "%s%s", LIBPATH, tch); |
|||
|
|||
if (!(libp->filedes = fopen(libp->name, "r"))) |
|||
{ |
|||
libp->flag = FAILED; |
|||
} |
|||
} |
|||
/* |
|||
* Read libraries if everything is OK |
|||
*/ |
|||
if (libp->flag != FAILED) |
|||
{ |
|||
libp->flag = LIB_OPEN; |
|||
|
|||
modp = (firstMOD->flag == IS_MOD) ? firstMOD->nextLS : NULL; |
|||
subp = (firstSUB->flag == IS_SUB) ? firstSUB->nextLS : NULL; |
|||
|
|||
mswritten += readlib(libp, tmplib->filedes, subp, modp); |
|||
} |
|||
libp = libp->nextLS; |
|||
} |
|||
while (libp); |
|||
} |
|||
fprintf(stdout, "mslib: Written %d items to tmplib %s.\n", \ |
|||
mswritten, tmplib->name); |
|||
|
|||
if (libp = firstLIB->nextLS) |
|||
{ |
|||
do |
|||
{ |
|||
if (libp->flag != LIB_OPEN) |
|||
fprintf(stderr, " Can't open lib %s.\n", libp->name); |
|||
libp = libp->nextLS; |
|||
} |
|||
while (libp); |
|||
} |
|||
/* |
|||
* Check is models or subckts were find and |
|||
* * are not duplicated |
|||
*/ |
|||
if (modp = firstMOD->nextLS) |
|||
{ |
|||
do |
|||
{ |
|||
switch (modp->flag) |
|||
{ |
|||
case DUPLICATE: |
|||
fprintf(stderr, " Model duplicated %s.\n", \ |
|||
modp->name); |
|||
break; |
|||
default: |
|||
fprintf(stderr, " Can't find model %s.\n", \ |
|||
modp->name); |
|||
break; |
|||
|
|||
case FINDED: |
|||
} |
|||
|
|||
modp = modp->nextLS; |
|||
} |
|||
while (modp); |
|||
} |
|||
if (subp = firstSUB->nextLS) |
|||
{ |
|||
do |
|||
{ |
|||
switch (subp->flag) |
|||
{ |
|||
case DUPLICATE: |
|||
fprintf(stderr, " Subckt duplicated %s.\n", \ |
|||
subp->name); |
|||
break; |
|||
default: |
|||
fprintf(stderr, " Can't find subckt %s.\n", \ |
|||
subp->name); |
|||
break; |
|||
|
|||
case FINDED: |
|||
} |
|||
subp = subp->nextLS; |
|||
} |
|||
while (subp); |
|||
} |
|||
/* |
|||
* Clear all data and close files |
|||
*/ |
|||
|
|||
LSclear(tmplib); |
|||
LSclear(deck); |
|||
LSclear(firstLIB); |
|||
LSclear(firstSUB); |
|||
|
|||
return SUCCESS; |
|||
|
|||
} |
|||
@ -1,77 +0,0 @@ |
|||
#!/bin/bash |
|||
#set -x -v |
|||
|
|||
# MW. Lib search / show program |
|||
|
|||
# usage liblook libname [text_to_find] [l_before] [l_after] |
|||
|
|||
LIBPATH=/usr/local/lib |
|||
|
|||
function trapper() |
|||
{ |
|||
echo User break! |
|||
echo Exiting . . . |
|||
unset LIBPATH |
|||
exit 1 |
|||
} |
|||
|
|||
trap trapper SIGINT SIGQUIT |
|||
|
|||
function operror() |
|||
{ |
|||
echo Incorrect parameters: $*, $# |
|||
echo Usage: liblook libname [text_to_find] [l_before] [l_after] |
|||
unset LIBPATH |
|||
exit 2 |
|||
} |
|||
|
|||
function showlib() |
|||
{ |
|||
if test -f $LIBPATH/$1; then |
|||
less $LIBPATH/$1; exit 0; fi |
|||
|
|||
if test -f [C./$1; then |
|||
less ./$1; exit 0; fi |
|||
|
|||
echo Searching $1 in ~/ . . . |
|||
less $(find ~/ -name $1) |
|||
} |
|||
|
|||
function searchlib() |
|||
{ |
|||
if test -f $LIBPATH/$1; then |
|||
echo File: $1; echo; |
|||
grep -B"$3" -A"$4" --ignore-case -e "$2" $LIBPATH/$1; |
|||
echo; exit 0; fi |
|||
|
|||
if test -f ./$1; then |
|||
echo File: $1; echo; |
|||
grep -B"$3" -A"$4" --ignore-case -e "$2" ./$1; |
|||
echo; exit 0; fi |
|||
|
|||
#if *.lib or sth like this |
|||
|
|||
echo Searching $1 in ~/ . . .;echo; |
|||
if (grep -B"$3" -A"$4" --ignore-case -e "$2" $(find ~/ -name $1)); then |
|||
echo; exit 0; fi |
|||
|
|||
echo Searching $1 in $LIBPATH;echo; |
|||
if (grep -B"$3" -A"$4" --ignore-case -e "$2" $(find $LIBPATH -name $1)); then |
|||
echo; exit 0; fi |
|||
|
|||
} |
|||
|
|||
|
|||
# Main body |
|||
if test $# -lt 1 -o $# -gt 4; then operror $*; fi |
|||
|
|||
case $# in |
|||
1) showlib $*;; |
|||
2) searchlib $1 $2 2 2;; |
|||
3) searchlib $1 $2 $3 2;; |
|||
4) searchlib $1 $2 $3 $4;; |
|||
esac |
|||
|
|||
unset LIBPATH |
|||
exit 0 |
|||
|
|||
@ -1,70 +0,0 @@ |
|||
#!/bin/bash |
|||
#set -x -v |
|||
|
|||
# MW. Lip / Param parsing program for spice |
|||
|
|||
# -n normal, -f full (keep everything), -r replace original file |
|||
# -e new addition start with editor, then like normal |
|||
|
|||
export TMPLP=/tmp/LibPrm.$$- |
|||
|
|||
function trapper() |
|||
{ |
|||
echo User break! |
|||
echo Exiting . . . |
|||
rm -f -v ${TMPLP}* |
|||
unset TMPLP |
|||
exit 1 |
|||
} |
|||
|
|||
trap trapper SIGINT SIGQUIT |
|||
|
|||
function operror() |
|||
{ |
|||
echo Incorrect parameters: $*, $# |
|||
unset TMPLP |
|||
exit 2 |
|||
} |
|||
|
|||
function repnormpl() |
|||
{ |
|||
mslib $1 ${TMPLP}1 |
|||
sed -n -e 'p' -e "1r ${TMPLP}1" $1 >${TMPLP}2 |
|||
spiceprm ${TMPLP}2 $2 |
|||
} |
|||
|
|||
function keepall() |
|||
{ |
|||
mslib $1 |
|||
sed -n -e 'p' -e "1r $1.lib" $1 >${TMPLP}2 |
|||
spiceprm ${TMPLP}2 $2 |
|||
} |
|||
|
|||
function withedit() |
|||
{ |
|||
joe $1 |
|||
mslib $1 ${TMPLP}1 |
|||
sed -n -e 'p' -e "1r ${TMPLP}1" $1 >${TMPLP}2 |
|||
spiceprm ${TMPLP}2 $2 |
|||
} |
|||
|
|||
|
|||
# Main body |
|||
if test $# -lt 2 -o $# -gt 3; then operror $*; fi |
|||
if !(test -f $2); then operror $*; fi |
|||
|
|||
case $1$# in |
|||
-r3) operror $*;; |
|||
-n2) repnormpl $2 ${2%.cir}.ckt;; |
|||
-n3) repnormpl $2 $3;; |
|||
-r2) repnormpl $2 $2;; |
|||
-f2) keepall $2 ${2%.cir}.ckt;; |
|||
-f3) keepall $2 $3;; |
|||
-e2) withedit $2 ${2%.cir}.ckt;; |
|||
-e3) withedit $2 $3;; |
|||
esac |
|||
|
|||
rm -f ${TMPLP}* |
|||
unset TMPLP |
|||
exit 0 |
|||
|
|||
@ -1,13 +0,0 @@ |
|||
So, this is my idea of using parametrized subckts with spice3f4. |
|||
|
|||
First I create an input file like foo.cir and I include commands for |
|||
mslib (*MOD, *SUB, *LIB) in it. Then I run "libprm -n foo.cir". Libprm then |
|||
runs mslib first to get all models and subckts form given libraries and then |
|||
runs spiceprm to evaluate all used parameters. |
|||
This works quite right for me, and I hope that You will find my idea |
|||
useful. Spiceprm is not my program (I get it from Internet), but I think |
|||
that it will better to enclose all used programs in this packet. Spiceprm |
|||
has it's own directory with very good readme and examples. If You want to |
|||
find out more about libprm or mslib look for the source code. These are rather |
|||
short and easy programs - they are all that I could write in quite short |
|||
time. |
|||
@ -1,15 +0,0 @@ |
|||
# MW. Include libs for Spice
|
|||
CFLAGS= -O2 -s |
|||
LDFLAGS= -s |
|||
|
|||
OBJS= inc_main.o inc_inp.o inc_LSD.o |
|||
HDRS= datadef.h |
|||
SRCC= inc_main.c inc_inp.c inc_LSD.c |
|||
|
|||
mslib: $(OBJS) |
|||
$(CC) $(LDFLAGS) -o $@ $(OBJS) |
|||
|
|||
clean: |
|||
$(RM) $(OBJS) mslib |
|||
|
|||
$(OBJS): $(HDRS) |
|||
@ -1,31 +0,0 @@ |
|||
Mslib can create a small tmp library which can be .include to spice deck or |
|||
used as tmp file with libprm. |
|||
You invoke it like this: mslib deck_name [tmp_lib_name]. If second argument |
|||
is not given mslib uses deck_name.lib. Mslib then reads deck and looks for |
|||
special commands in it. This commands are: |
|||
|
|||
*SUB name1 name2 ... - what subckts are used |
|||
*MOD name1 name2 ... - what models are used |
|||
*LIB name1 name2 ... - what libraries should be searched |
|||
|
|||
You can give full path for libraries or just the name. Mslib tries to |
|||
find them in current directory and then in directory specified in datadef.h |
|||
file. There are also some other default options defined there. Check them |
|||
After all a tmp. library for the deck is created. It consist only the models |
|||
and subckts that were specified in *MOD and *SUB commands. |
|||
|
|||
|
|||
|
|||
This is all. |
|||
Mslib is _NOT_ a good program. It should automatically recognize what models |
|||
or subckts were used and it should be written with flex or bison. Now it |
|||
just indicates what is my level of programming in C. |
|||
There are some options that You can set for mslib in datadef.h. I tried to |
|||
document all of them there, so when want to know more look to the sources. |
|||
|
|||
And one more thing. There is a perl program "spiceprm" that lets You use |
|||
parameters in subckts. Many Intusoft's libraries use this feature. To use |
|||
parameters I have written a small shell script "libprm". This program |
|||
automatic runs spiceprm and mslib on Your's deck to give a working spice |
|||
input file. To see how this all works please read "libprm_readme" and |
|||
spiceprm readme. |
|||
@ -1,5 +0,0 @@ |
|||
These scripts are free for everyone who think that they might by useful for |
|||
him. If someone makes them better please e-mail me. |
|||
|
|||
Michael Widlok |
|||
widlok@uci.agh.edu.pl |
|||
@ -1,77 +0,0 @@ |
|||
#!/bin/bash |
|||
#set -x -v |
|||
|
|||
# MW. Lib search / show program |
|||
|
|||
# usage liblook libname [text_to_find] [l_before] [l_after] |
|||
|
|||
LIBPATH=/usr/local/lib |
|||
|
|||
function trapper() |
|||
{ |
|||
echo User break! |
|||
echo Exiting . . . |
|||
unset LIBPATH |
|||
exit 1 |
|||
} |
|||
|
|||
trap trapper SIGINT SIGQUIT |
|||
|
|||
function operror() |
|||
{ |
|||
echo Incorrect parameters: $*, $# |
|||
echo Usage: liblook libname [text_to_find] [l_before] [l_after] |
|||
unset LIBPATH |
|||
exit 2 |
|||
} |
|||
|
|||
function showlib() |
|||
{ |
|||
if test -f $LIBPATH/$1; then |
|||
less $LIBPATH/$1; exit 0; fi |
|||
|
|||
if test -f [C./$1; then |
|||
less ./$1; exit 0; fi |
|||
|
|||
echo Searching $1 in ~/ . . . |
|||
less $(find ~/ -name $1) |
|||
} |
|||
|
|||
function searchlib() |
|||
{ |
|||
if test -f $LIBPATH/$1; then |
|||
echo File: $LIBNMAE; echo; |
|||
grep -B"$3" -A"$4" --ignore-case -e "$2" $LIBPATH/$LIBNAME1; |
|||
echo; exit 0; fi |
|||
|
|||
if test -f ./$1; then |
|||
echo File: $1; echo; |
|||
grep -B"$3" -A"$4" --ignore-case -e "$2" ./$1; |
|||
echo; exit 0; fi |
|||
|
|||
#if *.lib or sth like this |
|||
|
|||
echo Searching $1 in ~/ . . .;echo; |
|||
if (grep -B"$3" -A"$4" --ignore-case -e "$2" $(find ~/ -name $1)); then |
|||
echo; exit 0; fi |
|||
|
|||
echo Searching $1 in $LIBPATH;echo; |
|||
if (grep -B"$3" -A"$4" --ignore-case -e "$2" $(find $LIBPATH -name $1)); then |
|||
echo; exit 0; fi |
|||
|
|||
} |
|||
|
|||
|
|||
# Main body |
|||
if test $# -lt 1 -o $# -gt 4; then operror $*; fi |
|||
|
|||
case $# in |
|||
1) showlib $*;; |
|||
2) searchlib $1 $2 2 2;; |
|||
3) searchlib $1 $2 $3 2;; |
|||
4) searchlib $1 $2 $3 $4;; |
|||
esac |
|||
|
|||
unset LIBPATH |
|||
exit 0 |
|||
|
|||
@ -1,9 +0,0 @@ |
|||
Liblook is a script that can show specified model or sub-circuit entry in |
|||
spice library. Common use look like this: |
|||
|
|||
liblook lib_name [text_to_find] [lines_before] [lines_after] |
|||
|
|||
lines_before and lines_after are used when you want to specify how many lines |
|||
you want to see before or after given text. Look to he source for more |
|||
details. |
|||
|
|||
@ -1,58 +0,0 @@ |
|||
#!/bin/bash |
|||
#set -x -v |
|||
|
|||
# MW. Lip / Param parsing program for spice |
|||
|
|||
# -n normal, -f full (keep everything), -r replace original file |
|||
|
|||
export TMPLP=/tmp/LibPrm.$$- |
|||
|
|||
function trapper() |
|||
{ |
|||
echo User break! |
|||
echo Exiting . . . |
|||
rm -f -v ${TMPLP}* |
|||
unset TMPLP |
|||
exit 1 |
|||
} |
|||
|
|||
trap trapper SIGINT SIGQUIT |
|||
|
|||
function operror() |
|||
{ |
|||
echo Incorrect parameters: $*, $# |
|||
unset TMPLP |
|||
exit 2 |
|||
} |
|||
|
|||
function repnormpl() |
|||
{ |
|||
mslib $1 ${TMPLP}1 |
|||
sed -n -e 'p' -e "1r ${TMPLP}1" $1 >${TMPLP}2 |
|||
spiceprm ${TMPLP}2 $2 |
|||
} |
|||
|
|||
function keepall() |
|||
{ |
|||
mslib $1 |
|||
sed -n -e 'p' -e "1r $1.lib" $1 >${TMPLP}2 |
|||
spiceprm ${TMPLP}2 $2 |
|||
} |
|||
|
|||
|
|||
# Main body |
|||
if test $# -lt 2 -o $# -gt 3; then operror $*; fi |
|||
|
|||
case $1$# in |
|||
-r3) operror $*;; |
|||
-n2) repnormpl $2 ${2%.cir}.ckt;; |
|||
-n3) repnormpl $2 $3;; |
|||
-r2) repnormpl $2 $2;; |
|||
-f2) keepall $2 ${2%.cir}.ckt;; |
|||
-f3) keepall $2 $3;; |
|||
esac |
|||
|
|||
rm -f ${TMPLP}* |
|||
unset TMPLP |
|||
exit 0 |
|||
|
|||
@ -1,13 +0,0 @@ |
|||
So, this is my idea of using parametrized subckts with spice. |
|||
|
|||
First I create an input file like foo.cir and I include commands for |
|||
mslib (*MOD, *SUB, *LIB) in it. Then I run "libprm -n foo.cir". Libprm then |
|||
runs mslib first to get all models and subckts form given libraries and then |
|||
runs spiceprm to evaluate all used parameters. |
|||
This works quite right for me, and I hope that You will find my idea |
|||
useful. Spiceprm is not my program (I get it from Internet), but I think |
|||
that it will better to enclose all used programs in this packet. Spiceprm |
|||
has it's own directory with very good readme and examples. If You want to |
|||
find out more about libprm or mslib look for the source code. These are rather |
|||
short and easy programs - they are all that I could write in quite short |
|||
time. |
|||
@ -1,25 +0,0 @@ |
|||
------------------------------- |
|||
MW. 01-10-2000 |
|||
Bugs Fixes - |
|||
----------- |
|||
.subckt inside another parametrized .subckt works right now. |
|||
|
|||
|
|||
---------------------------------------------------------------------- |
|||
Version 0.11 January 2, 1996 |
|||
---------------------------------------------------------------------- |
|||
No new features. |
|||
|
|||
Bug Fixes - |
|||
----------- |
|||
|
|||
1. Duplicate name clash problem with parameterized subckt calls from |
|||
within a .subckt....ends block. |
|||
|
|||
2. Writing continuation lines to the output file occaisionally choked. |
|||
|
|||
|
|||
---------------------------------------------------------------------- |
|||
Version 0.10 October 10, 1996 |
|||
---------------------------------------------------------------------- |
|||
Original release. |
|||
@ -1,339 +0,0 @@ |
|||
GNU GENERAL PUBLIC LICENSE |
|||
Version 2, June 1991 |
|||
|
|||
Copyright (C) 1989, 1991 Free Software Foundation, Inc. |
|||
675 Mass Ave, Cambridge, MA 02139, USA |
|||
Everyone is permitted to copy and distribute verbatim copies |
|||
of this license document, but changing it is not allowed. |
|||
|
|||
Preamble |
|||
|
|||
The licenses for most software are designed to take away your |
|||
freedom to share and change it. By contrast, the GNU General Public |
|||
License is intended to guarantee your freedom to share and change free |
|||
software--to make sure the software is free for all its users. This |
|||
General Public License applies to most of the Free Software |
|||
Foundation's software and to any other program whose authors commit to |
|||
using it. (Some other Free Software Foundation software is covered by |
|||
the GNU Library General Public License instead.) You can apply it to |
|||
your programs, too. |
|||
|
|||
When we speak of free software, we are referring to freedom, not |
|||
price. Our General Public Licenses are designed to make sure that you |
|||
have the freedom to distribute copies of free software (and charge for |
|||
this service if you wish), that you receive source code or can get it |
|||
if you want it, that you can change the software or use pieces of it |
|||
in new free programs; and that you know you can do these things. |
|||
|
|||
To protect your rights, we need to make restrictions that forbid |
|||
anyone to deny you these rights or to ask you to surrender the rights. |
|||
These restrictions translate to certain responsibilities for you if you |
|||
distribute copies of the software, or if you modify it. |
|||
|
|||
For example, if you distribute copies of such a program, whether |
|||
gratis or for a fee, you must give the recipients all the rights that |
|||
you have. You must make sure that they, too, receive or can get the |
|||
source code. And you must show them these terms so they know their |
|||
rights. |
|||
|
|||
We protect your rights with two steps: (1) copyright the software, and |
|||
(2) offer you this license which gives you legal permission to copy, |
|||
distribute and/or modify the software. |
|||
|
|||
Also, for each author's protection and ours, we want to make certain |
|||
that everyone understands that there is no warranty for this free |
|||
software. If the software is modified by someone else and passed on, we |
|||
want its recipients to know that what they have is not the original, so |
|||
that any problems introduced by others will not reflect on the original |
|||
authors' reputations. |
|||
|
|||
Finally, any free program is threatened constantly by software |
|||
patents. We wish to avoid the danger that redistributors of a free |
|||
program will individually obtain patent licenses, in effect making the |
|||
program proprietary. To prevent this, we have made it clear that any |
|||
patent must be licensed for everyone's free use or not licensed at all. |
|||
|
|||
The precise terms and conditions for copying, distribution and |
|||
modification follow. |
|||
|
|||
GNU GENERAL PUBLIC LICENSE |
|||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
|||
|
|||
0. This License applies to any program or other work which contains |
|||
a notice placed by the copyright holder saying it may be distributed |
|||
under the terms of this General Public License. The "Program", below, |
|||
refers to any such program or work, and a "work based on the Program" |
|||
means either the Program or any derivative work under copyright law: |
|||
that is to say, a work containing the Program or a portion of it, |
|||
either verbatim or with modifications and/or translated into another |
|||
language. (Hereinafter, translation is included without limitation in |
|||
the term "modification".) Each licensee is addressed as "you". |
|||
|
|||
Activities other than copying, distribution and modification are not |
|||
covered by this License; they are outside its scope. The act of |
|||
running the Program is not restricted, and the output from the Program |
|||
is covered only if its contents constitute a work based on the |
|||
Program (independent of having been made by running the Program). |
|||
Whether that is true depends on what the Program does. |
|||
|
|||
1. You may copy and distribute verbatim copies of the Program's |
|||
source code as you receive it, in any medium, provided that you |
|||
conspicuously and appropriately publish on each copy an appropriate |
|||
copyright notice and disclaimer of warranty; keep intact all the |
|||
notices that refer to this License and to the absence of any warranty; |
|||
and give any other recipients of the Program a copy of this License |
|||
along with the Program. |
|||
|
|||
You may charge a fee for the physical act of transferring a copy, and |
|||
you may at your option offer warranty protection in exchange for a fee. |
|||
|
|||
2. You may modify your copy or copies of the Program or any portion |
|||
of it, thus forming a work based on the Program, and copy and |
|||
distribute such modifications or work under the terms of Section 1 |
|||
above, provided that you also meet all of these conditions: |
|||
|
|||
a) You must cause the modified files to carry prominent notices |
|||
stating that you changed the files and the date of any change. |
|||
|
|||
b) You must cause any work that you distribute or publish, that in |
|||
whole or in part contains or is derived from the Program or any |
|||
part thereof, to be licensed as a whole at no charge to all third |
|||
parties under the terms of this License. |
|||
|
|||
c) If the modified program normally reads commands interactively |
|||
when run, you must cause it, when started running for such |
|||
interactive use in the most ordinary way, to print or display an |
|||
announcement including an appropriate copyright notice and a |
|||
notice that there is no warranty (or else, saying that you provide |
|||
a warranty) and that users may redistribute the program under |
|||
these conditions, and telling the user how to view a copy of this |
|||
License. (Exception: if the Program itself is interactive but |
|||
does not normally print such an announcement, your work based on |
|||
the Program is not required to print an announcement.) |
|||
|
|||
These requirements apply to the modified work as a whole. If |
|||
identifiable sections of that work are not derived from the Program, |
|||
and can be reasonably considered independent and separate works in |
|||
themselves, then this License, and its terms, do not apply to those |
|||
sections when you distribute them as separate works. But when you |
|||
distribute the same sections as part of a whole which is a work based |
|||
on the Program, the distribution of the whole must be on the terms of |
|||
this License, whose permissions for other licensees extend to the |
|||
entire whole, and thus to each and every part regardless of who wrote it. |
|||
|
|||
Thus, it is not the intent of this section to claim rights or contest |
|||
your rights to work written entirely by you; rather, the intent is to |
|||
exercise the right to control the distribution of derivative or |
|||
collective works based on the Program. |
|||
|
|||
In addition, mere aggregation of another work not based on the Program |
|||
with the Program (or with a work based on the Program) on a volume of |
|||
a storage or distribution medium does not bring the other work under |
|||
the scope of this License. |
|||
|
|||
3. You may copy and distribute the Program (or a work based on it, |
|||
under Section 2) in object code or executable form under the terms of |
|||
Sections 1 and 2 above provided that you also do one of the following: |
|||
|
|||
a) Accompany it with the complete corresponding machine-readable |
|||
source code, which must be distributed under the terms of Sections |
|||
1 and 2 above on a medium customarily used for software interchange; or, |
|||
|
|||
b) Accompany it with a written offer, valid for at least three |
|||
years, to give any third party, for a charge no more than your |
|||
cost of physically performing source distribution, a complete |
|||
machine-readable copy of the corresponding source code, to be |
|||
distributed under the terms of Sections 1 and 2 above on a medium |
|||
customarily used for software interchange; or, |
|||
|
|||
c) Accompany it with the information you received as to the offer |
|||
to distribute corresponding source code. (This alternative is |
|||
allowed only for noncommercial distribution and only if you |
|||
received the program in object code or executable form with such |
|||
an offer, in accord with Subsection b above.) |
|||
|
|||
The source code for a work means the preferred form of the work for |
|||
making modifications to it. For an executable work, complete source |
|||
code means all the source code for all modules it contains, plus any |
|||
associated interface definition files, plus the scripts used to |
|||
control compilation and installation of the executable. However, as a |
|||
special exception, the source code distributed need not include |
|||
anything that is normally distributed (in either source or binary |
|||
form) with the major components (compiler, kernel, and so on) of the |
|||
operating system on which the executable runs, unless that component |
|||
itself accompanies the executable. |
|||
|
|||
If distribution of executable or object code is made by offering |
|||
access to copy from a designated place, then offering equivalent |
|||
access to copy the source code from the same place counts as |
|||
distribution of the source code, even though third parties are not |
|||
compelled to copy the source along with the object code. |
|||
|
|||
4. You may not copy, modify, sublicense, or distribute the Program |
|||
except as expressly provided under this License. Any attempt |
|||
otherwise to copy, modify, sublicense or distribute the Program is |
|||
void, and will automatically terminate your rights under this License. |
|||
However, parties who have received copies, or rights, from you under |
|||
this License will not have their licenses terminated so long as such |
|||
parties remain in full compliance. |
|||
|
|||
5. You are not required to accept this License, since you have not |
|||
signed it. However, nothing else grants you permission to modify or |
|||
distribute the Program or its derivative works. These actions are |
|||
prohibited by law if you do not accept this License. Therefore, by |
|||
modifying or distributing the Program (or any work based on the |
|||
Program), you indicate your acceptance of this License to do so, and |
|||
all its terms and conditions for copying, distributing or modifying |
|||
the Program or works based on it. |
|||
|
|||
6. Each time you redistribute the Program (or any work based on the |
|||
Program), the recipient automatically receives a license from the |
|||
original licensor to copy, distribute or modify the Program subject to |
|||
these terms and conditions. You may not impose any further |
|||
restrictions on the recipients' exercise of the rights granted herein. |
|||
You are not responsible for enforcing compliance by third parties to |
|||
this License. |
|||
|
|||
7. If, as a consequence of a court judgment or allegation of patent |
|||
infringement or for any other reason (not limited to patent issues), |
|||
conditions are imposed on you (whether by court order, agreement or |
|||
otherwise) that contradict the conditions of this License, they do not |
|||
excuse you from the conditions of this License. If you cannot |
|||
distribute so as to satisfy simultaneously your obligations under this |
|||
License and any other pertinent obligations, then as a consequence you |
|||
may not distribute the Program at all. For example, if a patent |
|||
license would not permit royalty-free redistribution of the Program by |
|||
all those who receive copies directly or indirectly through you, then |
|||
the only way you could satisfy both it and this License would be to |
|||
refrain entirely from distribution of the Program. |
|||
|
|||
If any portion of this section is held invalid or unenforceable under |
|||
any particular circumstance, the balance of the section is intended to |
|||
apply and the section as a whole is intended to apply in other |
|||
circumstances. |
|||
|
|||
It is not the purpose of this section to induce you to infringe any |
|||
patents or other property right claims or to contest validity of any |
|||
such claims; this section has the sole purpose of protecting the |
|||
integrity of the free software distribution system, which is |
|||
implemented by public license practices. Many people have made |
|||
generous contributions to the wide range of software distributed |
|||
through that system in reliance on consistent application of that |
|||
system; it is up to the author/donor to decide if he or she is willing |
|||
to distribute software through any other system and a licensee cannot |
|||
impose that choice. |
|||
|
|||
This section is intended to make thoroughly clear what is believed to |
|||
be a consequence of the rest of this License. |
|||
|
|||
8. If the distribution and/or use of the Program is restricted in |
|||
certain countries either by patents or by copyrighted interfaces, the |
|||
original copyright holder who places the Program under this License |
|||
may add an explicit geographical distribution limitation excluding |
|||
those countries, so that distribution is permitted only in or among |
|||
countries not thus excluded. In such case, this License incorporates |
|||
the limitation as if written in the body of this License. |
|||
|
|||
9. The Free Software Foundation may publish revised and/or new versions |
|||
of the General Public License from time to time. Such new versions will |
|||
be similar in spirit to the present version, but may differ in detail to |
|||
address new problems or concerns. |
|||
|
|||
Each version is given a distinguishing version number. If the Program |
|||
specifies a version number of this License which applies to it and "any |
|||
later version", you have the option of following the terms and conditions |
|||
either of that version or of any later version published by the Free |
|||
Software Foundation. If the Program does not specify a version number of |
|||
this License, you may choose any version ever published by the Free Software |
|||
Foundation. |
|||
|
|||
10. If you wish to incorporate parts of the Program into other free |
|||
programs whose distribution conditions are different, write to the author |
|||
to ask for permission. For software which is copyrighted by the Free |
|||
Software Foundation, write to the Free Software Foundation; we sometimes |
|||
make exceptions for this. Our decision will be guided by the two goals |
|||
of preserving the free status of all derivatives of our free software and |
|||
of promoting the sharing and reuse of software generally. |
|||
|
|||
NO WARRANTY |
|||
|
|||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
|||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
|||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
|||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
|||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
|||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
|||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
|||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
|||
REPAIR OR CORRECTION. |
|||
|
|||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
|||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
|||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
|||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
|||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
|||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
|||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
|||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
|||
POSSIBILITY OF SUCH DAMAGES. |
|||
|
|||
END OF TERMS AND CONDITIONS |
|||
|
|||
How to Apply These Terms to Your New Programs |
|||
|
|||
If you develop a new program, and you want it to be of the greatest |
|||
possible use to the public, the best way to achieve this is to make it |
|||
free software which everyone can redistribute and change under these terms. |
|||
|
|||
To do so, attach the following notices to the program. It is safest |
|||
to attach them to the start of each source file to most effectively |
|||
convey the exclusion of warranty; and each file should have at least |
|||
the "copyright" line and a pointer to where the full notice is found. |
|||
|
|||
<one line to give the program's name and a brief idea of what it does.> |
|||
Copyright (C) 19yy <name of author> |
|||
|
|||
This program is free software; you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation; either version 2 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with this program; if not, write to the Free Software |
|||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
|||
|
|||
Also add information on how to contact you by electronic and paper mail. |
|||
|
|||
If the program is interactive, make it output a short notice like this |
|||
when it starts in an interactive mode: |
|||
|
|||
Gnomovision version 69, Copyright (C) 19yy name of author |
|||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
|||
This is free software, and you are welcome to redistribute it |
|||
under certain conditions; type `show c' for details. |
|||
|
|||
The hypothetical commands `show w' and `show c' should show the appropriate |
|||
parts of the General Public License. Of course, the commands you use may |
|||
be called something other than `show w' and `show c'; they could even be |
|||
mouse-clicks or menu items--whatever suits your program. |
|||
|
|||
You should also get your employer (if you work as a programmer) or your |
|||
school, if any, to sign a "copyright disclaimer" for the program, if |
|||
necessary. Here is a sample; alter the names: |
|||
|
|||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
|||
`Gnomovision' (which makes passes at compilers) written by James Hacker. |
|||
|
|||
<signature of Ty Coon>, 1 April 1989 |
|||
Ty Coon, President of Vice |
|||
|
|||
This General Public License does not permit incorporating your program into |
|||
proprietary programs. If your program is a subroutine library, you may |
|||
consider it more useful to permit linking proprietary applications with the |
|||
library. If this is what you want to do, use the GNU Library General |
|||
Public License instead of this License. |
|||
@ -1,176 +0,0 @@ |
|||
**************************************************************** |
|||
* Pi attenuator pad. |
|||
* Parameters: R0 = impedance |
|||
* DB = attenuation in dB (positive) |
|||
.SUBCKT PIPAD 1 2 { R0 DB } |
|||
R1 1 0 {R0*(1+2/(10**(DB/20)-1))} |
|||
R2 1 2 {(R0/2)*(10**(DB/20)-10**(DB/-20))} |
|||
R3 2 0 {R0*(1+2/(10**(DB/20)-1))} |
|||
.ENDS |
|||
**************************************************************** |
|||
* PCB Via inductance + extra L. |
|||
* H = substrate height in inches |
|||
* D = via diameter in inches |
|||
* L = extra inductance in henries. |
|||
.SUBCKT VIA 1 2 { H D L } |
|||
LV 1 2 {L+ |
|||
+ 5.08E-9*H*(log((2+sqrt(4+D*D/(H*H)))*H/D)+ |
|||
+ .75*(D/H-sqrt(4+D*D/(H*H))))} |
|||
.ENDS |
|||
**************************************************************** |
|||
* Voltage-controlled oscillator. |
|||
* Parameters: F = frequency @ Vc = 0 in Hz |
|||
* KV = tuning sensitivity in Hz/volt |
|||
* A = peak output amplitude |
|||
* RO = output port resistance |
|||
* Connections: Vc Out |
|||
.SUBCKT VCO 20 2 { F KV A RO } |
|||
RIN1 20 0 1E12 |
|||
VSW 30 0 DC 0 PULSE 0 1 |
|||
RSW 30 0 1E12 |
|||
BIN 3 0 V=(V(20)+{F/KV})*V(30) |
|||
R3 3 0 1E6 |
|||
GSIN 2 0 22 0 {1/RO} |
|||
RSIN 2 0 {RO} |
|||
B1 1 0 I=-(V(22)*V(3)) |
|||
B2 22 0 I=V(1)*V(3) |
|||
R2 1 0 1E9 |
|||
I1 0 1 PULSE {1E-9*A} 0 |
|||
C2 1 0 {.159154943/KV} |
|||
C1 22 0 {.159154943/KV} |
|||
R1 22 0 1E9 |
|||
.ENDS |
|||
**************************************************************** |
|||
* Ideal Frequency converter. |
|||
* Parameters: F = Oscillator frequency |
|||
* RI = input port resistance |
|||
* RO = output port resistance |
|||
* Connections: In Out |
|||
.SUBCKT FCNVT 1 2 { F RI RO } |
|||
RIN 1 0 {RI} |
|||
VLO 3 0 DC 0 SIN 0 1 {F} |
|||
RLO 3 0 1E12 |
|||
BMIX 0 2 I=(V(1)*V(3))/{RO} |
|||
RO 2 0 {RO} |
|||
.ENDS |
|||
**************************************************************** |
|||
* Sine wave RF power source. |
|||
* Parameters: F = Frequency |
|||
* R = Output resistance |
|||
* P = Power in dBm |
|||
* V = DC (EMF) |
|||
.SUBCKT RFGEN 1 2 { F R P V } |
|||
* + - |
|||
Is 2 1 DC {V/R} SIN {V/R} {sqrt((10**(P/10))/(125*R))} {F} |
|||
Ro 1 2 {R} |
|||
.ENDS |
|||
**************************************************************** |
|||
* Sine wave 2-tone RF power source. |
|||
* Parameters: F1 = 1st tone frequency |
|||
* F2 = 2nd tone frequency |
|||
* R = output resistance |
|||
* P = power per tone in dBm |
|||
* V = DC (EMF) |
|||
.SUBCKT 2TGEN 1 2 { F1 F2 R P V } |
|||
* + - |
|||
I1 2 1 DC {V/R} SIN {V/R} {sqrt((10**(P/10))/(125*R))} {F1} |
|||
I2 2 1 DC 0 SIN 0 {sqrt((10**(P/10))/(125*R))} {F2} |
|||
Ro 1 2 {R} |
|||
.ENDS |
|||
**************************************************************** |
|||
* Transmission lines |
|||
* All ports must have external connections. |
|||
* Parameters: Z0 = impedance |
|||
* L = length in inches |
|||
* VP = velocity-of-propagation rel. to air |
|||
* Connections: 1+ 1- 2+ 2- |
|||
.SUBCKT TXL 1 2 3 4 { Z0 L VP } |
|||
T1 1 2 3 4 Z0={Z0} TD={L/(1.180315E10*VP)} |
|||
.ENDS |
|||
**************************************************************** |
|||
* Lossy transmission line. |
|||
* All ports must have external connections. |
|||
* Parameters: Z0 = impedance |
|||
* L = length in inches |
|||
* VP = velocity-of-propagation rel. to air |
|||
* A = loss in dB/inch |
|||
* Connections: 1+ 1- 2+ 2- |
|||
.SUBCKT LTXL 1 2 3 4 { Z0 L VP A } |
|||
O1 1 2 3 4 LOSSY |
|||
.MODEL LOSSY LTRA LEN={L} |
|||
+ R={5.848492e-3*A*Z0} |
|||
+ L={Z0/(1.180315E10*VP)} |
|||
+ C={1/(1.180315E10*VP*Z0)} |
|||
.ENDS |
|||
**************************************************************** |
|||
* 2 coupled transmission lines |
|||
* All ports must have external connections. |
|||
* Parameters: Z0E = even-mode impedance |
|||
* Z0O = odd-mode impedance |
|||
* L = length in inches |
|||
* VP = velocity-of-propagation rel. to air |
|||
* Connections: 1+ 1- 2+ 2- { Z0E Z0O L VP } |
|||
.SUBCKT CPL2 1 2 3 4 |
|||
T1 1 0 3 0 Z0={Z0E} TD={L/(1.180315E10*VP)} |
|||
T2 1 2 3 4 Z0={2*Z0E*Z0O/(Z0E-Z0O)} TD={L/(1.180315E10*VP)} |
|||
T3 2 0 4 0 Z0={Z0E} TD={L/(1.180315E10*VP)} |
|||
.ENDS |
|||
**************************************************************** |
|||
* Generic Bipolar OpAmp - linear model |
|||
* Parameters: G = open-loop gain in dB |
|||
* FT = unity gain frequency in Hz |
|||
* IOS = input offset current in amps |
|||
* VOS = input offset voltage |
|||
* IB = input bias current in amps |
|||
.SUBCKT BIPOPA 2 3 6 7 4 { G FT IOS VOS IB } |
|||
* - In + Out Vcc Vee |
|||
RP 4 7 10K |
|||
RXX 4 0 10MEG |
|||
IBP 3 0 {IB-IOS} |
|||
RIP 3 0 10MEG |
|||
CIP 3 0 1.4PF |
|||
IBN 2 0 {IB} |
|||
RIN 2 0 10MEG |
|||
CIN 2 0 1.4PF |
|||
VOFST 2 10 {VOS} |
|||
RID 10 3 200K |
|||
EA 11 0 10 3 1 |
|||
R1 11 12 5K |
|||
R2 12 13 50K |
|||
C1 12 0 {13E-6/FT} |
|||
GA 0 14 0 13 {0.0135*(10**(G/20))} |
|||
C2 13 14 {2.7E-6/FT} |
|||
RO 14 0 75 |
|||
L 14 6 {30/FT} |
|||
RL 14 6 1000 |
|||
CL 6 0 3PF |
|||
.ENDS |
|||
**************************************************************** |
|||
* Generic FET OpAmp - linear model |
|||
* Parameters: G = open-loop gain in dB |
|||
* FT = unity gain frequency in Hz |
|||
* VOS = input offset voltage |
|||
.SUBCKT FETOPA 2 3 6 7 4 { G FT VOS } |
|||
* - In + Out Vcc Vee |
|||
RP 4 7 6K |
|||
RXX 4 0 10MEG |
|||
IBP 3 0 33E-12 |
|||
RIP 3 0 1E12 |
|||
CIP 3 0 3PF |
|||
IBN 2 0 30E-12 |
|||
RIN 2 0 1E12 |
|||
CIN 2 0 3PF |
|||
VOFST 2 10 {VOS} |
|||
RID 10 3 1E12 |
|||
EA 11 0 10 3 1 |
|||
R1 11 12 5K |
|||
R2 12 13 50K |
|||
C1 12 0 {24E-6/FT} |
|||
GA 0 14 0 13 {0.0135*(10**(G/20))} |
|||
C2 13 14 {2.33E-6/FT} |
|||
RO 14 0 75 |
|||
L 14 6 {4E-6/FT} |
|||
RL 14 6 100 |
|||
CL 6 0 3PF |
|||
.ENDS |
|||
**************************************************************** |
|||
@ -1,216 +0,0 @@ |
|||
------------------------------------------------------------------------ |
|||
SPICEPRM - A Spice preprocessor for parameterized subcircuits (v 0.11) |
|||
Copyright (C) 1996 Andrew J. Borsa <andy@moose.mv.com> |
|||
------------------------------------------------------------------------ |
|||
|
|||
This program is free software; you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation; either version 2 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with this program; if not, write to the Free Software |
|||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
|||
|
|||
------------------------------------------------------------------------ |
|||
|
|||
Spiceprm was written in the course of moving my engineering activities |
|||
to the Linux operating system. My previous MSDOS spice package |
|||
permitted passing parameters to subcircuits. The raw Berkely Spice |
|||
doesn't. Anyone used to this feature knows the frustration of trying |
|||
to use a simulator without it. This script is the result of my |
|||
desperation. It translates a circuit file containing parameterized |
|||
subcircuits with math expressions into another circuit file meeting raw |
|||
spice requirements. You then run spice on the translated output file. |
|||
|
|||
This is an alpha version. It probably has some bugs I haven't caught. |
|||
But I have used it in a work environment enough to feel comfortable |
|||
about releasing it for comments and improvement suggestions. |
|||
|
|||
|
|||
What's So Great About Subcircuits With Parameters? |
|||
-------------------------------------------------- |
|||
1. You can generalize a model once and then use it without having to |
|||
recalculate values of it's internal elements every time. |
|||
|
|||
2. Many electronic devices can be modelled by using mathematical |
|||
expressions. The independent variables can be passed to the model as |
|||
parameters, evaluated in equations, and used to set the behavior of a |
|||
particular model instance. |
|||
|
|||
3. They save mucho time and minimize human calculation error. |
|||
|
|||
|
|||
Installation |
|||
------------ |
|||
1. Copy the executable script to an accessible directory. I keep mine |
|||
in $HOME/bin so it's on my path. |
|||
|
|||
2. Modify the top line if necessary to reflect the path to your Perl |
|||
interpreter. |
|||
For ex., #! /usr/bin/perl may have to become #! /usr/local/bin/perl or |
|||
wherever the perl binary is located. |
|||
|
|||
|
|||
Usage |
|||
----- |
|||
spiceprm infile [outfile] |
|||
|
|||
infile: Circuit file name containing parameterized subcircuits. |
|||
outfile: Transformed file meeting raw spice netlist conventions. |
|||
Optional. If not given, output is produced on standard |
|||
output (stdout). |
|||
|
|||
My file name convention: infile = *.cir, outfile = *.ckt |
|||
|
|||
infile == outfile isn't permitted for a coupla good reasons, the |
|||
best being you don't want to trash your original source. |
|||
|
|||
Now source outfile from spice. |
|||
|
|||
I always check the output from a new infile just to make sure. This |
|||
version only checks for a few obvious errors, so scanning outfile for |
|||
reasonable looking values and netlist correctness is wise. Note that |
|||
comment and blank lines are discarded in outfile and alphabetic |
|||
characters are transformed to lower case. |
|||
|
|||
|
|||
Parameterized Subcircuit Netlist Convention |
|||
------------------------------------------- |
|||
Calling a parameterized subcircuit works similarly to a normal spice call |
|||
except for the addition of a {} delimited list of parameter value |
|||
assignments - |
|||
|
|||
Xname n1 n2 n3 ... ni subname {p1 = val1 ... pj = valj} |
|||
p1 thru pj are the parameter assignments to be passed to the |
|||
subcircuit. |
|||
val is any valid spice value. |
|||
{} (braces) must enclose the parameter assignment sequence. |
|||
|
|||
After running the preprocessor on this file, each call in the netlist |
|||
will be replaced by the following - |
|||
|
|||
Xname n1 n2 n3 ... ni subname#k |
|||
*{p1 = val1 ... pj = valj} |
|||
where k is a digit or digits representing a subcircuit with that |
|||
specific set of parameter substitutions. k will be incremented for |
|||
each unique set of parameters and matched by a new .subckt listing |
|||
named subname#k as follows - |
|||
|
|||
.subckt subname#k n1 n2 n3 ... ni |
|||
... listing with parameters substituted and equations evaluated |
|||
.ends |
|||
|
|||
|
|||
Creating Parameterized Subcircuits |
|||
---------------------------------- |
|||
Below is a simple example. See the EXAMPLES file for a number of |
|||
illustrative and useful models for Spice3. |
|||
|
|||
This model creates an RF power source specified using the natural |
|||
output power units of dBm (dB referenced to 1 milliwatt). Note that |
|||
the model parameters must be declared on the ".subckt" definition line |
|||
inside curly braces {}. |
|||
**************************************************************** |
|||
* Sine wave RF power source. |
|||
* Parameters: F = Frequency |
|||
* R = Output resistance |
|||
* P = Power in dBm |
|||
* V = DC (EMF) |
|||
.SUBCKT RFGEN 1 2 {F R P V} |
|||
* + - |
|||
Is 2 1 DC {V/R} SIN {V/R} {sqrt((10**(P/10))/(125*R))} {F} |
|||
Ro 1 2 {R} |
|||
.ENDS |
|||
**************************************************************** |
|||
Note that independent current source Is has it's literal spice |
|||
parameters replaced by equations that calculate the required values |
|||
from the passed parameters. Each equation must be enclosed by {} to |
|||
inform the preprocessor that a substitution and calculation must be |
|||
performed for whatever appears between the braces. |
|||
|
|||
Equations may span multiple lines by using the spice line continuation |
|||
symbol "+" as the first character of the following line. |
|||
|
|||
.MODEL statements inside subcircuits may also use passed parameters. |
|||
In fact, anything between {} inside a subcircuit will be evaluated and |
|||
replaced with a result. |
|||
|
|||
Be careful in situations like the following: |
|||
Bx 3 0 v = {v(1)*sgn(v(2))*frick/frack} WRONG!!! |
|||
|
|||
The Spice3 nonlinear source element "B" also accepts equations |
|||
describing it's output dependency on functions of circuit voltages |
|||
and currents. If "frick" and "frack" are parameters, you must |
|||
separate them from the element's equation as follows - |
|||
Bx 3 0 v = v(1)*sgn(v(2))*{frick/frack} |
|||
|
|||
Just remember that preprocessor equations and spice functions must |
|||
never meld. |
|||
|
|||
The parameter substitution first replaces all parameters between any {} |
|||
with their numerical values and then uses Perl's eval() function to |
|||
produce a final numerical value. Theoretically at least, you could |
|||
execute a Perl program within those braces. I haven't explored this |
|||
yet so feel free. Realize though, that whatever's inside the braces |
|||
gets a ";" appended at the end to make a valid Perl statement from the |
|||
usual equation. Also, Perl's block delimiters are braces, so extra |
|||
one's could confuse the current parsing which is simply oriented to |
|||
equations. Ah well. |
|||
|
|||
|
|||
Known Bugs, Anomalies, and Perl Gotcha's |
|||
---------------------------------------- |
|||
1. Minimal error checking! Be forewarned! |
|||
|
|||
2. Don't use ".ends subckt_name" with parameters. Use ".ends" only. |
|||
The preprocessor modifies subckt_name to subckt_name#k. |
|||
|
|||
3. Spice unit representations like "k", "meg", etc, are not recognized |
|||
inside the {} equation sections of .subckt listings. They may, |
|||
however, be used in the parameter assignment section of a .subckt call. |
|||
|
|||
4. "-" as part of .subckt name doesn't work but "_" does. Stick to |
|||
alphanumeric names with optional underscore characters. |
|||
|
|||
5. Equations must use Perl math operators and functions. |
|||
The following lists operator differences I'm aware of - |
|||
|
|||
Exponentiation - Perl : ** |
|||
Spice3 : ^ |
|||
|
|||
Logical AND, OR - Perl : &&, || |
|||
Spice3 : &, | |
|||
|
|||
Equality, Inequality - Perl : ==, != |
|||
Spice3 : =, <> |
|||
|
|||
These operators are the same for Perl and Spice3 - |
|||
+ - * / % ! < > <= >= |
|||
|
|||
These operators are unique to Perl - |
|||
& | ^ ~ : bitwise AND, OR, exclusive OR, complement |
|||
|
|||
Perl math functions - |
|||
abs(EXPR) : absolute value of EXPR |
|||
atan2(Y,X) : arctangent of Y/X in the range of -pi to +pi |
|||
cos(EXPR) : cosine of EXPR in radians |
|||
exp(EXPR) : e raised to EXPR |
|||
int(EXPR) : integer portion of EXPR |
|||
log(EXPR) : natural logarithm (base e) of EXPR |
|||
rand[(EXPR)]: returns a random fractional number between 0 and the |
|||
value of EXPR. If EXPR is omitted, returns a value |
|||
between 0 and 1. |
|||
sin(EXPR) : sine of EXPR in radians |
|||
sqrt(EXPR) : square root of EXPR |
|||
|
|||
|
|||
Finally, if you could make use of a language allowing you to do neat |
|||
things like this with minimal pain, give Perl a try. It's naturally |
|||
suited for text processing and transformation tasks like pre and post |
|||
processors, along with any math manipulation required. |
|||
@ -1,305 +0,0 @@ |
|||
#!/usr/bin/env perl |
|||
# spiceprm |
|||
# Pass parameters to spice subcircuits. |
|||
# Usage: spiceprm infile [outfile] |
|||
# infile and outfile must be different. |
|||
# Output written to STDOUT if outfile not given. |
|||
|
|||
$BANNER = "Spiceprm version 0.11, Copyright (C) 1996 Andrew J. Borsa"; |
|||
|
|||
# NOTES: |
|||
# 1. Units not recognized inside .subckt {} expressions. |
|||
# 2. Perl exponent operator: "**", Spice exp op: "^". |
|||
# 3. "-" as part of subckt name doesn't work but "_" does. |
|||
|
|||
# Netlist convention |
|||
# Xname n1 n2 n3 ... ni subname {p1 = val1 ... pj = valj} |
|||
# p1 thru pj are the parameters to be passed to the subcircuit. |
|||
# val is any valid spice value. |
|||
# |
|||
# .subckt name n1 n2 ... ni {p1 p2 ... pj} |
|||
# parameter expressions must be enclosed in {}. |
|||
|
|||
# After substitution - |
|||
# Xname n1 n2 n3 ... ni subname#k |
|||
# *{p1 = val1 ... pj = valj} |
|||
# .subckt subname#k n1 n2 n3 ... ni |
|||
# ... listing with parameters substituted |
|||
# .ends |
|||
|
|||
# %subckt: key = subname |
|||
# value = startline, endline, listing(.subckt ... .ends) |
|||
# Only for .subckts with parameters. |
|||
# %subprm: key = subname |
|||
# value = parameter name list |
|||
# %subcall: key = Xname[#subname0#subname1...] |
|||
# value = subname#k |
|||
# NOTE: IF Xname is called from within a .subckt, it will have calling |
|||
# .subckt names appended, delimited by #'s. |
|||
# %sub: key = subname#k |
|||
# value = p1 val1 ... pj valj, where val is a pure |
|||
# numeric with no units. |
|||
|
|||
$MAXLEN = 70; # Max output file line length. |
|||
$DMAXLEN = 10; # Amount to increment if necessary. |
|||
$linenum = 0; |
|||
|
|||
%units = ('f','1e-15','p','1e-12','n','1e-9','u','1e-6','mil','25.4e-6', |
|||
'm','1e-3','k','1e3','meg','1e6','g','1e9','t','1e12'); |
|||
|
|||
$* = 1; # Pattern match with multi-line strings. |
|||
|
|||
($infile, $outfile) = @ARGV; |
|||
print "\n$BANNER\ninfile: $infile\noutfile: $outfile\n\n"; |
|||
$#ARGV && ($infile eq $outfile) |
|||
&& die "Input and Output filenames must be different\n"; |
|||
open(INFILE, $infile) || die "Can't open source file: $infile\n"; |
|||
$hasprm = $depth = 0; |
|||
&prm_scan; |
|||
close(INFILE); |
|||
|
|||
open(INFILE, $infile) || die "Can't open source file: $infile\n"; |
|||
unlink $outfile if $#ARGV; |
|||
open(OUTFILE, $#ARGV ? ">$outfile" : ">-") |
|||
|| die "Can't open output file: $outfile\n"; |
|||
$depth = 0; |
|||
&prm_wr; |
|||
close(INFILE); |
|||
close(OUTFILE); |
|||
|
|||
# Get a line from the input file, combining any continuation lines into |
|||
# one long line. Skip comment and blank lines. |
|||
sub prm_getline { |
|||
local($line); |
|||
|
|||
chop($line = defined($nxtline) ? $nxtline : <INFILE>); |
|||
$linenum = $.; |
|||
while ($nxtline = <INFILE>) { |
|||
if ($line =~ /^\*|^\s/) { $line = ''; } |
|||
if ($line eq '' || $nxtline =~ s/^(\+)/ /) { |
|||
chop($nxtline); |
|||
$line .= $nxtline; |
|||
} |
|||
else { last; } |
|||
} |
|||
$line; |
|||
} |
|||
|
|||
# Scan the input file looking for subcircuit calls with parameter list and |
|||
# any subcircuits with defined parameters. |
|||
sub prm_scan { |
|||
local(@w, @tmp, @list); |
|||
local($xnm, $subnm, $i, $max, $m, $s, $n, $tmp, $start); |
|||
local($sublist) = ''; |
|||
|
|||
PRM_SCAN: while ($_ = &prm_getline) { |
|||
# skip .control - .endc blocks |
|||
if (/^\.control/i) { |
|||
while ($_ = &prm_getline) { next PRM_SCAN if (/^\.endc/i); } |
|||
} |
|||
tr/A-Z/a-z/; |
|||
PRM_TST: { |
|||
if (/^x/ && s/(\{([^\}]+)\})//) { |
|||
@w = split(' '); |
|||
@tmp = @w[0 .. $#w-1]; |
|||
$xnm = $w[0] . $sublist; $subnm = $w[$#w]; |
|||
$_ = $2; $i = 0; |
|||
while (/(\w+)\s*\=\s*([+-]?\d*(\.\d*)?([Ee][+-]?\d+)?)([a-z]\w*)?/) { |
|||
# 1 2 3 4 5 |
|||
$prmval{$1} = $2*($5 ? &unit2mult($5) : 1); |
|||
$_ = $'; |
|||
$i += 2; |
|||
} |
|||
$max = -1; $m = ''; |
|||
CHKDUP: foreach $s (keys %sub) { |
|||
$s =~ /(\w+)\#(\d+)/; |
|||
if ($subnm eq $1) { |
|||
if ($max < $2) { $max = $2; } |
|||
$n = (@w = split(' ', $sub{$s})); |
|||
if ($n == $i) { |
|||
for ($i = 0; $i < $n; $i += 2) { |
|||
last if $w[$i+1] ne $prmval{$w[$i]}; |
|||
} |
|||
if ($i >= $n) { |
|||
$m = 1; |
|||
$subcall{$xnm} = $s; |
|||
last CHKDUP; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
if ($m eq '') { |
|||
foreach $n (keys %prmval) { |
|||
$m = join(' ', $m, $n, $prmval{$n}); |
|||
} |
|||
$sub{($s = join('', $subnm, '#', $max+1))} = $m; |
|||
$subcall{$xnm} = $s; |
|||
} |
|||
push(@list, join(' ', @tmp, $subcall{$xnm})) if $depth; |
|||
undef %prmval; |
|||
last PRM_TST; |
|||
} |
|||
if (/^\.subckt\s+(\w+)/) { |
|||
$depth++; $tmp = $1; |
|||
$sublist .= '#' . $1; |
|||
if (s/(\{([^\}]+)\})//) { |
|||
if ($hasprm) { |
|||
print "Line $linenum: ", |
|||
"Nested parameterized subckt definitions not permitted\n\n"; |
|||
} |
|||
else { |
|||
$hasprm = 1; $start = $.; |
|||
$subprm{$psubnm = $tmp} = $2; |
|||
} |
|||
} |
|||
push(@list, $_); # With {} parameter defs removed. |
|||
last PRM_TST; |
|||
} |
|||
if (/^\.ends/) { |
|||
$sublist =~ s/(\#\w+)$//; |
|||
if (--$depth == 0) { |
|||
if ($hasprm) { |
|||
$subckt{$psubnm} = join("\n",join(' ',$start,$.),@list,$_); |
|||
} |
|||
$hasprm = 0; |
|||
undef @list; $sublist = ''; |
|||
last PRM_TST; |
|||
} |
|||
# MW. 'last PRM_TST' should be inside 'if' loop to allow nestle subckts. |
|||
} |
|||
if ($depth) { |
|||
push(@list, $_); |
|||
last PRM_TST; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
# Write the output file. |
|||
sub prm_wr { |
|||
local(@w, @pnms, @list, @line); |
|||
local($xnm, $subnm, $n, $m, $i, $s); |
|||
local($sublist) = ''; |
|||
|
|||
PRMWR_SCAN: while ($_ = &prm_getline) { |
|||
# write .control - .endc blocks |
|||
if (/^\.control/i) { |
|||
print OUTFILE "$_\n"; |
|||
while ($_ = &prm_getline) { |
|||
prm_wrline($_); |
|||
next PRMWR_SCAN if (/^\.endc/i); |
|||
} |
|||
} |
|||
tr/A-Z/a-z/; |
|||
if (/^x/ && s/(\{([^\}]+)\})//) { |
|||
@w = split(' '); $subnm = pop(@w); |
|||
$xnm = $w[0] . $sublist; |
|||
prm_wrline(join(' ', @w, $subcall{$xnm})); |
|||
print OUTFILE "* $1\n"; |
|||
if (!defined($subprm{$subnm})) { |
|||
print "Line $linenum: Subckt \"$subnm\" has no defined parameters\n\n"; |
|||
next PRMWR_SCAN; |
|||
} |
|||
$n = @pnms = sort(split(' ', $subprm{$subnm})); |
|||
$m = (@w = split(' ', $sub{$subcall{$xnm}})); |
|||
if ($n == $m/2) { |
|||
for ($i = 0, undef(@list); $i < $m; $i += 2) { |
|||
push(@list, $w[$i]); |
|||
} |
|||
for ($i = 0, @w = sort(@list); $i < $n; ++$i) { |
|||
if ($pnms[$i] ne $w[$i]) { |
|||
print "Line $linenum: ", |
|||
"Undefined parameter \"$w[$i]\"", |
|||
"in subckt \"$subnm\" call\n\n"; |
|||
next PRMWR_SCAN; |
|||
} |
|||
} |
|||
} |
|||
else { |
|||
print "Line $linenum: ", |
|||
"Incorrect number of parameters in subckt \"$subnm\" call\n\n"; |
|||
} |
|||
next PRMWR_SCAN; |
|||
} |
|||
if (/^\.subckt\s+(\w+)/) { |
|||
if ($s = $subckt{$1}) { |
|||
$s =~ /\d+\s+(\d+)/; |
|||
$n = $1; |
|||
&prm_getline until $. == $n; |
|||
} |
|||
else { |
|||
$depth++; $sublist .= '#' . $1; |
|||
prm_wrline($_); |
|||
} |
|||
next PRMWR_SCAN; |
|||
} |
|||
if (/^\.end\b/) { |
|||
foreach $s (keys %sub) { |
|||
($subnm = $s) =~ s/\#\d+//; |
|||
@line = split(/\n/, $subckt{$subnm}); |
|||
shift(@line); |
|||
$line[0] =~ s/$subnm/$s/; |
|||
%prmval = split(' ', $sub{$s}); |
|||
foreach (@line) { |
|||
s/\{([^\}]+)\}/&prm_eval($1, %prmval)/eg; |
|||
prm_wrline($_); |
|||
} |
|||
} |
|||
print OUTFILE ".end\n"; |
|||
last PRMWR_SCAN; |
|||
} |
|||
if (/^\.ends/) { |
|||
if (--$depth == 0) { $sublist = ''; } |
|||
else { $sublist =~ s/(\#\w+)$//; } |
|||
} |
|||
prm_wrline($_); |
|||
} |
|||
} |
|||
|
|||
# Translate a possible unit into a multiplier factor. |
|||
# Parameter is the unit letter string assumed lower case. |
|||
sub unit2mult { |
|||
local($u) = shift; |
|||
|
|||
$u = ($u =~ /^(mil|meg)/ ? $1 : substr($u, 0, 1)); |
|||
$u = defined($units{$u}) ? $units{$u} : 1; |
|||
} |
|||
|
|||
# Evaluate a parameter expression. |
|||
# Arguments: expression, parameter & value assoc. array. |
|||
sub prm_eval { |
|||
local($x,%prm) = @_; |
|||
|
|||
foreach $key (keys %prm) { |
|||
$x =~ s/\b$key\b/$prm{$key}/eg; |
|||
} |
|||
eval($x . ';'); |
|||
} |
|||
|
|||
# Write an output file line with a max length. The line is split on |
|||
# whitespace or '=' at a point less than or equal to the max length |
|||
# and output as a spice continuation line. |
|||
# If a splitting delimiter is not found within $MAXLEN, then allowable |
|||
# length is increased, potentially up to the actual line length. |
|||
# NOTE: outputs '\n'. |
|||
# $MAXLEN sets the max value, $DMAXLEN the increment. |
|||
# File handle = OUTFILE. |
|||
sub prm_wrline { |
|||
local($line) = shift; |
|||
local($max, $s, $m); |
|||
|
|||
$max = $MAXLEN; |
|||
until ($line eq '') { |
|||
if (length($line) > $max) { |
|||
$m = substr($line, 0, $max); |
|||
if ($m =~ /((\s|\=)[^(\s|\=)]*)$/) { |
|||
$s = $` . $2; |
|||
$line = '+' . substr($line, length($s)); |
|||
} |
|||
else { $max += $DMAXLEN; next; } |
|||
} |
|||
else { $s = $line; $line = ''; } |
|||
print OUTFILE "$s\n"; |
|||
$max = $MAXLEN; |
|||
} |
|||
} |
|||
@ -1,19 +0,0 @@ |
|||
Begin3 |
|||
Title: spiceprm-0.11.tar.gz |
|||
Version: 0.11 |
|||
Entered-date: 02JAN97 |
|||
Description: A Perl script preprocessor adding parameterized |
|||
subcircuit capability to the Berkeley Spice circuit |
|||
simulator. Should also work with any spice lacking |
|||
this feature. |
|||
Keywords: spice cad simulation preprocessor perl script |
|||
Author: andy@moose.mv.com (Andy Borsa) |
|||
Maintained-by: |
|||
Primary-site: sunsite.unc.edu /pub/Linux/apps/circuits |
|||
15.6kB spiceprm-0.11.tar.gz |
|||
Alternate-site: |
|||
Original-site: |
|||
Platforms: Linux or most any unix, Perl 4 or greater. |
|||
Tested with Linux and Perl 5. |
|||
Copying-policy: GNU General Public License. See file COPYING. |
|||
End |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue