diff --git a/src/spicelib/devices/bjt/bjt.c b/src/spicelib/devices/bjt/bjt.c index c505afe50..6eb909753 100644 --- a/src/spicelib/devices/bjt/bjt.c +++ b/src/spicelib/devices/bjt/bjt.c @@ -23,7 +23,9 @@ IFparm BJTpTable[] = { /* parameters */ IOPU("off", BJT_OFF, IF_FLAG, "Device initially off"), IOPAU("icvbe", BJT_IC_VBE, IF_REAL, "Initial B-E voltage"), IOPAU("icvce", BJT_IC_VCE, IF_REAL, "Initial C-E voltage"), - IOPU("area", BJT_AREA, IF_REAL, "Area factor"), + IOPU("area", BJT_AREA, IF_REAL, "(Emitter )Area factor"), + IOPU("areab", BJT_AREAB, IF_REAL, "Base area factor"), + IOPU("areac", BJT_AREAC, IF_REAL, "Collector area factor"), IOPU("m", BJT_M, IF_REAL, "Parallel Multiplier"), IP("ic", BJT_IC, IF_REALVEC, "Initial condition vector"), IP("sens_area",BJT_AREA_SENS,IF_FLAG, "flag to request sensitivity WRT area"), diff --git a/src/spicelib/devices/bjt/bjtask.c b/src/spicelib/devices/bjt/bjtask.c index 725c141b1..3f1088218 100644 --- a/src/spicelib/devices/bjt/bjtask.c +++ b/src/spicelib/devices/bjt/bjtask.c @@ -45,6 +45,12 @@ BJTask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalue case BJT_AREA: value->rValue = here->BJTarea; return(OK); + case BJT_AREAB: + value->rValue = here->BJTareab; + return(OK); + case BJT_AREAC: + value->rValue = here->BJTareac; + return(OK); case BJT_M: value->rValue = here->BJTm; return(OK); diff --git a/src/spicelib/devices/bjt/bjtdefs.h b/src/spicelib/devices/bjt/bjtdefs.h index a05d0c911..f0f9f46af 100644 --- a/src/spicelib/devices/bjt/bjtdefs.h +++ b/src/spicelib/devices/bjt/bjtdefs.h @@ -31,7 +31,9 @@ typedef struct sBJTinstance { int BJTcolPrimeNode; /* number of internal collector node of bjt */ int BJTbasePrimeNode; /* number of internal base node of bjt */ int BJTemitPrimeNode; /* number of internal emitter node of bjt */ - double BJTarea; /* area factor for the bjt */ + double BJTarea; /* (emitter) area factor for the bjt */ + double BJTareab; /* base area factor for the bjt */ + double BJTareac; /* collector area factor for the bjt */ double BJTm; /* parallel multiplier */ double BJTicVBE; /* initial condition voltage B-E*/ double BJTicVCE; /* initial condition voltage C-E*/ @@ -103,6 +105,8 @@ typedef struct sBJTinstance { unsigned BJTtempGiven :1; /* temperature given for bjt instance*/ unsigned BJTdtempGiven :1; /* delta temperature given for bjt instance*/ unsigned BJTareaGiven :1; /* flag to indicate area was specified */ + unsigned BJTareabGiven :1; /* flag to indicate base area was specified */ + unsigned BJTareacGiven :1; /* flag to indicate collector area was specified */ unsigned BJTmGiven :1; /* flag to indicate m parameter specified */ unsigned BJTicVBEGiven :1; /* flag to indicate VBE init. cond. given */ unsigned BJTicVCEGiven :1; /* flag to indicate VCE init. cond. given */ @@ -409,6 +413,8 @@ typedef struct sBJTmodel { /* model structure for a bjt */ #define BJT_TEMP 7 #define BJT_DTEMP 8 #define BJT_M 9 +#define BJT_AREAB 10 +#define BJT_AREAC 11 /* model parameters */ #define BJT_MOD_NPN 101 diff --git a/src/spicelib/devices/bjt/bjtdset.c b/src/spicelib/devices/bjt/bjtdset.c index 0a67beb4d..eccb4d7f7 100644 --- a/src/spicelib/devices/bjt/bjtdset.c +++ b/src/spicelib/devices/bjt/bjtdset.c @@ -160,7 +160,7 @@ BJTdSetup(GENmodel *inModel, CKTcircuit *ckt) c2=here->BJTtBEleakCur*here->BJTarea * here->BJTm; vte=model->BJTleakBEemissionCoeff*vt; oikr=model->BJTinvRollOffR/(here->BJTarea * here->BJTm); - c4=here->BJTtBCleakCur*here->BJTarea * here->BJTm; + c4=here->BJTtBCleakCur*here->BJTareab * here->BJTm; vtc=model->BJTleakBCemissionCoeff*vt; xjrb=model->BJTbaseCurrentHalfResist*here->BJTarea * here->BJTm; @@ -483,13 +483,13 @@ BJTdSetup(GENmodel *inModel, CKTcircuit *ckt) pe=here->BJTtBEpot; xme=model->BJTjunctionExpBE; cdis=model->BJTbaseFractionBCcap; - ctot=here->BJTtBCcap*here->BJTarea * here->BJTm; + ctot=here->BJTtBCcap*here->BJTareab * here->BJTm; czbc=ctot*cdis; czbx=ctot-czbc; pc=here->BJTtBCpot; xmc=model->BJTjunctionExpBC; fcpe=here->BJTtDepCap; - czcs=model->BJTcapCS*here->BJTarea * here->BJTm; + czcs=model->BJTcapCS*here->BJTareac * here->BJTm; ps=model->BJTpotentialSubstrate; xms=model->BJTexponentialSubstrate; xtf=model->BJTtransitTimeBiasCoeffF; diff --git a/src/spicelib/devices/bjt/bjtload.c b/src/spicelib/devices/bjt/bjtload.c index dd9a41179..620f85e7a 100644 --- a/src/spicelib/devices/bjt/bjtload.c +++ b/src/spicelib/devices/bjt/bjtload.c @@ -170,7 +170,7 @@ BJTload(GENmodel *inModel, CKTcircuit *ckt) c2=here->BJTtBEleakCur*here->BJTarea; vte=model->BJTleakBEemissionCoeff*vt; oikr=model->BJTinvRollOffR/here->BJTarea; - c4=here->BJTtBCleakCur*here->BJTarea; + c4=here->BJTtBCleakCur*here->BJTareab; vtc=model->BJTleakBCemissionCoeff*vt; td=model->BJTexcessPhaseFactor; xjrb=model->BJTbaseCurrentHalfResist*here->BJTarea; @@ -507,7 +507,7 @@ next1: vtn=vt*model->BJTemissionCoeffF; pc=here->BJTtBCpot; xmc=model->BJTjunctionExpBC; fcpe=here->BJTtDepCap; - czcs=model->BJTcapCS*here->BJTarea; + czcs=model->BJTcapCS*here->BJTareac; ps=model->BJTpotentialSubstrate; xms=model->BJTexponentialSubstrate; xtf=model->BJTtransitTimeBiasCoeffF; diff --git a/src/spicelib/devices/bjt/bjtnoise.c b/src/spicelib/devices/bjt/bjtnoise.c index 11546451f..84047828c 100644 --- a/src/spicelib/devices/bjt/bjtnoise.c +++ b/src/spicelib/devices/bjt/bjtnoise.c @@ -122,7 +122,7 @@ if (!data->namelist) return(E_NOMEM); NevalSrc(&noizDens[BJTRBNOIZ],&lnNdens[BJTRBNOIZ], ckt,THERMNOISE,inst->BJTbasePrimeNode,inst->BJTbaseNode, - *(ckt->CKTstate0 + inst->BJTgx) * here->BJTm); + *(ckt->CKTstate0 + inst->BJTgx) * inst->BJTm); NevalSrc(&noizDens[BJT_RE_NOISE],&lnNdens[BJT_RE_NOISE], ckt,THERMNOISE,inst->BJTemitPrimeNode,inst->BJTemitNode, diff --git a/src/spicelib/devices/bjt/bjtparam.c b/src/spicelib/devices/bjt/bjtparam.c index 37b4a7e66..7b8c74496 100644 --- a/src/spicelib/devices/bjt/bjtparam.c +++ b/src/spicelib/devices/bjt/bjtparam.c @@ -29,6 +29,14 @@ BJTparam(int param, IFvalue *value, GENinstance *instPtr, IFvalue *select) here->BJTarea = value->rValue; here->BJTareaGiven = TRUE; break; + case BJT_AREAB: + here->BJTareab = value->rValue; + here->BJTareabGiven = TRUE; + break; + case BJT_AREAC: + here->BJTareac = value->rValue; + here->BJTareacGiven = TRUE; + break; case BJT_M: here->BJTm = value->rValue; here->BJTmGiven = TRUE; diff --git a/src/spicelib/devices/bjt/bjtsetup.c b/src/spicelib/devices/bjt/bjtsetup.c index f8da4887e..f92859ab8 100644 --- a/src/spicelib/devices/bjt/bjtsetup.c +++ b/src/spicelib/devices/bjt/bjtsetup.c @@ -150,9 +150,14 @@ BJTsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) goto matrixpointers; if(!here->BJTareaGiven) { - here->BJTarea = 1; + here->BJTarea = 1.0; + } + if(!here->BJTareabGiven) { + here->BJTareab = here->BJTarea; + } + if(!here->BJTareacGiven) { + here->BJTareac = here->BJTarea; } - if(!here->BJTmGiven) { here->BJTm = 1.0; }