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

This commit is contained in:
pnenzi 2003-10-28 08:56:58 +00:00
parent fa936c397f
commit c57a5c5464
18 changed files with 90 additions and 45 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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