⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bjt2sacl.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 2 页
字号:
/**********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 + -