Enhanced model: m,dtemp.

This commit is contained in:
pnenzi 2003-10-27 19:30:52 +00:00
parent 858a227a57
commit fa936c397f
26 changed files with 221 additions and 263 deletions

View File

@ -9,7 +9,6 @@ Author: 1985 Thomas L. Quarles
*/
#include "ngspice.h"
#include <stdio.h>
#include "devdefs.h"
#include "bjtdefs.h"
#include "suffix.h"
@ -19,6 +18,7 @@ IFparm BJTpTable[] = { /* parameters */
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("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"),
OPU("colnode", BJT_QUEST_COLNODE, IF_INTEGER, "Number of collector node"),
@ -68,7 +68,8 @@ IFparm BJTpTable[] = { /* parameters */
OPU("sens_mag", BJT_QUEST_SENS_MAG, IF_REAL, "sensitivity of ac magnitude"),
OPU("sens_ph", BJT_QUEST_SENS_PH, IF_REAL, "sensitivity of ac phase"),
OPU("sens_cplx", BJT_QUEST_SENS_CPLX, IF_COMPLEX, "ac sensitivity"),
IOPU("temp", BJT_TEMP, IF_REAL, "instance temperature")
IOPU("temp", BJT_TEMP, IF_REAL, "instance temperature"),
IOPU("dtemp", BJT_DTEMP, IF_REAL, "instance temperature delta from circuit")
};
IFparm BJTmPTable[] = { /* model parameters */

View File

@ -10,17 +10,13 @@ Author: 1985 Thomas L. Quarles
*/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "bjtdefs.h"
#include "sperror.h"
#include "suffix.h"
int
BJTacLoad(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
BJTacLoad(GENmodel *inModel, CKTcircuit *ckt)
{
BJTinstance *here;
BJTmodel *model = (BJTmodel*)inModel;
@ -39,12 +35,15 @@ BJTacLoad(inModel,ckt)
double xcbx;
double xccs;
double xcmcb;
double m;
for( ; model != NULL; model = model->BJTnextModel) {
for( here = model->BJTinstances; here!= NULL;
here = here->BJTnextInstance) {
if (here->BJTowner != ARCHme) continue;
m = here->BJTm;
gcpr=model->BJTcollectorConduct * here->BJTarea;
gepr=model->BJTemitterConduct * here->BJTarea;
gpi= *(ckt->CKTstate0 + here->BJTgpi);
@ -65,39 +64,39 @@ BJTacLoad(inModel,ckt)
xcbx= *(ckt->CKTstate0 + here->BJTcqbx) * ckt->CKTomega;
xccs= *(ckt->CKTstate0 + here->BJTcqcs) * ckt->CKTomega;
xcmcb= *(ckt->CKTstate0 + here->BJTcexbc) * ckt->CKTomega;
*(here->BJTcolColPtr) += (gcpr);
*(here->BJTbaseBasePtr) += (gx);
*(here->BJTbaseBasePtr + 1) += (xcbx);
*(here->BJTemitEmitPtr) += (gepr);
*(here->BJTcolPrimeColPrimePtr) += (gmu+go+gcpr);
*(here->BJTcolPrimeColPrimePtr + 1) += (xcmu+xccs+xcbx);
*(here->BJTbasePrimeBasePrimePtr) += (gx+gpi+gmu);
*(here->BJTbasePrimeBasePrimePtr + 1) += (xcpi+xcmu+xcmcb);
*(here->BJTemitPrimeEmitPrimePtr) += (gpi+gepr+gm+go);
*(here->BJTemitPrimeEmitPrimePtr + 1) += (xcpi+xgm);
*(here->BJTcolColPrimePtr) += (-gcpr);
*(here->BJTbaseBasePrimePtr) += (-gx);
*(here->BJTemitEmitPrimePtr) += (-gepr);
*(here->BJTcolPrimeColPtr) += (-gcpr);
*(here->BJTcolPrimeBasePrimePtr) += (-gmu+gm);
*(here->BJTcolPrimeBasePrimePtr + 1) += (-xcmu+xgm);
*(here->BJTcolPrimeEmitPrimePtr) += (-gm-go);
*(here->BJTcolPrimeEmitPrimePtr + 1) += (-xgm);
*(here->BJTbasePrimeBasePtr) += (-gx);
*(here->BJTbasePrimeColPrimePtr) += (-gmu);
*(here->BJTbasePrimeColPrimePtr + 1) += (-xcmu-xcmcb);
*(here->BJTbasePrimeEmitPrimePtr) += (-gpi);
*(here->BJTbasePrimeEmitPrimePtr + 1) += (-xcpi);
*(here->BJTemitPrimeEmitPtr) += (-gepr);
*(here->BJTemitPrimeColPrimePtr) += (-go);
*(here->BJTemitPrimeColPrimePtr + 1) += (xcmcb);
*(here->BJTemitPrimeBasePrimePtr) += (-gpi-gm);
*(here->BJTemitPrimeBasePrimePtr + 1) += (-xcpi-xgm-xcmcb);
*(here->BJTsubstSubstPtr + 1) += (xccs);
*(here->BJTcolPrimeSubstPtr + 1) += (-xccs);
*(here->BJTsubstColPrimePtr + 1) += (-xccs);
*(here->BJTbaseColPrimePtr + 1) += (-xcbx);
*(here->BJTcolPrimeBasePtr + 1) += (-xcbx);
*(here->BJTcolColPtr) += m * (gcpr);
*(here->BJTbaseBasePtr) += m * (gx);
*(here->BJTbaseBasePtr + 1) += m * (xcbx);
*(here->BJTemitEmitPtr) += m * (gepr);
*(here->BJTcolPrimeColPrimePtr) += m * (gmu+go+gcpr);
*(here->BJTcolPrimeColPrimePtr + 1) += m * (xcmu+xccs+xcbx);
*(here->BJTbasePrimeBasePrimePtr) += m * (gx+gpi+gmu);
*(here->BJTbasePrimeBasePrimePtr + 1) += m * (xcpi+xcmu+xcmcb);
*(here->BJTemitPrimeEmitPrimePtr) += m * (gpi+gepr+gm+go);
*(here->BJTemitPrimeEmitPrimePtr + 1) += m * (xcpi+xgm);
*(here->BJTcolColPrimePtr) += m * (-gcpr);
*(here->BJTbaseBasePrimePtr) += m * (-gx);
*(here->BJTemitEmitPrimePtr) += m * (-gepr);
*(here->BJTcolPrimeColPtr) += m * (-gcpr);
*(here->BJTcolPrimeBasePrimePtr) += m * (-gmu+gm);
*(here->BJTcolPrimeBasePrimePtr + 1) += m * (-xcmu+xgm);
*(here->BJTcolPrimeEmitPrimePtr) += m * (-gm-go);
*(here->BJTcolPrimeEmitPrimePtr + 1) += m * (-xgm);
*(here->BJTbasePrimeBasePtr) += m * (-gx);
*(here->BJTbasePrimeColPrimePtr) += m * (-gmu);
*(here->BJTbasePrimeColPrimePtr + 1) += m * (-xcmu-xcmcb);
*(here->BJTbasePrimeEmitPrimePtr) += m * (-gpi);
*(here->BJTbasePrimeEmitPrimePtr + 1) += m * (-xcpi);
*(here->BJTemitPrimeEmitPtr) += m * (-gepr);
*(here->BJTemitPrimeColPrimePtr) += m * (-go);
*(here->BJTemitPrimeColPrimePtr + 1) += m * (xcmcb);
*(here->BJTemitPrimeBasePrimePtr) += m * (-gpi-gm);
*(here->BJTemitPrimeBasePrimePtr + 1) += m * (-xcpi-xgm-xcmcb);
*(here->BJTsubstSubstPtr + 1) += m * (xccs);
*(here->BJTcolPrimeSubstPtr + 1) += m * (-xccs);
*(here->BJTsubstColPrimePtr + 1) += m * (-xccs);
*(here->BJTbaseColPrimePtr + 1) += m * (-xcbx);
*(here->BJTcolPrimeBasePtr + 1) += m * (-xcbx);
}
}
return(OK);

View File

@ -10,7 +10,6 @@ Author: 1985 Mathew Lew and Thomas L. Quarles
#include "ngspice.h"
#include "const.h"
#include <stdio.h>
#include "cktdefs.h"
#include "bjtdefs.h"
#include "ifsim.h"
@ -19,12 +18,7 @@ Author: 1985 Mathew Lew and Thomas L. Quarles
/*ARGSUSED*/
int
BJTask(ckt,instPtr,which,value,select)
CKTcircuit *ckt;
GENinstance *instPtr;
int which;
IFvalue *value;
IFvalue *select;
BJTask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalue *select)
{
BJTinstance *here = (BJTinstance*)instPtr;
double tmp;
@ -45,9 +39,15 @@ BJTask(ckt,instPtr,which,value,select)
case BJT_TEMP:
value->rValue = here->BJTtemp - CONSTCtoK;
return(OK);
case BJT_DTEMP:
value->rValue = here->BJTdtemp;
return(OK);
case BJT_AREA:
value->rValue = here->BJTarea;
return(OK);
case BJT_M:
value->rValue = here->BJTm;
return(OK);
case BJT_OFF:
value->iValue = here->BJToff;
return(OK);

View File

@ -9,16 +9,13 @@ Author: 1985 Thomas L. Quarles
*/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "bjtdefs.h"
#include "sperror.h"
#include "suffix.h"
int
BJTconvTest(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
BJTconvTest(GENmodel *inModel, CKTcircuit *ckt)
{
BJTinstance *here;

View File

@ -31,10 +31,12 @@ 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; /* area factor for the bjt */
double BJTm; /* parallel multiplier */
double BJTicVBE; /* initial condition voltage B-E*/
double BJTicVCE; /* initial condition voltage C-E*/
double BJTtemp; /* instance temperature */
double BJTdtemp; /* instance delta temperature from circuit */
double BJTtSatCur; /* temperature adjusted saturation current */
double BJTtBetaF; /* temperature adjusted forward beta */
double BJTtBetaR; /* temperature adjusted reverse beta */
@ -97,9 +99,11 @@ typedef struct sBJTinstance {
double *BJTcolPrimeBasePtr; /* pointer to sparse matrix at
* (collector prime,base) */
unsigned BJToff :1; /* 'off' flag for bjt */
unsigned BJToff :1; /* 'off' flag for bjt */
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 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 */
unsigned BJTsenPertFlag :1; /* indictes whether the the parameter of
@ -403,6 +407,8 @@ typedef struct sBJTmodel { /* model structure for a bjt */
#define BJT_IC 5
#define BJT_AREA_SENS 6
#define BJT_TEMP 7
#define BJT_DTEMP 8
#define BJT_M 9
/* model parameters */
#define BJT_MOD_NPN 101

View File

@ -9,17 +9,13 @@ Author: 1985 Thomas L. Quarles
*/
#include "ngspice.h"
#include <stdio.h>
#include "bjtdefs.h"
#include "sperror.h"
#include "suffix.h"
int
BJTdelete(inModel,name,kill)
GENmodel *inModel;
IFuid name;
GENinstance **kill;
BJTdelete(GENmodel *inModel, IFuid name, GENinstance **kill)
{
BJTmodel *model = (BJTmodel*)inModel;

View File

@ -11,14 +11,12 @@ Author: 1985 Thomas L. Quarles
*/
#include "ngspice.h"
#include <stdio.h>
#include "bjtdefs.h"
#include "suffix.h"
void
BJTdestroy(inModel)
GENmodel **inModel;
BJTdestroy(GENmodel **inModel)
{

View File

@ -5,7 +5,6 @@ Modified: 2000 AlansFixes
**********/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "bjtdefs.h"
#include "sperror.h"

View File

@ -4,7 +4,6 @@ Author: 1988 Jaijeet S Roychowdhury
**********/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "bjtdefs.h"
#include "const.h"
@ -154,16 +153,16 @@ BJTdSetup(GENmodel *inModel, CKTcircuit *ckt)
/*
* dc model paramters
*/
csat=here->BJTtSatCur*here->BJTarea;
rbpr=model->BJTminBaseResist/here->BJTarea;
rbpi=model->BJTbaseResist/here->BJTarea-rbpr;
oik=model->BJTinvRollOffF/here->BJTarea;
c2=here->BJTtBEleakCur*here->BJTarea;
csat=here->BJTtSatCur*here->BJTarea * here->BJTm;
rbpr=model->BJTminBaseResist/(here->BJTarea * here->BJTm);
rbpi=model->BJTbaseResist/(here->BJTarea * here->BJTm)-rbpr;
oik=model->BJTinvRollOffF/(here->BJTarea * here->BJTm);
c2=here->BJTtBEleakCur*here->BJTarea * here->BJTm;
vte=model->BJTleakBEemissionCoeff*vt;
oikr=model->BJTinvRollOffR/here->BJTarea;
c4=here->BJTtBCleakCur*here->BJTarea;
oikr=model->BJTinvRollOffR/(here->BJTarea * here->BJTm);
c4=here->BJTtBCleakCur*here->BJTarea * here->BJTm;
vtc=model->BJTleakBCemissionCoeff*vt;
xjrb=model->BJTbaseCurrentHalfResist*here->BJTarea;
xjrb=model->BJTbaseCurrentHalfResist*here->BJTarea * here->BJTm;
/*
@ -480,22 +479,22 @@ BJTdSetup(GENmodel *inModel, CKTcircuit *ckt)
*/
tf=model->BJTtransitTimeF;
tr=model->BJTtransitTimeR;
czbe=here->BJTtBEcap*here->BJTarea;
czbe=here->BJTtBEcap*here->BJTarea * here->BJTm;
pe=here->BJTtBEpot;
xme=model->BJTjunctionExpBE;
cdis=model->BJTbaseFractionBCcap;
ctot=here->BJTtBCcap*here->BJTarea;
ctot=here->BJTtBCcap*here->BJTarea * here->BJTm;
czbc=ctot*cdis;
czbx=ctot-czbc;
pc=here->BJTtBCpot;
xmc=model->BJTjunctionExpBC;
fcpe=here->BJTtDepCap;
czcs=model->BJTcapCS*here->BJTarea;
czcs=model->BJTcapCS*here->BJTarea * here->BJTm;
ps=model->BJTpotentialSubstrate;
xms=model->BJTexponentialSubstrate;
xtf=model->BJTtransitTimeBiasCoeffF;
ovtf=model->BJTtransitTimeVBCFactor;
xjtf=model->BJTtransitTimeHighCurrentF*here->BJTarea;
xjtf=model->BJTtransitTimeHighCurrentF*here->BJTarea * here->BJTm;
if(tf != 0 && vbe >0) {
EqualDeriv(&d_cbe, &d_p);
d_cbe.value = cbe;

View File

@ -1,7 +1,7 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Modified: 2000 AnalsFixes
Modified: 2000 AlansFixes
**********/
#ifndef __BJTEXT_H
#define __BJTEXT_H
@ -30,7 +30,6 @@ extern int BJTtemp(GENmodel*,CKTcircuit*);
extern int BJTtrunc(GENmodel*,CKTcircuit*,double*);
extern int BJTdisto(int,GENmodel*,CKTcircuit*);
extern int BJTnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*);
extern int BJTdSetup(GENmodel*, register CKTcircuit*);
#endif

View File

@ -11,7 +11,6 @@ Author: 1985 Thomas L. Quarles
*/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "bjtdefs.h"
#include "sperror.h"
@ -19,9 +18,7 @@ Author: 1985 Thomas L. Quarles
int
BJTgetic(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
BJTgetic(GENmodel *inModel, CKTcircuit *ckt)
{

View File

@ -10,7 +10,6 @@ Modified: 2000 AlansFixes
*/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "bjtdefs.h"
#include "const.h"
@ -20,13 +19,10 @@ Modified: 2000 AlansFixes
#include "suffix.h"
int
BJTload(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
BJTload(GENmodel *inModel, CKTcircuit *ckt)
/* actually load the current resistance value into the
* sparse matrix previously provided
*/
* sparse matrix previously provided
*/
{
BJTmodel *model = (BJTmodel*)inModel;
BJTinstance *here;
@ -132,6 +128,8 @@ BJTload(inModel,ckt)
int ichk1;
int error;
int SenCond=0;
double m;
/* loop through all the models */
for( ; model != NULL; model = model->BJTnextModel ) {
@ -141,7 +139,9 @@ BJTload(inModel,ckt)
if (here->BJTowner != ARCHme) continue;
vt = here->BJTtemp * CONSTKoverQ;
m = here->BJTm;
if(ckt->CKTsenInfo){
#ifdef SENSDEBUG
printf("BJTload \n");
@ -314,7 +314,7 @@ BJTload(inModel,ckt)
cbhat= *(ckt->CKTstate0 + here->BJTcb)+ *(ckt->CKTstate0 +
here->BJTgpi)*delvbe+ *(ckt->CKTstate0 + here->BJTgmu)*
delvbc;
#ifndef NOBYPASS
/*
* bypass if solution has not changed
*/
@ -355,7 +355,7 @@ BJTload(inModel,ckt)
geqbx = *(ckt->CKTstate0 + here->BJTgeqbx);
goto load;
}
#endif /*NOBYPASS*/
/*
* limit nonlinear branch voltages
*/
@ -713,8 +713,8 @@ next2:
if(SenCond)continue;
load:
/*
* load current excitation vector
*/
* load current excitation vector
*/
ceqcs=model->BJTtype * (*(ckt->CKTstate0 + here->BJTcqcs) -
vcs * gccs);
ceqbx=model->BJTtype * (*(ckt->CKTstate0 + here->BJTcqbx) -
@ -723,39 +723,39 @@ load:
(go - geqcb));
ceqbc=model->BJTtype * (-cc + vbe * (gm + go) - vbc * (gmu + go));
*(ckt->CKTrhs + here->BJTbaseNode) += (-ceqbx);
*(ckt->CKTrhs + here->BJTbaseNode) += m * (-ceqbx);
*(ckt->CKTrhs + here->BJTcolPrimeNode) +=
(ceqcs+ceqbx+ceqbc);
m * (ceqcs+ceqbx+ceqbc);
*(ckt->CKTrhs + here->BJTbasePrimeNode) +=
(-ceqbe-ceqbc);
*(ckt->CKTrhs + here->BJTemitPrimeNode) += (ceqbe);
*(ckt->CKTrhs + here->BJTsubstNode) += (-ceqcs);
m * (-ceqbe-ceqbc);
*(ckt->CKTrhs + here->BJTemitPrimeNode) += m * (ceqbe);
*(ckt->CKTrhs + here->BJTsubstNode) += m * (-ceqcs);
/*
* load y matrix
*/
*(here->BJTcolColPtr) += (gcpr);
*(here->BJTbaseBasePtr) += (gx+geqbx);
*(here->BJTemitEmitPtr) += (gepr);
*(here->BJTcolPrimeColPrimePtr) += (gmu+go+gcpr+gccs+geqbx);
*(here->BJTbasePrimeBasePrimePtr) += (gx +gpi+gmu+geqcb);
*(here->BJTemitPrimeEmitPrimePtr) += (gpi+gepr+gm+go);
*(here->BJTcolColPrimePtr) += (-gcpr);
*(here->BJTbaseBasePrimePtr) += (-gx);
*(here->BJTemitEmitPrimePtr) += (-gepr);
*(here->BJTcolPrimeColPtr) += (-gcpr);
*(here->BJTcolPrimeBasePrimePtr) += (-gmu+gm);
*(here->BJTcolPrimeEmitPrimePtr) += (-gm-go);
*(here->BJTbasePrimeBasePtr) += (-gx);
*(here->BJTbasePrimeColPrimePtr) += (-gmu-geqcb);
*(here->BJTbasePrimeEmitPrimePtr) += (-gpi);
*(here->BJTemitPrimeEmitPtr) += (-gepr);
*(here->BJTemitPrimeColPrimePtr) += (-go+geqcb);
*(here->BJTemitPrimeBasePrimePtr) += (-gpi-gm-geqcb);
*(here->BJTsubstSubstPtr) += (gccs);
*(here->BJTcolPrimeSubstPtr) += (-gccs);
*(here->BJTsubstColPrimePtr) += (-gccs);
*(here->BJTbaseColPrimePtr) += (-geqbx);
*(here->BJTcolPrimeBasePtr) += (-geqbx);
*(here->BJTcolColPtr) += m * (gcpr);
*(here->BJTbaseBasePtr) += m * (gx+geqbx);
*(here->BJTemitEmitPtr) += m * (gepr);
*(here->BJTcolPrimeColPrimePtr) += m * (gmu+go+gcpr+gccs+geqbx);
*(here->BJTbasePrimeBasePrimePtr) += m * (gx +gpi+gmu+geqcb);
*(here->BJTemitPrimeEmitPrimePtr) += m * (gpi+gepr+gm+go);
*(here->BJTcolColPrimePtr) += m * (-gcpr);
*(here->BJTbaseBasePrimePtr) += m * (-gx);
*(here->BJTemitEmitPrimePtr) += m * (-gepr);
*(here->BJTcolPrimeColPtr) += m * (-gcpr);
*(here->BJTcolPrimeBasePrimePtr) += m * (-gmu+gm);
*(here->BJTcolPrimeEmitPrimePtr) += m * (-gm-go);
*(here->BJTbasePrimeBasePtr) += m * (-gx);
*(here->BJTbasePrimeColPrimePtr) += m * (-gmu-geqcb);
*(here->BJTbasePrimeEmitPrimePtr) += m * (-gpi);
*(here->BJTemitPrimeEmitPtr) += m * (-gepr);
*(here->BJTemitPrimeColPrimePtr) += m * (-go+geqcb);
*(here->BJTemitPrimeBasePrimePtr) += m * (-gpi-gm-geqcb);
*(here->BJTsubstSubstPtr) += m * (gccs);
*(here->BJTcolPrimeSubstPtr) += m * (-gccs);
*(here->BJTsubstColPrimePtr) += m * (-gccs);
*(here->BJTbaseColPrimePtr) += m * (-geqbx);
*(here->BJTcolPrimeBasePtr) += m * (-geqbx);
}
}
return(OK);

View File

@ -6,7 +6,6 @@ Author: 1987 Mathew Lew and Thomas L. Quarles
*/
#include "ngspice.h"
#include <stdio.h>
#include "const.h"
#include "ifsim.h"
#include "cktdefs.h"
@ -18,11 +17,7 @@ Author: 1987 Mathew Lew and Thomas L. Quarles
/*ARGSUSED*/
int
BJTmAsk(ckt,instPtr,which,value)
CKTcircuit *ckt;
GENmodel *instPtr;
int which;
IFvalue *value;
BJTmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
{
BJTmodel *here = (BJTmodel*)instPtr;

View File

@ -12,18 +12,13 @@ Author: 1985 Thomas L. Quarles
*/
#include "ngspice.h"
#include <stdio.h>
#include "bjtdefs.h"
#include "sperror.h"
#include "suffix.h"
int
BJTmDelete(inModels,modname,kill)
GENmodel **inModels;
IFuid modname;
GENmodel *kill;
BJTmDelete(GENmodel **inModels, IFuid modname, GENmodel *kill)
{
BJTmodel **model = (BJTmodel**)inModels;
BJTmodel *modfast = (BJTmodel*)kill;

View File

@ -11,7 +11,6 @@ Author: 1985 Thomas L. Quarles
*/
#include "ngspice.h"
#include <stdio.h>
#include "const.h"
#include "ifsim.h"
#include "bjtdefs.h"
@ -20,10 +19,7 @@ Author: 1985 Thomas L. Quarles
int
BJTmParam(param,value,inModel)
int param;
IFvalue *value;
GENmodel *inModel;
BJTmParam(int param, IFvalue *value, GENmodel *inModel)
{
BJTmodel *mods = (BJTmodel*)inModel;

View File

@ -4,7 +4,6 @@ Author: 1987 Gary W. Ng
**********/
#include "ngspice.h"
#include <stdio.h>
#include "bjtdefs.h"
#include "cktdefs.h"
#include "iferrmsg.h"
@ -25,13 +24,8 @@ extern void NevalSrc();
extern double Nintegrate();
int
BJTnoise (mode, operation, genmodel, ckt, data, OnDens)
GENmodel *genmodel;
int mode;
int operation;
CKTcircuit *ckt;
Ndata *data;
double *OnDens;
BJTnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt,
Ndata *data, double *OnDens)
{
BJTmodel *firstModel = (BJTmodel *) genmodel;
BJTmodel *model;
@ -124,7 +118,7 @@ if (!data->namelist) return(E_NOMEM);
case N_DENS:
NevalSrc(&noizDens[BJTRCNOIZ],&lnNdens[BJTRCNOIZ],
ckt,THERMNOISE,inst->BJTcolPrimeNode,inst->BJTcolNode,
model->BJTcollectorConduct * inst->BJTarea);
model->BJTcollectorConduct * inst->BJTarea * inst->BJTm);
NevalSrc(&noizDens[BJTRBNOIZ],&lnNdens[BJTRBNOIZ],
ckt,THERMNOISE,inst->BJTbasePrimeNode,inst->BJTbaseNode,
@ -132,20 +126,20 @@ if (!data->namelist) return(E_NOMEM);
NevalSrc(&noizDens[BJT_RE_NOISE],&lnNdens[BJT_RE_NOISE],
ckt,THERMNOISE,inst->BJTemitPrimeNode,inst->BJTemitNode,
model->BJTemitterConduct * inst->BJTarea);
model->BJTemitterConduct * inst->BJTarea * inst-> BJTm);
NevalSrc(&noizDens[BJTICNOIZ],&lnNdens[BJTICNOIZ],
ckt,SHOTNOISE,inst->BJTcolPrimeNode, inst->BJTemitPrimeNode,
*(ckt->CKTstate0 + inst->BJTcc));
*(ckt->CKTstate0 + inst->BJTcc) * inst->BJTm);
NevalSrc(&noizDens[BJTIBNOIZ],&lnNdens[BJTIBNOIZ],
ckt,SHOTNOISE,inst->BJTbasePrimeNode, inst->BJTemitPrimeNode,
*(ckt->CKTstate0 + inst->BJTcb));
*(ckt->CKTstate0 + inst->BJTcb) * inst->BJTm);
NevalSrc(&noizDens[BJTFLNOIZ],(double*)NULL,ckt,
N_GAIN,inst->BJTbasePrimeNode, inst->BJTemitPrimeNode,
(double)0.0);
noizDens[BJTFLNOIZ] *= model->BJTfNcoef *
noizDens[BJTFLNOIZ] *= inst->BJTm * model->BJTfNcoef *
exp(model->BJTfNexp *
log(MAX(fabs(*(ckt->CKTstate0 + inst->BJTcb)),N_MINLOG))) /
data->freq;

View File

@ -11,7 +11,6 @@ Author: 1985 Thomas L. Quarles
*/
#include "ngspice.h"
#include <stdio.h>
#include "const.h"
#include "ifsim.h"
#include "bjtdefs.h"
@ -21,11 +20,7 @@ Author: 1985 Thomas L. Quarles
/* ARGSUSED */
int
BJTparam(param,value,instPtr,select)
int param;
IFvalue *value;
GENinstance *instPtr;
IFvalue *select;
BJTparam(int param, IFvalue *value, GENinstance *instPtr, IFvalue *select)
{
BJTinstance *here = (BJTinstance*)instPtr;
@ -34,10 +29,18 @@ BJTparam(param,value,instPtr,select)
here->BJTarea = value->rValue;
here->BJTareaGiven = TRUE;
break;
case BJT_M:
here->BJTm = value->rValue;
here->BJTmGiven = TRUE;
break;
case BJT_TEMP:
here->BJTtemp = value->rValue+CONSTCtoK;
here->BJTtemp = value->rValue + CONSTCtoK;
here->BJTtempGiven = TRUE;
break;
case BJT_DTEMP:
here->BJTdtemp = value->rValue;
here->BJTdtempGiven = TRUE;
break;
case BJT_OFF:
here->BJToff = value->iValue;
break;

View File

@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles
*/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "complex.h"
#include "bjtdefs.h"
@ -15,11 +14,7 @@ Author: 1985 Thomas L. Quarles
int
BJTpzLoad(inModel,ckt,s)
GENmodel *inModel;
CKTcircuit *ckt;
SPcomplex *s;
BJTpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
{
BJTmodel *model = (BJTmodel*)inModel;
BJTinstance *here;
@ -36,12 +31,15 @@ BJTpzLoad(inModel,ckt,s)
double xcbx;
double xccs;
double xcmcb;
double m;
for( ; model != NULL; model = model->BJTnextModel) {
for( here = model->BJTinstances; here!= NULL;
here = here->BJTnextInstance) {
if (here->BJTowner != ARCHme) continue;
m = here->BJTm;
gcpr=model->BJTcollectorResist * here->BJTarea;
gepr=model->BJTemitterResist * here->BJTarea;
gpi= *(ckt->CKTstate0 + here->BJTgpi);
@ -55,62 +53,63 @@ BJTpzLoad(inModel,ckt,s)
xcbx= *(ckt->CKTstate0 + here->BJTcqbx);
xccs= *(ckt->CKTstate0 + here->BJTcqcs);
xcmcb= *(ckt->CKTstate0 + here->BJTcexbc);
*(here->BJTcolColPtr) += (gcpr);
*(here->BJTbaseBasePtr) += (gx) + (xcbx) * (s->real);
*(here->BJTbaseBasePtr + 1) += (xcbx) * (s->imag);
*(here->BJTemitEmitPtr) += (gepr);
*(here->BJTcolPrimeColPrimePtr) += (gmu+go+gcpr)
+ (xcmu+xccs+xcbx) * (s->real);
*(here->BJTcolPrimeColPrimePtr + 1) += (xcmu+xccs+xcbx)
* (s->imag);
*(here->BJTbasePrimeBasePrimePtr) += (gx+gpi+gmu)
+ (xcpi+xcmu+xcmcb) * (s->real);
*(here->BJTbasePrimeBasePrimePtr + 1) += (xcpi+xcmu+xcmcb)
* (s->imag);
*(here->BJTemitPrimeEmitPrimePtr) += (gpi+gepr+gm+go)
+ (xcpi+xgm) * (s->real);
*(here->BJTemitPrimeEmitPrimePtr + 1) += (xcpi+xgm)
* (s->imag);
*(here->BJTcolColPrimePtr) += (-gcpr);
*(here->BJTbaseBasePrimePtr) += (-gx);
*(here->BJTemitEmitPrimePtr) += (-gepr);
*(here->BJTcolPrimeColPtr) += (-gcpr);
*(here->BJTcolPrimeBasePrimePtr) += (-gmu+gm)
+ (-xcmu+xgm) * (s->real);
*(here->BJTcolPrimeBasePrimePtr + 1) += (-xcmu+xgm)
* (s->imag);
*(here->BJTcolPrimeEmitPrimePtr) += (-gm-go)
+ (-xgm) * (s->real);
*(here->BJTcolPrimeEmitPrimePtr + 1) += (-xgm) *
(s->imag);
*(here->BJTbasePrimeBasePtr) += (-gx);
*(here->BJTbasePrimeColPrimePtr) += (-gmu)
+ (-xcmu-xcmcb) * (s->real);
*(here->BJTbasePrimeColPrimePtr + 1) += (-xcmu-xcmcb)
* (s->imag);
*(here->BJTbasePrimeEmitPrimePtr) += (-gpi)
+ (-xcpi) * (s->real);
*(here->BJTbasePrimeEmitPrimePtr + 1) += (-xcpi)
* (s->imag);
*(here->BJTemitPrimeEmitPtr) += (-gepr);
*(here->BJTemitPrimeColPrimePtr) += (-go)
+ (xcmcb) * (s->real);
*(here->BJTemitPrimeColPrimePtr + 1) += (xcmcb)
* (s->imag);
*(here->BJTemitPrimeBasePrimePtr) += (-gpi-gm)
+ (-xcpi-xgm-xcmcb) * (s->real);
*(here->BJTemitPrimeBasePrimePtr + 1) += (-xcpi-xgm-xcmcb)
* (s->imag);
*(here->BJTsubstSubstPtr) += (xccs) * (s->real);
*(here->BJTsubstSubstPtr + 1) += (xccs) * (s->imag);
*(here->BJTcolPrimeSubstPtr) += (-xccs) * (s->real);
*(here->BJTcolPrimeSubstPtr + 1) += (-xccs) * (s->imag);
*(here->BJTsubstColPrimePtr) += (-xccs) * (s->real);
*(here->BJTsubstColPrimePtr + 1) += (-xccs) * (s->imag);
*(here->BJTbaseColPrimePtr) += (-xcbx) * (s->real);
*(here->BJTbaseColPrimePtr + 1) += (-xcbx) * (s->imag);
*(here->BJTcolPrimeBasePtr) += (-xcbx) * (s->real);
*(here->BJTcolPrimeBasePtr + 1) += (-xcbx) * (s->imag);
*(here->BJTcolColPtr) += m * (gcpr);
*(here->BJTbaseBasePtr) += m * ((gx) + (xcbx) * (s->real));
*(here->BJTbaseBasePtr + 1) += m * ((xcbx) * (s->imag));
*(here->BJTemitEmitPtr) += m * (gepr);
*(here->BJTcolPrimeColPrimePtr) += m * ((gmu+go+gcpr)
+ (xcmu+xccs+xcbx) * (s->real));
*(here->BJTcolPrimeColPrimePtr + 1) += m * ((xcmu+xccs+xcbx)
* (s->imag));
*(here->BJTbasePrimeBasePrimePtr) += m * ((gx+gpi+gmu)
+ (xcpi+xcmu+xcmcb) * (s->real));
*(here->BJTbasePrimeBasePrimePtr + 1) += m * ((xcpi+xcmu+xcmcb)
* (s->imag));
*(here->BJTemitPrimeEmitPrimePtr) += m * ((gpi+gepr+gm+go)
+ (xcpi+xgm) * (s->real));
*(here->BJTemitPrimeEmitPrimePtr + 1) += m * ((xcpi+xgm)
* (s->imag));
*(here->BJTcolColPrimePtr) += m * (-gcpr);
*(here->BJTbaseBasePrimePtr) += m * (-gx);
*(here->BJTemitEmitPrimePtr) += m * (-gepr);
*(here->BJTcolPrimeColPtr) += m * (-gcpr);
*(here->BJTcolPrimeBasePrimePtr) += m * ((-gmu+gm)
+ (-xcmu+xgm) * (s->real));
*(here->BJTcolPrimeBasePrimePtr + 1) += m * ((-xcmu+xgm)
* (s->imag));
*(here->BJTcolPrimeEmitPrimePtr) += m * ((-gm-go)
+ (-xgm) * (s->real));
*(here->BJTcolPrimeEmitPrimePtr + 1) += m * ((-xgm) *
(s->imag));
*(here->BJTbasePrimeBasePtr) += m * (-gx);
*(here->BJTbasePrimeColPrimePtr) += m * ((-gmu)
+ (-xcmu-xcmcb) * (s->real));
*(here->BJTbasePrimeColPrimePtr + 1) += m * ((-xcmu-xcmcb)
* (s->imag));
*(here->BJTbasePrimeEmitPrimePtr) += m * ((-gpi)
+ (-xcpi) * (s->real));
*(here->BJTbasePrimeEmitPrimePtr + 1) += m * ((-xcpi)
* (s->imag));
*(here->BJTemitPrimeEmitPtr) += m * (-gepr);
*(here->BJTemitPrimeColPrimePtr) += m * ((-go)
+ (xcmcb) * (s->real));
*(here->BJTemitPrimeColPrimePtr + 1) += m * ((xcmcb)
* (s->imag));
*(here->BJTemitPrimeBasePrimePtr) += m * ((-gpi-gm)
+ (-xcpi-xgm-xcmcb) * (s->real));
*(here->BJTemitPrimeBasePrimePtr + 1) += m * ((-xcpi-xgm-xcmcb)
* (s->imag));
*(here->BJTsubstSubstPtr) += m * ((xccs) * (s->real));
*(here->BJTsubstSubstPtr + 1) += m * ((xccs) * (s->imag));
*(here->BJTcolPrimeSubstPtr) += m * ((-xccs) * (s->real));
*(here->BJTcolPrimeSubstPtr + 1) += m * ((-xccs) * (s->imag));
*(here->BJTsubstColPrimePtr) += m * ((-xccs) * (s->real));
*(here->BJTsubstColPrimePtr + 1) += m * ((-xccs) * (s->imag));
*(here->BJTbaseColPrimePtr) += m * ((-xcbx) * (s->real));
*(here->BJTbaseColPrimePtr + 1) += m * ((-xcbx) * (s->imag));
*(here->BJTcolPrimeBasePtr) += m * ((-xcbx) * (s->real));
*(here->BJTcolPrimeBasePtr + 1) += m * ((-xcbx) * (s->imag));
}
}
return(OK);

View File

@ -1,6 +1,8 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
This function is obsolete (was used by an old sensitivity analysis)
**********/
/* actually load the current ac sensitivity
@ -8,7 +10,6 @@ Author: 1985 Thomas L. Quarles
*/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "smpdefs.h"
#include "bjtdefs.h"
@ -19,10 +20,7 @@ Author: 1985 Thomas L. Quarles
int
BJTsAcLoad(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
BJTsAcLoad(GENmodel *inModel, CKTcircuit *ckt)
{
BJTmodel *model = (BJTmodel*)inModel;

View File

@ -12,7 +12,6 @@ Modified: 2000 AlansFixes
*/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "smpdefs.h"
#include "bjtdefs.h"
@ -22,15 +21,10 @@ Modified: 2000 AlansFixes
#include "suffix.h"
int
BJTsetup(matrix,inModel,ckt,states)
SMPmatrix *matrix;
GENmodel *inModel;
CKTcircuit *ckt;
int *states;
/* load the BJT structure with those pointers needed later
* for fast matrix loading
*/
BJTsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
/* load the BJT structure with those pointers needed later
* for fast matrix loading
*/
{
BJTmodel *model = (BJTmodel*)inModel;
BJTinstance *here;
@ -158,6 +152,11 @@ BJTsetup(matrix,inModel,ckt,states)
if(!here->BJTareaGiven) {
here->BJTarea = 1;
}
if(!here->BJTmGiven) {
here->BJTm = 1.0;
}
here->BJTstate = *states;
*states += BJTnumStates;
if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN) ){

View File

@ -1,6 +1,8 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
This function is obsolete (was used by an old sensitivity analysis)
**********/
/* actually load the current sensitivity
@ -8,7 +10,6 @@ Author: 1985 Thomas L. Quarles
*/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "smpdefs.h"
#include "bjtdefs.h"
@ -19,9 +20,7 @@ Author: 1985 Thomas L. Quarles
int
BJTsLoad(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
BJTsLoad(GENmodel *inModel, CKTcircuit *ckt)
{
BJTmodel *model = (BJTmodel*)inModel;
BJTinstance *here;

View File

@ -1,6 +1,8 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
This function is obsolete (was used by an old sensitivity analysis)
**********/
/* Pretty print the sensitivity info for all
@ -8,7 +10,6 @@ Author: 1985 Thomas L. Quarles
*/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "smpdefs.h"
#include "bjtdefs.h"
@ -19,10 +20,7 @@ Author: 1985 Thomas L. Quarles
void
BJTsPrint(inModel,ckt)
CKTcircuit *ckt;
GENmodel *inModel;
BJTsPrint(GENmodel *inModel, CKTcircuit *ckt)
{
BJTmodel *model = (BJTmodel*)inModel;
BJTinstance *here;

View File

@ -1,6 +1,8 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
This function is obsolete (was used by an old sensitivity analysis)
**********/
/* loop through all the devices and
@ -8,7 +10,6 @@ Author: 1985 Thomas L. Quarles
*/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "smpdefs.h"
#include "bjtdefs.h"
@ -19,9 +20,7 @@ Author: 1985 Thomas L. Quarles
int
BJTsSetup(info,inModel)
SENstruct *info;
GENmodel *inModel;
BJTsSetup(SENstruct *info, GENmodel *inModel)
{
BJTmodel *model = (BJTmodel*)inModel;
BJTinstance *here;

View File

@ -1,12 +1,13 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
This function is obsolete (was used by an old sensitivity analysis)
**********/
/* update the charge sensitivities and their derivatives */
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "smpdefs.h"
#include "bjtdefs.h"
@ -17,9 +18,7 @@ Author: 1985 Thomas L. Quarles
int
BJTsUpdate(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
BJTsUpdate(GENmodel *inModel, CKTcircuit *ckt)
{
BJTmodel *model = (BJTmodel*)inModel;
BJTinstance *here;

View File

@ -5,7 +5,6 @@ Modified: 2000 AlansFixes
**********/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "smpdefs.h"
#include "bjtdefs.h"
@ -17,11 +16,9 @@ Modified: 2000 AlansFixes
/* ARGSUSED */
int
BJTtemp(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
/* Pre-compute many useful parameters
*/
*/
{
BJTmodel *model = (BJTmodel *)inModel;
@ -135,7 +132,7 @@ BJTtemp(inModel,ckt)
here=here->BJTnextInstance) {
if (here->BJTowner != ARCHme) continue;
if(!here->BJTtempGiven) here->BJTtemp = ckt->CKTtemp;
if(!here->BJTtempGiven) here->BJTtemp = ckt->CKTtemp + here->BJTdtemp;
vt = here->BJTtemp * CONSTKoverQ;
fact2 = here->BJTtemp/REFTEMP;
egfet = 1.16-(7.02e-4*here->BJTtemp*here->BJTtemp)/

View File

@ -11,7 +11,6 @@ Author: 1985 Thomas L. Quarles
*/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "bjtdefs.h"
#include "sperror.h"
@ -19,10 +18,7 @@ Author: 1985 Thomas L. Quarles
int
BJTtrunc(inModel,ckt,timeStep)
GENmodel *inModel;
CKTcircuit *ckt;
double *timeStep;
BJTtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep)
{
BJTmodel *model = (BJTmodel*)inModel;