Browse Source

Code to link mos9 and bjt2 and some fixes from last Alan's code.

pre-master-46
pnenzi 25 years ago
parent
commit
8551caa8e9
  1. 2
      configure.in
  2. 2
      src/Makefile.am
  3. 46
      src/maths/ni/niiter.c
  4. 1
      src/spicelib/analysis/Makefile.am
  5. 7
      src/spicelib/analysis/acan.c
  6. 4
      src/spicelib/analysis/cktload.c
  7. 46
      src/spicelib/analysis/cktncdump.c
  8. 6
      src/spicelib/analysis/cktop.c
  9. 7
      src/spicelib/analysis/dcop.c
  10. 9
      src/spicelib/analysis/dctran.c
  11. 4
      src/spicelib/analysis/noisean.c
  12. 2
      src/spicelib/analysis/traninit.c
  13. 2
      src/spicelib/devices/Makefile.am
  14. 72
      src/spicelib/devices/dev.c
  15. 1
      src/spicelib/parser/inp2m.c
  16. 13
      src/spicelib/parser/inp2q.c
  17. 43
      src/spicelib/parser/inpdomod.c

2
configure.in

@ -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 \

2
src/Makefile.am

@ -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 \

46
src/maths/ni/niiter.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
**********/ **********/
/* /*
@ -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! */
} }

1
src/spicelib/analysis/Makefile.am

@ -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 \

7
src/spicelib/analysis/acan.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);

4
src/spicelib/analysis/cktload.c

@ -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:

46
src/spicelib/analysis/cktncdump.c

@ -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");
}

6
src/spicelib/analysis/cktop.c

@ -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 */
double raise, ConvFact, NumNodes; /* AlansFixes */
double *OldRhsOld, *OldCKTstate0; /* AlansFixes */
CKTnode *n;
double raise, ConvFact, NumNodes;
double *OldRhsOld, *OldCKTstate0;
int iters; int iters;
ckt->CKTmode = firstmode; ckt->CKTmode = firstmode;

7
src/spicelib/analysis/dcop.c

@ -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);
}; };

9
src/spicelib/analysis/dctran.c

@ -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) {
CKTnode *node;
fprintf(stdout,"\nTransient solution failed -\n");
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");

4
src/spicelib/analysis/noisean.c

@ -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)
{ {

2
src/spicelib/analysis/traninit.c

@ -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

2
src/spicelib/devices/Makefile.am

@ -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 \

72
src/spicelib/devices/dev.c

@ -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[ 4] = get_bsim2_info();
DEVices[ 5] = get_bsim3_info();
DEVices[ 6] = get_bsim3v1_info();
DEVices[ 7] = get_bsim3v2_info();
DEVices[ 8] = get_bsim4_info();
DEVices[ 9] = get_b3soipd_info();
DEVices[10] = get_b3soifd_info();
DEVices[11] = get_b3soidd_info();
DEVices[12] = get_cap_info();
DEVices[13] = get_cccs_info();
DEVices[14] = get_ccvs_info();
DEVices[15] = get_csw_info();
DEVices[16] = get_dio_info();
DEVices[17] = get_ind_info();
DEVices[18] = get_mut_info();
DEVices[19] = get_isrc_info();
DEVices[20] = get_jfet_info();
DEVices[21] = get_jfet2_info();
DEVices[22] = get_ltra_info();
DEVices[23] = get_mes_info();
DEVices[24] = get_mos1_info();
DEVices[25] = get_mos2_info();
DEVices[26] = get_mos3_info();
DEVices[27] = get_mos6_info();
DEVices[28] = get_res_info();
DEVices[29] = get_sw_info();
DEVices[30] = get_tra_info();
DEVices[31] = get_vccs_info();
DEVices[32] = get_vcvs_info();
DEVices[33] = get_vsrc_info();
assert(34 == DEVNUM);
DEVices[ 3] = get bjt2_info();
DEVices[ 4] = get_bsim1_info();
DEVices[ 5] = get_bsim2_info();
DEVices[ 6] = get_bsim3_info();
DEVices[ 7] = get_bsim3v1_info();
DEVices[ 8] = get_bsim3v2_info();
DEVices[ 9] = get_bsim4_info();
DEVices[10] = get_b3soipd_info();
DEVices[11] = get_b3soifd_info();
DEVices[12] = get_b3soidd_info();
DEVices[13] = get_cap_info();
DEVices[14] = get_cccs_info();
DEVices[15] = get_ccvs_info();
DEVices[16] = get_csw_info();
DEVices[17] = get_dio_info();
DEVices[18] = get_ind_info();
DEVices[19] = get_mut_info();
DEVices[20] = get_isrc_info();
DEVices[21] = get_jfet_info();
DEVices[22] = get_jfet2_info();
DEVices[23] = get_ltra_info();
DEVices[24] = get_mes_info();
DEVices[25] = get_mos1_info();
DEVices[26] = get_mos2_info();
DEVices[27] = get_mos3_info();
DEVices[28] = get_mos6_info();
DEVices[29] = get_mos9_info();
DEVices[30] = get_res_info();
DEVices[31] = get_sw_info();
DEVices[32] = get_tra_info();
DEVices[33] = get_vccs_info();
DEVices[34] = get_vcvs_info();
DEVices[35] = get_vsrc_info();
assert(36 == DEVNUM);
} }

1
src/spicelib/parser/inp2m.c

@ -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")

13
src/spicelib/parser/inp2q.c

@ -66,12 +66,13 @@ 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) {
LITERR("incorrect model type");
return;
}
type = mytype;
mdfast = (thismodel->INPmodfast);
if(thismodel->INPmodType != INPtypelook("BJT") &&
thismodel->INPmodType != INPtypelook("BJT2")) {
LITERR("incorrect model type")
return;
}
type = (thismodel->INPmodType);
mdfast = (thismodel->INPmodfast);
} else { } else {
type = mytype; type = mytype;
if (!tab->defQmod) { if (!tab->defQmod) {

43
src/spicelib/parser/inpdomod.c

@ -26,12 +26,29 @@ 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)) {
type = INPtypelook("BJT");
if (type < 0) {
err =
INPmkTemp
("Device type BJT not available in this binary\n");
}
err = INPfindLev(line,&lev);
switch(lev) {
case 0:
case 1:
type = INPtypelook("BJT");
if (type < 0) {
err = INPmkTemp(
"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) {
type = INPtypelook("Diode"); type = INPtypelook("Diode");
@ -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…
Cancel
Save