diff --git a/src/spicelib/devices/bjt2/bjt2.c b/src/spicelib/devices/bjt2/bjt2.c index 407db82a3..df1bd970a 100644 --- a/src/spicelib/devices/bjt2/bjt2.c +++ b/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 */ diff --git a/src/spicelib/devices/bjt2/bjt2acld.c b/src/spicelib/devices/bjt2/bjt2acld.c index 8d03540fb..af4f6e7de 100644 --- a/src/spicelib/devices/bjt2/bjt2acld.c +++ b/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); diff --git a/src/spicelib/devices/bjt2/bjt2ask.c b/src/spicelib/devices/bjt2/bjt2ask.c index eae103368..b430f7e65 100644 --- a/src/spicelib/devices/bjt2/bjt2ask.c +++ b/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); diff --git a/src/spicelib/devices/bjt2/bjt2conv.c b/src/spicelib/devices/bjt2/bjt2conv.c index b62f8dbfd..dcd90d5e6 100644 --- a/src/spicelib/devices/bjt2/bjt2conv.c +++ b/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*( diff --git a/src/spicelib/devices/bjt2/bjt2defs.h b/src/spicelib/devices/bjt2/bjt2defs.h index 289c6f2f5..490959381 100644 --- a/src/spicelib/devices/bjt2/bjt2defs.h +++ b/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 diff --git a/src/spicelib/devices/bjt2/bjt2disto.c b/src/spicelib/devices/bjt2/bjt2disto.c index fb3f11f5b..07fec985b 100644 --- a/src/spicelib/devices/bjt2/bjt2disto.c +++ b/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 */ diff --git a/src/spicelib/devices/bjt2/bjt2getic.c b/src/spicelib/devices/bjt2/bjt2getic.c index 8906be02a..68f9b8b55 100644 --- a/src/spicelib/devices/bjt2/bjt2getic.c +++ b/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); diff --git a/src/spicelib/devices/bjt2/bjt2load.c b/src/spicelib/devices/bjt2/bjt2load.c index 3d260fd73..213b44fd0 100644 --- a/src/spicelib/devices/bjt2/bjt2load.c +++ b/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 diff --git a/src/spicelib/devices/bjt2/bjt2noise.c b/src/spicelib/devices/bjt2/bjt2noise.c index 43614890b..16a9d5252 100644 --- a/src/spicelib/devices/bjt2/bjt2noise.c +++ b/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: diff --git a/src/spicelib/devices/bjt2/bjt2param.c b/src/spicelib/devices/bjt2/bjt2param.c index 34ceee8f6..cc3c22806 100644 --- a/src/spicelib/devices/bjt2/bjt2param.c +++ b/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; diff --git a/src/spicelib/devices/bjt2/bjt2pzld.c b/src/spicelib/devices/bjt2/bjt2pzld.c index 933a8ad58..4016a9359 100644 --- a/src/spicelib/devices/bjt2/bjt2pzld.c +++ b/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; diff --git a/src/spicelib/devices/bjt2/bjt2setup.c b/src/spicelib/devices/bjt2/bjt2setup.c index a17481605..fe0416493 100644 --- a/src/spicelib/devices/bjt2/bjt2setup.c +++ b/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; } diff --git a/src/spicelib/devices/bjt2/bjt2sload.c b/src/spicelib/devices/bjt2/bjt2sload.c index 66550970c..ba19d4a77 100644 --- a/src/spicelib/devices/bjt2/bjt2sload.c +++ b/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", diff --git a/src/spicelib/devices/bjt2/bjt2sprt.c b/src/spicelib/devices/bjt2/bjt2sprt.c index a0bdd7c97..d567d1ea4 100644 --- a/src/spicelib/devices/bjt2/bjt2sprt.c +++ b/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); diff --git a/src/spicelib/devices/bjt2/bjt2sset.c b/src/spicelib/devices/bjt2/bjt2sset.c index b763f7685..776c5326e 100644 --- a/src/spicelib/devices/bjt2/bjt2sset.c +++ b/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); diff --git a/src/spicelib/devices/bjt2/bjt2supd.c b/src/spicelib/devices/bjt2/bjt2supd.c index 1d4520380..80705f796 100644 --- a/src/spicelib/devices/bjt2/bjt2supd.c +++ b/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; diff --git a/src/spicelib/devices/bjt2/bjt2temp.c b/src/spicelib/devices/bjt2/bjt2temp.c index ca8c06d8a..f85a5ab59 100644 --- a/src/spicelib/devices/bjt2/bjt2temp.c +++ b/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)/ diff --git a/src/spicelib/devices/bjt2/bjt2trun.c b/src/spicelib/devices/bjt2/bjt2trun.c index d2888cd1d..c877f613e 100644 --- a/src/spicelib/devices/bjt2/bjt2trun.c +++ b/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);