Browse Source

Added support for dtemp and parallel code. Partial support for multiplier.

pre-master-46
pnenzi 23 years ago
parent
commit
c57a5c5464
  1. 4
      src/spicelib/devices/bjt2/bjt2.c
  2. 72
      src/spicelib/devices/bjt2/bjt2acld.c
  3. 6
      src/spicelib/devices/bjt2/bjt2ask.c
  4. 4
      src/spicelib/devices/bjt2/bjt2conv.c
  5. 6
      src/spicelib/devices/bjt2/bjt2defs.h
  6. 4
      src/spicelib/devices/bjt2/bjt2disto.c
  7. 4
      src/spicelib/devices/bjt2/bjt2getic.c
  8. 5
      src/spicelib/devices/bjt2/bjt2load.c
  9. 2
      src/spicelib/devices/bjt2/bjt2noise.c
  10. 10
      src/spicelib/devices/bjt2/bjt2param.c
  11. 2
      src/spicelib/devices/bjt2/bjt2pzld.c
  12. 4
      src/spicelib/devices/bjt2/bjt2setup.c
  13. 1
      src/spicelib/devices/bjt2/bjt2sload.c
  14. 2
      src/spicelib/devices/bjt2/bjt2sprt.c
  15. 1
      src/spicelib/devices/bjt2/bjt2sset.c
  16. 2
      src/spicelib/devices/bjt2/bjt2supd.c
  17. 4
      src/spicelib/devices/bjt2/bjt2temp.c
  18. 2
      src/spicelib/devices/bjt2/bjt2trun.c

4
src/spicelib/devices/bjt2/bjt2.c

