📄 hfetload.c
字号:
*(ckt->CKTstate0 + here->HFETAvgspp) = vgspp; *(ckt->CKTstate0 + here->HFETAvgdpp) = vgdpp; *(ckt->CKTstate0 + here->HFETAcg) = cg; *(ckt->CKTstate0 + here->HFETAcd) = cd; *(ckt->CKTstate0 + here->HFETAcgd) = cgd; *(ckt->CKTstate0 + here->HFETAcgs) = cgs; *(ckt->CKTstate0 + here->HFETAcgspp) = cgspp; *(ckt->CKTstate0 + here->HFETAcgdpp) = cgdpp; *(ckt->CKTstate0 + here->HFETAgm) = gm; *(ckt->CKTstate0 + here->HFETAgds) = gds; *(ckt->CKTstate0 + here->HFETAggs) = ggs; *(ckt->CKTstate0 + here->HFETAggd) = ggd; *(ckt->CKTstate0 + here->HFETAggspp) = ggspp; *(ckt->CKTstate0 + here->HFETAggdpp) = ggdpp; *(ckt->CKTstate0 + here->HFETAgmg) = gmg; *(ckt->CKTstate0 + here->HFETAgmd) = gmd; /* * load current vector */load: m = here->HFETAm; ceqgd = model->HFETAtype*(cgd+cgdpp-ggd*vgd-gmg*vgs-gmd*vds-ggdpp*vgdpp); ceqgs = model->HFETAtype*(cgs + cgspp - ggs*vgs - ggspp*vgspp); cdreq = model->HFETAtype*(cd + cgd + cgdpp - gds*vds - gm*vgs); *(ckt->CKTrhs + here->HFETAgatePrimeNode) += m * (-ceqgs-ceqgd); ceqgd = model->HFETAtype*(cgd-ggd*vgd-gmg*vgs-gmd*vds); *(ckt->CKTrhs + here->HFETAdrainPrimeNode) += m * (-cdreq+ceqgd); ceqgd = model->HFETAtype*(cgdpp-ggdpp*vgdpp); *(ckt->CKTrhs + here->HFETAdrainPrmPrmNode) += m * ceqgd; ceqgs = model->HFETAtype*(cgs-ggs*vgs); *(ckt->CKTrhs + here->HFETAsourcePrimeNode) += m * (cdreq+ceqgs); ceqgs = model->HFETAtype*(cgspp-ggspp*vgspp); *(ckt->CKTrhs + here->HFETAsourcePrmPrmNode) += m * ceqgs; /* * load y matrix */ *(here->HFETAdrainDrainPtr) += m * (model->HFETAdrainConduct); *(here->HFETAsourceSourcePtr) += m * (model->HFETAsourceConduct); *(here->HFETAgatePrimeGatePrimePtr) += m * (ggd+ggs+ggspp+ggdpp+gmg+model->HFETAgateConduct); *(here->HFETAdrainPrimeDrainPrimePtr) += m * (gds+ggd-gmd+model->HFETAdrainConduct+model->HFETAgf); *(here->HFETAsourcePrimeSourcePrimePtr) += m * (gds+gm+ggs+model->HFETAsourceConduct+model->HFETAgi); *(here->HFETAsourcePrmPrmSourcePrmPrmPtr) += m * (model->HFETAgi+ggspp); *(here->HFETAdrainPrmPrmDrainPrmPrmPtr) += m * (model->HFETAgf+ggdpp); *(here->HFETAdrainDrainPrimePtr) -= m * (model->HFETAdrainConduct); *(here->HFETAdrainPrimeDrainPtr) -= m * (model->HFETAdrainConduct); *(here->HFETAsourceSourcePrimePtr) -= m * (model->HFETAsourceConduct); *(here->HFETAsourcePrimeSourcePtr) -= m * (model->HFETAsourceConduct); *(here->HFETAgatePrimeDrainPrimePtr) += m * (-ggd+gmd); *(here->HFETAdrainPrimeGatePrimePtr) += m * (gm-ggd-gmg); *(here->HFETAgatePrimeSourcePrimePtr) -= m * (ggs+gmg+gmd); *(here->HFETAsourcePrimeGatePrimePtr) += m * (-ggs-gm); *(here->HFETAdrainPrimeSourcePrimePtr) += m * (-gds-gm+gmg+gmd); *(here->HFETAsourcePrimeDrainPrimePtr) -= m * (gds); *(here->HFETAsourcePrimeSourcePrmPrmPtr) -= m * (model->HFETAgi); *(here->HFETAsourcePrmPrmSourcePrimePtr) -= m * (model->HFETAgi); *(here->HFETAgatePrimeSourcePrmPrmPtr) -= m * (ggspp); *(here->HFETAsourcePrmPrmGatePrimePtr) -= m * (ggspp); *(here->HFETAdrainPrimeDrainPrmPrmPtr) -= m * (model->HFETAgf); *(here->HFETAdrainPrmPrmDrainPrimePtr) -= m * (model->HFETAgf); *(here->HFETAgatePrimeDrainPrmPrmPtr) -= m * (ggdpp); *(here->HFETAdrainPrmPrmGatePrimePtr) -= m * (ggdpp); *(here->HFETAgateGatePtr) += m * (model->HFETAgateConduct); *(here->HFETAgateGatePrimePtr) -= m * (model->HFETAgateConduct); *(here->HFETAgatePrimeGatePtr) -= m * (model->HFETAgateConduct); } } return(OK);}static void leak(double gmin, double vt, double v, double rs, double is1, double is2, double m1, double m2, double *il, double *gl){ double vt1 = vt*m1; double vt2 = vt*m2; if(v > -10*vt1) { double dvdi0; double iaprox; double iaprox1; double iaprox2; double v0; double vteff = vt1 + vt2; double iseff = is2*pow((is1/is2),(m1/(m1+m2))); if(rs > 0) { double unorm = (v + rs*is1)/vt1 + log(rs*is1/vt1); iaprox1 = vt1*diode(unorm)/rs - is1; unorm = (v + rs*iseff)/vteff + log(rs*iseff/vteff); iaprox2 = vteff*diode(unorm)/rs - iseff; } else { iaprox1 = is1*(exp(v/vt1) - 1); iaprox2 = iseff*(exp(v/vteff) - 1); } if((iaprox1*iaprox2) != 0.0) iaprox = 1./(1./iaprox1 + 1./iaprox2); else iaprox = 0.5*(iaprox1 + iaprox2); dvdi0 = rs + vt1/(iaprox+is1) + vt2/(iaprox+is2); v0 = rs*iaprox; v0 += vt1*log(iaprox/is1 + 1) + vt2*log(iaprox/is2 + 1); //*il = __max(-is1,iaprox + (v - v0)/dvdi0)*0.99999; *il = MAX(-is1,iaprox + (v - v0)/dvdi0)*0.99999; *gl = 1./(rs + vt1/(*il+is1) + vt2/(*il+is2)); } else { *gl = gmin; *il = (*gl)*v-is1; }}static void hfeta(HFETAmodel *model, HFETAinstance *here, CKTcircuit *ckt, double vgs, double vds, double *cdrain, double *gm, double *gds, double *capgs, double *capgd, double *cgd, double *gmg, double *gmd, double *cgs, double *ggs){ double vt; double vgt; double vgt0; double sigma; double vgte; double isat; double isatm; double ns; double nsm; double a; double b; double c; double d; double e; double f; double g; double h; double p; double q; double s; double t; double u; double nsc = 0.0; double nsn = 0.0; double temp; double etavth; double gch; double gchi; double gchim; double vsate = 0.0; double vdse; double cg1; double cgc; double rt; double vl; double delidgch; double delgchgchi; double delgchins; double delnsnsm; double delnsmvgt; double delvgtevgt = 0.0; double delidvsate; double delvsateisat; double delisatisatm; double delisatmvgte; double delisatmgchim; double delvsategch; double delidvds; double delvgtvgs = 0.0; double delvsatevgt = 0.0; vt = CONSTKoverQ*TEMP; etavth = ETA*vt; vl = VS/TMU*L; rt = RSI+RDI; vgt0 = vgs - TVTO; s = exp((vgt0-VSIGMAT)/VSIGMA); sigma = SIGMA0/(1+s); vgt = vgt0+sigma*vds; u = 0.5*vgt/vt-1; t = sqrt(model->HFETAdeltaSqr+u*u); vgte = vt*(2+u+t); b = exp(vgt/etavth); if(model->HFETAeta2Given && model->HFETAd2Given) { nsc = N02*exp((vgt+TVTO-VT2)/(ETA2*vt)); nsn = 2*N0*log(1+0.5*b); nsm = nsn*nsc/(nsn+nsc); } else { nsm = 2*N0*log(1+0.5*b); } if(nsm < 1.0e-38) { *cdrain = 0; *gm = 0.0; *gds = 0.0; *capgs = CF; *capgd = CF; goto cgd_calc; } c = pow(nsm/NMAX,GAMMA); q = pow(1+c,1.0/GAMMA); ns = nsm/q; gchi = GCHI0*ns; gch = gchi/(1+gchi*rt); gchim = GCHI0*nsm; h = sqrt(1+2*gchim*RSI + vgte*vgte/(vl*vl)); p = 1+gchim*RSI+h; isatm = gchim*vgte/p; g = pow(isatm/IMAX,GAMMA); isat = isatm/pow(1+g,1/GAMMA); vsate = isat/gch; d = pow(vds/vsate,M); e = pow(1+d,1.0/M); delidgch = vds*(1+TLAMBDA*vds)/e; *cdrain = gch*delidgch; delidvsate = (*cdrain)*d/vsate/(1+d); delidvds = gch*(1+2*TLAMBDA*vds)/e-(*cdrain)* pow(vds/vsate,M-1)/(vsate*(1+d)); a = 1+gchi*rt; delgchgchi = 1.0/(a*a); delgchins = GCHI0; delnsnsm = ns/nsm*(1-c/(1+c)); delvgtevgt = 0.5*(1+u/t); delnsmvgt = N0/etavth/(1.0/b + 0.5); if(model->HFETAeta2Given && model->HFETAd2Given) delnsmvgt = nsc*(nsc*delnsmvgt+nsn*nsn/(ETA2*vt))/((nsc+nsn)*(nsc+nsn)); delvsateisat = 1.0/gch; delisatisatm = isat/isatm*(1-g/(1+g)); delisatmvgte = gchim*(p - vgte*vgte/(vl*vl*h))/(p*p); delvsategch = -vsate/gch; delisatmgchim = vgte*(p - gchim*RSI*(1+1.0/h))/(p*p); delvgtvgs = 1-vds*SIGMA0/VSIGMA*s/((1+s)*(1+s)); p = delgchgchi*delgchins*delnsnsm*delnsmvgt; delvsatevgt = (delvsateisat*delisatisatm*(delisatmvgte*delvgtevgt + delisatmgchim*GCHI0*delnsmvgt)+delvsategch*p); g = delidgch*p + delidvsate*delvsatevgt; *gm = g*delvgtvgs; *gds = delidvds + g*sigma; // Capacitance calculations temp = ETA1*vt; cg1 = 1/(D1/EPSI+temp*exp(-(vgs-IN_VT1)/temp)); cgc = W*L*(CHARGE*delnsnsm*delnsmvgt*delvgtvgs+cg1); vdse = vds*pow(1+pow(vds/vsate,MC),-1.0/MC); a = (vsate-vdse)/(2*vsate-vdse); a = a*a; temp = 2.0/3.0; p = PM + (1-PM)*exp(-vds/vsate); *capgs = CF+2*temp*cgc*(1-a)/(1+p); a = vsate/(2*vsate-vdse); a = a*a; *capgd = CF+2*p*temp*cgc*(1-a)/(1+p);/* { char buf[128]; FILE *fp; fp = fopen("d:\\temp\\debug.txt","at"); sprintf(buf,"%f\t%f\t%e\t%e\n",vgs,vds,W*L*CHARGE*delnsnsm*delnsmvgt*delvgtvgs,cgc); fputs(buf,fp); fclose(fp); }*/ cgd_calc: if(model->HFETAgatemod != 0) { // Gate-drain current calculation double vkneet; double vmax; double td; double delcgdvgs; double delcgdtd; double deltdvdse; double deltdvkneet; double delvdsevmax; double delvdsevds; double dvdsevgs; double dvdsevds; double dtdvgs; double dtdvds; vkneet = CK1*vsate+CK2; vmax = CM1*vsate+CM2; a = pow(vds/vmax,MT2); b = pow(1+a,1/MT2); vdse = vds/b; c = pow(vdse/vkneet,MT1); d = pow(1+c,1/MT1); td = TEMP+TALPHA*vdse*vdse/d; e = CONSTKoverQ*td*M2D; p = PHIB/(CONSTboltz*td); f = exp(-p); q = (vgs-vdse)/e; g = exp(q); h = ISO*td*td*f*g; *cgd = h - ISO*TEMP*TEMP*exp(-PHIB/(CONSTboltz*TEMP)); delcgdvgs = h/e; delcgdtd = h*(p-q+2)/td; deltdvdse = TALPHA*vdse*(2-c/(1+c))/d; deltdvkneet = (td-TEMP)*c/((1+c)*vkneet); delvdsevmax = vdse*a/((1+a)*vmax); delvdsevds = (1-a/(1+a))/b; temp = delvsatevgt*delvgtvgs; dvdsevgs = delvdsevmax*CM1*temp; dtdvgs = deltdvdse*dvdsevgs+deltdvkneet*CK1*temp; *gmg = delcgdvgs+delcgdtd*dtdvgs; temp = delvsatevgt*sigma; dvdsevds = delvdsevds+delvdsevmax*CM1*temp; dtdvds = deltdvdse*dvdsevds+deltdvkneet*CK1*temp; *gmd = -delcgdvgs*dvdsevds+delcgdtd*dtdvds; } else { gmg = 0; gmd = 0; } if(model->HFETAgatemod != 0) { // Gate-source current calculation double evgs; double vtn = vt*M2S; double csat = ISO*TEMP*TEMP*exp(-PHIB/(CONSTboltz*TEMP)); if (vgs <= -5*vt) { *ggs = -csat/vgs+ckt->CKTgmin; *cgs = (*ggs)*vgs; } else { evgs = exp(vgs/vtn); *ggs = csat*evgs/vtn+ckt->CKTgmin; *cgs = csat*(evgs-1)+ckt->CKTgmin*vgs; } } if(model->HFETAgatemod != 0 && (A1 != 0.0 || A2 != 0.0)) { // Correction current calculations double vmax; double delvdsevmax; double delvdsevds; double dvdsevgs; double dvdsevds; vmax = CM3*vsate; a = pow(vds/vmax,MV1); b = pow(1+a,1/MV1); vdse = vds/b; delvdsevmax = vdse*a/((1+a)*vmax); delvdsevds = (1-a/(1+a))/b; dvdsevgs = delvdsevmax*CM3*delvsatevgt*delvgtvgs; dvdsevds = delvdsevds+delvdsevmax*CM3*delvsatevgt*sigma; c = vgte*vdse; d = 1+A2*c; e = vdse*delvgtevgt; f = A2*(*cgd); *cdrain += A1*(d*(*cgd) - (*cgs)); *gds += A1*(d*(*gmd)+f*(vgte*dvdsevds+e*sigma)); *gm += A1*(d*(*gmg)+f*(vgte*dvdsevgs+e*delvgtvgs) - (*ggs)); }}double diode(double u){#define U0 (-2.303)#define A (2.221)#define B (6.804)#define C (1.685) double it; double ut; double b; double c; double i; double expu=exp(u); if(u <= U0) { it = expu*(1-expu); }else { b = 0.5*(u-U0); it = u + A*exp((U0-u)/B) - log(b+sqrt(b*b + 0.25*C*C)); } ut = it + log(it); b = u-ut; c = 1+it; i = it*(1 + b/c + 0.5*b*b/c/c/c); return(i);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -