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

📄 mos9load.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 4 页
字号:
                if(((ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) ||                        fabs(delvbd) >= ckt->CKTreltol * MAX(fabs(vbd),                        fabs(*(ckt->CKTstate0+here->MOS9vbd)))+                        ckt->CKTvoltTol)|| senflag )#endif /*CAPBYPASS*/                    /* can't bypass the diode capacitance calculations */                {#ifdef CAPZEROBYPASS                    if(here->MOS9Cbd != 0 || here->MOS9Cbdsw != 0 ) {#endif /*CAPZEROBYPASS*/                    if (vbd < here->MOS9tDepCap) {                        arg=1-vbd/here->MOS9tBulkPot;                        /*                         * the following block looks somewhat long and messy,                         * but since most users use the default grading                         * coefficients of .5, and sqrt is MUCH faster than an                         * exp(log()) we use this special case code to buy time.                         * (as much as 10% of total job time!)                         */#ifndef NOSQRT                        if(model->MOS9bulkJctBotGradingCoeff == .5 &&                                model->MOS9bulkJctSideGradingCoeff == .5) {                            sarg = sargsw = 1/sqrt(arg);                        } else {                            if(model->MOS9bulkJctBotGradingCoeff == .5) {                                sarg = 1/sqrt(arg);                            } else {#endif /*NOSQRT*/                                sarg = exp(-model->MOS9bulkJctBotGradingCoeff*                                        log(arg));#ifndef NOSQRT                            }                            if(model->MOS9bulkJctSideGradingCoeff == .5) {                                sargsw = 1/sqrt(arg);                            } else {#endif /*NOSQRT*/                                sargsw =exp(-model->MOS9bulkJctSideGradingCoeff*                                        log(arg));#ifndef NOSQRT                            }                        }#endif /*NOSQRT*/                        *(ckt->CKTstate0 + here->MOS9qbd) =                            here->MOS9tBulkPot*(here->MOS9Cbd*                            (1-arg*sarg)                            /(1-model->MOS9bulkJctBotGradingCoeff)                            +here->MOS9Cbdsw*                            (1-arg*sargsw)                            /(1-model->MOS9bulkJctSideGradingCoeff));                        here->MOS9capbd=here->MOS9Cbd*sarg+                                here->MOS9Cbdsw*sargsw;                    } else {                        *(ckt->CKTstate0 + here->MOS9qbd) = here->MOS9f4d +                                vbd * (here->MOS9f2d + vbd * here->MOS9f3d/2);                        here->MOS9capbd=here->MOS9f2d + vbd * here->MOS9f3d;                    }#ifdef CAPZEROBYPASS                } else {                    *(ckt->CKTstate0 + here->MOS9qbd) = 0;                    here->MOS9capbd = 0;                }#endif /*CAPZEROBYPASS*/                }                if(SenCond && (ckt->CKTsenInfo->SENmode==TRANSEN)) goto next2;                if ( ckt->CKTmode & MODETRAN ) {                    /* (above only excludes tranop, since we're only at this                     * point if tran or tranop )                     */                    /*                     *    calculate equivalent conductances and currents for                     *    depletion capacitors                     */                    /* integrate the capacitors and save results */                    error = NIintegrate(ckt,&geq,&ceq,here->MOS9capbd,                            here->MOS9qbd);                    if(error) return(error);                    here->MOS9gbd += geq;                    here->MOS9cbd += *(ckt->CKTstate0 + here->MOS9cqbd);                    here->MOS9cd -= *(ckt->CKTstate0 + here->MOS9cqbd);                    error = NIintegrate(ckt,&geq,&ceq,here->MOS9capbs,                            here->MOS9qbs);                    if(error) return(error);                    here->MOS9gbs += geq;                    here->MOS9cbs += *(ckt->CKTstate0 + here->MOS9cqbs);                }            }            if(SenCond) goto next2;            /*             *  check convergence             */            if ( (here->MOS9off == 0)  ||                     (!(ckt->CKTmode & (MODEINITFIX|MODEINITSMSIG))) ){                if (Check == 1) {                    ckt->CKTnoncon++;		    ckt->CKTtroubleElt = (GENinstance *) here;                }            }            /* save things away for next time */next2:      *(ckt->CKTstate0 + here->MOS9vbs) = vbs;            *(ckt->CKTstate0 + here->MOS9vbd) = vbd;            *(ckt->CKTstate0 + here->MOS9vgs) = vgs;            *(ckt->CKTstate0 + here->MOS9vds) = vds;            /*             *     meyer's capacitor model             */            if ( ckt->CKTmode & (MODETRAN | MODETRANOP | MODEINITSMSIG) ) {                /*                 *     calculate meyer's capacitors                 */                /*                  * new cmeyer - this just evaluates at the current time,                 * expects you to remember values from previous time                 * returns 1/2 of non-constant portion of capacitance                 * you must add in the other half from previous time                 * and the constant part                 */                if (here->MOS9mode > 0){                    DEVqmeyer (vgs,vgd,vgb,von,vdsat,                        (ckt->CKTstate0 + here->MOS9capgs),                        (ckt->CKTstate0 + here->MOS9capgd),                        (ckt->CKTstate0 + here->MOS9capgb),                        here->MOS9tPhi,OxideCap);                } else {                    DEVqmeyer (vgd,vgs,vgb,von,vdsat,                        (ckt->CKTstate0 + here->MOS9capgd),                        (ckt->CKTstate0 + here->MOS9capgs),                        (ckt->CKTstate0 + here->MOS9capgb),                        here->MOS9tPhi,OxideCap);                }                vgs1 = *(ckt->CKTstate1 + here->MOS9vgs);                vgd1 = vgs1 - *(ckt->CKTstate1 + here->MOS9vds);                vgb1 = vgs1 - *(ckt->CKTstate1 + here->MOS9vbs);                if(ckt->CKTmode & MODETRANOP) {                    capgs =  2 * *(ckt->CKTstate0+here->MOS9capgs)+                               GateSourceOverlapCap ;                    capgd =  2 * *(ckt->CKTstate0+here->MOS9capgd)+                               GateDrainOverlapCap ;                    capgb =  2 * *(ckt->CKTstate0+here->MOS9capgb)+                               GateBulkOverlapCap ;                } else {                    capgs = ( *(ckt->CKTstate0+here->MOS9capgs)+                               *(ckt->CKTstate1+here->MOS9capgs) +                              GateSourceOverlapCap );                    capgd = ( *(ckt->CKTstate0+here->MOS9capgd)+                               *(ckt->CKTstate1+here->MOS9capgd) +                              GateDrainOverlapCap );                    capgb = ( *(ckt->CKTstate0+here->MOS9capgb)+                               *(ckt->CKTstate1+here->MOS9capgb) +                              GateBulkOverlapCap );                }                if(ckt->CKTsenInfo){                    here->MOS9cgs = capgs;                    here->MOS9cgd = capgd;                    here->MOS9cgb = capgb;                }                /*                 *     store small-signal parameters (for meyer's model)                 *  all parameters already stored, so done...                 */                if(SenCond){                    if(ckt->CKTsenInfo->SENmode & (DCSEN|ACSEN)) {                        continue;                    }                }#ifndef PREDICTOR                if (ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) {                    *(ckt->CKTstate0 + here->MOS9qgs) =                        (1+xfact) * *(ckt->CKTstate1 + here->MOS9qgs)                        - xfact * *(ckt->CKTstate2 + here->MOS9qgs);                    *(ckt->CKTstate0 + here->MOS9qgd) =                        (1+xfact) * *(ckt->CKTstate1 + here->MOS9qgd)                        - xfact * *(ckt->CKTstate2 + here->MOS9qgd);                    *(ckt->CKTstate0 + here->MOS9qgb) =                        (1+xfact) * *(ckt->CKTstate1 + here->MOS9qgb)                        - xfact * *(ckt->CKTstate2 + here->MOS9qgb);                } else {#endif /*PREDICTOR*/                    if(ckt->CKTmode & MODETRAN) {                        *(ckt->CKTstate0 + here->MOS9qgs) = (vgs-vgs1)*capgs +                            *(ckt->CKTstate1 + here->MOS9qgs) ;                        *(ckt->CKTstate0 + here->MOS9qgd) = (vgd-vgd1)*capgd +                            *(ckt->CKTstate1 + here->MOS9qgd) ;                        *(ckt->CKTstate0 + here->MOS9qgb) = (vgb-vgb1)*capgb +                            *(ckt->CKTstate1 + here->MOS9qgb) ;                    } else {                        /* TRANOP only */                        *(ckt->CKTstate0 + here->MOS9qgs) = vgs*capgs;                        *(ckt->CKTstate0 + here->MOS9qgd) = vgd*capgd;                        *(ckt->CKTstate0 + here->MOS9qgb) = vgb*capgb;                    }#ifndef PREDICTOR                }#endif /*PREDICTOR*/            }bypass:            if(SenCond) continue;            if ( (ckt->CKTmode & (MODEINITTRAN)) ||                     (! (ckt->CKTmode & (MODETRAN)) )  ) {                /*                 *  initialize to zero charge conductances                  *  and current                 */                gcgs=0;                ceqgs=0;                gcgd=0;                ceqgd=0;                gcgb=0;                ceqgb=0;            } else {                if(capgs == 0) *(ckt->CKTstate0 + here->MOS9cqgs) =0;                if(capgd == 0) *(ckt->CKTstate0 + here->MOS9cqgd) =0;                if(capgb == 0) *(ckt->CKTstate0 + here->MOS9cqgb) =0;                /*                 *    calculate equivalent conductances and currents for                 *    meyer"s capacitors                 */                error = NIintegrate(ckt,&gcgs,&ceqgs,capgs,here->MOS9qgs);                if(error) return(error);                error = NIintegrate(ckt,&gcgd,&ceqgd,capgd,here->MOS9qgd);                if(error) return(error);                error = NIintegrate(ckt,&gcgb,&ceqgb,capgb,here->MOS9qgb);                if(error) return(error);                ceqgs=ceqgs-gcgs*vgs+ckt->CKTag[0]*                         *(ckt->CKTstate0 + here->MOS9qgs);                ceqgd=ceqgd-gcgd*vgd+ckt->CKTag[0]*                        *(ckt->CKTstate0 + here->MOS9qgd);                ceqgb=ceqgb-gcgb*vgb+ckt->CKTag[0]*                        *(ckt->CKTstate0 + here->MOS9qgb);            }            /*             *     store charge storage info for meyer's cap in lx table             */            /*             *  load current vector             */            ceqbs = model->MOS9type *                     (here->MOS9cbs-(here->MOS9gbs)*vbs);            ceqbd = model->MOS9type *                     (here->MOS9cbd-(here->MOS9gbd)*vbd);            if (here->MOS9mode >= 0) {                xnrm=1;                xrev=0;                cdreq=model->MOS9type*(cdrain-here->MOS9gds*vds-                        here->MOS9gm*vgs-here->MOS9gmbs*vbs);            } else {                xnrm=0;                xrev=1;                cdreq = -(model->MOS9type)*(cdrain-here->MOS9gds*(-vds)-                        here->MOS9gm*vgd-here->MOS9gmbs*vbd);            }            *(ckt->CKTrhs + here->MOS9gNode) -=                 (model->MOS9type * (ceqgs + ceqgb + ceqgd));            *(ckt->CKTrhs + here->MOS9bNode) -=                (ceqbs + ceqbd - model->MOS9type * ceqgb);            *(ckt->CKTrhs + here->MOS9dNodePrime) +=                    (ceqbd - cdreq + model->MOS9type * ceqgd);            *(ckt->CKTrhs + here->MOS9sNodePrime) +=                     cdreq + ceqbs + model->MOS9type * ceqgs;            /*             *  load y matrix             *//*printf(" loading %s at time %g\n",here->MOS9name,ckt->CKTtime);*//*printf("%g %g %g %g %g\n", here->MOS9drainConductance,gcgd+gcgs+gcgb,        here->MOS9sourceConductance,here->MOS9gbd,here->MOS9gbs);*//*printf("%g %g %g %g %g\n",-gcgb,0.0,0.0,here->MOS9gds,here->MOS9gm);*//*printf("%g %g %g %g %g\n", here->MOS9gds,here->MOS9gmbs,gcgd,-gcgs,-gcgd);*//*printf("%g %g %g %g %g\n", -gcgs,-gcgd,0.0,-gcgs,0.0);*/            *(here->MOS9DdPtr) += (here->MOS9drainConductance);            *(here->MOS9GgPtr) += ((gcgd+gcgs+gcgb));            *(here->MOS9SsPtr) += (here->MOS9sourceConductance);            *(here->MOS9BbPtr) += (here->MOS9gbd+here->MOS9gbs+gcgb);            *(here->MOS9DPdpPtr) +=                 (here->MOS9drainConductance+here->MOS9gds+                here->MOS9gbd+xrev*(here->MOS9gm+here->MOS9gmbs)+gcgd);            *(here->MOS9SPspPtr) +=                 (here->MOS9sourceConductance+here->MOS9gds+                here->MOS9gbs+xnrm*(here->MOS9gm+here->MOS9gmbs)+gcgs);            *(here->MOS9DdpPtr) += (-here->MOS9drainConductance);            *(here->MOS9GbPtr) -= gcgb;            *(here->MOS9GdpPtr) -= gcgd;            *(here->MOS9GspPtr) -= gcgs;            *(here->MOS9SspPtr) += (-here->MOS9sourceConductance);            *(here->MOS9BgPtr) -= gcgb;            *(here->MOS9BdpPtr) -= here->MOS9gbd;            *(here->MOS9BspPtr) -= here->MOS9gbs;            *(here->MOS9DPdPtr) += (-here->MOS9drainConductance);            *(here->MOS9DPgPtr) += ((xnrm-xrev)*here->MOS9gm-gcgd);            *(here->MOS9DPbPtr) += (-here->MOS9gbd+(xnrm-xrev)*here->MOS9gmbs);            *(here->MOS9DPspPtr) += (-here->MOS9gds-                    xnrm*(here->MOS9gm+here->MOS9gmbs));            *(here->MOS9SPgPtr) += (-(xnrm-xrev)*here->MOS9gm-gcgs);            *(here->MOS9SPsPtr) += (-here->MOS9sourceConductance);            *(here->MOS9SPbPtr) += (-here->MOS9gbs-(xnrm-xrev)*here->MOS9gmbs);            *(here->MOS9SPdpPtr) += (-here->MOS9gds-                    xrev*(here->MOS9gm+here->MOS9gmbs));        }    }    return(OK);}

⌨️ 快捷键说明

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