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

📄 mesaload.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 3 页
字号:
  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 + -