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

📄 jfetload.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
📖 第 1 页 / 共 2 页
字号:
                         * normal mode, linear region                         */                        apart = 2*model->JFETb + 3*Bfac*(vgst - vds);                        cpart = vds*(vds*(Bfac*vds - model->JFETb)+vgst*apart);                        cdrain = betap*cpart;                        gm = betap*vds*(apart + 3*Bfac*vgst);                        gds = betap*(vgst - vds)*apart                              + beta*model->JFETlModulation*cpart;                    } else {                        Bfac = vgst*Bfac;                        gm = betap*vgst*(2*model->JFETb+3*Bfac);                        /*                         * normal mode, saturation region                         */                        cpart=vgst*vgst*(model->JFETb+Bfac);                        cdrain = betap*cpart;                        gds = model->JFETlModulation*beta*cpart;                    }                }            } else {                vgdt = vgd - vto;                /*                 * compute drain current and derivatives for inverse mode                 */                if (vgdt <= 0) {                    /*                     * inverse mode, cutoff region                     */                    cdrain = 0;                    gm = 0;                    gds = 0;                } else {                    betap = beta*(1 - model->JFETlModulation*vds);                    Bfac = model->JFETbFac;                    if (vgdt + vds >= 0) {                        /*                         * inverse mode, linear region                         */                        apart = 2*model->JFETb + 3*Bfac*(vgdt + vds);                        cpart = vds*(-vds*(-Bfac*vds-model->JFETb)+vgdt*apart);                        cdrain = betap*cpart;                        gm = betap*vds*(apart + 3*Bfac*vgdt);                        gds = betap*(vgdt + vds)*apart                             - beta*model->JFETlModulation*cpart - gm;                    } else {                        Bfac = vgdt*Bfac;                        gm = -betap*vgdt*(2*model->JFETb+3*Bfac);                        /*                         * inverse mode, saturation region                         */                        cpart=vgdt*vgdt*(model->JFETb+Bfac);                        cdrain = - betap*cpart;                        gds = model->JFETlModulation*beta*cpart-gm;                    }                }            }#ifdef notdef	    /* The original section is now commented out */	    /* end Sydney University mod */            /*             *   compute drain current and derivitives for normal mode              */            if (vds >= 0) {                vgst=vgs-model->JFETthreshold;                /*                 *   normal mode, cutoff region                  */                if (vgst <= 0) {                    cdrain=0;                    gm=0;                    gds=0;                } else {                    betap=beta*(1+model->JFETlModulation*vds);                    twob=betap+betap;                    if (vgst <= vds) {                        /*                         *   normal mode, saturation region                          */                        cdrain=betap*vgst*vgst;                        gm=twob*vgst;                        gds=model->JFETlModulation*beta*vgst*vgst;                    } else {                        /*                         *   normal mode, linear region                          */                        cdrain=betap*vds*(vgst+vgst-vds);                        gm=twob*vds;                        gds=twob*(vgst-vds)+model->JFETlModulation*beta*                                vds*(vgst+vgst-vds);                    }                }            } else {                /*                 *   compute drain current and derivitives for inverse mode                  */                vgdt=vgd-model->JFETthreshold;                if (vgdt <= 0) {                    /*                     *   inverse mode, cutoff region                      */                    cdrain=0;                    gm=0;                    gds=0;                } else {                    /*                     *   inverse mode, saturation region                      */                    betap=beta*(1-model->JFETlModulation*vds);                    twob=betap+betap;                    if (vgdt <= -vds) {                        cdrain = -betap*vgdt*vgdt;                        gm = -twob*vgdt;                        gds = model->JFETlModulation*beta*vgdt*vgdt-gm;                    } else {                        /*                         *  inverse mode, linear region                          */                        cdrain=betap*vds*(vgdt+vgdt+vds);                        gm=twob*vds;                        gds=twob*vgdt-model->JFETlModulation*beta*vds*                                (vgdt+vgdt+vds);                    }                }            }	    /* end of original section, now deleted (replaced w/SU mod */#endif            /*             *   compute equivalent drain current source              */            cd=cdrain-cgd;            if ( (ckt->CKTmode & (MODETRAN | MODEAC | MODEINITSMSIG) ) ||                    ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) ){                /*                  *    charge storage elements                  */                czgs=here->JFETtCGS*here->JFETarea;                czgd=here->JFETtCGD*here->JFETarea;                twop=here->JFETtGatePot+here->JFETtGatePot;                fcpb2=here->JFETcorDepCap*here->JFETcorDepCap;                czgsf2=czgs/model->JFETf2;                czgdf2=czgd/model->JFETf2;                if (vgs < here->JFETcorDepCap) {                    sarg=sqrt(1-vgs/here->JFETtGatePot);                    *(ckt->CKTstate0 + here->JFETqgs) = twop*czgs*(1-sarg);                    capgs=czgs/sarg;                } else {                    *(ckt->CKTstate0 + here->JFETqgs) = czgs*here->JFETf1 +                            czgsf2*(model->JFETf3 *(vgs-                            here->JFETcorDepCap)+(vgs*vgs-fcpb2)/                            (twop+twop));                    capgs=czgsf2*(model->JFETf3+vgs/twop);                }                if (vgd < here->JFETcorDepCap) {                    sarg=sqrt(1-vgd/here->JFETtGatePot);                    *(ckt->CKTstate0 + here->JFETqgd) = twop*czgd*(1-sarg);                    capgd=czgd/sarg;                } else {                    *(ckt->CKTstate0 + here->JFETqgd) = czgd*here->JFETf1+                            czgdf2*(model->JFETf3* (vgd-                            here->JFETcorDepCap)+(vgd*vgd-fcpb2)/                            (twop+twop));                    capgd=czgdf2*(model->JFETf3+vgd/twop);                }                /*                 *   store small-signal parameters                  */                if( (!(ckt->CKTmode & MODETRANOP)) ||                         (!(ckt->CKTmode & MODEUIC)) ) {                    if(ckt->CKTmode & MODEINITSMSIG) {                        *(ckt->CKTstate0 + here->JFETqgs) = capgs;                        *(ckt->CKTstate0 + here->JFETqgd) = capgd;                        continue; /*go to 1000*/                    }                    /*                     *   transient analysis                      */                    if(ckt->CKTmode & MODEINITTRAN) {                        *(ckt->CKTstate1 + here->JFETqgs) =                                *(ckt->CKTstate0 + here->JFETqgs);                        *(ckt->CKTstate1 + here->JFETqgd) =                                *(ckt->CKTstate0 + here->JFETqgd);                    }                    error = NIintegrate(ckt,&geq,&ceq,capgs,here->JFETqgs);                    if(error) return(error);                    ggs = ggs + geq;                    cg = cg + *(ckt->CKTstate0 + here->JFETcqgs);                    error = NIintegrate(ckt,&geq,&ceq,capgd,here->JFETqgd);                    if(error) return(error);                    ggd = ggd + geq;                    cg = cg + *(ckt->CKTstate0 + here->JFETcqgd);                    cd = cd - *(ckt->CKTstate0 + here->JFETcqgd);                    cgd = cgd + *(ckt->CKTstate0 + here->JFETcqgd);                    if (ckt->CKTmode & MODEINITTRAN) {                        *(ckt->CKTstate1 + here->JFETcqgs) =                                *(ckt->CKTstate0 + here->JFETcqgs);                        *(ckt->CKTstate1 + here->JFETcqgd) =                                *(ckt->CKTstate0 + here->JFETcqgd);                    }                }            }            /*             *  check convergence              */            if( (!(ckt->CKTmode & MODEINITFIX)) | (!(ckt->CKTmode & MODEUIC))) {                if( (icheck == 1)#ifndef NEWCONV/* XXX */#endif /*NEWCONV*/                        || (FABS(cghat-cg) >= ckt->CKTreltol*                            MAX(FABS(cghat),FABS(cg))+ckt->CKTabstol) ||                        (FABS(cdhat-cd) > ckt->CKTreltol*                            MAX(FABS(cdhat),FABS(cd))+ckt->CKTabstol)                         ) {                    ckt->CKTnoncon++;		    ckt->CKTtroubleElt = (GENinstance *) here;                }            }            *(ckt->CKTstate0 + here->JFETvgs) = vgs;            *(ckt->CKTstate0 + here->JFETvgd) = vgd;            *(ckt->CKTstate0 + here->JFETcg) = cg;            *(ckt->CKTstate0 + here->JFETcd) = cd;            *(ckt->CKTstate0 + here->JFETcgd) = cgd;            *(ckt->CKTstate0 + here->JFETgm) = gm;            *(ckt->CKTstate0 + here->JFETgds) = gds;            *(ckt->CKTstate0 + here->JFETggs) = ggs;            *(ckt->CKTstate0 + here->JFETggd) = ggd;            /*             *    load current vector             */load:            ceqgd=model->JFETtype*(cgd-ggd*vgd);            ceqgs=model->JFETtype*((cg-cgd)-ggs*vgs);            cdreq=model->JFETtype*((cd+cgd)-gds*vds-gm*vgs);            *(ckt->CKTrhs + here->JFETgateNode) += (-ceqgs-ceqgd);            *(ckt->CKTrhs + here->JFETdrainPrimeNode) +=                    (-cdreq+ceqgd);            *(ckt->CKTrhs + here->JFETsourcePrimeNode) +=                    (cdreq+ceqgs);            /*             *    load y matrix              */            *(here->JFETdrainDrainPrimePtr) += (-gdpr);            *(here->JFETgateDrainPrimePtr) += (-ggd);            *(here->JFETgateSourcePrimePtr) += (-ggs);            *(here->JFETsourceSourcePrimePtr) += (-gspr);            *(here->JFETdrainPrimeDrainPtr) += (-gdpr);            *(here->JFETdrainPrimeGatePtr) += (gm-ggd);            *(here->JFETdrainPrimeSourcePrimePtr) += (-gds-gm);            *(here->JFETsourcePrimeGatePtr) += (-ggs-gm);            *(here->JFETsourcePrimeSourcePtr) += (-gspr);            *(here->JFETsourcePrimeDrainPrimePtr) += (-gds);            *(here->JFETdrainDrainPtr) += (gdpr);            *(here->JFETgateGatePtr) += (ggd+ggs);            *(here->JFETsourceSourcePtr) += (gspr);            *(here->JFETdrainPrimeDrainPrimePtr) += (gdpr+gds+ggd);            *(here->JFETsourcePrimeSourcePrimePtr) += (gspr+gds+gm+ggs);        }    }    return(OK);}

⌨️ 快捷键说明

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