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

📄 b2ld.c

📁 linux平台下类似著名的电路板作图软件 Spice的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
                    vbd = DEVpnjlim(vbd,*(ckt->CKTstate0 + here->B2vbd),                            CONSTvt0,vcrit,&Check); /* B2 test*/                    vbs = vbd + vds;                }            }              /* determine DC current and derivatives */            vbd = vbs - vds;            vgd = vgs - vds;            vgb = vgs - vbs;            if(vbs <= 0.0 ) {                gbs = SourceSatCurrent / CONSTvt0 + ckt->CKTgmin;                cbs = gbs * vbs ;            } else {                evbs = exp(vbs/CONSTvt0);                gbs = SourceSatCurrent*evbs/CONSTvt0 + ckt->CKTgmin;                cbs = SourceSatCurrent * (evbs-1) + ckt->CKTgmin * vbs ;            }            if(vbd <= 0.0) {                gbd = DrainSatCurrent / CONSTvt0 + ckt->CKTgmin;                cbd = gbd * vbd ;            } else {                evbd = exp(vbd/CONSTvt0);                gbd = DrainSatCurrent*evbd/CONSTvt0 +ckt->CKTgmin;                cbd = DrainSatCurrent *(evbd-1)+ckt->CKTgmin*vbd;            }            /* line 400 */            if(vds >= 0) {                /* normal mode */                here->B2mode = 1;            } else {                /* inverse mode */                here->B2mode = -1;            }            /* call B2evaluate to calculate drain current and its              * derivatives and charge and capacitances related to gate             * drain, and bulk             */           if( vds >= 0 )  {                B2evaluate(vds,vbs,vgs,here,model,&gm,&gds,&gmbs,&qgate,                    &qbulk,&qdrn,&cggb,&cgdb,&cgsb,&cbgb,&cbdb,&cbsb,&cdgb,                    &cddb,&cdsb,&cdrain,&von,&vdsat,ckt);            } else {                B2evaluate(-vds,vbd,vgd,here,model,&gm,&gds,&gmbs,&qgate,                    &qbulk,&qsrc,&cggb,&cgsb,&cgdb,&cbgb,&cbsb,&cbdb,&csgb,                    &cssb,&csdb,&cdrain,&von,&vdsat,ckt);            }                      here->B2von = model->B2type * von;            here->B2vdsat = model->B2type * vdsat;                      /*             *  COMPUTE EQUIVALENT DRAIN CURRENT SOURCE             */            cd=here->B2mode * cdrain - cbd;            if ((ckt->CKTmode & (MODETRAN | MODEAC | MODEINITSMSIG)) ||                    ((ckt->CKTmode & MODETRANOP ) &&                     (ckt->CKTmode & MODEUIC))) {                /*                 *  charge storage elements                 *                 *   bulk-drain and bulk-source depletion capacitances                 *  czbd : zero bias drain junction capacitance                 *  czbs : zero bias source junction capacitance                 * czbdsw:zero bias drain junction sidewall capacitance                 * czbssw:zero bias source junction sidewall capacitance                 */                czbd  = model->B2unitAreaJctCap * DrainArea;                czbs  = model->B2unitAreaJctCap * SourceArea;                czbdsw= model->B2unitLengthSidewallJctCap * DrainPerimeter;                czbssw= model->B2unitLengthSidewallJctCap * SourcePerimeter;                PhiB = model->B2bulkJctPotential;                PhiBSW = model->B2sidewallJctPotential;                MJ = model->B2bulkJctBotGradingCoeff;                MJSW = model->B2bulkJctSideGradingCoeff;                /* Source Bulk Junction */                if( vbs < 0 ) {                      arg = 1 - vbs / PhiB;                    argsw = 1 - vbs / PhiBSW;                    sarg = exp(-MJ*log(arg));                    sargsw = exp(-MJSW*log(argsw));                    *(ckt->CKTstate0 + here->B2qbs) =                        PhiB * czbs * (1-arg*sarg)/(1-MJ) + PhiBSW *                     czbssw * (1-argsw*sargsw)/(1-MJSW);                    capbs = czbs * sarg + czbssw * sargsw ;                } else {                      *(ckt->CKTstate0+here->B2qbs) =                        vbs*(czbs+czbssw)+ vbs*vbs*(czbs*MJ*0.5/PhiB                         + czbssw * MJSW * 0.5/PhiBSW);                    capbs = czbs + czbssw + vbs *(czbs*MJ/PhiB+                        czbssw * MJSW / PhiBSW );                }                /* Drain Bulk Junction */                if( vbd < 0 ) {                      arg = 1 - vbd / PhiB;                    argsw = 1 - vbd / PhiBSW;                    sarg = exp(-MJ*log(arg));                    sargsw = exp(-MJSW*log(argsw));                    *(ckt->CKTstate0 + here->B2qbd) =                        PhiB * czbd * (1-arg*sarg)/(1-MJ) + PhiBSW *                     czbdsw * (1-argsw*sargsw)/(1-MJSW);                    capbd = czbd * sarg + czbdsw * sargsw ;                } else {                      *(ckt->CKTstate0+here->B2qbd) =                        vbd*(czbd+czbdsw)+ vbd*vbd*(czbd*MJ*0.5/PhiB                         + czbdsw * MJSW * 0.5/PhiBSW);                    capbd = czbd + czbdsw + vbd *(czbd*MJ/PhiB+                        czbdsw * MJSW / PhiBSW );                }            }            /*             *  check convergence             */            if ( (here->B2off == 0)  || (!(ckt->CKTmode & MODEINITFIX)) ){                if (Check == 1) {                    ckt->CKTnoncon++;		    ckt->CKTtroubleElt = (GENinstance *) here;#ifndef NEWCONV                } else {                    tol=ckt->CKTreltol*MAX(FABS(cdhat),FABS(cd))+ckt->CKTabstol;                    if (FABS(cdhat-cd) >= tol) {                         ckt->CKTnoncon++;			ckt->CKTtroubleElt = (GENinstance *) here;                    } else {                        tol=ckt->CKTreltol*MAX(FABS(cbhat),FABS(cbs+cbd))+                            ckt->CKTabstol;                        if (FABS(cbhat-(cbs+cbd)) > tol) {                            ckt->CKTnoncon++;			    ckt->CKTtroubleElt = (GENinstance *) here;                        }                    }#endif /* NEWCONV */                }            }            *(ckt->CKTstate0 + here->B2vbs) = vbs;            *(ckt->CKTstate0 + here->B2vbd) = vbd;            *(ckt->CKTstate0 + here->B2vgs) = vgs;            *(ckt->CKTstate0 + here->B2vds) = vds;            *(ckt->CKTstate0 + here->B2cd) = cd;            *(ckt->CKTstate0 + here->B2cbs) = cbs;            *(ckt->CKTstate0 + here->B2cbd) = cbd;            *(ckt->CKTstate0 + here->B2gm) = gm;            *(ckt->CKTstate0 + here->B2gds) = gds;            *(ckt->CKTstate0 + here->B2gmbs) = gmbs;            *(ckt->CKTstate0 + here->B2gbd) = gbd;            *(ckt->CKTstate0 + here->B2gbs) = gbs;            *(ckt->CKTstate0 + here->B2cggb) = cggb;            *(ckt->CKTstate0 + here->B2cgdb) = cgdb;            *(ckt->CKTstate0 + here->B2cgsb) = cgsb;            *(ckt->CKTstate0 + here->B2cbgb) = cbgb;            *(ckt->CKTstate0 + here->B2cbdb) = cbdb;            *(ckt->CKTstate0 + here->B2cbsb) = cbsb;            *(ckt->CKTstate0 + here->B2cdgb) = cdgb;            *(ckt->CKTstate0 + here->B2cddb) = cddb;            *(ckt->CKTstate0 + here->B2cdsb) = cdsb;            *(ckt->CKTstate0 + here->B2capbs) = capbs;            *(ckt->CKTstate0 + here->B2capbd) = capbd;           /* bulk and channel charge plus overlaps */            if((!(ckt->CKTmode & (MODETRAN | MODEAC))) &&                    ((!(ckt->CKTmode & MODETRANOP)) ||                    (!(ckt->CKTmode & MODEUIC)))  && (!(ckt->CKTmode                     &  MODEINITSMSIG))) goto line850;          line755:            if( here->B2mode > 0 ) {		args[0] = GateDrainOverlapCap;		args[1] = GateSourceOverlapCap;		args[2] = GateBulkOverlapCap;		args[3] = capbd;		args[4] = capbs;		args[5] = cggb;		args[6] = cgdb;		args[7] = cgsb;                B2mosCap(ckt,vgd,vgs,vgb,		    args,		    /*		    GateDrainOverlapCap,		    GateSourceOverlapCap,GateBulkOverlapCap,		    capbd,capbs,cggb,cgdb,cgsb,		    */		    cbgb,cbdb,cbsb,cdgb,cddb,cdsb		    ,&gcggb,&gcgdb,&gcgsb,&gcbgb,&gcbdb,&gcbsb,&gcdgb		    ,&gcddb,&gcdsb,&gcsgb,&gcsdb,&gcssb,&qgate,&qbulk		    ,&qdrn,&qsrc);            } else {		args[0] = GateSourceOverlapCap;		args[1] = GateDrainOverlapCap;		args[2] = GateBulkOverlapCap;		args[3] = capbs;		args[4] = capbd;		args[5] = cggb;		args[6] = cgsb;		args[7] = cgdb;                B2mosCap(ckt,vgs,vgd,vgb,args,		    /*		    GateSourceOverlapCap,                    GateDrainOverlapCap,GateBulkOverlapCap,		    capbs,capbd,cggb,cgsb,cgdb,		    */		    cbgb,cbsb,cbdb,csgb,cssb,csdb                    ,&gcggb,&gcgsb,&gcgdb,&gcbgb,&gcbsb,&gcbdb,&gcsgb                    ,&gcssb,&gcsdb,&gcdgb,&gcdsb,&gcddb,&qgate,&qbulk                    ,&qsrc,&qdrn);            }                         if(ByPass) goto line860;            *(ckt->CKTstate0 + here->B2qg) = qgate;            *(ckt->CKTstate0 + here->B2qd) = qdrn -                      *(ckt->CKTstate0 + here->B2qbd);            *(ckt->CKTstate0 + here->B2qb) = qbulk +                      *(ckt->CKTstate0 + here->B2qbd) +                      *(ckt->CKTstate0 + here->B2qbs);             /* store small signal parameters */            if((!(ckt->CKTmode & (MODEAC | MODETRAN))) &&                    (ckt->CKTmode & MODETRANOP ) && (ckt->CKTmode &                    MODEUIC ))   goto line850;            if(ckt->CKTmode & MODEINITSMSIG ) {                  *(ckt->CKTstate0+here->B2cggb) = cggb;                *(ckt->CKTstate0+here->B2cgdb) = cgdb;                *(ckt->CKTstate0+here->B2cgsb) = cgsb;                *(ckt->CKTstate0+here->B2cbgb) = cbgb;                *(ckt->CKTstate0+here->B2cbdb) = cbdb;                *(ckt->CKTstate0+here->B2cbsb) = cbsb;                *(ckt->CKTstate0+here->B2cdgb) = cdgb;                *(ckt->CKTstate0+here->B2cddb) = cddb;                *(ckt->CKTstate0+here->B2cdsb) = cdsb;                     *(ckt->CKTstate0+here->B2capbd) = capbd;                *(ckt->CKTstate0+here->B2capbs) = capbs;                goto line1000;            }                   if(ckt->CKTmode & MODEINITTRAN ) {                 *(ckt->CKTstate1+here->B2qb) =                    *(ckt->CKTstate0+here->B2qb) ;                *(ckt->CKTstate1+here->B2qg) =                    *(ckt->CKTstate0+here->B2qg) ;                *(ckt->CKTstate1+here->B2qd) =                    *(ckt->CKTstate0+here->B2qd) ;            }                          error = NIintegrate(ckt,&geq,&ceq,0.0,here->B2qb);            if(error) return(error);            error = NIintegrate(ckt,&geq,&ceq,0.0,here->B2qg);            if(error) return(error);            error = NIintegrate(ckt,&geq,&ceq,0.0,here->B2qd);            if(error) return(error);                  goto line860;line850:            /* initialize to zero charge conductance and current */            ceqqg = ceqqb = ceqqd = 0.0;            gcdgb = gcddb = gcdsb = 0.0;            gcsgb = gcsdb = gcssb = 0.0;            gcggb = gcgdb = gcgsb = 0.0;            gcbgb = gcbdb = gcbsb = 0.0;            goto line900;            line860:            /* evaluate equivalent charge current */            cqgate = *(ckt->CKTstate0 + here->B2iqg);            cqbulk = *(ckt->CKTstate0 + here->B2iqb);            cqdrn = *(ckt->CKTstate0 + here->B2iqd);            ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs;            ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs;            ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs;            if(ckt->CKTmode & MODEINITTRAN ) {                  *(ckt->CKTstate1 + here->B2iqb) =                      *(ckt->CKTstate0 + here->B2iqb);                *(ckt->CKTstate1 + here->B2iqg) =                      *(ckt->CKTstate0 + here->B2iqg);                *(ckt->CKTstate1 + here->B2iqd) =                      *(ckt->CKTstate0 + here->B2iqd);            }            /*             *  load current vector             */line900:               ceqbs = model->B2type * (cbs-(gbs-ckt->CKTgmin)*vbs);            ceqbd = model->B2type * (cbd-(gbd-ckt->CKTgmin)*vbd);                 ceqqg = model->B2type * ceqqg;            ceqqb = model->B2type * ceqqb;            ceqqd =  model->B2type * ceqqd;            if (here->B2mode >= 0) {                xnrm=1;                xrev=0;                cdreq=model->B2type*(cdrain-gds*vds-gm*vgs-gmbs*vbs);            } else {                xnrm=0;                xrev=1;                cdreq = -(model->B2type)*(cdrain+gds*vds-gm*vgd-gmbs*vbd);            }            *(ckt->CKTrhs + here->B2gNode) -= ceqqg;            *(ckt->CKTrhs + here->B2bNode) -=(ceqbs+ceqbd+ceqqb);            *(ckt->CKTrhs + here->B2dNodePrime) +=                    (ceqbd-cdreq-ceqqd);            *(ckt->CKTrhs + here->B2sNodePrime) +=                     (cdreq+ceqbs+ceqqg+ceqqb+ceqqd);            /*             *  load y matrix             */            *(here->B2DdPtr) += (here->B2drainConductance);            *(here->B2GgPtr) += (gcggb);            *(here->B2SsPtr) += (here->B2sourceConductance);            *(here->B2BbPtr) += (gbd+gbs-gcbgb-gcbdb-gcbsb);            *(here->B2DPdpPtr) +=                 (here->B2drainConductance+gds+gbd+xrev*(gm+gmbs)+gcddb);            *(here->B2SPspPtr) +=                 (here->B2sourceConductance+gds+gbs+xnrm*(gm+gmbs)+gcssb);            *(here->B2DdpPtr) += (-here->B2drainConductance);            *(here->B2GbPtr) += (-gcggb-gcgdb-gcgsb);            *(here->B2GdpPtr) += (gcgdb);            *(here->B2GspPtr) += (gcgsb);            *(here->B2SspPtr) += (-here->B2sourceConductance);            *(here->B2BgPtr) += (gcbgb);            *(here->B2BdpPtr) += (-gbd+gcbdb);            *(here->B2BspPtr) += (-gbs+gcbsb);            *(here->B2DPdPtr) += (-here->B2drainConductance);            *(here->B2DPgPtr) += ((xnrm-xrev)*gm+gcdgb);            *(here->B2DPbPtr) += (-gbd+(xnrm-xrev)*gmbs-gcdgb-gcddb-gcdsb);            *(here->B2DPspPtr) += (-gds-xnrm*(gm+gmbs)+gcdsb);            *(here->B2SPgPtr) += (-(xnrm-xrev)*gm+gcsgb);            *(here->B2SPsPtr) += (-here->B2sourceConductance);            *(here->B2SPbPtr) += (-gbs-(xnrm-xrev)*gmbs-gcsgb-gcsdb-gcssb);            *(here->B2SPdpPtr) += (-gds-xrev*(gm+gmbs)+gcsdb);line1000:  ;        }   /* End of Mosfet Instance */    }       /* End of Model Instance */    return(OK);}

⌨️ 快捷键说明

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