📄 bjt2sacl.c
字号:
/**********Copyright 1990 Regents of the University of California. All rights reserved.Author: 1985 Thomas L. QuarlesModified: Alan GillespieThis function is obsolete (was used by an old sensitivity analysis)**********//* actually load the current ac sensitivity * information into the array previously provided */#include "ngspice.h"#include "cktdefs.h"#include "smpdefs.h"#include "bjt2defs.h"#include "const.h"#include "sperror.h"#include "ifsim.h"#include "suffix.h"intBJT2sAcLoad(GENmodel *inModel, CKTcircuit *ckt){ BJT2model *model = (BJT2model*)inModel; BJT2instance *here; double SaveState[25]; int error; int flag; double vbeOp; double vbcOp; double A0; double DELA = 0.0; double Apert; double DELAinv; double vte = 0.0; double gcpr; double gepr; double gpi; double gmu; double go; double xgm; double td; double arg; double gm; double gx; double xcpi; double xcmu; double xcbx; double xccs; double xcmcb; double cx,icx; double cbx,icbx; double ccs,iccs; double cbc,icbc; double cbe,icbe; double cce,icce; double cb,icb; double cbprm,icbprm; double cc,icc; double ccprm,iccprm; double ce,ice; double ceprm,iceprm; double cs,ics; double vcpr,ivcpr; double vepr,ivepr; double vx,ivx; double vbx,ivbx; double vcs,ivcs; double vbc,ivbc; double vbe,ivbe; double vce,ivce; double cb0,icb0; double cbprm0,icbprm0; double cc0,icc0; double ccprm0,iccprm0; double ce0,ice0; double ceprm0,iceprm0; double cs0,ics0; double DvDp = 0.0; int iparmno,i; SENstruct *info;#ifdef SENSDEBUG printf("BJT2senacload \n"); printf("BJT2senacload \n");#endif /* SENSDEBUG */ info = ckt->CKTsenInfo; info->SENstatus = PERTURBATION; /* 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) { /* save the unperturbed values in the state vector */ for(i=0; i <= 20; i++) { *(SaveState + i) = *(ckt->CKTstate0 + here->BJT2state + i); } vcpr = *(ckt->CKTrhsOld + here->BJT2colNode) - *(ckt->CKTrhsOld + here->BJT2colPrimeNode) ; ivcpr = *(ckt->CKTirhsOld + here->BJT2colNode) - *(ckt->CKTirhsOld + here->BJT2colPrimeNode) ; vepr = *(ckt->CKTrhsOld + here->BJT2emitNode) - *(ckt->CKTrhsOld + here->BJT2emitPrimeNode) ; ivepr = *(ckt->CKTirhsOld + here->BJT2emitNode) - *(ckt->CKTirhsOld + here->BJT2emitPrimeNode) ; vx = *(ckt->CKTrhsOld + here->BJT2baseNode) - *(ckt->CKTrhsOld + here->BJT2basePrimeNode) ;/* vb_bprm */ ivx = *(ckt->CKTirhsOld + here->BJT2baseNode) - *(ckt->CKTirhsOld + here->BJT2basePrimeNode) ;/* ivb_bprm */ vcs = *(ckt->CKTrhsOld + here->BJT2colPrimeNode) - *(ckt->CKTrhsOld + here->BJT2substNode) ; ivcs = *(ckt->CKTirhsOld + here->BJT2colPrimeNode) - *(ckt->CKTirhsOld + here->BJT2substNode) ; vbc = *(ckt->CKTrhsOld + here->BJT2basePrimeNode) - *(ckt->CKTrhsOld + here->BJT2colPrimeNode) ;/* vbprm_cprm */ ivbc = *(ckt->CKTirhsOld + here->BJT2basePrimeNode) - *(ckt->CKTirhsOld + here->BJT2colPrimeNode) ;/* ivbprm_cprm */ vbe = *(ckt->CKTrhsOld + here->BJT2basePrimeNode) - *(ckt->CKTrhsOld + here->BJT2emitPrimeNode) ;/* vbprm_eprm */ ivbe = *(ckt->CKTirhsOld + here->BJT2basePrimeNode) - *(ckt->CKTirhsOld + here->BJT2emitPrimeNode) ;/* ivbprm_eprm */ vce = vbe - vbc ; ivce = ivbe - ivbc ; vbx = vx + vbc ; ivbx = ivx + ivbc ; vbeOp =model->BJT2type * ( *(ckt->CKTrhsOp + here->BJT2basePrimeNode) - *(ckt->CKTrhsOp + here->BJT2emitPrimeNode)); vbcOp =model->BJT2type * ( *(ckt->CKTrhsOp + here->BJT2basePrimeNode) - *(ckt->CKTrhsOp + here->BJT2colPrimeNode));#ifdef SENSDEBUG printf("\n without perturbation\n");#endif /* SENSDEBUG */ /* without perturbation */ A0 = here->BJT2area; here->BJT2senPertFlag = ON; *(ckt->CKTstate0 + here->BJT2vbe) = vbeOp; *(ckt->CKTstate0 + here->BJT2vbc) = vbcOp; /* info->SENacpertflag == 1 only for first frequency */ if(info->SENacpertflag == 1){ /* store the unperturbed values of small signal parameters */ if ((error = BJT2load((GENmodel*)model,ckt))) return(error); *(here->BJT2senGpi)= *(ckt->CKTstate0 + here->BJT2gpi); *(here->BJT2senGmu)= *(ckt->CKTstate0 + here->BJT2gmu); *(here->BJT2senGm)= *(ckt->CKTstate0 + here->BJT2gm); *(here->BJT2senGo)= *(ckt->CKTstate0 + here->BJT2go); *(here->BJT2senGx)= *(ckt->CKTstate0 + here->BJT2gx); *(here->BJT2senCpi)= *(ckt->CKTstate0 + here->BJT2cqbe); *(here->BJT2senCmu)= *(ckt->CKTstate0 + here->BJT2cqbc); *(here->BJT2senCbx)= *(ckt->CKTstate0 + here->BJT2cqbx); *(here->BJT2senCsub)= *(ckt->CKTstate0 + here->BJT2cqsub); *(here->BJT2senCmcb)= *(ckt->CKTstate0 + here->BJT2cexbc); } gcpr = here->BJT2tCollectorConduct * A0; gepr = here->BJT2tEmitterConduct * A0; gpi= *(here->BJT2senGpi); gmu= *(here->BJT2senGmu); gm= *(here->BJT2senGm); go= *(here->BJT2senGo); gx= *(here->BJT2senGx); xgm=0; td=model->BJT2excessPhase; if(td != 0) { arg = td*ckt->CKTomega; gm = gm+go; xgm = -gm * sin(arg); gm = gm * cos(arg)-go; } xcpi= *(here->BJT2senCpi) * ckt->CKTomega; xcmu= *(here->BJT2senCmu) * ckt->CKTomega; xcbx= *(here->BJT2senCbx) * ckt->CKTomega; xccs= *(here->BJT2senCsub) * ckt->CKTomega; xcmcb= *(here->BJT2senCmcb) * ckt->CKTomega; cx=gx * vx ; icx=gx * ivx; cbx=( -xcbx * ivbx) ; icbx= xcbx * vbx ; ccs=( -xccs * ivcs) ; iccs= xccs * vcs ; cbc=(gmu * vbc -xcmu * ivbc) ; icbc=xcmu * vbc + gmu * ivbc ; cbe=gpi * vbe -xcpi * ivbe - xcmcb * ivbc ; icbe=xcpi * vbe + gpi * ivbe + xcmcb * vbc; cce= go * vce + gm * vbe - xgm * ivbe; icce=go * ivce + gm * ivbe + xgm * vbe ; cc0=gcpr * vcpr ; icc0=gcpr * ivcpr ; ce0=gepr * vepr; ice0=gepr * ivepr ; cb0 = cx + cbx; icb0 = icx + icbx; if(here->BJT2baseNode != here->BJT2basePrimeNode){ cbprm0 = (- cx + cbe + cbc); icbprm0 = (- icx + icbe + icbc); } else{ cbprm0 = ( cbx + cbe + cbc); icbprm0 = (icbx + icbe + icbc); } ccprm0 = (- cbx - cc0 + ccs + cce - cbc); iccprm0 = (- icbx - icc0 + iccs + icce - icbc); ceprm0 = (- cbe - cce - ce0); iceprm0 = (- icbe - icce - ice0); cs0 = (- ccs) ; ics0 = (- iccs) ;#ifdef SENSDEBUG printf("gepr0 = %.7e , gcpr0 = %.7e , gmu0 = %.7e, gpi0 = %.7e\n", gepr,gcpr,gmu,gpi); printf("gm0 = %.7e , go0 = %.7e , gx0 = %.7e, xcpi0 = %.7e\n", gm,go,gx,xcpi); printf("xcmu0 = %.7e , xcbx0 = %.7e , xccs0 = %.7e, xcmcb0 = %.7e\n" ,xcmu,xcbx,xccs,xcmcb); printf("vepr = %.7e + j%.7e , vcpr = %.7e + j%.7e\n", vepr,ivepr,vcpr,ivcpr); printf("vbx = %.7e + j%.7e , vx = %.7e + j%.7e\n", vbx,ivbx,vx,ivx); printf("vbc = %.7e + j%.7e , vbe = %.7e + j%.7e\n", vbc,ivbc,vbe,ivbe); printf("vce = %.7e + j%.7e , vcs = %.7e + j%.7e\n", vce,ivce,vcs,ivcs); printf("cce0 = %.7e + j%.7e , cbe0 = %.7e + j%.7e\n", cce,icce,cbe,icbe); printf("cbc0 = %.7e + j%.7e\n", cbc,icbc); printf("cc0 = %.7e + j%.7e , ce0 = %.7e + j%.7e\n", cc0,icc0,ce0,ice0); printf("cb0 = %.7e + j%.7e , cs0 = %.7e + j%.7e\n", cb0,icb0,cs0,ics0); printf("cbprm0 = %.7e + j%.7e , ceprm0 = %.7e + j%.7e\n", cbprm0,icbprm0,ceprm0,iceprm0); printf("ccprm0 = %.7e + j%.7e \n", ccprm0,iccprm0); printf("\nPerturbation of Area\n");#endif /* SENSDEBUG */ /* Perturbation of Area */ if(here->BJT2senParmNo == 0){ flag = 0; goto next1; } DELA = info->SENpertfac * A0; Apert = A0 + DELA; DELAinv = 1.0/DELA; here->BJT2area = Apert; *(ckt->CKTstate0 + here->BJT2vbe) = vbeOp; *(ckt->CKTstate0 + here->BJT2vbc) = vbcOp; if(info->SENacpertflag == 1){ /* store the small signal parameters * corresponding to perturbed area */ if ((error = BJT2load((GENmodel*)model,ckt))) return(error); *(here->BJT2senGpi + 1)= *(ckt->CKTstate0 + here->BJT2gpi); *(here->BJT2senGmu + 1)= *(ckt->CKTstate0 + here->BJT2gmu); *(here->BJT2senGm + 1)= *(ckt->CKTstate0 + here->BJT2gm); *(here->BJT2senGo + 1)= *(ckt->CKTstate0 + here->BJT2go); *(here->BJT2senGx + 1)= *(ckt->CKTstate0 + here->BJT2gx); *(here->BJT2senCpi + 1)= *(ckt->CKTstate0 + here->BJT2cqbe); *(here->BJT2senCmu + 1)= *(ckt->CKTstate0 + here->BJT2cqbc); *(here->BJT2senCbx + 1)= *(ckt->CKTstate0 + here->BJT2cqbx); *(here->BJT2senCsub + 1)= *(ckt->CKTstate0 + here->BJT2cqsub); *(here->BJT2senCmcb + 1)= *(ckt->CKTstate0 + here->BJT2cexbc); } flag = 0; goto load;pertvbx: /* Perturbation of vbx */#ifdef SENSDEBUG printf("\nPerturbation of vbx\n");#endif /* SENSDEBUG */ here->BJT2area = A0; A0 = model->BJT2type * (*(ckt->CKTrhsOp + here->BJT2baseNode) - *(ckt->CKTrhsOp + here->BJT2colPrimeNode)); DELA = info->SENpertfac * A0 + 1e-8; Apert = A0 + DELA; DELAinv = model->BJT2type * 1.0/DELA; *(ckt->CKTrhsOp + here->BJT2baseNode) += DELA; *(ckt->CKTstate0 + here->BJT2vbe) = vbeOp; *(ckt->CKTstate0 + here->BJT2vbc) = vbcOp; if(info->SENacpertflag == 1){ /* store the small signal parameters * corresponding to perturbed vbx */ if((error = BJT2load((GENmodel*)model,ckt))) return(error); *(here->BJT2senGpi + 2)= *(ckt->CKTstate0 + here->BJT2gpi); *(here->BJT2senGmu + 2)= *(ckt->CKTstate0 + here->BJT2gmu); *(here->BJT2senGm + 2)= *(ckt->CKTstate0 + here->BJT2gm); *(here->BJT2senGo + 2)= *(ckt->CKTstate0 + here->BJT2go); *(here->BJT2senGx + 2)= *(ckt->CKTstate0 + here->BJT2gx); *(here->BJT2senCpi + 2)= *(ckt->CKTstate0 + here->BJT2cqbe); *(here->BJT2senCmu + 2)= *(ckt->CKTstate0 + here->BJT2cqbc); *(here->BJT2senCbx + 2)= *(ckt->CKTstate0 + here->BJT2cqbx); *(here->BJT2senCsub + 2)= *(ckt->CKTstate0 + here->BJT2cqsub); *(here->BJT2senCmcb + 2)= *(ckt->CKTstate0 + here->BJT2cexbc); } flag = 1; goto load;pertvbe: /* Perturbation of vbe */#ifdef SENSDEBUG printf("\nPerturbation of vbe\n");#endif /* SENSDEBUG */ if (*(here->BJT2senCbx) != 0){ *(ckt->CKTrhsOp + here ->BJT2baseNode) -= DELA; } vte=model->BJT2leakBEemissionCoeff*CONSTvt0; A0 = vbeOp; DELA = info->SENpertfac * vte ; Apert = A0 + DELA; DELAinv = 1.0/DELA; *(ckt->CKTstate0 + here->BJT2vbe) = Apert; *(ckt->CKTstate0 + here->BJT2vbc) = vbcOp; if(info->SENacpertflag == 1){ /* store the small signal parameters * corresponding to perturbed vbe */ if((error = BJT2load((GENmodel*)model,ckt))) return(error); *(here->BJT2senGpi + 3)= *(ckt->CKTstate0 + here->BJT2gpi); *(here->BJT2senGmu + 3)= *(ckt->CKTstate0 + here->BJT2gmu); *(here->BJT2senGm + 3)= *(ckt->CKTstate0 + here->BJT2gm); *(here->BJT2senGo + 3)= *(ckt->CKTstate0 + here->BJT2go);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -