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/asrc/Makefile \
src/spicelib/devices/bjt/Makefile \
src/spicelib/devices/bjt2/Makefile \
src/spicelib/devices/bsim1/Makefile \
src/spicelib/devices/bsim2/Makefile \
src/spicelib/devices/bsim3v1/Makefile \
@ -249,6 +250,7 @@ src/spicelib/devices/mos1/Makefile \
src/spicelib/devices/mos2/Makefile \
src/spicelib/devices/mos3/Makefile \
src/spicelib/devices/mos6/Makefile \
src/spicelib/devices/mos9/Makefile \
src/spicelib/devices/res/Makefile \
src/spicelib/devices/sw/Makefile \
src/spicelib/devices/tra/Makefile \

2
src/Makefile.am

@ -18,6 +18,7 @@ initdata_DATA = spinit setplot spectrum
DYNAMIC_DEVICELIBS = \
spicelib/devices/asrc/libasrc.la \
spicelib/devices/bjt/libbjt.la \
spicelib/devices/bjt2/libbjt2.la \
spicelib/devices/bsim1/libbsim1.la \
spicelib/devices/bsim2/libbsim2.la \
spicelib/devices/bsim3/libbsim3.la \
@ -43,6 +44,7 @@ DYNAMIC_DEVICELIBS = \
spicelib/devices/mos2/libmos2.la \
spicelib/devices/mos3/libmos3.la \
spicelib/devices/mos6/libmos6.la \
spicelib/devices/mos9/libmos9.la \
spicelib/devices/res/libres.la \
spicelib/devices/sw/libsw.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.
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";
CKTnode *node; /* current matrix entry */
double diff, maxdiff, damp_factor, *OldCKTstate0;
iterno=0;
ipass=0;
@ -65,6 +69,7 @@ NIiter(register CKTcircuit *ckt, int maxIter)
return(error);
}
}
OldCKTstate0=(double *)MALLOC((ckt->CKTnumStates+1)*sizeof(double));
for(;;){
ckt->CKTnoncon=0;
#ifdef NEWPRED
@ -81,6 +86,7 @@ NIiter(register CKTcircuit *ckt, int maxIter)
#ifdef STEPDEBUG
printf("load returned error \n");
#endif
FREE(OldCKTstate0);
return(error);
}
/*printf("after loading, before solving\n");*/
@ -93,6 +99,7 @@ NIiter(register CKTcircuit *ckt, int maxIter)
#ifdef STEPDEBUG
printf("pre-order returned error \n");
#endif
FREE(OldCKTstate0);
return(error); /* badly formed matrix */
}
ckt->CKTniState |= NIDIDPREORDER;
@ -123,6 +130,7 @@ NIiter(register CKTcircuit *ckt, int maxIter)
#ifdef STEPDEBUG
printf("reorder returned error \n");
#endif
FREE(OldCKTstate0);
return(error); /* can't handle these errors - pass up! */
}
ckt->CKTniState &= ~NISHOULDREORDER;
@ -145,10 +153,15 @@ NIiter(register CKTcircuit *ckt, int maxIter)
#ifdef STEPDEBUG
printf("lufac returned error \n");
#endif
FREE(OldCKTstate0);
return(error);
}
}
for(i=0;i<ckt->CKTnumStates;i++) {
*(OldCKTstate0+i) = *(ckt->CKTstate0+i);
};
startTime = (*(SPfrontEnd->IFseconds))();
SMPsolve(ckt->CKTmatrix,ckt->CKTrhs,ckt->CKTrhsSpare);
ckt->CKTstat->STATsolveTime += (*(SPfrontEnd->IFseconds))()-
@ -176,6 +189,7 @@ NIiter(register CKTcircuit *ckt, int maxIter)
#ifdef STEPDEBUG
printf("iterlim exceeded \n");
#endif
FREE(OldCKTstate0);
return(E_ITERLIM);
}
if(ckt->CKTnoncon==0 && iterno!=1) {
@ -188,6 +202,36 @@ NIiter(register CKTcircuit *ckt, int maxIter)
#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 & MODEDC) &&
( ckt->CKThadNodeset) ) {
@ -198,6 +242,7 @@ NIiter(register CKTcircuit *ckt, int maxIter)
}
if(ckt->CKTnoncon == 0) {
ckt->CKTstat->STATnumIter += iterno;
FREE(OldCKTstate0);
return(OK);
}
} else if(ckt->CKTmode & MODEINITJCT) {
@ -219,6 +264,7 @@ NIiter(register CKTcircuit *ckt, int maxIter)
#ifdef STEPDEBUG
printf("bad initf state \n");
#endif
FREE(OldCKTstate0);
return(E_INTERN);
/* impossible - no such INITF flag! */
}

1
src/spicelib/analysis/Makefile.am

@ -22,6 +22,7 @@ libckt_a_SOURCES = \
cktdltn.c \
cktdojob.c \
cktdump.c \
cktncdump.c \
cktfbran.c \
cktfnda.c \
cktfndm.c \

7
src/spicelib/analysis/acan.c

@ -1,6 +1,7 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Modified 2001: AlansFixes
**********/
#include "ngspice.h"
@ -62,7 +63,11 @@ ACan(CKTcircuit *ckt, int restart)
(ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITJCT,
(ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITFLOAT,
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;
error = CKTload(ckt);

4
src/spicelib/analysis/cktload.c

@ -1,7 +1,7 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
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->CKTsrcFact; /* AlansFixes */
ckt->CKTsrcFact;
*(node->ptr) += 1.0e10;
} else {
/* 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 i;
CKTnode *n; /* AlansFixes */
double raise, ConvFact, NumNodes; /* AlansFixes */
double *OldRhsOld, *OldCKTstate0; /* AlansFixes */
CKTnode *n;
double raise, ConvFact, NumNodes;
double *OldRhsOld, *OldCKTstate0;
int iters;
ckt->CKTmode = firstmode;

7
src/spicelib/analysis/dcop.c

@ -33,7 +33,9 @@ DCop(CKTcircuit *ckt)
(ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITFLOAT,
ckt->CKTdcMaxIter);
if(converged != 0) {
fprintf(stdout,"\nDC solution failed -\n");
CKTncDump(ckt);
/*
CKTnode *node;
double new, old, tol;
int i=1;
@ -65,7 +67,8 @@ DCop(CKTcircuit *ckt)
i++;
};
fprintf(stdout,"\n");
(*(SPfrontEnd->OUTendPlot))(plot);
(*(SPfrontEnd->OUTendPlot))(plot); */
return(converged);
};

9
src/spicelib/analysis/dctran.c

@ -51,7 +51,7 @@ DCtran(CKTcircuit *ckt,
#endif /* PARALLEL_ARCH */
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 */
if (ckt->CKTtimePoints != NULL)
@ -100,8 +100,9 @@ DCtran(CKTcircuit *ckt,
ckt->CKTdcMaxIter);
if(converged != 0) {
CKTnode *node;
fprintf(stdout,"\nTransient solution failed -\n");
CKTncDump(ckt);
/* CKTnode *node;
double new, old, tol;
int i=1;
@ -130,7 +131,7 @@ DCtran(CKTcircuit *ckt,
fprintf(stdout,"\n");
};
i++;
}
} */
} else {
fprintf(stdout,"\nInitial Transient Solution\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.
Author: 1987 Gary W. Ng
Modified: 2001 AlansFixes
**********/
#include "ngspice.h"
@ -18,6 +19,9 @@ Author: 1987 Gary W. Ng
#include "vsrc/vsrcdefs.h"
#include "isrc/isrcdefs.h"
extern int CKTnoise( CKTcircuit *, int, int, Ndata * );
int
NOISEan (CKTcircuit *ckt, int restart)
{

2
src/spicelib/analysis/traninit.c

@ -40,7 +40,7 @@ int TRANinit(CKTcircuit *ckt, JOB *job)
#else
/* The original spice code */
if(ckt->CKTmaxStep == 0) {
ckt->CKTmaxStep = (ckt->CKTfinalTime-ckt->CKTinitTime)/100;
ckt->CKTmaxStep = (ckt->CKTfinalTime-ckt->CKTinitTime)/200;
}
#endif

2
src/spicelib/devices/Makefile.am

@ -3,6 +3,7 @@
SUBDIRS = \
asrc \
bjt \
bjt2 \
bsim1 \
bsim2 \
bsim3 \
@ -27,6 +28,7 @@ SUBDIRS = \
mos2 \
mos3 \
mos6 \
mos9 \
res \
sw \
tra \

72
src/spicelib/devices/dev.c

@ -35,7 +35,7 @@
#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
@ -55,6 +55,7 @@
#include "asrc/asrcitf.h"
#include "bjt/bjtitf.h"
#include "bjt2/bjt2itf.h"
#include "bsim1/bsim1itf.h"
#include "bsim2/bsim2itf.h"
#include "bsim3/bsim3itf.h"
@ -79,6 +80,7 @@
#include "mos2/mos2itf.h"
#include "mos3/mos3itf.h"
#include "mos6/mos6itf.h"
#include "mos9/mos9itf.h"
#include "res/resitf.h"
#include "sw/switf.h"
#include "tra/traitf.h"
@ -88,7 +90,7 @@
#include "vsrc/vsrcitf.h"
#define DEVNUM 34
#define DEVNUM 36
SPICEdev *DEVices[DEVNUM];
@ -100,38 +102,40 @@ spice_init_devices(void)
DEVices[ 0] = get_urc_info();
DEVices[ 1] = get_asrc_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 ("Mos6")
&& thismodel->INPmodType != INPtypelook ("Mos8")
&& thismodel->INPmodType != INPtypelook ("Mos9")
&& thismodel->INPmodType != INPtypelook ("BSIM1")
&& thismodel->INPmodType != INPtypelook ("BSIM2")
&& 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);
current->error = INPgetMod(ckt, model, &thismodel, tab);
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 {
type = mytype;
if (!tab->defQmod) {

43
src/spicelib/parser/inpdomod.c

@ -26,12 +26,29 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab)
INPinsert(&modname, tab);
INPgetTok(&line, &typename, 1);
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);
} else if (strcmp(typename, "d") == 0) {
type = INPtypelook("Diode");
@ -155,7 +172,15 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab)
("Device type BSIM3 not available in this binary\n");
}
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");
if (type < 0) {
err =
@ -163,7 +188,7 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab)
("Device type B3SOIPD not available in this binary\n");
}
break;
case 10:
case 11:
type = INPtypelook("B3SOIFD");
if (type < 0) {
err =
@ -171,7 +196,7 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab)
("Device type B3SOIFD not available in this binary\n");
}
break;
case 11:
case 12:
type = INPtypelook("B3SOIDD");
if (type < 0) {
err =

Loading…
Cancel
Save