📄 jfetload.c
字号:
/**********Copyright 1990 Regents of the University of California. All rights reserved.Author: 1985 Thomas L. QuarlesSydney University mods Copyright(c) 1989 Anthony E. Parker, David J. Skellern Laboratory for Communication Science Engineering Sydney University Department of Electrical Engineering, Australia**********/#include "spice.h"#include <stdio.h>#include "util.h"#include "cktdefs.h"#include "jfetdefs.h"#include "const.h"#include "trandefs.h"#include "sperror.h"#include "devdefs.h"#include "suffix.h"intJFETload(inModel,ckt) GENmodel *inModel; CKTcircuit *ckt; /* actually load the current resistance value into the * sparse matrix previously provided */{ register JFETmodel *model = (JFETmodel*)inModel; register JFETinstance *here; double beta; double betap; double capgd; double capgs; double cd; double cdhat; double cdrain; double cdreq; double ceq; double ceqgd; double ceqgs; double cg; double cgd; double cghat; double csat; double czgd; double czgdf2; double czgs; double czgsf2; double delvds; double delvgd; double delvgs; double evgd; double evgs; double fcpb2; double gdpr; double gds; double geq; double ggd; double ggs; double gm; double gspr; double sarg; double twob; double twop; double vds; double vgd; double vgdt; double vgs; double vgst; double xfact; /* Modification for Sydney University JFET model */ double phib,vto; double apart,bpart,cpart; double Bfac; double vgd1,vgs1; /* end Sydney University mod. */ int icheck; int ichk1; int error; /* loop through all the models */ for( ; model != NULL; model = model->JFETnextModel ) { /* loop through all the instances of the model */ for (here = model->JFETinstances; here != NULL ; here=here->JFETnextInstance) { if (here->JFETowner != ARCHme) continue; /* * dc model parameters */ beta = model->JFETbeta * here->JFETarea; gdpr=model->JFETdrainConduct*here->JFETarea; gspr=model->JFETsourceConduct*here->JFETarea; csat=here->JFETtSatCur*here->JFETarea; /* * initialization */ icheck=1; if( ckt->CKTmode & MODEINITSMSIG) { vgs= *(ckt->CKTstate0 + here->JFETvgs); vgd= *(ckt->CKTstate0 + here->JFETvgd); } else if (ckt->CKTmode & MODEINITTRAN) { vgs= *(ckt->CKTstate1 + here->JFETvgs); vgd= *(ckt->CKTstate1 + here->JFETvgd); } else if ( (ckt->CKTmode & MODEINITJCT) && (ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC) ) { vds=model->JFETtype*here->JFETicVDS; vgs=model->JFETtype*here->JFETicVGS; vgd=vgs-vds; } else if ( (ckt->CKTmode & MODEINITJCT) && (here->JFEToff == 0) ) { vgs = -1; vgd = -1; } else if( (ckt->CKTmode & MODEINITJCT) || ((ckt->CKTmode & MODEINITFIX) && (here->JFEToff))) { vgs = 0; vgd = 0; } else {#ifndef PREDICTOR if(ckt->CKTmode & MODEINITPRED) { xfact=ckt->CKTdelta/ckt->CKTdeltaOld[1]; *(ckt->CKTstate0 + here->JFETvgs)= *(ckt->CKTstate1 + here->JFETvgs); vgs=(1+xfact)* *(ckt->CKTstate1 + here->JFETvgs)-xfact* *(ckt->CKTstate2 + here->JFETvgs); *(ckt->CKTstate0 + here->JFETvgd)= *(ckt->CKTstate1 + here->JFETvgd); vgd=(1+xfact)* *(ckt->CKTstate1 + here->JFETvgd)-xfact* *(ckt->CKTstate2 + here->JFETvgd); *(ckt->CKTstate0 + here->JFETcg)= *(ckt->CKTstate1 + here->JFETcg); *(ckt->CKTstate0 + here->JFETcd)= *(ckt->CKTstate1 + here->JFETcd); *(ckt->CKTstate0 + here->JFETcgd)= *(ckt->CKTstate1 + here->JFETcgd); *(ckt->CKTstate0 + here->JFETgm)= *(ckt->CKTstate1 + here->JFETgm); *(ckt->CKTstate0 + here->JFETgds)= *(ckt->CKTstate1 + here->JFETgds); *(ckt->CKTstate0 + here->JFETggs)= *(ckt->CKTstate1 + here->JFETggs); *(ckt->CKTstate0 + here->JFETggd)= *(ckt->CKTstate1 + here->JFETggd); } else {#endif /*PREDICTOR*/ /* * compute new nonlinear branch voltages */ vgs=model->JFETtype* (*(ckt->CKTrhsOld+ here->JFETgateNode)- *(ckt->CKTrhsOld+ here->JFETsourcePrimeNode)); vgd=model->JFETtype* (*(ckt->CKTrhsOld+here->JFETgateNode)- *(ckt->CKTrhsOld+ here->JFETdrainPrimeNode));#ifndef PREDICTOR }#endif /*PREDICTOR*/ delvgs=vgs- *(ckt->CKTstate0 + here->JFETvgs); delvgd=vgd- *(ckt->CKTstate0 + here->JFETvgd); delvds=delvgs-delvgd; cghat= *(ckt->CKTstate0 + here->JFETcg)+ *(ckt->CKTstate0 + here->JFETggd)*delvgd+ *(ckt->CKTstate0 + here->JFETggs)*delvgs; cdhat= *(ckt->CKTstate0 + here->JFETcd)+ *(ckt->CKTstate0 + here->JFETgm)*delvgs+ *(ckt->CKTstate0 + here->JFETgds)*delvds- *(ckt->CKTstate0 + here->JFETggd)*delvgd; /* * bypass if solution has not changed */ if((ckt->CKTbypass) && (!(ckt->CKTmode & MODEINITPRED)) && (FABS(delvgs) < ckt->CKTreltol*MAX(FABS(vgs), FABS(*(ckt->CKTstate0 + here->JFETvgs)))+ ckt->CKTvoltTol) ) if ( (FABS(delvgd) < ckt->CKTreltol*MAX(FABS(vgd), FABS(*(ckt->CKTstate0 + here->JFETvgd)))+ ckt->CKTvoltTol)) if ( (FABS(cghat-*(ckt->CKTstate0 + here->JFETcg)) < ckt->CKTreltol*MAX(FABS(cghat), FABS(*(ckt->CKTstate0 + here->JFETcg)))+ ckt->CKTabstol) ) if ( /* hack - expression too big */ (FABS(cdhat-*(ckt->CKTstate0 + here->JFETcd)) < ckt->CKTreltol*MAX(FABS(cdhat), FABS(*(ckt->CKTstate0 + here->JFETcd)))+ ckt->CKTabstol) ) { /* we can do a bypass */ vgs= *(ckt->CKTstate0 + here->JFETvgs); vgd= *(ckt->CKTstate0 + here->JFETvgd); vds= vgs-vgd; cg= *(ckt->CKTstate0 + here->JFETcg); cd= *(ckt->CKTstate0 + here->JFETcd); cgd= *(ckt->CKTstate0 + here->JFETcgd); gm= *(ckt->CKTstate0 + here->JFETgm); gds= *(ckt->CKTstate0 + here->JFETgds); ggs= *(ckt->CKTstate0 + here->JFETggs); ggd= *(ckt->CKTstate0 + here->JFETggd); goto load; } /* * limit nonlinear branch voltages */ ichk1=1; vgs = DEVpnjlim(vgs,*(ckt->CKTstate0 + here->JFETvgs), (here->JFETtemp*CONSTKoverQ), here->JFETvcrit, &icheck); vgd = DEVpnjlim(vgd,*(ckt->CKTstate0 + here->JFETvgd), (here->JFETtemp*CONSTKoverQ), here->JFETvcrit,&ichk1); if (ichk1 == 1) { icheck=1; } vgs = DEVfetlim(vgs,*(ckt->CKTstate0 + here->JFETvgs), model->JFETthreshold); vgd = DEVfetlim(vgd,*(ckt->CKTstate0 + here->JFETvgd), model->JFETthreshold); } /* * determine dc current and derivatives */ vds=vgs-vgd; if (vgs <= -5*here->JFETtemp*CONSTKoverQ) { ggs = -csat/vgs+ckt->CKTgmin; cg = ggs*vgs; } else { evgs = exp(vgs/(here->JFETtemp*CONSTKoverQ)); ggs = csat*evgs/(here->JFETtemp*CONSTKoverQ)+ckt->CKTgmin; cg = csat*(evgs-1)+ckt->CKTgmin*vgs; } if (vgd <= -5*(here->JFETtemp*CONSTKoverQ)) { ggd = -csat/vgd+ckt->CKTgmin; cgd = ggd*vgd; } else { evgd = exp(vgd/(here->JFETtemp*CONSTKoverQ)); ggd = csat*evgd/(here->JFETtemp*CONSTKoverQ)+ckt->CKTgmin; cgd = csat*(evgd-1)+ckt->CKTgmin*vgd; } cg = cg+cgd; /* Modification for Sydney University JFET model */ vto = model->JFETthreshold; if (vds >= 0) { vgst = vgs - vto; /* * compute drain current and derivatives for normal mode */ if (vgst <= 0) { /* * normal mode, cutoff region */ cdrain = 0; gm = 0; gds = 0; } else { betap = beta*(1 + model->JFETlModulation*vds); Bfac = model->JFETbFac; if (vgst >= vds) { /*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -