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

📄 bjtsacl.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
📖 第 1 页 / 共 2 页
字号:
                *(here->BJTsenGo + 3)= *(ckt->CKTstate0 + here->BJTgo);                *(here->BJTsenGx + 3)= *(ckt->CKTstate0 + here->BJTgx);                *(here->BJTsenCpi + 3)= *(ckt->CKTstate0 + here->BJTcqbe);                *(here->BJTsenCmu + 3)= *(ckt->CKTstate0 + here->BJTcqbc);                *(here->BJTsenCbx + 3)= *(ckt->CKTstate0 + here->BJTcqbx);                *(here->BJTsenCcs + 3)= *(ckt->CKTstate0 + here->BJTcqcs);                *(here->BJTsenCmcb + 3)= *(ckt->CKTstate0 + here->BJTcexbc);            }            flag = 2;            goto load;pertvbc:    /* Perturbation of vbc */#ifdef SENSDEBUG            printf("\nPerturbation of vbc\n");#endif /* SENSDEBUG */            *(ckt->CKTstate0 + here->BJTvbe) = A0;            A0 = vbcOp;            DELA = info->SENpertfac * vte ;            Apert = A0 + DELA;            DELAinv = 1.0/DELA;            *(ckt->CKTstate0 + here->BJTvbc) = Apert;            *(ckt->CKTstate0 + here->BJTvbe) = vbeOp;            if(info->SENacpertflag == 1){                /* store the  small signal parameters                  * corresponding to perturbed vbc                  */                if(error = BJTload((GENmodel*)model,ckt)) return(error);                *(here->BJTsenGpi + 4)= *(ckt->CKTstate0 + here->BJTgpi);                *(here->BJTsenGmu + 4)= *(ckt->CKTstate0 + here->BJTgmu);                *(here->BJTsenGm + 4)= *(ckt->CKTstate0 + here->BJTgm);                *(here->BJTsenGo + 4)= *(ckt->CKTstate0 + here->BJTgo);                *(here->BJTsenGx + 4)= *(ckt->CKTstate0 + here->BJTgx);                *(here->BJTsenCpi + 4)= *(ckt->CKTstate0 + here->BJTcqbe);                *(here->BJTsenCmu + 4)= *(ckt->CKTstate0 + here->BJTcqbc);                *(here->BJTsenCbx + 4)= *(ckt->CKTstate0 + here->BJTcqbx);                *(here->BJTsenCcs + 4)= *(ckt->CKTstate0 + here->BJTcqcs);                *(here->BJTsenCmcb + 4)= *(ckt->CKTstate0 + here->BJTcexbc);            }            flag = 3;            goto load;pertvcs:    /* Perturbation of vcs */#ifdef SENSDEBUG            printf("\nPerturbation of vcs\n");#endif /* SENSDEBUG */            *(ckt->CKTstate0 + here->BJTvbc) = A0;            A0 = model->BJTtype * (*(ckt->CKTrhsOp + here->BJTsubstNode)                -  *(ckt->CKTrhsOp + here->BJTcolPrimeNode));            DELA = info->SENpertfac * A0 + 1e-8;             Apert = A0 + DELA;            DELAinv = model->BJTtype * 1.0/DELA;            *(ckt->CKTrhsOp + here->BJTsubstNode) += DELA;            *(ckt->CKTstate0 + here->BJTvbe) = vbeOp;            *(ckt->CKTstate0 + here->BJTvbc) = vbcOp;            if(info->SENacpertflag == 1){                /* store the  small signal parameters                  * corresponding to perturbed vcs                  */                if(error = BJTload((GENmodel*)model,ckt)) return(error);                *(here->BJTsenCcs + 5)= *(ckt->CKTstate0 + here->BJTcqcs);            }            flag = 4;            *(ckt->CKTrhsOp + here->BJTsubstNode) -= DELA;            xccs= *(here->BJTsenCcs + 5) * ckt->CKTomega;            ccs=( -xccs * ivcs) ;            iccs= xccs * vcs ;            cs = -ccs;            ics = -iccs;            ccprm = ccprm0 +  cs0 - cs;            iccprm = iccprm0 + ics0 - ics;            cbprm = cbprm0;            icbprm = icbprm0;            ceprm = ceprm0;            iceprm = iceprm0;            cc = cc0;            icc = icc0;            ce = ce0;            ice = ice0;            cb = cb0;            icb = icb0;            goto next2;load:            gcpr=model->BJTcollectorConduct * here->BJTarea;            gepr=model->BJTemitterConduct * here->BJTarea;            gpi= *(here->BJTsenGpi + flag+1);            gmu= *(here->BJTsenGmu + flag+1);            gm= *(here->BJTsenGm + flag+1);            go= *(here->BJTsenGo + flag+1);            gx= *(here->BJTsenGx + flag+1);            xgm=0;            td=model->BJTexcessPhase;            if(td != 0) {                arg = td*ckt->CKTomega;                gm = gm+go;                xgm = -gm * sin(arg);                gm = gm * cos(arg)-go;            }            xcpi= *(here->BJTsenCpi + flag+1) * ckt->CKTomega;            xcmu= *(here->BJTsenCmu + flag+1) * ckt->CKTomega;            xcbx= *(here->BJTsenCbx + flag+1) * ckt->CKTomega;            xccs= *(here->BJTsenCcs + flag+1) * ckt->CKTomega;            xcmcb= *(here->BJTsenCmcb + flag+1) * ckt->CKTomega;            cc=gcpr * vcpr ;            icc=gcpr * ivcpr ;            ce=gepr * vepr;            ice=gepr * ivepr ;            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 ;            cb= cx + cbx;            icb= icx + icbx;            if(here->BJTbaseNode != here->BJTbasePrimeNode){                cbprm=(- cx + cbe + cbc);                icbprm=(- icx + icbe + icbc);            }            else{                cbprm=( cbx + cbe + cbc);                icbprm=(icbx + icbe + icbc);            }            ccprm=(- cbx - cc + ccs + cce - cbc);            iccprm=(- icbx - icc + iccs + icce - icbc);            ceprm=(- cbe - cce - ce);            iceprm=(- icbe - icce - ice);            cs= (- ccs) ;            ics= (- iccs) ;#ifdef SENSDEBUG            printf("A0 = %.7e , Apert = %.7e , DELA = %.7e\n"                    ,A0,Apert,DELA);            printf("gepr = %.7e , gcpr = %.7e , gmu = %.7e, gpi = %.7e\n"                    ,gepr,gcpr,gmu,gpi);            printf("gm = %.7e , go = %.7e , gx = %.7e, xcpi = %.7e\n"                    ,gm,go,gx,xcpi);            printf("xcmu = %.7e , xcbx = %.7e , xccs = %.7e, xcmcb = %.7e\n"                    ,xcmu,xcbx,xccs,xcmcb);            printf("cx = %.7e + j%.7e , cbx = %.7e + j%.7e\n"                    ,cx,icx,cbx,icbx);            printf("ccs %.7e + j%.7e , cbc = %.7e + j%.7e"                    ,ccs,iccs,cbc,icbc);            printf("cbe %.7e + j%.7e , cce = %.7e + j%.7e\n"                    ,cbe,icbe,cce,icce);            printf("cc = %.7e + j%.7e , ce = %.7e + j%.7e,",                    ,cc,icc,ce,ice);            printf("ccprm = %.7e + j%.7e , ceprm = %.7e + j%.7e",                    ccprm,iccprm,ceprm,iceprm);            printf("cb = %.7e + j%.7e , cbprm = %.7e + j%.7e , ",                    cb,icb,cbprm,icbprm)            printf("cs = %.7e + j%.7e\n",                    cs,ics);#endif /* SENSDEBUG */            /* load the RHS matrix */next2:            for(iparmno = 1;iparmno<=info->SENparms;iparmno++){                if( (!flag) && (iparmno != here->BJTsenParmNo) ) continue;                switch(flag){                case 0:                     /* area : so no DC sensitivity term involved */                    DvDp = 1.0;                     break;                    /* calculate the DC sensitivities of operating points */                case 1:                     DvDp = model->BJTtype *                             (info->SEN_Sap[here->BJTbaseNode][iparmno]                            -  info->SEN_Sap[here->BJTcolPrimeNode][iparmno]);                    break;                case 2:                     DvDp = model->BJTtype *                             (info->SEN_Sap[here->BJTbasePrimeNode][iparmno]                            -  info->SEN_Sap[here->BJTemitPrimeNode][iparmno]);                    break;                case 3:                     DvDp = model->BJTtype *                             (info->SEN_Sap[here->BJTbasePrimeNode][iparmno]                            -  info->SEN_Sap[here->BJTcolPrimeNode][iparmno]);                    break;                case 4:                     DvDp = model->BJTtype *                             (info->SEN_Sap[here->BJTsubstNode][iparmno]                            -  info->SEN_Sap[here->BJTcolPrimeNode][iparmno]);                    break;                }#ifdef SENSDEBUG                printf("before loading\n");                  printf("BJTtype = %d\n",model->BJTtype);                  printf("DvDp = %.7e , flag = %d , iparmno = %d,senparmno = %d\n"                        ,DvDp,flag,iparmno,here->BJTsenParmNo);                printf("senb = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJTbaseNode] + iparmno),                        *(info->SEN_iRHS[here->BJTbaseNode] + iparmno));                printf("senbrm = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJTbasePrimeNode] + iparmno),                        *(info->SEN_iRHS[here->BJTbasePrimeNode] + iparmno));                printf("senc = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJTcolNode] + iparmno),                        *(info->SEN_iRHS[here->BJTcolNode] + iparmno));                printf("sencprm = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJTcolPrimeNode] + iparmno),                        *(info->SEN_iRHS[here->BJTcolPrimeNode] + iparmno));                printf("sene = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJTemitNode] + iparmno),                        *(info->SEN_iRHS[here->BJTemitNode] + iparmno));                printf("seneprm = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJTemitPrimeNode] + iparmno),                        *(info->SEN_iRHS[here->BJTemitPrimeNode] + iparmno));                printf("sens = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJTsubstNode] + iparmno),                        *(info->SEN_iRHS[here->BJTsubstNode] + iparmno));#endif /* SENSDEBUG */                if(here->BJTbaseNode != here->BJTbasePrimeNode){                    *(info->SEN_RHS[here->BJTbaseNode] + iparmno) -=                              ( cb  - cb0) * DELAinv * DvDp;                    *(info->SEN_iRHS[here->BJTbaseNode] + iparmno) -=                              ( icb  - icb0) * DELAinv * DvDp;                }                *(info->SEN_RHS[here->BJTbasePrimeNode] + iparmno) -=                          ( cbprm  - cbprm0) * DELAinv * DvDp;                *(info->SEN_iRHS[here->BJTbasePrimeNode] + iparmno) -=                          ( icbprm  - icbprm0) * DELAinv * DvDp;                if(here->BJTcolNode != here->BJTcolPrimeNode){                    *(info->SEN_RHS[here->BJTcolNode] + iparmno) -=                              ( cc  - cc0) * DELAinv * DvDp;                    *(info->SEN_iRHS[here->BJTcolNode] + iparmno) -=                              ( icc  - icc0) * DELAinv * DvDp;                }                *(info->SEN_RHS[here->BJTcolPrimeNode] + iparmno) -=                          ( ccprm  - ccprm0) * DELAinv * DvDp;                *(info->SEN_iRHS[here->BJTcolPrimeNode] + iparmno) -=                          ( iccprm  - iccprm0) * DELAinv * DvDp;                if(here->BJTemitNode != here->BJTemitPrimeNode){                    *(info->SEN_RHS[here->BJTemitNode] + iparmno) -=                             ( ce  - ce0) * DELAinv * DvDp;                    *(info->SEN_iRHS[here->BJTemitNode] + iparmno) -=                             ( ice  - ice0) * DELAinv * DvDp;                }                *(info->SEN_RHS[here->BJTemitPrimeNode] + iparmno) -=                         ( ceprm  - ceprm0) * DELAinv * DvDp;                *(info->SEN_iRHS[here->BJTemitPrimeNode] + iparmno) -=                         ( iceprm  - iceprm0) * DELAinv * DvDp;                *(info->SEN_RHS[here->BJTsubstNode] + iparmno) -=                          ( cs  - cs0) * DELAinv * DvDp;                *(info->SEN_iRHS[here->BJTsubstNode] + iparmno) -=                          ( ics  - ics0) * DELAinv * DvDp;#ifdef SENSDEBUG                printf("after loading\n");                                  printf("senb = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJTbaseNode] + iparmno),                        *(info->SEN_iRHS[here->BJTbaseNode] + iparmno));                printf("senbrm = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJTbasePrimeNode] + iparmno),                        *(info->SEN_iRHS[here->BJTbasePrimeNode] + iparmno));                printf("senc = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJTcolNode] + iparmno),                        *(info->SEN_iRHS[here->BJTcolNode] + iparmno));                printf("sencprm = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJTcolPrimeNode] + iparmno),                        *(info->SEN_iRHS[here->BJTcolPrimeNode] + iparmno));                printf("sene = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJTemitNode] + iparmno),                        *(info->SEN_iRHS[here->BJTemitNode] + iparmno));                printf("seneprm = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJTemitPrimeNode] + iparmno),                        *(info->SEN_iRHS[here->BJTemitPrimeNode] + iparmno));                printf("sens = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJTsubstNode] + iparmno),                        *(info->SEN_iRHS[here->BJTsubstNode] + iparmno));#endif /* SENSDEBUG */            }next1:                      switch(flag){            case 0:                 if (*(here->BJTsenCbx) == 0){                     here->BJTarea = A0;                    goto pertvbe ;                }                else{                    goto pertvbx;                }            case 1:                 goto pertvbe ;             case 2:                 goto pertvbc ;            case 3:                 goto pertvcs ;            case 4:                 break;             }            /* put the unperturbed values back into the state vector */            for(i=0; i <= 20; i++) {                *(ckt->CKTstate0 + here->BJTstate + i) = *(SaveState + i);            }            here->BJTsenPertFlag = OFF;        }    }    info->SENstatus = NORMAL;#ifdef SENSDEBUG    printf("BJTsenacload end\n");#endif /* SENSDEBUG */    return(OK);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -