📄 mesaload.c
字号:
disatbvgt = isatb/etavth+isatb/mu*THETA; p = delgchgchi*dgchivgt; w = delgchgchi*dgchivds; dvsatevgt = delvsateisat*(delisatisata*disatavgt+delisatisatb*disatbvgt)+delvsategch*p; dvsatevds = delvsateisat*(delisatisata*disatavds+delisatisatb*disatbvgt*sigma)+delvsategch*w; if(ALPHA != 0) { if(vds == 0) gmmadd = 0; else gmmadd = (*cdrain)*(log(1+g)/(m*m)-g*log(vds/vsate)/(m*(1+g)))* ALPHA*delvgtevgt; gdsmadd = gmmadd*sigma; } else { gmmadd = 0; gdsmadd = 0; } here->MESAgm0 = p; here->MESAgm1 = delidvsate*dvsatevgt; here->MESAgm2 = dvgtvgs; g = delidgch*p+here->MESAgm1; *gm = (g+gmmadd)*dvgtvgs; here->MESAgds0 = delidvsate*dvsatevds+delidgch*w+gdsmadd; *gds = delidvds+here->MESAgds0; }static void mesa2(MESAmodel *model, MESAinstance *here, double vgs, double vds, double von, double *cdrain, double *gm, double *gds, double *capgs, double *capgd){ double vt; double rt; double vgt; double etavth; double vgt0; double sigma; double vgte; double isat; double isata; double isatb; double nsa; double nsb; double ns; double a; double b; double c; double d; double e; double f; double g; double h; double p; double q; double r; double s; double t; double gch; double gchi; double vsate; double vdse; double ca; double cb; double cgc; double delidgch; double delgchgchi; double delgchins; double delnsvgt; double delnsbvgt; double delnsavgte; double delvgtevgt; double delidvsate; double delvsateisat; double delisatisata; double delisatavgte; double delisatisatb; double delvsategch; double delisatbvgt; double delvsatevgt; double delidvds; double ddevgte; double delvgtvgs; vt = CONSTKoverQ * here->MESAts; etavth = ETA*vt; rt = RS+RD; vgt0 = vgs - von; s = exp((vgt0-VSIGMAT)/VSIGMA); sigma = SIGMA0/(1+s); vgt = vgt0+sigma*vds; t = vgt/vt-1; q = sqrt(model->MESAdeltaSqr+t*t); vgte = 0.5*vt*(2+t+q); a = 2*model->MESAbeta*vgte; if(vgt > model->MESAvpod) { if(vgte > model->MESAvpo) { nsa = NDELTA*TH + NDU*DU; ca = EPSILONGAAS/DU; delnsavgte = 0; } else { r = sqrt((model->MESAvpo-vgte)/model->MESAvpou); nsa = NDELTA*TH + NDU*DU*(1-r); ca = EPSILONGAAS/DU/r; delnsavgte = NDU*DU/model->MESAvpou/2.0/r; } } else { if(model->MESAvpod - vgte < 0) { nsa = NDELTA*TH*(1-DU/TH); ca = EPSILONGAAS/DU; delnsavgte = 0; } else { r = sqrt(1+NDU/NDELTA*(model->MESAvpod - vgte)/model->MESAvpou); nsa = NDELTA*TH*(1-DU/TH*(r-1)); ca = EPSILONGAAS/DU/r; delnsavgte = DU*NDU/2.0/model->MESAvpou/r; } } b = exp(vgt/etavth); cb = EPSILONGAAS/(DU+TH)*b; nsb = here->MESAnsb0*b; delnsbvgt = nsb/etavth; ns = nsa*nsb/(nsa+nsb); if(ns < 1.0e-38) { *cdrain = 0; *gm = 0.0; *gds = 0.0; *capgs = here->MESAcf; *capgd = here->MESAcf; return; } gchi = here->MESAgchi0*ns; gch = gchi/(1+gchi*rt); f = sqrt(1+2*a*RS); d = 1+a*RS + f; e = 1+TC*vgte; isata = a*vgte/d/e; isatb = here->MESAisatb0*b; isat = isata*isatb/(isata+isatb); vsate = isat/gch; vdse = vds*pow(1+pow(vds/vsate,MC),-1.0/MC); g = pow(vds/vsate,M0); h = pow(1+g,1.0/M0); here->MESAdelidgch0 = vds/h; delidgch = here->MESAdelidgch0*(1+LAMBDA*vds); *cdrain = gch*delidgch; cgc = W*L*ca*cb/(ca+cb); c = (vsate-vdse)/(2*vsate-vdse); c = c*c; *capgs = here->MESAcf+2.0/3.0*cgc*(1-c); c = vsate/(2*vsate-vdse); c = c*c; *capgd = here->MESAcf+2.0/3.0*cgc*(1-c); c = vgt/vt-1; delvgtevgt = 0.5*(1+t/q); here->MESAdelidvds0 = gch/h; if(vds != 0.0) here->MESAdelidvds1 = (*cdrain)*pow(vds/vsate,M0-1)/vsate/(1+g); else here->MESAdelidvds1 = 0.0; delidvds = here->MESAdelidvds0*(1+2*LAMBDA*vds) - here->MESAdelidvds1; delgchgchi = 1.0/(1+gchi*rt)/(1+gchi*rt); delgchins = here->MESAgchi0; r = nsa+nsb; r = r*r; delnsvgt = (nsb*nsb*delvgtevgt*delnsavgte + nsa*nsa*delnsbvgt)/r; delidvsate = (*cdrain)*g/vsate/(1+g); delvsateisat = 1.0/gch; r = isata+isatb; r = r*r; delisatisata = isatb*isatb/r; ddevgte = 2*model->MESAbeta*RS*(1+1.0/f)*e+d*TC; delisatavgte = (2*a*d*e - a*vgte*ddevgte)/d/d/e/e; delisatisatb = isata*isata/r; delisatbvgt = isatb/etavth; delvsategch = -vsate/gch; delvgtvgs = 1-SIGMA0*vds*s/VSIGMA/(1+s)/(1+s); p = delgchgchi*delgchins*delnsvgt; delvsatevgt = delvsateisat*(delisatisata*delisatavgte*delvgtevgt + delisatisatb*delisatbvgt) + delvsategch*p; here->MESAgm0 = p; here->MESAgm1 = delidvsate*delvsatevgt; here->MESAgm2 = delvgtvgs; g = delidgch*p + here->MESAgm1; *gm = g*delvgtvgs; here->MESAgds0 = g*sigma; *gds = delidvds+here->MESAgds0;}static void mesa3(MESAmodel *model, MESAinstance *here, double vgs, double vds, double von, double *cdrain, double *gm, double *gds, double *capgs, double *capgd){ 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 g; double h; double p; double q; double s; double t; double u; double temp; double etavth; double gch; double gchi; double gchim; double vsate; double vdse; double cgc; double cgcm; double rt; double vl; double delidgch; double delgchgchi; double delgchins; double delnsnsm; double delnsmvgt; double delvgtevgt; double delidvsate; double delvsateisat; double delisatisatm; double delisatmvgte; double delisatmgchim; double delvsategch; double delidvds; double delvgtvgs; double delvsatevgt; vt = CONSTKoverQ * here->MESAts; etavth = ETA*vt; vl = VS/MU0*L; rt = RS+RD; vgt0 = vgs - von; s = exp((vgt0-VSIGMAT)/VSIGMA); sigma = SIGMA0/(1+s); vgt = vgt0+sigma*vds; u = 0.5*vgt/vt-1; t = sqrt(model->MESAdeltaSqr+u*u); vgte = vt*(2+u+t); b = exp(vgt/etavth); nsm = 2*here->MESAn0*log(1+0.5*b); if(nsm < 1.0e-38) { *cdrain = 0; *gm = 0.0; *gds = 0.0; *capgs = here->MESAcf; *capgd = here->MESAcf; return; } c = pow(nsm/NMAX,GAMMA); q = pow(1+c,1.0/GAMMA); ns = nsm/q; gchi = here->MESAgchi0*ns; gch = gchi/(1+gchi*rt); gchim = here->MESAgchi0*nsm; h = sqrt(1+2*gchim*model->MESArsi + vgte*vgte/(vl*vl)); p = 1+gchim*RS+h; isatm = gchim*vgte/p; g = pow(isatm/here->MESAimax,GAMMA); isat = isatm/pow(1+g,1/GAMMA); vsate = isat/gch; vdse = vds*pow(1+pow(vds/vsate,MC),-1.0/MC); d = pow(vds/vsate,M0); e = pow(1+d,1.0/M0); delidgch = vds*(1+LAMBDA*vds)/e; *cdrain = gch*delidgch; cgcm = 1.0/(1/model->MESAcas*D/model->MESAepsi + 1/model->MESAcbs*etavth/CHARGE/here->MESAn0*exp(-vgt/etavth)); cgc = W*L*cgcm/pow(1+c,1+1.0/GAMMA);/* { char buf[256]; void far pascal OutputDebugString(char*); sprintf(buf,"\n%f\t%e\0",vgs,cgc); OutputDebugString(buf); }*/ a = (vsate-vdse)/(2*vsate-vdse); a = a*a; temp = 2.0/3.0; *capgs = here->MESAcf+temp*cgc*(1-a); a = vsate/(2*vsate-vdse); a = a*a; *capgd = here->MESAcf+temp*cgc*(1-a); delidvsate = (*cdrain)*d/vsate/(1+d); delidvds = gch*(1+2*LAMBDA*vds)/e-(*cdrain)* pow(vds/vsate,M0-1)/(vsate*(1+d)); a = 1+gchi*rt; delgchgchi = 1.0/(a*a); delgchins = here->MESAgchi0; delnsnsm = ns/nsm*(1-c/(1+c)); delnsmvgt = here->MESAn0/etavth/(1.0/b + 0.5); delvgtevgt = 0.5*(1+u/t); 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*RS*(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*here->MESAgchi0*delnsmvgt)+delvsategch*p); g = delidgch*p + delidvsate*delvsatevgt; *gm = g*delvgtvgs; *gds = delidvds + g*sigma;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -