📄 vbicload.c
字号:
/**********Copyright 1990 Regents of the University of California. All rights reserved.Author: 1985 Thomas L. QuarlesModel Author: 1995 Colin McAndrew MotorolaSpice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH**********//* * This is the function called each iteration to evaluate the * VBICs in the circuit and load them into the matrix as appropriate */#include "ngspice.h"#include "cktdefs.h"#include "vbicdefs.h"#include "const.h"#include "trandefs.h"#include "sperror.h"#include "devdefs.h"#include "suffix.h"intVBICload(GENmodel *inModel, CKTcircuit *ckt) /* actually load the current resistance value into the * sparse matrix previously provided */{ VBICmodel *model = (VBICmodel*)inModel; VBICinstance *here; double p[108] ,Vbei,Vbex,Vbci,Vbep,Vbcp,Vrcx ,Vbcx,Vrci,Vrbx,Vrbi,Vre,Vrbp,Vrs ,Vbe,Vbc,Ibe,Ibe_Vbei,Ibex,Ibex_Vbex,Itzf ,Itzf_Vbei,Itzf_Vbci,Itzr,Itzr_Vbci,Itzr_Vbei,Ibc,Ibc_Vbci ,Ibc_Vbei,Ibep,Ibep_Vbep,Ircx,Ircx_Vrcx,Irci,Irci_Vrci ,Irci_Vbci,Irci_Vbcx,Irbx,Irbx_Vrbx,Irbi,Irbi_Vrbi,Irbi_Vbei ,Irbi_Vbci,Ire,Ire_Vre,Irbp,Irbp_Vrbp,Irbp_Vbep,Irbp_Vbci ,Qbe,Qbe_Vbei,Qbe_Vbci,Qbex,Qbex_Vbex,Qbc,Qbc_Vbci ,Qbcx,Qbcx_Vbcx,Qbep,Qbep_Vbep,Qbep_Vbci,Qbeo,Qbeo_Vbe ,Qbco,Qbco_Vbc,Ibcp,Ibcp_Vbcp,Iccp,Iccp_Vbep,Iccp_Vbci ,Iccp_Vbcp,Irs,Irs_Vrs,Qbcp,Qbcp_Vbcp,SCALE; int iret; int vbic_4T_it_cf_fj(double * ,double *,double *,double *,double *,double *,double * ,double *,double *,double *,double *,double *,double *, double * ,double *,double *,double *,double *,double *,double *, double * ,double *,double *,double *,double *,double *,double *, double * ,double *,double *,double *,double *,double *,double *, double * ,double *,double *,double *,double *,double *,double *, double * ,double *,double *,double *,double *,double *,double *, double * ,double *,double *,double *,double *,double *,double *, double * ,double *,double *,double *,double *,double *,double *, double * ,double *,double *,double *,double *,double *,double *, double * ,double *,double *,double *,double *,double *,double *); double vce, xfact; double vt; double delvbei; double delvbex; double delvbci; double delvbcx; double delvbep; double delvrci; double delvrbi; double delvrbp; double delvbcp; double ibehat; double ibexhat; double itzfhat; double itzrhat; double ibchat; double ibephat; double ircihat; double irbihat; double irbphat; double ibcphat; double iccphat; double ceq, geq, rhs_current; int icheck; int ichk1, ichk2, ichk3, ichk4, ichk5; int error; int SenCond=0; double gqbeo, cqbeo, gqbco, cqbco, gbcx, cbcx; /* loop through all the models */ for( ; model != NULL; model = model->VBICnextModel ) { /* loop through all the instances of the model */ for (here = model->VBICinstances; here != NULL ; here=here->VBICnextInstance) { if (here->VBICowner != ARCHme) continue; vt = here->VBICtemp * CONSTKoverQ; if(ckt->CKTsenInfo){#ifdef SENSDEBUG printf("VBICload\n");#endif /* SENSDEBUG */ if((ckt->CKTsenInfo->SENstatus == PERTURBATION)&& (here->VBICsenPertFlag == OFF)) continue; SenCond = here->VBICsenPertFlag; } gbcx = 0.0; cbcx = 0.0; gqbeo = 0.0; cqbeo = 0.0; gqbco = 0.0; cqbco = 0.0; /* * dc model paramters */ p[0] = here->VBICttnom; p[1] = here->VBICtextCollResist; p[2] = here->VBICtintCollResist; p[3] = here->VBICtepiSatVoltage; p[4] = here->VBICtepiDoping; p[5] = model->VBIChighCurFac; p[6] = here->VBICtextBaseResist; p[7] = here->VBICtintBaseResist; p[8] = here->VBICtemitterResist; p[9] = here->VBICtsubstrateResist; p[10] = here->VBICtparBaseResist; p[11] = here->VBICtsatCur; p[12] = here->VBICtemissionCoeffF; p[13] = here->VBICtemissionCoeffR; p[14] = model->VBICdeplCapLimitF; p[15] = model->VBICextOverlapCapBE; p[16] = here->VBICtdepletionCapBE; p[17] = here->VBICtpotentialBE; p[18] = model->VBICjunctionExpBE; p[19] = model->VBICsmoothCapBE; p[20] = model->VBICextOverlapCapBC; p[21] = here->VBICtdepletionCapBC; p[22] = model->VBICepiCharge; p[23] = here->VBICtextCapBC; p[24] = here->VBICtpotentialBC; p[25] = model->VBICjunctionExpBC; p[26] = model->VBICsmoothCapBC; p[27] = here->VBICtextCapSC; p[28] = here->VBICtpotentialSC; p[29] = model->VBICjunctionExpSC; p[30] = model->VBICsmoothCapSC; p[31] = here->VBICtidealSatCurBE; p[32] = model->VBICportionIBEI; p[33] = model->VBICidealEmissCoeffBE; p[34] = here->VBICtnidealSatCurBE; p[35] = model->VBICnidealEmissCoeffBE; p[36] = here->VBICtidealSatCurBC; p[37] = model->VBICidealEmissCoeffBC; p[38] = here->VBICtnidealSatCurBC; p[39] = model->VBICnidealEmissCoeffBC; p[40] = model->VBICavalanchePar1BC; p[41] = here->VBICtavalanchePar2BC; p[42] = here->VBICtparasitSatCur; p[43] = model->VBICportionICCP; p[44] = model->VBICparasitFwdEmissCoeff; p[45] = here->VBICtidealParasitSatCurBE; p[46] = here->VBICtnidealParasitSatCurBE; p[47] = here->VBICtidealParasitSatCurBC; p[48] = model->VBICidealParasitEmissCoeffBC; p[49] = here->VBICtnidealParasitSatCurBC; p[50] = model->VBICnidealParasitEmissCoeffBC; p[51] = model->VBICearlyVoltF; p[52] = model->VBICearlyVoltR; p[53] = here->VBICtrollOffF; p[54] = model->VBICrollOffR; p[55] = model->VBICparRollOff; p[56] = model->VBICtransitTimeF; p[57] = model->VBICvarTransitTimeF; p[58] = model->VBICtransitTimeBiasCoeffF; p[59] = model->VBICtransitTimeFVBC; p[60] = model->VBICtransitTimeHighCurrentF; p[61] = model->VBICtransitTimeR; p[62] = model->VBICdelayTimeF; p[63] = model->VBICfNcoef; p[64] = model->VBICfNexpA; p[65] = model->VBICfNexpB; p[66] = model->VBICtempExpRE; p[67] = model->VBICtempExpRBI; p[68] = model->VBICtempExpRCI; p[69] = model->VBICtempExpRS; p[70] = model->VBICtempExpVO; p[71] = model->VBICactivEnergyEA; p[72] = model->VBICactivEnergyEAIE; p[73] = model->VBICactivEnergyEAIC; p[74] = model->VBICactivEnergyEAIS; p[75] = model->VBICactivEnergyEANE; p[76] = model->VBICactivEnergyEANC; p[77] = model->VBICactivEnergyEANS; p[78] = model->VBICtempExpIS; p[79] = model->VBICtempExpII; p[80] = model->VBICtempExpIN; p[81] = model->VBICtempExpNF; p[82] = model->VBICtempExpAVC; p[83] = model->VBICthermalResist; p[84] = model->VBICthermalCapacitance; p[85] = model->VBICpunchThroughVoltageBC; p[86] = model->VBICdeplCapCoeff1; p[87] = model->VBICfixedCapacitanceCS; p[88] = model->VBICsgpQBselector; p[89] = model->VBIChighCurrentBetaRolloff; p[90] = model->VBICtempExpIKF; p[91] = model->VBICtempExpRCX; p[92] = model->VBICtempExpRBX; p[93] = model->VBICtempExpRBP; p[94] = here->VBICtsepISRR; p[95] = model->VBICtempExpXISR; p[96] = model->VBICdear; p[97] = model->VBICeap; p[98] = here->VBICtvbbe; p[99] = here->VBICtnbbe; p[100] = model->VBICibbe; p[101] = model->VBICtvbbe1; p[102] = model->VBICtvbbe2; p[103] = model->VBICtnbbe; p[104] = model->VBICebbe; p[105] = model->VBIClocTempDiff; p[106] = model->VBICrevVersion; p[107] = model->VBICrefVersion; SCALE = here->VBICarea * here->VBICm; if(SenCond){#ifdef SENSDEBUG printf("VBICsenPertFlag = ON \n");#endif /* SENSDEBUG */ if((ckt->CKTsenInfo->SENmode == TRANSEN)&& (ckt->CKTmode & MODEINITTRAN)) { Vbe = model->VBICtype*( *(ckt->CKTrhsOp+here->VBICbaseNode)- *(ckt->CKTrhsOp+here->VBICemitNode)); Vbc = model->VBICtype*( *(ckt->CKTrhsOp+here->VBICbaseNode)- *(ckt->CKTrhsOp+here->VBICcollNode)); Vbei = *(ckt->CKTstate1 + here->VBICvbei); Vbex = *(ckt->CKTstate1 + here->VBICvbex); Vbci = *(ckt->CKTstate1 + here->VBICvbci); Vbcx = *(ckt->CKTstate1 + here->VBICvbcx); Vbep = *(ckt->CKTstate1 + here->VBICvbep); Vrci = *(ckt->CKTstate1 + here->VBICvrci); Vrbi = *(ckt->CKTstate1 + here->VBICvrbi); Vrbp = *(ckt->CKTstate1 + here->VBICvrbp); Vrcx = model->VBICtype*( *(ckt->CKTrhsOp+here->VBICcollNode)- *(ckt->CKTrhsOp+here->VBICcollCXNode)); Vrbx = model->VBICtype*( *(ckt->CKTrhsOp+here->VBICbaseNode)- *(ckt->CKTrhsOp+here->VBICbaseBXNode)); Vre = model->VBICtype*(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -