📄 jfetload.c
字号:
* 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 + -