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

📄 bjt2sacl.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 2 页
字号:
                *(here->BJT2senGx + 3)= *(ckt->CKTstate0 + here->BJT2gx);                *(here->BJT2senCpi + 3)= *(ckt->CKTstate0 + here->BJT2cqbe);                *(here->BJT2senCmu + 3)= *(ckt->CKTstate0 + here->BJT2cqbc);                *(here->BJT2senCbx + 3)= *(ckt->CKTstate0 + here->BJT2cqbx);                *(here->BJT2senCsub + 3)= *(ckt->CKTstate0 + here->BJT2cqsub);                *(here->BJT2senCmcb + 3)= *(ckt->CKTstate0 + here->BJT2cexbc);            }            flag = 2;            goto load;pertvbc:    /* Perturbation of vbc */#ifdef SENSDEBUG            printf("\nPerturbation of vbc\n");#endif /* SENSDEBUG */            *(ckt->CKTstate0 + here->BJT2vbe) = A0;            A0 = vbcOp;            DELA = info->SENpertfac * vte ;            Apert = A0 + DELA;            DELAinv = 1.0/DELA;            *(ckt->CKTstate0 + here->BJT2vbc) = Apert;            *(ckt->CKTstate0 + here->BJT2vbe) = vbeOp;            if(info->SENacpertflag == 1){                /* store the  small signal parameters                  * corresponding to perturbed vbc                  */                if((error = BJT2load((GENmodel*)model,ckt))) return(error);                *(here->BJT2senGpi + 4)= *(ckt->CKTstate0 + here->BJT2gpi);                *(here->BJT2senGmu + 4)= *(ckt->CKTstate0 + here->BJT2gmu);                *(here->BJT2senGm + 4)= *(ckt->CKTstate0 + here->BJT2gm);                *(here->BJT2senGo + 4)= *(ckt->CKTstate0 + here->BJT2go);                *(here->BJT2senGx + 4)= *(ckt->CKTstate0 + here->BJT2gx);                *(here->BJT2senCpi + 4)= *(ckt->CKTstate0 + here->BJT2cqbe);                *(here->BJT2senCmu + 4)= *(ckt->CKTstate0 + here->BJT2cqbc);                *(here->BJT2senCbx + 4)= *(ckt->CKTstate0 + here->BJT2cqbx);                *(here->BJT2senCsub + 4)= *(ckt->CKTstate0 + here->BJT2cqsub);                *(here->BJT2senCmcb + 4)= *(ckt->CKTstate0 + here->BJT2cexbc);            }            flag = 3;            goto load;pertvcs:    /* Perturbation of vcs */#ifdef SENSDEBUG            printf("\nPerturbation of vcs\n");#endif /* SENSDEBUG */            *(ckt->CKTstate0 + here->BJT2vbc) = A0;            A0 = model->BJT2type * (*(ckt->CKTrhsOp + here->BJT2substNode)                -  *(ckt->CKTrhsOp + here->BJT2colPrimeNode));            DELA = info->SENpertfac * A0 + 1e-8;             Apert = A0 + DELA;            DELAinv = model->BJT2type * 1.0/DELA;            *(ckt->CKTrhsOp + here->BJT2substNode) += DELA;            *(ckt->CKTstate0 + here->BJT2vbe) = vbeOp;            *(ckt->CKTstate0 + here->BJT2vbc) = vbcOp;            if(info->SENacpertflag == 1){                /* store the  small signal parameters                  * corresponding to perturbed vcs                  */                if((error = BJT2load((GENmodel*)model,ckt))) return(error);                *(here->BJT2senCsub + 5)= *(ckt->CKTstate0 + here->BJT2cqsub);            }            flag = 4;            *(ckt->CKTrhsOp + here->BJT2substNode) -= DELA;            xccs= *(here->BJT2senCsub + 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=here->BJT2tCollectorConduct * here->BJT2area;            gepr=here->BJT2tEmitterConduct * here->BJT2area;            gpi= *(here->BJT2senGpi + flag+1);            gmu= *(here->BJT2senGmu + flag+1);            gm= *(here->BJT2senGm + flag+1);            go= *(here->BJT2senGo + flag+1);            gx= *(here->BJT2senGx + flag+1);            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 + flag+1) * ckt->CKTomega;            xcmu= *(here->BJT2senCmu + flag+1) * ckt->CKTomega;            xcbx= *(here->BJT2senCbx + flag+1) * ckt->CKTomega;            xccs= *(here->BJT2senCsub + flag+1) * ckt->CKTomega;            xcmcb= *(here->BJT2senCmcb + 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->BJT2baseNode != here->BJT2basePrimeNode){                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->BJT2senParmNo) ) 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->BJT2type *                             (info->SEN_Sap[here->BJT2baseNode][iparmno]                            -  info->SEN_Sap[here->BJT2colPrimeNode][iparmno]);                    break;                case 2:                     DvDp = model->BJT2type *                             (info->SEN_Sap[here->BJT2basePrimeNode][iparmno]                            -  info->SEN_Sap[here->BJT2emitPrimeNode][iparmno]);                    break;                case 3:                     DvDp = model->BJT2type *                             (info->SEN_Sap[here->BJT2basePrimeNode][iparmno]                            -  info->SEN_Sap[here->BJT2colPrimeNode][iparmno]);                    break;                case 4:                     DvDp = model->BJT2type *                             (info->SEN_Sap[here->BJT2substNode][iparmno]                            -  info->SEN_Sap[here->BJT2colPrimeNode][iparmno]);                    break;                }#ifdef SENSDEBUG                printf("before loading\n");                  printf("BJT2type = %d\n",model->BJT2type);                  printf("DvDp = %.7e , flag = %d , iparmno = %d,senparmno = %d\n"                        ,DvDp,flag,iparmno,here->BJT2senParmNo);                printf("senb = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJT2baseNode] + iparmno),                        *(info->SEN_iRHS[here->BJT2baseNode] + iparmno));                printf("senbrm = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJT2basePrimeNode] + iparmno),                        *(info->SEN_iRHS[here->BJT2basePrimeNode] + iparmno));                printf("senc = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJT2colNode] + iparmno),                        *(info->SEN_iRHS[here->BJT2colNode] + iparmno));                printf("sencprm = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJT2colPrimeNode] + iparmno),                        *(info->SEN_iRHS[here->BJT2colPrimeNode] + iparmno));                printf("sene = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJT2emitNode] + iparmno),                        *(info->SEN_iRHS[here->BJT2emitNode] + iparmno));                printf("seneprm = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJT2emitPrimeNode] + iparmno),                        *(info->SEN_iRHS[here->BJT2emitPrimeNode] + iparmno));                printf("sens = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJT2substNode] + iparmno),                        *(info->SEN_iRHS[here->BJT2substNode] + iparmno));#endif /* SENSDEBUG */                if(here->BJT2baseNode != here->BJT2basePrimeNode){                    *(info->SEN_RHS[here->BJT2baseNode] + iparmno) -=                              ( cb  - cb0) * DELAinv * DvDp;                    *(info->SEN_iRHS[here->BJT2baseNode] + iparmno) -=                              ( icb  - icb0) * DELAinv * DvDp;                }                *(info->SEN_RHS[here->BJT2basePrimeNode] + iparmno) -=                          ( cbprm  - cbprm0) * DELAinv * DvDp;                *(info->SEN_iRHS[here->BJT2basePrimeNode] + iparmno) -=                          ( icbprm  - icbprm0) * DELAinv * DvDp;                if(here->BJT2colNode != here->BJT2colPrimeNode){                    *(info->SEN_RHS[here->BJT2colNode] + iparmno) -=                              ( cc  - cc0) * DELAinv * DvDp;                    *(info->SEN_iRHS[here->BJT2colNode] + iparmno) -=                              ( icc  - icc0) * DELAinv * DvDp;                }                *(info->SEN_RHS[here->BJT2colPrimeNode] + iparmno) -=                          ( ccprm  - ccprm0) * DELAinv * DvDp;                *(info->SEN_iRHS[here->BJT2colPrimeNode] + iparmno) -=                          ( iccprm  - iccprm0) * DELAinv * DvDp;                if(here->BJT2emitNode != here->BJT2emitPrimeNode){                    *(info->SEN_RHS[here->BJT2emitNode] + iparmno) -=                             ( ce  - ce0) * DELAinv * DvDp;                    *(info->SEN_iRHS[here->BJT2emitNode] + iparmno) -=                             ( ice  - ice0) * DELAinv * DvDp;                }                *(info->SEN_RHS[here->BJT2emitPrimeNode] + iparmno) -=                         ( ceprm  - ceprm0) * DELAinv * DvDp;                *(info->SEN_iRHS[here->BJT2emitPrimeNode] + iparmno) -=                         ( iceprm  - iceprm0) * DELAinv * DvDp;                *(info->SEN_RHS[here->BJT2substNode] + iparmno) -=                          ( cs  - cs0) * DELAinv * DvDp;                *(info->SEN_iRHS[here->BJT2substNode] + iparmno) -=                          ( ics  - ics0) * DELAinv * DvDp;#ifdef SENSDEBUG                printf("after loading\n");                                  printf("senb = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJT2baseNode] + iparmno),                        *(info->SEN_iRHS[here->BJT2baseNode] + iparmno));                printf("senbrm = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJT2basePrimeNode] + iparmno),                        *(info->SEN_iRHS[here->BJT2basePrimeNode] + iparmno));                printf("senc = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJT2colNode] + iparmno),                        *(info->SEN_iRHS[here->BJT2colNode] + iparmno));                printf("sencprm = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJT2colPrimeNode] + iparmno),                        *(info->SEN_iRHS[here->BJT2colPrimeNode] + iparmno));                printf("sene = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJT2emitNode] + iparmno),                        *(info->SEN_iRHS[here->BJT2emitNode] + iparmno));                printf("seneprm = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJT2emitPrimeNode] + iparmno),                        *(info->SEN_iRHS[here->BJT2emitPrimeNode] + iparmno));                printf("sens = %.7e + j%.7e\n "                        ,*(info->SEN_RHS[here->BJT2substNode] + iparmno),                        *(info->SEN_iRHS[here->BJT2substNode] + iparmno));#endif /* SENSDEBUG */            }next1:                      switch(flag){            case 0:                 if (*(here->BJT2senCbx) == 0){                     here->BJT2area = 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->BJT2state + i) = *(SaveState + i);            }            here->BJT2senPertFlag = OFF;        }    }    info->SENstatus = NORMAL;#ifdef SENSDEBUG    printf("BJT2senacload end\n");#endif /* SENSDEBUG */    return(OK);}

⌨️ 快捷键说明

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