📄 bjt2load.c
字号:
/**********Copyright 1990 Regents of the University of California. All rights reserved.Author: 1985 Thomas L. QuarlesModified: Alan Gillespie**********//* * This is the function called each iteration to evaluate the * BJT2s in the circuit and load them into the matrix as appropriate */#include "ngspice.h"#include "cktdefs.h"#include "bjt2defs.h"#include "const.h"#include "trandefs.h"#include "sperror.h"#include "devdefs.h"#include "suffix.h"intBJT2load(GENmodel *inModel, CKTcircuit *ckt) /* actually load the current resistance value into the * sparse matrix previously provided */{ BJT2model *model = (BJT2model*)inModel; BJT2instance *here; double arg1; double arg2; double arg3; double arg; double argtf; double c2; double c4; double capbc; double capbe; double capbx=0; double capsub=0; double cb; double cbc; double cbcn; double cbe; double cben; double cbhat; double cc; double cchat; double cdis; double ceq; double ceqbc; double ceqbe; double ceqbx; double geqsub; double ceqsub; double cex; double csat; double csubsat; double ctot; double czbc; double czbcf2; double czbe; double czbef2; double czbx; double czbxf2; double czsub; double delvbc; double delvbe; double denom; double dqbdvc; double dqbdve; double evbc; double evbcn; double evbe; double evben; double f1; double f2; double f3; double fcpc; double fcpe; double gbc; double gbcn; double gbe; double gben; double gcsub; double gcpr; double gepr; double geq; double geqbx; double geqcb; double gex; double gm; double gmu; double go; double gpi; double gx; double oik; double oikr; double ovtf; double pc; double pe; double ps; double q1; double q2; double qb; double rbpi; double rbpr; double sarg; double sqarg; double td; double temp; double tf; double tr; double vbc; double vbe; double vbx = 0.0; double vce; double vsub = 0.0; double vt; double vtc; double vte; double vtn; double xfact; double xjrb; double xjtf; double xmc; double xme; double xms; double xtf; double evsub; double gdsub; double cdsub; int icheck; int ichk1; int error; int SenCond=0; double m; /* loop through all the models */ for( ; model != NULL; model = model->BJT2nextModel ) { /* loop through all the instances of the model */ for (here = model->BJT2instances; here != NULL ; here=here->BJT2nextInstance) { if (here->BJT2owner != ARCHme) continue; vt = here->BJT2temp * CONSTKoverQ; if(ckt->CKTsenInfo){#ifdef SENSDEBUG printf("BJT2load \n");#endif /* SENSDEBUG */ if((ckt->CKTsenInfo->SENstatus == PERTURBATION)&& (here->BJT2senPertFlag == OFF)) continue; SenCond = here->BJT2senPertFlag; } gcsub=0; ceqsub=0; geqbx=0; ceqbx=0; geqcb=0; /* * dc model paramters */ csat=here->BJT2tSatCur*here->BJT2area; csubsat=here->BJT2tSubSatCur*here->BJT2area; rbpr=here->BJT2tMinBaseResist/here->BJT2area; rbpi=here->BJT2tBaseResist/here->BJT2area-rbpr; gcpr=here->BJT2tCollectorConduct*here->BJT2area; gepr=here->BJT2tEmitterConduct*here->BJT2area; oik=model->BJT2invRollOffF/here->BJT2area; c2=here->BJT2tBEleakCur*here->BJT2area; vte=model->BJT2leakBEemissionCoeff*vt; oikr=model->BJT2invRollOffR/here->BJT2area; if (model->BJT2subs == VERTICAL) c4=here->BJT2tBCleakCur * here->BJT2areab; else c4=here->BJT2tBCleakCur * here->BJT2areac; vtc=model->BJT2leakBCemissionCoeff*vt; td=model->BJT2excessPhaseFactor; xjrb=model->BJT2baseCurrentHalfResist*here->BJT2area; if(SenCond){#ifdef SENSDEBUG printf("BJT2senPertFlag = ON \n");#endif /* SENSDEBUG */ if((ckt->CKTsenInfo->SENmode == TRANSEN)&& (ckt->CKTmode & MODEINITTRAN)) { vbe = *(ckt->CKTstate1 + here->BJT2vbe); vbc = *(ckt->CKTstate1 + here->BJT2vbc); vbx=model->BJT2type*( *(ckt->CKTrhsOp+here->BJT2baseNode)- *(ckt->CKTrhsOp+here->BJT2colPrimeNode)); vsub=model->BJT2type*model->BJT2subs*( *(ckt->CKTrhsOp+here->BJT2substNode)- *(ckt->CKTrhsOp+here->BJT2substConNode)); } else{ vbe = *(ckt->CKTstate0 + here->BJT2vbe); vbc = *(ckt->CKTstate0 + here->BJT2vbc); if((ckt->CKTsenInfo->SENmode == DCSEN)|| (ckt->CKTsenInfo->SENmode == TRANSEN)){ vbx=model->BJT2type*( *(ckt->CKTrhsOld+here->BJT2baseNode)- *(ckt->CKTrhsOld+here->BJT2colPrimeNode)); vsub=model->BJT2type*model->BJT2subs*( *(ckt->CKTrhsOld+here->BJT2substNode)- *(ckt->CKTrhsOld+here->BJT2substConNode)); } if(ckt->CKTsenInfo->SENmode == ACSEN){ vbx=model->BJT2type*( *(ckt->CKTrhsOp+here->BJT2baseNode)- *(ckt->CKTrhsOp+here->BJT2colPrimeNode)); vsub=model->BJT2type*model->BJT2subs*( *(ckt->CKTrhsOp+here->BJT2substNode)- *(ckt->CKTrhsOp+here->BJT2substConNode)); } } goto next1; } /* * initialization */ icheck=1; if(ckt->CKTmode & MODEINITSMSIG) { vbe= *(ckt->CKTstate0 + here->BJT2vbe); vbc= *(ckt->CKTstate0 + here->BJT2vbc); vbx=model->BJT2type*( *(ckt->CKTrhsOld+here->BJT2baseNode)- *(ckt->CKTrhsOld+here->BJT2colPrimeNode)); vsub=model->BJT2type*model->BJT2subs*( *(ckt->CKTrhsOld+here->BJT2substNode)- *(ckt->CKTrhsOld+here->BJT2substConNode)); } else if(ckt->CKTmode & MODEINITTRAN) { vbe = *(ckt->CKTstate1 + here->BJT2vbe); vbc = *(ckt->CKTstate1 + here->BJT2vbc); vbx=model->BJT2type*( *(ckt->CKTrhsOld+here->BJT2baseNode)- *(ckt->CKTrhsOld+here->BJT2colPrimeNode)); vsub=model->BJT2type*model->BJT2subs*( *(ckt->CKTrhsOld+here->BJT2substNode)- *(ckt->CKTrhsOld+here->BJT2substConNode)); if( (ckt->CKTmode & MODETRAN) && (ckt->CKTmode & MODEUIC) ) { vbx=model->BJT2type*(here->BJT2icVBE-here->BJT2icVCE); vsub=0; } } else if((ckt->CKTmode & MODEINITJCT) && (ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)){ vbe=model->BJT2type*here->BJT2icVBE; vce=model->BJT2type*here->BJT2icVCE; vbc=vbe-vce; vbx=vbc; vsub=0; } else if((ckt->CKTmode & MODEINITJCT) && (here->BJT2off==0)) { vbe=here->BJT2tVcrit; vbc=0; /* ERROR: need to initialize VCS, VBX here */ vsub=vbx=0; } else if((ckt->CKTmode & MODEINITJCT) || ( (ckt->CKTmode & MODEINITFIX) && (here->BJT2off!=0))) { vbe=0; vbc=0; /* ERROR: need to initialize VCS, VBX here */ vsub=vbx=0; } else {#ifndef PREDICTOR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -