Code to link mos9 and bjt2 and some fixes from last Alan's code.
This commit is contained in:
parent
34d9855db1
commit
8551caa8e9
|
|
@ -225,6 +225,7 @@ src/spicelib/analysis/Makefile \
|
||||||
src/spicelib/devices/Makefile \
|
src/spicelib/devices/Makefile \
|
||||||
src/spicelib/devices/asrc/Makefile \
|
src/spicelib/devices/asrc/Makefile \
|
||||||
src/spicelib/devices/bjt/Makefile \
|
src/spicelib/devices/bjt/Makefile \
|
||||||
|
src/spicelib/devices/bjt2/Makefile \
|
||||||
src/spicelib/devices/bsim1/Makefile \
|
src/spicelib/devices/bsim1/Makefile \
|
||||||
src/spicelib/devices/bsim2/Makefile \
|
src/spicelib/devices/bsim2/Makefile \
|
||||||
src/spicelib/devices/bsim3v1/Makefile \
|
src/spicelib/devices/bsim3v1/Makefile \
|
||||||
|
|
@ -249,6 +250,7 @@ src/spicelib/devices/mos1/Makefile \
|
||||||
src/spicelib/devices/mos2/Makefile \
|
src/spicelib/devices/mos2/Makefile \
|
||||||
src/spicelib/devices/mos3/Makefile \
|
src/spicelib/devices/mos3/Makefile \
|
||||||
src/spicelib/devices/mos6/Makefile \
|
src/spicelib/devices/mos6/Makefile \
|
||||||
|
src/spicelib/devices/mos9/Makefile \
|
||||||
src/spicelib/devices/res/Makefile \
|
src/spicelib/devices/res/Makefile \
|
||||||
src/spicelib/devices/sw/Makefile \
|
src/spicelib/devices/sw/Makefile \
|
||||||
src/spicelib/devices/tra/Makefile \
|
src/spicelib/devices/tra/Makefile \
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ initdata_DATA = spinit setplot spectrum
|
||||||
DYNAMIC_DEVICELIBS = \
|
DYNAMIC_DEVICELIBS = \
|
||||||
spicelib/devices/asrc/libasrc.la \
|
spicelib/devices/asrc/libasrc.la \
|
||||||
spicelib/devices/bjt/libbjt.la \
|
spicelib/devices/bjt/libbjt.la \
|
||||||
|
spicelib/devices/bjt2/libbjt2.la \
|
||||||
spicelib/devices/bsim1/libbsim1.la \
|
spicelib/devices/bsim1/libbsim1.la \
|
||||||
spicelib/devices/bsim2/libbsim2.la \
|
spicelib/devices/bsim2/libbsim2.la \
|
||||||
spicelib/devices/bsim3/libbsim3.la \
|
spicelib/devices/bsim3/libbsim3.la \
|
||||||
|
|
@ -43,6 +44,7 @@ DYNAMIC_DEVICELIBS = \
|
||||||
spicelib/devices/mos2/libmos2.la \
|
spicelib/devices/mos2/libmos2.la \
|
||||||
spicelib/devices/mos3/libmos3.la \
|
spicelib/devices/mos3/libmos3.la \
|
||||||
spicelib/devices/mos6/libmos6.la \
|
spicelib/devices/mos6/libmos6.la \
|
||||||
|
spicelib/devices/mos9/libmos9.la \
|
||||||
spicelib/devices/res/libres.la \
|
spicelib/devices/res/libres.la \
|
||||||
spicelib/devices/sw/libsw.la \
|
spicelib/devices/sw/libsw.la \
|
||||||
spicelib/devices/tra/libtra.la \
|
spicelib/devices/tra/libtra.la \
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
/**********
|
/**********
|
||||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||||
Author: 1985 Thomas L. Quarles
|
Author: 1985 Thomas L. Quarles
|
||||||
|
Modified: 2001 AlansFixes
|
||||||
**********/
|
**********/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -36,6 +37,9 @@ NIiter(register CKTcircuit *ckt, int maxIter)
|
||||||
static char *msg = "Too many iterations without convergence";
|
static char *msg = "Too many iterations without convergence";
|
||||||
|
|
||||||
|
|
||||||
|
CKTnode *node; /* current matrix entry */
|
||||||
|
double diff, maxdiff, damp_factor, *OldCKTstate0;
|
||||||
|
|
||||||
iterno=0;
|
iterno=0;
|
||||||
ipass=0;
|
ipass=0;
|
||||||
|
|
||||||
|
|
@ -65,6 +69,7 @@ NIiter(register CKTcircuit *ckt, int maxIter)
|
||||||
return(error);
|
return(error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
OldCKTstate0=(double *)MALLOC((ckt->CKTnumStates+1)*sizeof(double));
|
||||||
for(;;){
|
for(;;){
|
||||||
ckt->CKTnoncon=0;
|
ckt->CKTnoncon=0;
|
||||||
#ifdef NEWPRED
|
#ifdef NEWPRED
|
||||||
|
|
@ -81,6 +86,7 @@ NIiter(register CKTcircuit *ckt, int maxIter)
|
||||||
#ifdef STEPDEBUG
|
#ifdef STEPDEBUG
|
||||||
printf("load returned error \n");
|
printf("load returned error \n");
|
||||||
#endif
|
#endif
|
||||||
|
FREE(OldCKTstate0);
|
||||||
return(error);
|
return(error);
|
||||||
}
|
}
|
||||||
/*printf("after loading, before solving\n");*/
|
/*printf("after loading, before solving\n");*/
|
||||||
|
|
@ -93,6 +99,7 @@ NIiter(register CKTcircuit *ckt, int maxIter)
|
||||||
#ifdef STEPDEBUG
|
#ifdef STEPDEBUG
|
||||||
printf("pre-order returned error \n");
|
printf("pre-order returned error \n");
|
||||||
#endif
|
#endif
|
||||||
|
FREE(OldCKTstate0);
|
||||||
return(error); /* badly formed matrix */
|
return(error); /* badly formed matrix */
|
||||||
}
|
}
|
||||||
ckt->CKTniState |= NIDIDPREORDER;
|
ckt->CKTniState |= NIDIDPREORDER;
|
||||||
|
|
@ -123,6 +130,7 @@ NIiter(register CKTcircuit *ckt, int maxIter)
|
||||||
#ifdef STEPDEBUG
|
#ifdef STEPDEBUG
|
||||||
printf("reorder returned error \n");
|
printf("reorder returned error \n");
|
||||||
#endif
|
#endif
|
||||||
|
FREE(OldCKTstate0);
|
||||||
return(error); /* can't handle these errors - pass up! */
|
return(error); /* can't handle these errors - pass up! */
|
||||||
}
|
}
|
||||||
ckt->CKTniState &= ~NISHOULDREORDER;
|
ckt->CKTniState &= ~NISHOULDREORDER;
|
||||||
|
|
@ -145,10 +153,15 @@ NIiter(register CKTcircuit *ckt, int maxIter)
|
||||||
#ifdef STEPDEBUG
|
#ifdef STEPDEBUG
|
||||||
printf("lufac returned error \n");
|
printf("lufac returned error \n");
|
||||||
#endif
|
#endif
|
||||||
|
FREE(OldCKTstate0);
|
||||||
return(error);
|
return(error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(i=0;i<ckt->CKTnumStates;i++) {
|
||||||
|
*(OldCKTstate0+i) = *(ckt->CKTstate0+i);
|
||||||
|
};
|
||||||
|
|
||||||
startTime = (*(SPfrontEnd->IFseconds))();
|
startTime = (*(SPfrontEnd->IFseconds))();
|
||||||
SMPsolve(ckt->CKTmatrix,ckt->CKTrhs,ckt->CKTrhsSpare);
|
SMPsolve(ckt->CKTmatrix,ckt->CKTrhs,ckt->CKTrhsSpare);
|
||||||
ckt->CKTstat->STATsolveTime += (*(SPfrontEnd->IFseconds))()-
|
ckt->CKTstat->STATsolveTime += (*(SPfrontEnd->IFseconds))()-
|
||||||
|
|
@ -176,6 +189,7 @@ NIiter(register CKTcircuit *ckt, int maxIter)
|
||||||
#ifdef STEPDEBUG
|
#ifdef STEPDEBUG
|
||||||
printf("iterlim exceeded \n");
|
printf("iterlim exceeded \n");
|
||||||
#endif
|
#endif
|
||||||
|
FREE(OldCKTstate0);
|
||||||
return(E_ITERLIM);
|
return(E_ITERLIM);
|
||||||
}
|
}
|
||||||
if(ckt->CKTnoncon==0 && iterno!=1) {
|
if(ckt->CKTnoncon==0 && iterno!=1) {
|
||||||
|
|
@ -188,6 +202,36 @@ NIiter(register CKTcircuit *ckt, int maxIter)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( (ckt->CKTnodeDamping!=0) && (ckt->CKTnoncon!=0) &&
|
||||||
|
((ckt->CKTmode & MODETRANOP) || (ckt->CKTmode & MODEDCOP)) &&
|
||||||
|
(iterno>1) ) {
|
||||||
|
maxdiff=0;
|
||||||
|
for (node = ckt->CKTnodes->next; node; node = node->next) {
|
||||||
|
if(node->type == NODE_VOLTAGE) {
|
||||||
|
diff = (ckt->CKTrhs)[node->number] -
|
||||||
|
(ckt->CKTrhsOld)[node->number];
|
||||||
|
if (diff>maxdiff) maxdiff=diff;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
if (maxdiff>10) {
|
||||||
|
damp_factor=10/maxdiff;
|
||||||
|
if (damp_factor<0.1) damp_factor=0.1;
|
||||||
|
for (node = ckt->CKTnodes->next; node; node = node->next) {
|
||||||
|
diff = (ckt->CKTrhs)[node->number] -
|
||||||
|
(ckt->CKTrhsOld)[node->number];
|
||||||
|
(ckt->CKTrhs)[node->number]=(ckt->CKTrhsOld)[node->number] +
|
||||||
|
(damp_factor * diff);
|
||||||
|
};
|
||||||
|
for(i=0;i<ckt->CKTnumStates;i++) {
|
||||||
|
diff = *(ckt->CKTstate0+i) - *(OldCKTstate0+i);
|
||||||
|
*(ckt->CKTstate0+i) = *(OldCKTstate0+i) +
|
||||||
|
(damp_factor * diff);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(ckt->CKTmode & MODEINITFLOAT) {
|
if(ckt->CKTmode & MODEINITFLOAT) {
|
||||||
if ((ckt->CKTmode & MODEDC) &&
|
if ((ckt->CKTmode & MODEDC) &&
|
||||||
( ckt->CKThadNodeset) ) {
|
( ckt->CKThadNodeset) ) {
|
||||||
|
|
@ -198,6 +242,7 @@ NIiter(register CKTcircuit *ckt, int maxIter)
|
||||||
}
|
}
|
||||||
if(ckt->CKTnoncon == 0) {
|
if(ckt->CKTnoncon == 0) {
|
||||||
ckt->CKTstat->STATnumIter += iterno;
|
ckt->CKTstat->STATnumIter += iterno;
|
||||||
|
FREE(OldCKTstate0);
|
||||||
return(OK);
|
return(OK);
|
||||||
}
|
}
|
||||||
} else if(ckt->CKTmode & MODEINITJCT) {
|
} else if(ckt->CKTmode & MODEINITJCT) {
|
||||||
|
|
@ -219,6 +264,7 @@ NIiter(register CKTcircuit *ckt, int maxIter)
|
||||||
#ifdef STEPDEBUG
|
#ifdef STEPDEBUG
|
||||||
printf("bad initf state \n");
|
printf("bad initf state \n");
|
||||||
#endif
|
#endif
|
||||||
|
FREE(OldCKTstate0);
|
||||||
return(E_INTERN);
|
return(E_INTERN);
|
||||||
/* impossible - no such INITF flag! */
|
/* impossible - no such INITF flag! */
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ libckt_a_SOURCES = \
|
||||||
cktdltn.c \
|
cktdltn.c \
|
||||||
cktdojob.c \
|
cktdojob.c \
|
||||||
cktdump.c \
|
cktdump.c \
|
||||||
|
cktncdump.c \
|
||||||
cktfbran.c \
|
cktfbran.c \
|
||||||
cktfnda.c \
|
cktfnda.c \
|
||||||
cktfndm.c \
|
cktfndm.c \
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
/**********
|
/**********
|
||||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||||
Author: 1985 Thomas L. Quarles
|
Author: 1985 Thomas L. Quarles
|
||||||
|
Modified 2001: AlansFixes
|
||||||
**********/
|
**********/
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
|
|
@ -62,7 +63,11 @@ ACan(CKTcircuit *ckt, int restart)
|
||||||
(ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITJCT,
|
(ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITJCT,
|
||||||
(ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITFLOAT,
|
(ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITFLOAT,
|
||||||
ckt->CKTdcMaxIter);
|
ckt->CKTdcMaxIter);
|
||||||
if(error) return(error);
|
if(error){
|
||||||
|
fprintf(stdout,"\nAC operating point failed -\n");
|
||||||
|
CKTncDump(ckt);
|
||||||
|
return(error);
|
||||||
|
}
|
||||||
|
|
||||||
ckt->CKTmode = (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITSMSIG;
|
ckt->CKTmode = (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITSMSIG;
|
||||||
error = CKTload(ckt);
|
error = CKTload(ckt);
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/**********
|
/**********
|
||||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||||
Author: 1985 Thomas L. Quarles
|
Author: 1985 Thomas L. Quarles
|
||||||
Modified: 2000 AlansFIxes
|
Modified: 2000 AlansFixes
|
||||||
**********/
|
**********/
|
||||||
/*
|
/*
|
||||||
*/
|
*/
|
||||||
|
|
@ -105,7 +105,7 @@ CKTload(CKTcircuit *ckt)
|
||||||
*(ckt->CKTrhs+node->number) += 1.0e10 * node->ic;
|
*(ckt->CKTrhs+node->number) += 1.0e10 * node->ic;
|
||||||
*/
|
*/
|
||||||
*(ckt->CKTrhs+node->number) = 1.0e10 * node->ic *
|
*(ckt->CKTrhs+node->number) = 1.0e10 * node->ic *
|
||||||
ckt->CKTsrcFact; /* AlansFixes */
|
ckt->CKTsrcFact;
|
||||||
*(node->ptr) += 1.0e10;
|
*(node->ptr) += 1.0e10;
|
||||||
} else {
|
} else {
|
||||||
/* Original code:
|
/* Original code:
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
/**********
|
||||||
|
Copyright 1999 AG inc. All rights reserved.
|
||||||
|
Author: 1999 Alan Gillespie
|
||||||
|
**********/
|
||||||
|
|
||||||
|
#include "spice.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "cktdefs.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "misc.h"
|
||||||
|
#include "suffix.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
CKTncDump(ckt)
|
||||||
|
CKTcircuit *ckt;
|
||||||
|
{
|
||||||
|
CKTnode *node;
|
||||||
|
double new, old, tol;
|
||||||
|
int i=1;
|
||||||
|
|
||||||
|
fprintf(stdout,"\n");
|
||||||
|
fprintf(stdout,"Last Node Voltages\n");
|
||||||
|
fprintf(stdout,"------------------\n\n");
|
||||||
|
fprintf(stdout,"%-30s %20s %20s\n", "Node", "Last Voltage", "Previous Iter");
|
||||||
|
fprintf(stdout,"%-30s %20s %20s\n", "----", "------------", "-------------");
|
||||||
|
for(node=ckt->CKTnodes->next;node;node=node->next) {
|
||||||
|
if (strstr(node->name, "#branch") || !strstr(node->name, "#")) {
|
||||||
|
new = *((ckt->CKTrhsOld) + i ) ;
|
||||||
|
old = *((ckt->CKTrhs) + i ) ;
|
||||||
|
fprintf(stdout,"%-30s %20g %20g", node->name, new, old);
|
||||||
|
if(node->type == 3) {
|
||||||
|
tol = ckt->CKTreltol * (MAX(FABS(old),FABS(new))) +
|
||||||
|
ckt->CKTvoltTol;
|
||||||
|
} else {
|
||||||
|
tol = ckt->CKTreltol * (MAX(FABS(old),FABS(new))) +
|
||||||
|
ckt->CKTabstol;
|
||||||
|
}
|
||||||
|
if (FABS(new-old) >tol ) {
|
||||||
|
fprintf(stdout," *");
|
||||||
|
}
|
||||||
|
fprintf(stdout,"\n");
|
||||||
|
};
|
||||||
|
i++;
|
||||||
|
};
|
||||||
|
fprintf(stdout,"\n");
|
||||||
|
}
|
||||||
|
|
@ -16,9 +16,9 @@ CKTop(CKTcircuit *ckt, long int firstmode, long int continuemode, int iterlim)
|
||||||
{
|
{
|
||||||
int converged;
|
int converged;
|
||||||
int i;
|
int i;
|
||||||
CKTnode *n; /* AlansFixes */
|
CKTnode *n;
|
||||||
double raise, ConvFact, NumNodes; /* AlansFixes */
|
double raise, ConvFact, NumNodes;
|
||||||
double *OldRhsOld, *OldCKTstate0; /* AlansFixes */
|
double *OldRhsOld, *OldCKTstate0;
|
||||||
int iters;
|
int iters;
|
||||||
|
|
||||||
ckt->CKTmode = firstmode;
|
ckt->CKTmode = firstmode;
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,9 @@ DCop(CKTcircuit *ckt)
|
||||||
(ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITFLOAT,
|
(ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITFLOAT,
|
||||||
ckt->CKTdcMaxIter);
|
ckt->CKTdcMaxIter);
|
||||||
if(converged != 0) {
|
if(converged != 0) {
|
||||||
|
fprintf(stdout,"\nDC solution failed -\n");
|
||||||
|
CKTncDump(ckt);
|
||||||
|
/*
|
||||||
CKTnode *node;
|
CKTnode *node;
|
||||||
double new, old, tol;
|
double new, old, tol;
|
||||||
int i=1;
|
int i=1;
|
||||||
|
|
@ -65,7 +67,8 @@ DCop(CKTcircuit *ckt)
|
||||||
i++;
|
i++;
|
||||||
};
|
};
|
||||||
fprintf(stdout,"\n");
|
fprintf(stdout,"\n");
|
||||||
(*(SPfrontEnd->OUTendPlot))(plot);
|
(*(SPfrontEnd->OUTendPlot))(plot); */
|
||||||
|
|
||||||
return(converged);
|
return(converged);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ DCtran(CKTcircuit *ckt,
|
||||||
#endif /* PARALLEL_ARCH */
|
#endif /* PARALLEL_ARCH */
|
||||||
|
|
||||||
if(restart || ckt->CKTtime == 0) {
|
if(restart || ckt->CKTtime == 0) {
|
||||||
delta=MIN(ckt->CKTfinalTime/100,ckt->CKTstep)/10;
|
delta=MIN(ckt->CKTfinalTime/200,ckt->CKTstep)/10;
|
||||||
|
|
||||||
/* begin LTRA code addition */
|
/* begin LTRA code addition */
|
||||||
if (ckt->CKTtimePoints != NULL)
|
if (ckt->CKTtimePoints != NULL)
|
||||||
|
|
@ -100,8 +100,9 @@ DCtran(CKTcircuit *ckt,
|
||||||
ckt->CKTdcMaxIter);
|
ckt->CKTdcMaxIter);
|
||||||
|
|
||||||
if(converged != 0) {
|
if(converged != 0) {
|
||||||
|
fprintf(stdout,"\nTransient solution failed -\n");
|
||||||
CKTnode *node;
|
CKTncDump(ckt);
|
||||||
|
/* CKTnode *node;
|
||||||
double new, old, tol;
|
double new, old, tol;
|
||||||
int i=1;
|
int i=1;
|
||||||
|
|
||||||
|
|
@ -130,7 +131,7 @@ DCtran(CKTcircuit *ckt,
|
||||||
fprintf(stdout,"\n");
|
fprintf(stdout,"\n");
|
||||||
};
|
};
|
||||||
i++;
|
i++;
|
||||||
}
|
} */
|
||||||
} else {
|
} else {
|
||||||
fprintf(stdout,"\nInitial Transient Solution\n");
|
fprintf(stdout,"\nInitial Transient Solution\n");
|
||||||
fprintf(stdout,"--------------------------\n\n");
|
fprintf(stdout,"--------------------------\n\n");
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
/**********
|
/**********
|
||||||
Copyright 1990 Regents of the University of California. All rights reserved.
|
Copyright 1990 Regents of the University of California. All rights reserved.
|
||||||
Author: 1987 Gary W. Ng
|
Author: 1987 Gary W. Ng
|
||||||
|
Modified: 2001 AlansFixes
|
||||||
**********/
|
**********/
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
|
|
@ -18,6 +19,9 @@ Author: 1987 Gary W. Ng
|
||||||
#include "vsrc/vsrcdefs.h"
|
#include "vsrc/vsrcdefs.h"
|
||||||
#include "isrc/isrcdefs.h"
|
#include "isrc/isrcdefs.h"
|
||||||
|
|
||||||
|
extern int CKTnoise( CKTcircuit *, int, int, Ndata * );
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
NOISEan (CKTcircuit *ckt, int restart)
|
NOISEan (CKTcircuit *ckt, int restart)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ int TRANinit(CKTcircuit *ckt, JOB *job)
|
||||||
#else
|
#else
|
||||||
/* The original spice code */
|
/* The original spice code */
|
||||||
if(ckt->CKTmaxStep == 0) {
|
if(ckt->CKTmaxStep == 0) {
|
||||||
ckt->CKTmaxStep = (ckt->CKTfinalTime-ckt->CKTinitTime)/100;
|
ckt->CKTmaxStep = (ckt->CKTfinalTime-ckt->CKTinitTime)/200;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
SUBDIRS = \
|
SUBDIRS = \
|
||||||
asrc \
|
asrc \
|
||||||
bjt \
|
bjt \
|
||||||
|
bjt2 \
|
||||||
bsim1 \
|
bsim1 \
|
||||||
bsim2 \
|
bsim2 \
|
||||||
bsim3 \
|
bsim3 \
|
||||||
|
|
@ -27,6 +28,7 @@ SUBDIRS = \
|
||||||
mos2 \
|
mos2 \
|
||||||
mos3 \
|
mos3 \
|
||||||
mos6 \
|
mos6 \
|
||||||
|
mos9 \
|
||||||
res \
|
res \
|
||||||
sw \
|
sw \
|
||||||
tra \
|
tra \
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@
|
||||||
|
|
||||||
#include "dev.h"
|
#include "dev.h"
|
||||||
|
|
||||||
#define DEVICES_USED "asrc bjt bsim1 bsim2 bsim3 bsim3v2 bsim3v1 bsim4 bsim3soipd bsim3soifd bsim3soidd cap cccs ccvs csw dio ind isrc jfet ltra mes mos1 mos2 mos3 mos6 res sw tra urc vccs vcvs vsrc"
|
#define DEVICES_USED "asrc bjt bjt2 bsim1 bsim2 bsim3 bsim3v2 bsim3v1 bsim4 bsim3soipd bsim3soifd bsim3soidd cap cccs ccvs csw dio ind isrc jfet ltra mes mos1 mos2 mos3 mos6 mos9 res sw tra urc vccs vcvs vsrc"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Analyses
|
* Analyses
|
||||||
|
|
@ -55,6 +55,7 @@
|
||||||
|
|
||||||
#include "asrc/asrcitf.h"
|
#include "asrc/asrcitf.h"
|
||||||
#include "bjt/bjtitf.h"
|
#include "bjt/bjtitf.h"
|
||||||
|
#include "bjt2/bjt2itf.h"
|
||||||
#include "bsim1/bsim1itf.h"
|
#include "bsim1/bsim1itf.h"
|
||||||
#include "bsim2/bsim2itf.h"
|
#include "bsim2/bsim2itf.h"
|
||||||
#include "bsim3/bsim3itf.h"
|
#include "bsim3/bsim3itf.h"
|
||||||
|
|
@ -79,6 +80,7 @@
|
||||||
#include "mos2/mos2itf.h"
|
#include "mos2/mos2itf.h"
|
||||||
#include "mos3/mos3itf.h"
|
#include "mos3/mos3itf.h"
|
||||||
#include "mos6/mos6itf.h"
|
#include "mos6/mos6itf.h"
|
||||||
|
#include "mos9/mos9itf.h"
|
||||||
#include "res/resitf.h"
|
#include "res/resitf.h"
|
||||||
#include "sw/switf.h"
|
#include "sw/switf.h"
|
||||||
#include "tra/traitf.h"
|
#include "tra/traitf.h"
|
||||||
|
|
@ -88,7 +90,7 @@
|
||||||
#include "vsrc/vsrcitf.h"
|
#include "vsrc/vsrcitf.h"
|
||||||
|
|
||||||
|
|
||||||
#define DEVNUM 34
|
#define DEVNUM 36
|
||||||
|
|
||||||
SPICEdev *DEVices[DEVNUM];
|
SPICEdev *DEVices[DEVNUM];
|
||||||
|
|
||||||
|
|
@ -100,38 +102,40 @@ spice_init_devices(void)
|
||||||
DEVices[ 0] = get_urc_info();
|
DEVices[ 0] = get_urc_info();
|
||||||
DEVices[ 1] = get_asrc_info();
|
DEVices[ 1] = get_asrc_info();
|
||||||
DEVices[ 2] = get_bjt_info();
|
DEVices[ 2] = get_bjt_info();
|
||||||
DEVices[ 3] = get_bsim1_info();
|
DEVices[ 3] = get bjt2_info();
|
||||||
DEVices[ 4] = get_bsim2_info();
|
DEVices[ 4] = get_bsim1_info();
|
||||||
DEVices[ 5] = get_bsim3_info();
|
DEVices[ 5] = get_bsim2_info();
|
||||||
DEVices[ 6] = get_bsim3v1_info();
|
DEVices[ 6] = get_bsim3_info();
|
||||||
DEVices[ 7] = get_bsim3v2_info();
|
DEVices[ 7] = get_bsim3v1_info();
|
||||||
DEVices[ 8] = get_bsim4_info();
|
DEVices[ 8] = get_bsim3v2_info();
|
||||||
DEVices[ 9] = get_b3soipd_info();
|
DEVices[ 9] = get_bsim4_info();
|
||||||
DEVices[10] = get_b3soifd_info();
|
DEVices[10] = get_b3soipd_info();
|
||||||
DEVices[11] = get_b3soidd_info();
|
DEVices[11] = get_b3soifd_info();
|
||||||
DEVices[12] = get_cap_info();
|
DEVices[12] = get_b3soidd_info();
|
||||||
DEVices[13] = get_cccs_info();
|
DEVices[13] = get_cap_info();
|
||||||
DEVices[14] = get_ccvs_info();
|
DEVices[14] = get_cccs_info();
|
||||||
DEVices[15] = get_csw_info();
|
DEVices[15] = get_ccvs_info();
|
||||||
DEVices[16] = get_dio_info();
|
DEVices[16] = get_csw_info();
|
||||||
DEVices[17] = get_ind_info();
|
DEVices[17] = get_dio_info();
|
||||||
DEVices[18] = get_mut_info();
|
DEVices[18] = get_ind_info();
|
||||||
DEVices[19] = get_isrc_info();
|
DEVices[19] = get_mut_info();
|
||||||
DEVices[20] = get_jfet_info();
|
DEVices[20] = get_isrc_info();
|
||||||
DEVices[21] = get_jfet2_info();
|
DEVices[21] = get_jfet_info();
|
||||||
DEVices[22] = get_ltra_info();
|
DEVices[22] = get_jfet2_info();
|
||||||
DEVices[23] = get_mes_info();
|
DEVices[23] = get_ltra_info();
|
||||||
DEVices[24] = get_mos1_info();
|
DEVices[24] = get_mes_info();
|
||||||
DEVices[25] = get_mos2_info();
|
DEVices[25] = get_mos1_info();
|
||||||
DEVices[26] = get_mos3_info();
|
DEVices[26] = get_mos2_info();
|
||||||
DEVices[27] = get_mos6_info();
|
DEVices[27] = get_mos3_info();
|
||||||
DEVices[28] = get_res_info();
|
DEVices[28] = get_mos6_info();
|
||||||
DEVices[29] = get_sw_info();
|
DEVices[29] = get_mos9_info();
|
||||||
DEVices[30] = get_tra_info();
|
DEVices[30] = get_res_info();
|
||||||
DEVices[31] = get_vccs_info();
|
DEVices[31] = get_sw_info();
|
||||||
DEVices[32] = get_vcvs_info();
|
DEVices[32] = get_tra_info();
|
||||||
DEVices[33] = get_vsrc_info();
|
DEVices[33] = get_vccs_info();
|
||||||
assert(34 == DEVNUM);
|
DEVices[34] = get_vcvs_info();
|
||||||
|
DEVices[35] = get_vsrc_info();
|
||||||
|
assert(36 == DEVNUM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -155,6 +155,7 @@ INP2M (void *ckt, INPtables * tab, card * current)
|
||||||
&& thismodel->INPmodType != INPtypelook ("Mos5")
|
&& thismodel->INPmodType != INPtypelook ("Mos5")
|
||||||
&& thismodel->INPmodType != INPtypelook ("Mos6")
|
&& thismodel->INPmodType != INPtypelook ("Mos6")
|
||||||
&& thismodel->INPmodType != INPtypelook ("Mos8")
|
&& thismodel->INPmodType != INPtypelook ("Mos8")
|
||||||
|
&& thismodel->INPmodType != INPtypelook ("Mos9")
|
||||||
&& thismodel->INPmodType != INPtypelook ("BSIM1")
|
&& thismodel->INPmodType != INPtypelook ("BSIM1")
|
||||||
&& thismodel->INPmodType != INPtypelook ("BSIM2")
|
&& thismodel->INPmodType != INPtypelook ("BSIM2")
|
||||||
&& thismodel->INPmodType != INPtypelook ("BSIM3")
|
&& thismodel->INPmodType != INPtypelook ("BSIM3")
|
||||||
|
|
|
||||||
|
|
@ -66,11 +66,12 @@ void INP2Q(void *ckt, INPtables * tab, card * current, void *gnode)
|
||||||
INPinsert(&model, tab);
|
INPinsert(&model, tab);
|
||||||
current->error = INPgetMod(ckt, model, &thismodel, tab);
|
current->error = INPgetMod(ckt, model, &thismodel, tab);
|
||||||
if (thismodel != NULL) {
|
if (thismodel != NULL) {
|
||||||
if (mytype != thismodel->INPmodType) {
|
if(thismodel->INPmodType != INPtypelook("BJT") &&
|
||||||
LITERR("incorrect model type");
|
thismodel->INPmodType != INPtypelook("BJT2")) {
|
||||||
|
LITERR("incorrect model type")
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
type = mytype;
|
type = (thismodel->INPmodType);
|
||||||
mdfast = (thismodel->INPmodfast);
|
mdfast = (thismodel->INPmodfast);
|
||||||
} else {
|
} else {
|
||||||
type = mytype;
|
type = mytype;
|
||||||
|
|
|
||||||
|
|
@ -26,11 +26,28 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab)
|
||||||
INPinsert(&modname, tab);
|
INPinsert(&modname, tab);
|
||||||
INPgetTok(&line, &typename, 1);
|
INPgetTok(&line, &typename, 1);
|
||||||
if ((strcmp(typename, "npn") == 0) || (strcmp(typename, "pnp") == 0)) {
|
if ((strcmp(typename, "npn") == 0) || (strcmp(typename, "pnp") == 0)) {
|
||||||
|
err = INPfindLev(line,&lev);
|
||||||
|
switch(lev) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
type = INPtypelook("BJT");
|
type = INPtypelook("BJT");
|
||||||
if (type < 0) {
|
if (type < 0) {
|
||||||
err =
|
err = INPmkTemp(
|
||||||
INPmkTemp
|
"Device type BJT not available in this binary\n");
|
||||||
("Device type BJT not available in this binary\n");
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
type = INPtypelook("BJT2");
|
||||||
|
if(type < 0) {
|
||||||
|
err = INPmkTemp(
|
||||||
|
"Device type BJT2 not available in this binary\n");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default: /* placeholder; use level 3 for the next model */
|
||||||
|
err = INPmkTemp(
|
||||||
|
"Only BJT levels 1 and 2 are supported in this binary\n");
|
||||||
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
INPmakeMod(modname, type, image);
|
INPmakeMod(modname, type, image);
|
||||||
} else if (strcmp(typename, "d") == 0) {
|
} else if (strcmp(typename, "d") == 0) {
|
||||||
|
|
@ -155,7 +172,15 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab)
|
||||||
("Device type BSIM3 not available in this binary\n");
|
("Device type BSIM3 not available in this binary\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 9:
|
case 9:
|
||||||
|
type = INPtypelook("Mos9");
|
||||||
|
if(type < 0) {
|
||||||
|
err = INPmkTemp(
|
||||||
|
"Device type MOS9 not available in this binary\n");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
type = INPtypelook("B3SOIPD");
|
type = INPtypelook("B3SOIPD");
|
||||||
if (type < 0) {
|
if (type < 0) {
|
||||||
err =
|
err =
|
||||||
|
|
@ -163,7 +188,7 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab)
|
||||||
("Device type B3SOIPD not available in this binary\n");
|
("Device type B3SOIPD not available in this binary\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 10:
|
case 11:
|
||||||
type = INPtypelook("B3SOIFD");
|
type = INPtypelook("B3SOIFD");
|
||||||
if (type < 0) {
|
if (type < 0) {
|
||||||
err =
|
err =
|
||||||
|
|
@ -171,7 +196,7 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab)
|
||||||
("Device type B3SOIFD not available in this binary\n");
|
("Device type B3SOIFD not available in this binary\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 11:
|
case 12:
|
||||||
type = INPtypelook("B3SOIDD");
|
type = INPtypelook("B3SOIDD");
|
||||||
if (type < 0) {
|
if (type < 0) {
|
||||||
err =
|
err =
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue