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

📄 hfetload.c

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