@ -19,6 +19,7 @@ IFparm BJT2pTable[] = { /* parameters */
IOPAU("icvbe", BJT2_IC_VBE, IF_REAL, "Initial B-E voltage"),
IOPAU("icvce", BJT2_IC_VCE, IF_REAL, "Initial C-E voltage"),
IOPU("area", BJT2_AREA, IF_REAL, "Area factor"),
IOPU("m", BJT_M, IF_REAL, "Parallel Multiplier"),
IP("ic", BJT2_IC, IF_REALVEC, "Initial condition vector"),
IP("sens_area",BJT2_AREA_SENS,IF_FLAG, "flag to request sensitivity WRT area"),
OPU("colnode", BJT2_QUEST_COLNODE, IF_INTEGER, "Number of collector node"),
@ -68,7 +69,8 @@ IFparm BJT2pTable[] = { /* parameters */
OPU("sens_mag", BJT2_QUEST_SENS_MAG, IF_REAL, "sensitivity of ac magnitude"),
OPU("sens_ph", BJT2_QUEST_SENS_PH, IF_REAL, "sensitivity of ac phase"),
OPU("sens_cplx", BJT2_QUEST_SENS_CPLX, IF_COMPLEX, "ac sensitivity"),
IOPU("temp", BJT2_TEMP, IF_REAL, "instance temperature")
IOPU("temp", BJT2_TEMP, IF_REAL, "instance temperature"),
IOPU("dtemp", BJT_DTEMP, IF_REAL, "instance temperature delta from circuit")
};
IFparm BJT2mPTable[] = { /* model parameters */

72
src/spicelib/devices/bjt2/bjt2acld.c

@ -36,12 +36,16 @@ BJT2acLoad(GENmodel *inModel, CKTcircuit *ckt)
double xcbx;
double xcsub;
double xcmcb;
double m;
for( ; model != NULL; model = model->BJT2nextModel) {
for( here = model->BJT2instances; here!= NULL;
here = here->BJT2nextInstance) {
if (here->BJT2owner != ARCHme) continue;
m = here->BJT2m;
gcpr=here->BJT2tCollectorConduct * here->BJT2area;
gepr=here->BJT2tEmitterConduct * here->BJT2area;
gpi= *(ckt->CKTstate0 + here->BJT2gpi);
@ -62,40 +66,40 @@ BJT2acLoad(GENmodel *inModel, CKTcircuit *ckt)
xcbx= *(ckt->CKTstate0 + here->BJT2cqbx) * ckt->CKTomega;
xcsub= *(ckt->CKTstate0 + here->BJT2cqsub) * ckt->CKTomega;
xcmcb= *(ckt->CKTstate0 + here->BJT2cexbc) * ckt->CKTomega;
*(here->BJT2colColPtr) += (gcpr);
*(here->BJT2baseBasePtr) += (gx);
*(here->BJT2baseBasePtr + 1) += (xcbx);
*(here->BJT2emitEmitPtr) += (gepr);
*(here->BJT2colPrimeColPrimePtr) += (gmu+go+gcpr);
*(here->BJT2colPrimeColPrimePtr + 1) += (xcmu+xcbx);
*(here->BJT2substConSubstConPtr + 1) += (xcsub);
*(here->BJT2basePrimeBasePrimePtr) += (gx+gpi+gmu);
*(here->BJT2basePrimeBasePrimePtr + 1) += (xcpi+xcmu+xcmcb);
*(here->BJT2emitPrimeEmitPrimePtr) += (gpi+gepr+gm+go);
*(here->BJT2emitPrimeEmitPrimePtr + 1) += (xcpi+xgm);
*(here->BJT2colColPrimePtr) += (-gcpr);
*(here->BJT2baseBasePrimePtr) += (-gx);
*(here->BJT2emitEmitPrimePtr) += (-gepr);
*(here->BJT2colPrimeColPtr) += (-gcpr);
*(here->BJT2colPrimeBasePrimePtr) += (-gmu+gm);
*(here->BJT2colPrimeBasePrimePtr + 1) += (-xcmu+xgm);
*(here->BJT2colPrimeEmitPrimePtr) += (-gm-go);
*(here->BJT2colPrimeEmitPrimePtr + 1) += (-xgm);
*(here->BJT2basePrimeBasePtr) += (-gx);
*(here->BJT2basePrimeColPrimePtr) += (-gmu);
*(here->BJT2basePrimeColPrimePtr + 1) += (-xcmu-xcmcb);
*(here->BJT2basePrimeEmitPrimePtr) += (-gpi);
*(here->BJT2basePrimeEmitPrimePtr + 1) += (-xcpi);
*(here->BJT2emitPrimeEmitPtr) += (-gepr);
*(here->BJT2emitPrimeColPrimePtr) += (-go);
*(here->BJT2emitPrimeColPrimePtr + 1) += (xcmcb);
*(here->BJT2emitPrimeBasePrimePtr) += (-gpi-gm);
*(here->BJT2emitPrimeBasePrimePtr + 1) += (-xcpi-xgm-xcmcb);
*(here->BJT2substSubstPtr + 1) += (xcsub);
*(here->BJT2substConSubstPtr + 1) += (-xcsub);
*(here->BJT2substSubstConPtr + 1) += (-xcsub);
*(here->BJT2baseColPrimePtr + 1) += (-xcbx);
*(here->BJT2colPrimeBasePtr + 1) += (-xcbx);
*(here->BJT2colColPtr) += m * (gcpr);
*(here->BJT2baseBasePtr) += m * (gx);
*(here->BJT2baseBasePtr + 1) += m * (xcbx);
*(here->BJT2emitEmitPtr) += m * (gepr);
*(here->BJT2colPrimeColPrimePtr) += m * (gmu+go+gcpr);
*(here->BJT2colPrimeColPrimePtr + 1) += m * (xcmu+xcbx);
*(here->BJT2substConSubstConPtr + 1) += m * (xcsub);
*(here->BJT2basePrimeBasePrimePtr) += m * (gx+gpi+gmu);
*(here->BJT2basePrimeBasePrimePtr + 1) += m * (xcpi+xcmu+xcmcb);
*(here->BJT2emitPrimeEmitPrimePtr) += m * (gpi+gepr+gm+go);
*(here->BJT2emitPrimeEmitPrimePtr + 1) += m * (xcpi+xgm);
*(here->BJT2colColPrimePtr) += m * (-gcpr);
*(here->BJT2baseBasePrimePtr) += m * (-gx);
*(here->BJT2emitEmitPrimePtr) += m * (-gepr);
*(here->BJT2colPrimeColPtr) += m * (-gcpr);
*(here->BJT2colPrimeBasePrimePtr) += m * (-gmu+gm);
*(here->BJT2colPrimeBasePrimePtr + 1) += m * (-xcmu+xgm);
*(here->BJT2colPrimeEmitPrimePtr) += m * (-gm-go);
*(here->BJT2colPrimeEmitPrimePtr + 1) += m * (-xgm);
*(here->BJT2basePrimeBasePtr) += m * (-gx);
*(here->BJT2basePrimeColPrimePtr) += m * (-gmu);
*(here->BJT2basePrimeColPrimePtr + 1) += m * (-xcmu-xcmcb);
*(here->BJT2basePrimeEmitPrimePtr) += m * (-gpi);
*(here->BJT2basePrimeEmitPrimePtr + 1) += m * (-xcpi);
*(here->BJT2emitPrimeEmitPtr) += m * (-gepr);
*(here->BJT2emitPrimeColPrimePtr) += m * (-go);
*(here->BJT2emitPrimeColPrimePtr + 1) += m * (xcmcb);
*(here->BJT2emitPrimeBasePrimePtr) += m * (-gpi-gm);
*(here->BJT2emitPrimeBasePrimePtr + 1) += m * (-xcpi-xgm-xcmcb);
*(here->BJT2substSubstPtr + 1) += m * (xcsub);
*(here->BJT2substConSubstPtr + 1) += m * (-xcsub);
*(here->BJT2substSubstConPtr + 1) += m * (-xcsub);
*(here->BJT2baseColPrimePtr + 1) += m * (-xcbx);
*(here->BJT2colPrimeBasePtr + 1) += m * (-xcbx);
}
}
return(OK);

6
src/spicelib/devices/bjt2/bjt2ask.c

@ -41,9 +41,15 @@ BJT2ask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value,
case BJT2_TEMP:
value->rValue = here->BJT2temp - CONSTCtoK;
return(OK);
case BJT2_DTEMP:
value->rValue = here->BJT2dtemp;
return(OK);
case BJT2_AREA:
value->rValue = here->BJT2area;
return(OK);
case BJT2_M:
value->rValue = here->BJT2m;
return(OK);
case BJT2_OFF:
value->iValue = here->BJT2off;
return(OK);

4
src/spicelib/devices/bjt2/bjt2conv.c

@ -34,7 +34,9 @@ BJT2convTest(GENmodel *inModel, CKTcircuit *ckt)
for( ; model != NULL; model = model->BJT2nextModel) {
for(here=model->BJT2instances;here!=NULL;here = here->BJT2nextInstance){
vbe=model->BJT2type*(
if (here->BJT2owner != ARCHme) continue;
vbe=model->BJT2type*(
*(ckt->CKTrhsOld+here->BJT2basePrimeNode)-
*(ckt->CKTrhsOld+here->BJT2emitPrimeNode));
vbc=model->BJT2type*(

6
src/spicelib/devices/bjt2/bjt2defs.h

@ -37,9 +37,11 @@ typedef struct sBJT2instance {
* or collector prime depending on whether *
* the device is VERTICAL or LATERAL */
double BJT2area; /* area factor for the bjt2 */
double BJTm; /* parallel multiplier */
double BJT2icVBE; /* initial condition voltage B-E*/
double BJT2icVCE; /* initial condition voltage C-E*/
double BJT2temp; /* instance temperature */
double BJTdtemp; /* instance delta temperature from circuit */
double BJT2tSatCur; /* temperature adjusted saturation current */
double BJT2tSubSatCur; /* temperature adjusted subst. saturation current */
double BJT2tEmitterConduct; /* emitter conductance */
@ -117,7 +119,9 @@ typedef struct sBJT2instance {
unsigned BJT2off :1; /* 'off' flag for bjt2 */
unsigned BJT2tempGiven :1; /* temperature given for bjt2 instance*/
unsigned BJT2dtempGiven :1; /* temperature given for bjt2 instance*/
unsigned BJT2areaGiven :1; /* flag to indicate area was specified */
unsigned BJT2mGiven :1; /* flag to indicate m parameter specified */
unsigned BJT2icVBEGiven :1; /* flag to indicate VBE init. cond. given */
unsigned BJT2icVCEGiven :1; /* flag to indicate VCE init. cond. given */
unsigned BJT2senPertFlag :1; /* indictes whether the the parameter of
@ -453,6 +457,8 @@ typedef struct sBJT2model { /* model structure for a bjt2 */
#define BJT2_IC 5
#define BJT2_AREA_SENS 6
#define BJT2_TEMP 7
#define BJT2_DTEMP 8
#define BJT2_M 9
/* model parameters */
#define BJT2_MOD_NPN 101

4
src/spicelib/devices/bjt2/bjt2disto.c

@ -58,8 +58,8 @@ for( ; model != NULL; model = model->BJT2nextModel ) {
/* loop through all the instances of the model */
for (here = model->BJT2instances; here != NULL ;
here=here->BJT2nextInstance) {
here=here->BJT2nextInstance) {
if (here->BJT2owner != ARCHme) continue;
/* getting Volterra kernels */

4
src/spicelib/devices/bjt2/bjt2getic.c

@ -31,7 +31,9 @@ BJT2getic(GENmodel *inModel, CKTcircuit *ckt)
for( ; model ; model = model->BJT2nextModel) {
for(here = model->BJT2instances; here ; here = here->BJT2nextInstance) {
if(!here->BJT2icVBEGiven) {
if (here->BJT2owner != ARCHme) continue;
if(!here->BJT2icVBEGiven) {
here->BJT2icVBE =
*(ckt->CKTrhs + here->BJT2baseNode) -
*(ckt->CKTrhs + here->BJT2emitNode);

5
src/spicelib/devices/bjt2/bjt2load.c

@ -140,8 +140,9 @@ BJT2load(GENmodel *inModel, CKTcircuit *ckt)
/* loop through all the instances of the model */
for (here = model->BJT2instances; here != NULL ;
here=here->BJT2nextInstance) {
vt = here->BJT2temp * CONSTKoverQ;
if (here->BJT2owner != ARCHme) continue;
vt = here->BJT2temp * CONSTKoverQ;
if(ckt->CKTsenInfo){
#ifdef SENSDEBUG

2
src/spicelib/devices/bjt2/bjt2noise.c

@ -53,6 +53,8 @@ BJT2noise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt,
for (model=firstModel; model != NULL; model=model->BJT2nextModel) {
for (inst=model->BJT2instances; inst != NULL; inst=inst->BJT2nextInstance) {
if (inst->BJT2owner != ARCHme) continue;
switch (operation) {
case N_OPEN:

10
src/spicelib/devices/bjt2/bjt2param.c

@ -30,10 +30,18 @@ BJT2param(int param, IFvalue *value, GENinstance *instPtr, IFvalue *select)
here->BJT2area = value->rValue;
here->BJT2areaGiven = TRUE;
break;
case BJT2_M:
here->BJT2m = value->rValue;
here->BJT2mGiven = TRUE;
break;
case BJT2_TEMP:
here->BJT2temp = value->rValue+CONSTCtoK;
here->BJT2temp = value->rValue + CONSTCtoK;
here->BJT2tempGiven = TRUE;
break;
case BJT2_DTEMP:
here->BJT2dtemp = value->rValue;
here->BJT2dtempGiven = TRUE;
break;
case BJT2_OFF:
here->BJT2off = value->iValue;
break;

2
src/spicelib/devices/bjt2/bjt2pzld.c

@ -36,7 +36,7 @@ BJT2pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
for( ; model != NULL; model = model->BJT2nextModel) {
for( here = model->BJT2instances; here!= NULL;
here = here->BJT2nextInstance) {
if (here->BJT2owner != ARCHme) continue;
gcpr=model->BJT2collectorResist * here->BJT2area;
gepr=model->BJT2emitterResist * here->BJT2area;

4
src/spicelib/devices/bjt2/bjt2setup.c

@ -178,6 +178,10 @@ BJT2setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
CKTnode *tmpNode;
IFuid tmpName;
if (here->BJT2owner != ARCHme)
goto matrixpointers;
if(!here->BJT2areaGiven) {
here->BJT2area = 1;
}

1
src/spicelib/devices/bjt2/bjt2sload.c

@ -90,6 +90,7 @@ BJT2sLoad(GENmodel *inModel, CKTcircuit *ckt)
/* loop through all the instances of the model */
for (here = model->BJT2instances; here != NULL ;
here=here->BJT2nextInstance) {
if (here->BJT2owner != ARCHme) continue;
#ifdef SENSDEBUG
printf("base = %d , baseprm = %d ,col = %d, colprm = %d\n",

2
src/spicelib/devices/bjt2/bjt2sprt.c

@ -33,6 +33,8 @@ BJT2sPrint(GENmodel *inModel, CKTcircuit *ckt)
/* loop through all the instances of the model */
for (here = model->BJT2instances; here != NULL ;
here=here->BJT2nextInstance) {
if (here->BJT2owner != ARCHme) continue;
ckt->CKTsenInfo->SEN_parmVal[here->BJT2senParmNo] = here->BJT2area;
printf(" Instance name:%s\n",here->BJT2name);

1
src/spicelib/devices/bjt2/bjt2sset.c

@ -35,6 +35,7 @@ BJT2sSetup(SENstruct *info, GENmodel *inModel)
/* loop through all the instances of the model */
for (here = model->BJT2instances; here != NULL ;
here=here->BJT2nextInstance) {
if (here->BJT2owner != ARCHme) continue;
if(here->BJT2senParmNo){
here->BJT2senParmNo = ++(info->SENparms);

2
src/spicelib/devices/bjt2/bjt2supd.c

@ -47,7 +47,7 @@ BJT2sUpdate(GENmodel *inModel, CKTcircuit *ckt)
/* loop through all the instances of the model */
for (here = model->BJT2instances; here != NULL ;
here=here->BJT2nextInstance) {
if (here->BJT2owner != ARCHme) continue;
sxpbe = 0;
sxpbc = 0;

4
src/spicelib/devices/bjt2/bjt2temp.c

@ -132,7 +132,9 @@ BJT2temp(GENmodel *inModel, CKTcircuit *ckt)
/* loop through all the instances of the model */
for (here = model->BJT2instances; here != NULL ;
here=here->BJT2nextInstance) {
if(!here->BJT2tempGiven) here->BJT2temp = ckt->CKTtemp;
if (here->BJT2owner != ARCHme) continue;
if(!here->BJT2tempGiven) here->BJT2temp = ckt->CKTtemp + here->BJT2_dtemp;
vt = here->BJT2temp * CONSTKoverQ;
fact2 = here->BJT2temp/REFTEMP;
egfet = 1.16-(7.02e-4*here->BJT2temp*here->BJT2temp)/

2
src/spicelib/devices/bjt2/bjt2trun.c

@ -27,6 +27,8 @@ BJT2trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep)
for( ; model != NULL; model = model->BJT2nextModel) {
for(here=model->BJT2instances;here!=NULL;here = here->BJT2nextInstance){
if (here->BJT2owner != ARCHme) continue;
CKTterr(here->BJT2qbe,ckt,timeStep);
CKTterr(here->BJT2qbc,ckt,timeStep);
CKTterr(here->BJT2qsub,ckt,timeStep);

Loading…
Cancel
Save