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

📄 mos6load.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
📖 第 1 页 / 共 3 页
字号:
                                model->MOS6bulkJctSideGradingCoeff == .5) {                            sarg = sargsw = 1/sqrt(arg);                        } else {                            if(model->MOS6bulkJctBotGradingCoeff == .5) {                                sarg = 1/sqrt(arg);                            } else {#endif /*NOSQRT*/                                sarg = exp(-model->MOS6bulkJctBotGradingCoeff*                                        log(arg));#ifndef NOSQRT                            }                            if(model->MOS6bulkJctSideGradingCoeff == .5) {                                sargsw = 1/sqrt(arg);                            } else {#endif /*NOSQRT*/                                sargsw =exp(-model->MOS6bulkJctSideGradingCoeff*                                        log(arg));#ifndef NOSQRT                            }                        }#endif /*NOSQRT*/                        *(ckt->CKTstate0 + here->MOS6qbd) =                            here->MOS6tBulkPot*(here->MOS6Cbd*                            (1-arg*sarg)                            /(1-model->MOS6bulkJctBotGradingCoeff)                            +here->MOS6Cbdsw*                            (1-arg*sargsw)                            /(1-model->MOS6bulkJctSideGradingCoeff));                        here->MOS6capbd=here->MOS6Cbd*sarg+                                here->MOS6Cbdsw*sargsw;                    } else {                        *(ckt->CKTstate0 + here->MOS6qbd) = here->MOS6f4d +                                vbd * (here->MOS6f2d + vbd * here->MOS6f3d/2);                        here->MOS6capbd=here->MOS6f2d + vbd * here->MOS6f3d;                    }#ifdef CAPZEROBYPASS                } else {                    *(ckt->CKTstate0 + here->MOS6qbd) = 0;                    here->MOS6capbd = 0;                }#endif /*CAPZEROBYPASS*/                }/**/#ifdef DETAILPROFasm("   .globl mospth");asm("mospth:");#endif /*DETAILPROF*/                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->MOS6capbd,                            here->MOS6qbd);                    if(error) return(error);                    here->MOS6gbd += geq;                    here->MOS6cbd += *(ckt->CKTstate0 + here->MOS6cqbd);                    here->MOS6cd -= *(ckt->CKTstate0 + here->MOS6cqbd);                    error = NIintegrate(ckt,&geq,&ceq,here->MOS6capbs,                            here->MOS6qbs);                    if(error) return(error);                    here->MOS6gbs += geq;                    here->MOS6cbs += *(ckt->CKTstate0 + here->MOS6cqbs);                }            }/**/#ifdef DETAILPROFasm("   .globl mospti");asm("mospti:");#endif /*DETAILPROF*/            if(SenCond) goto next2;            /*             *  check convergence             */            if ( (here->MOS6off == 0)  ||                     (!(ckt->CKTmode & (MODEINITFIX|MODEINITSMSIG))) ){                if (Check == 1) {                    ckt->CKTnoncon++;		    ckt->CKTtroubleElt = (GENinstance *) here;#ifndef NEWCONV                } else {                    tol=ckt->CKTreltol*MAX(FABS(cdhat),                            FABS(here->MOS6cd))+ckt->CKTabstol;                    if (FABS(cdhat-here->MOS6cd) >= tol) {                         ckt->CKTnoncon++;			ckt->CKTtroubleElt = (GENinstance *) here;                    } else {                        tol=ckt->CKTreltol*MAX(FABS(cbhat),                                FABS(here->MOS6cbs+here->MOS6cbd))+                                ckt->CKTabstol;                        if (FABS(cbhat-(here->MOS6cbs+here->MOS6cbd)) > tol) {                            ckt->CKTnoncon++;			    ckt->CKTtroubleElt = (GENinstance *) here;                        }                    }#endif /*NEWCONV*/                }            }/**/#ifdef DETAILPROFasm("   .globl mosptj");asm("mosptj:");#endif /*DETAILPROF*/            /* save things away for next time */next2:      *(ckt->CKTstate0 + here->MOS6vbs) = vbs;            *(ckt->CKTstate0 + here->MOS6vbd) = vbd;            *(ckt->CKTstate0 + here->MOS6vgs) = vgs;            *(ckt->CKTstate0 + here->MOS6vds) = vds;/**/#ifdef DETAILPROFasm("   .globl mosptk");asm("mosptk:");#endif /*DETAILPROF*/            /*             *     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->MOS6mode > 0){                    DEVqmeyer (vgs,vgd,vgb,von,vdsat,                        (ckt->CKTstate0 + here->MOS6capgs),                        (ckt->CKTstate0 + here->MOS6capgd),                        (ckt->CKTstate0 + here->MOS6capgb),                        here->MOS6tPhi,OxideCap);                } else {                    DEVqmeyer (vgd,vgs,vgb,von,vdsat,                        (ckt->CKTstate0 + here->MOS6capgd),                        (ckt->CKTstate0 + here->MOS6capgs),                        (ckt->CKTstate0 + here->MOS6capgb),                        here->MOS6tPhi,OxideCap);                }                vgs1 = *(ckt->CKTstate1 + here->MOS6vgs);                vgd1 = vgs1 - *(ckt->CKTstate1 + here->MOS6vds);                vgb1 = vgs1 - *(ckt->CKTstate1 + here->MOS6vbs);                if(ckt->CKTmode & (MODETRANOP|MODEINITSMSIG)) {                    capgs =  2 * *(ckt->CKTstate0+here->MOS6capgs)+                               GateSourceOverlapCap ;                    capgd =  2 * *(ckt->CKTstate0+here->MOS6capgd)+                               GateDrainOverlapCap ;                    capgb =  2 * *(ckt->CKTstate0+here->MOS6capgb)+                               GateBulkOverlapCap ;                } else {                    capgs = ( *(ckt->CKTstate0+here->MOS6capgs)+                               *(ckt->CKTstate1+here->MOS6capgs) +                              GateSourceOverlapCap );                    capgd = ( *(ckt->CKTstate0+here->MOS6capgd)+                               *(ckt->CKTstate1+here->MOS6capgd) +                              GateDrainOverlapCap );                    capgb = ( *(ckt->CKTstate0+here->MOS6capgb)+                               *(ckt->CKTstate1+here->MOS6capgb) +                              GateBulkOverlapCap );                }                if(ckt->CKTsenInfo){                    here->MOS6cgs = capgs;                    here->MOS6cgd = capgd;                    here->MOS6cgb = capgb;                }/**/#ifdef DETAILPROFasm("   .globl mosptl");asm("mosptl:");#endif /*DETAILPROF*/                /*                 *     store small-signal parameters (for meyer's model)                 *  all parameters already stored, so done...                 */                if(SenCond){                    if((ckt->CKTsenInfo->SENmode == DCSEN)||                            (ckt->CKTsenInfo->SENmode == ACSEN)){                        continue;                    }                }#ifndef PREDICTOR                if (ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) {                    *(ckt->CKTstate0 + here->MOS6qgs) =                        (1+xfact) * *(ckt->CKTstate1 + here->MOS6qgs)                        - xfact * *(ckt->CKTstate2 + here->MOS6qgs);                    *(ckt->CKTstate0 + here->MOS6qgd) =                        (1+xfact) * *(ckt->CKTstate1 + here->MOS6qgd)                        - xfact * *(ckt->CKTstate2 + here->MOS6qgd);                    *(ckt->CKTstate0 + here->MOS6qgb) =                        (1+xfact) * *(ckt->CKTstate1 + here->MOS6qgb)                        - xfact * *(ckt->CKTstate2 + here->MOS6qgb);                } else {#endif /*PREDICTOR*/                    if(ckt->CKTmode & MODETRAN) {                        *(ckt->CKTstate0 + here->MOS6qgs) = (vgs-vgs1)*capgs +                            *(ckt->CKTstate1 + here->MOS6qgs) ;                        *(ckt->CKTstate0 + here->MOS6qgd) = (vgd-vgd1)*capgd +                            *(ckt->CKTstate1 + here->MOS6qgd) ;                        *(ckt->CKTstate0 + here->MOS6qgb) = (vgb-vgb1)*capgb +                            *(ckt->CKTstate1 + here->MOS6qgb) ;                    } else {                        /* TRANOP only */                        *(ckt->CKTstate0 + here->MOS6qgs) = vgs*capgs;                        *(ckt->CKTstate0 + here->MOS6qgd) = vgd*capgd;                        *(ckt->CKTstate0 + here->MOS6qgb) = 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->MOS6cqgs) =0;                if(capgd == 0) *(ckt->CKTstate0 + here->MOS6cqgd) =0;                if(capgb == 0) *(ckt->CKTstate0 + here->MOS6cqgb) =0;                /*                 *    calculate equivalent conductances and currents for                 *    meyer"s capacitors                 */                error = NIintegrate(ckt,&gcgs,&ceqgs,capgs,here->MOS6qgs);                if(error) return(error);                error = NIintegrate(ckt,&gcgd,&ceqgd,capgd,here->MOS6qgd);                if(error) return(error);                error = NIintegrate(ckt,&gcgb,&ceqgb,capgb,here->MOS6qgb);                if(error) return(error);                ceqgs=ceqgs-gcgs*vgs+ckt->CKTag[0]*                         *(ckt->CKTstate0 + here->MOS6qgs);                ceqgd=ceqgd-gcgd*vgd+ckt->CKTag[0]*                        *(ckt->CKTstate0 + here->MOS6qgd);                ceqgb=ceqgb-gcgb*vgb+ckt->CKTag[0]*                        *(ckt->CKTstate0 + here->MOS6qgb);            }            /*             *     store charge storage info for meyer's cap in lx table             */            /*             *  load current vector             */            ceqbs = model->MOS6type *                     (here->MOS6cbs-(here->MOS6gbs-ckt->CKTgmin)*vbs);            ceqbd = model->MOS6type *                     (here->MOS6cbd-(here->MOS6gbd-ckt->CKTgmin)*vbd);            if (here->MOS6mode >= 0) {                xnrm=1;                xrev=0;                cdreq=model->MOS6type*(cdrain-here->MOS6gds*vds-                        here->MOS6gm*vgs-here->MOS6gmbs*vbs);            } else {                xnrm=0;                xrev=1;                cdreq = -(model->MOS6type)*(cdrain-here->MOS6gds*(-vds)-                        here->MOS6gm*vgd-here->MOS6gmbs*vbd);            }            *(ckt->CKTrhs + here->MOS6gNode) -=                 (model->MOS6type * (ceqgs + ceqgb + ceqgd));            *(ckt->CKTrhs + here->MOS6bNode) -=                (ceqbs + ceqbd - model->MOS6type * ceqgb);            *(ckt->CKTrhs + here->MOS6dNodePrime) +=                    (ceqbd - cdreq + model->MOS6type * ceqgd);            *(ckt->CKTrhs + here->MOS6sNodePrime) +=                     cdreq + ceqbs + model->MOS6type * ceqgs;            /*             *  load y matrix             */            *(here->MOS6DdPtr) += (here->MOS6drainConductance);            *(here->MOS6GgPtr) += ((gcgd+gcgs+gcgb));            *(here->MOS6SsPtr) += (here->MOS6sourceConductance);            *(here->MOS6BbPtr) += (here->MOS6gbd+here->MOS6gbs+gcgb);            *(here->MOS6DPdpPtr) +=                     (here->MOS6drainConductance+here->MOS6gds+                    here->MOS6gbd+xrev*(here->MOS6gm+here->MOS6gmbs)+gcgd);            *(here->MOS6SPspPtr) +=                     (here->MOS6sourceConductance+here->MOS6gds+                    here->MOS6gbs+xnrm*(here->MOS6gm+here->MOS6gmbs)+gcgs);            *(here->MOS6DdpPtr) += (-here->MOS6drainConductance);            *(here->MOS6GbPtr) -= gcgb;            *(here->MOS6GdpPtr) -= gcgd;            *(here->MOS6GspPtr) -= gcgs;            *(here->MOS6SspPtr) += (-here->MOS6sourceConductance);            *(here->MOS6BgPtr) -= gcgb;            *(here->MOS6BdpPtr) -= here->MOS6gbd;            *(here->MOS6BspPtr) -= here->MOS6gbs;            *(here->MOS6DPdPtr) += (-here->MOS6drainConductance);            *(here->MOS6DPgPtr) += ((xnrm-xrev)*here->MOS6gm-gcgd);            *(here->MOS6DPbPtr) += (-here->MOS6gbd+(xnrm-xrev)*here->MOS6gmbs);            *(here->MOS6DPspPtr) += (-here->MOS6gds-xnrm*                    (here->MOS6gm+here->MOS6gmbs));            *(here->MOS6SPgPtr) += (-(xnrm-xrev)*here->MOS6gm-gcgs);            *(here->MOS6SPsPtr) += (-here->MOS6sourceConductance);            *(here->MOS6SPbPtr) += (-here->MOS6gbs-(xnrm-xrev)*here->MOS6gmbs);            *(here->MOS6SPdpPtr) += (-here->MOS6gds-xrev*                    (here->MOS6gm+here->MOS6gmbs));        }    }    return(OK);}

⌨️ 快捷键说明

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