Added support for dtemp and parallel code. Partial support for multiplier.
This commit is contained in:
parent
fa936c397f
commit
c57a5c5464
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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*(
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)/
|
||||
|
|
|
|||
|
|
@ -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…
Reference in New Issue