📄 mos2dset.c
字号:
TimesDeriv(&d_sarg,&d_sarg,sphi); dsrgdb = -0.5*sarg*sarg/sphi3; MultDeriv(&d_dsrgdb,&d_sarg,&d_sarg); TimesDeriv(&d_dsrgdb,&d_dsrgdb,-0.5/sphi3); /* tmp = sarg/sphi3; */ } if ((lvds-lvbs) >= 0) { barg = sqrt(phiMinVbs+lvds); EqualDeriv(&d_barg,&d_phiMinVbs); d_barg.value += lvds; d_barg.d1_r += 1.0; SqrtDeriv(&d_barg,&d_barg); dbrgdb = -0.5/barg; InvDeriv(&d_dbrgdb,&d_barg); TimesDeriv(&d_dbrgdb,&d_dbrgdb,-0.5); } else { barg = sphi/(1.0+0.5*(lvbs-lvds)/here->MOS2tPhi); EqualDeriv(&d_barg,&d_q); d_barg.value = lvbs - lvds; d_barg.d1_r -= 1.0; TimesDeriv(&d_barg,&d_barg,0.5/here->MOS2tPhi); d_barg.value += 1.0; InvDeriv(&d_barg,&d_barg); TimesDeriv(&d_barg,&d_barg,sphi); dbrgdb = -0.5*barg*barg/sphi3; MultDeriv(&d_dbrgdb,&d_barg,&d_barg); TimesDeriv(&d_dbrgdb,&d_dbrgdb,-0.5/sphi3); /* tmp = barg/sphi3; */ } /* * calculate threshold voltage (von) * narrow-channel effect */ /*XXX constant per device */ factor = 0.125*model->MOS2narrowFactor*2.0*M_PI*EPSSIL/ OxideCap*EffectiveLength; /*XXX constant per device */ eta = 1.0+factor; vbin = here->MOS2tVbi*model->MOS2type+factor*phiMinVbs; /* mistake! fixed Dec 7 '89 TimesDeriv(&d_vbin,&d_phiMinVbs,here->MOS2tVbi* model->MOS2type+factor); */ TimesDeriv(&d_vbin,&d_phiMinVbs,factor); d_vbin.value += here->MOS2tVbi*model->MOS2type; if ((model->MOS2gamma > 0.0) || (model->MOS2substrateDoping > 0.0)) { xwd = model->MOS2xd*barg; xws = model->MOS2xd*sarg; TimesDeriv(&d_xwd,&d_barg,model->MOS2xd); TimesDeriv(&d_xws,&d_sarg,model->MOS2xd); /* * short-channel effect with vds .ne. 0.0 */ argss = 0.0; argsd = 0.0; EqualDeriv(&d_argss,&d_zero); EqualDeriv(&d_argsd,&d_zero); if (model->MOS2junctionDepth > 0) { tmp = 2.0/model->MOS2junctionDepth; /*const*/ argxs = 1.0+xws*tmp; TimesDeriv(&d_argxs,&d_xws,tmp); d_argxs.value += 1.0; argxd = 1.0+xwd*tmp; TimesDeriv(&d_argxd,&d_xwd,tmp); d_argxd.value += 1.0; args = sqrt(argxs); SqrtDeriv(&d_args,&d_argxs); argd = sqrt(argxd); SqrtDeriv(&d_argd,&d_argxd); tmp = .5*model->MOS2junctionDepth/EffectiveLength; argss = tmp * (args-1.0); TimesDeriv(&d_argss,&d_args,tmp); d_argss.value -= tmp; argsd = tmp * (argd-1.0); TimesDeriv(&d_argsd,&d_argd,tmp); d_argsd.value -= tmp; } gamasd = model->MOS2gamma*(1.0-argss-argsd); PlusDeriv(&d_gamasd,&d_argss,&d_argsd); d_gamasd.value -= 1.0; TimesDeriv(&d_gamasd,&d_gamasd,-model->MOS2gamma); dbxwd = model->MOS2xd*dbrgdb; dbxws = model->MOS2xd*dsrgdb; TimesDeriv(&d_dbxwd,&d_dbrgdb,model->MOS2xd); TimesDeriv(&d_dbxws,&d_dsrgdb,model->MOS2xd); if (model->MOS2junctionDepth > 0) { tmp = 0.5/EffectiveLength; dbargs = tmp*dbxws/args; dbargd = tmp*dbxwd/argd; DivDeriv(&d_dbargs,&d_dbxws,&d_args); DivDeriv(&d_dbargd,&d_dbxwd,&d_argd); TimesDeriv(&d_dbargs,&d_dbargs,tmp); TimesDeriv(&d_dbargd,&d_dbargd,tmp); } dgddvb = -model->MOS2gamma*(dbargs+dbargd); PlusDeriv(&d_dgddvb,&d_dbargs,&d_dbargd); TimesDeriv(&d_dgddvb,&d_dgddvb,-model->MOS2gamma); if (model->MOS2junctionDepth > 0) { } } else { gamasd = model->MOS2gamma; gammad = model->MOS2gamma; EqualDeriv(&d_gamasd,&d_zero); EqualDeriv(&d_gammad,&d_zero); d_gamasd.value = d_gammad.value = model->MOS2gamma; dgddvb = 0.0; EqualDeriv(&d_dgddvb,&d_zero); } von = vbin+gamasd*sarg; MultDeriv(&d_von,&d_gamasd,&d_sarg); PlusDeriv(&d_von,&d_von,&d_vbin); /* vth = von; EqualDeriv(&d_vth,&d_von); */ vdsat = 0.0; EqualDeriv(&d_vdsat,&d_zero); if (model->MOS2fastSurfaceStateDensity != 0.0 && OxideCap != 0.0) { /* XXX constant per model */ cfs = CHARGE*model->MOS2fastSurfaceStateDensity* 1e4 /*(cm**2/m**2)*/; cdonco = -(gamasd*dsrgdb + dgddvb*sarg) + factor; MultDeriv(&d_dummy,&d_dgddvb,&d_sarg); MultDeriv(&d_cdonco,&d_gamasd,&d_dsrgdb); PlusDeriv(&d_cdonco,&d_cdonco,&d_dummy); TimesDeriv(&d_cdonco,&d_cdonco,-1.0); d_cdonco.value += factor; xn = 1.0+cfs/OxideCap*here->MOS2w*EffectiveLength+cdonco; EqualDeriv(&d_xn,&d_cdonco); d_xn.value = xn; tmp = vt*xn; TimesDeriv(&d_tmp,&d_xn,vt); von = von+tmp; PlusDeriv(&d_von,&d_von,&d_tmp); argg = 1.0/tmp; InvDeriv(&d_argg,&d_tmp); vgst = lvgs-von; TimesDeriv(&d_vgst,&d_von,-1.0); PlusDeriv(&d_vgst,&d_vgst,&d_p); d_vgst.value += lvgs; } else { vgst = lvgs-von; TimesDeriv(&d_vgst,&d_von,-1.0); PlusDeriv(&d_vgst,&d_vgst,&d_p); d_vgst.value += lvgs; if (lvgs <= von) { /* * cutoff region */ here->MOS2gds = 0.0; /* look at this later */ goto line1050; } } /* * compute some more useful quantities */ sarg3 = sarg*sarg*sarg; CubeDeriv(&d_sarg3,&d_sarg); /* XXX constant per model */ sbiarg = sqrt(here->MOS2tBulkPot); /*const*/ gammad = gamasd; EqualDeriv(&d_gammad,&d_gamasd); body = barg*barg*barg-sarg3; TimesDeriv(&d_body,&d_sarg3,-1.0); CubeDeriv(&d_dummy,&d_barg); PlusDeriv(&d_body,&d_body,&d_dummy); if (model->MOS2fastSurfaceStateDensity == 0.0) goto line400; if (OxideCap == 0.0) goto line410; /* * evaluate effective mobility and its derivatives */line400: if (OxideCap <= 0.0) goto line410; udenom = vgst; EqualDeriv(&d_udenom,&d_vgst); tmp = model->MOS2critField * 100 /* cm/m */ * EPSSIL/ model->MOS2oxideCapFactor; if (udenom <= tmp) goto line410; ufact = exp(model->MOS2critFieldExp*log(tmp/udenom)); /* dummy = tmp/udenom */ InvDeriv(&d_dummy,&d_udenom); TimesDeriv(&d_dummy,&d_dummy,tmp); PowDeriv(&d_ufact,&d_dummy,model->MOS2critFieldExp); ueff = model->MOS2surfaceMobility * 1e-4 /*(m**2/cm**2) */ *ufact; TimesDeriv(&d_ueff,&d_ufact,model->MOS2surfaceMobility * 1e-4); goto line500;line410: ufact = 0.0; EqualDeriv(&d_ufact,&d_zero); ueff = model->MOS2surfaceMobility * 1e-4 /*(m**2/cm**2) */ ; EqualDeriv(&d_ueff,&d_zero); d_ueff.value = ueff; /* * evaluate saturation voltage and its derivatives according to * grove-frohman equation */line500: vgsx = lvgs; EqualDeriv(&d_vgsx,&d_p); d_vgsx.value = lvgs; gammad = gamasd/eta; /* eta is a constant */ TimesDeriv(&d_gammad,&d_gamasd,1/eta); if (model->MOS2fastSurfaceStateDensity != 0 && OxideCap != 0) { vgsx = MAX(lvgs,von); /* mistake! fixed Dec 8 '89 if (vgsx < von) { } */ if (lvgs > von) { EqualDeriv(&d_vgsx,&d_p);d_vgsx.value = lvgs; } else { EqualDeriv(&d_vgsx,&d_von); } } if (gammad > 0) { gammd2 = gammad*gammad; MultDeriv(&d_gammd2,&d_gammad,&d_gammad); argv = (vgsx-vbin)/eta+phiMinVbs; TimesDeriv(&d_argv,&d_vbin,-1.0); PlusDeriv(&d_argv,&d_vgsx,&d_vgsx); TimesDeriv(&d_argv,&d_argv,1/eta); PlusDeriv(&d_argv,&d_argv,&d_phiMinVbs); if (argv <= 0.0) { vdsat = 0.0; EqualDeriv(&d_vdsat,&d_zero); } else { arg = sqrt(1.0+4.0*argv/gammd2); DivDeriv(&d_arg,&d_argv,&d_gammd2); TimesDeriv(&d_arg,&d_arg,4.0);d_arg.value += 1.0; SqrtDeriv(&d_arg,&d_arg); /* dumarg= sqrt(gammd2*gammd2 +4*argv*gammd2); TimesDeriv(&d_dumarg,&d_argv,4.0); PlusDeriv(&d_dumarg,&d_dumarg,&d_gammd2); MultDeriv(&d_dumarg,&d_dumarg,&d_gammd2); SqrtDeriv(&d_dumarg,&d_dumarg); vdsat = (vgsx-vbin)/eta+gammd2*(1.0-arg)/2.0; /* distortion vdsat=(vgsx-vbin)/eta + (gammd2 - dumarg)/2.0 = argv - phiMinVbs + (gammd2 - dumarg)/2 */ TimesDeriv(&d_dummy,&d_dumarg,-1.0); PlusDeriv(&d_dummy,&d_dummy,&d_gammd2); TimesDeriv(&d_dummy,&d_dummy,0.5); TimesDeriv(&d_vdsat,&d_phiMinVbs,-1.0); PlusDeriv(&d_vdsat,&d_vdsat,&d_argv); PlusDeriv(&d_vdsat,&d_dummy,&d_vdsat); vdsat = MAX(vdsat,0.0); if (vdsat < 0.0) { EqualDeriv(&d_vdsat,&d_zero); } } } else { vdsat = (vgsx-vbin)/eta; TimesDeriv(&d_vdsat,&d_vbin,-1.0); PlusDeriv(&d_vdsat,&d_vgsx,&d_vdsat); TimesDeriv(&d_vdsat,&d_vdsat,1/eta); vdsat = MAX(vdsat,0.0); if (vdsat < 0.0) { EqualDeriv(&d_vdsat,&d_zero); } } if (model->MOS2maxDriftVel > 0) { /* * evaluate saturation voltage and its derivatives * according to baum's theory of scattering velocity * saturation */ gammd2 = gammad*gammad; MultDeriv(&d_gammd2,&d_gammad,&d_gammad); v1 = (vgsx-vbin)/eta+phiMinVbs; TimesDeriv(&d_v1,&d_vbin,-1.0); /* mistake ! (fixed Dec 7 '89) thanks to Jean Hsu PlusDeriv(&d_v1,&d_vgsx,&d_vgsx); */ PlusDeriv(&d_v1,&d_v1,&d_vgsx); TimesDeriv(&d_v1,&d_v1,1/eta); PlusDeriv(&d_v1,&d_v1,&d_phiMinVbs); v2 = phiMinVbs; EqualDeriv(&d_v2,&d_phiMinVbs); xv = model->MOS2maxDriftVel*EffectiveLength/ueff; InvDeriv(&d_xv,&d_ueff); TimesDeriv(&d_xv,&d_xv,model->MOS2maxDriftVel*EffectiveLength); a1 = gammad/0.75; TimesDeriv(&d_a1,&d_gammad,4.0/3.0); /* dummy1 = a1 */ b1 = -2.0*(v1+xv); PlusDeriv(&d_b1,&d_v1,&d_xv); TimesDeriv(&d_b1,&d_b1,-2.0); /* dummy2 = b1 */ c1 = -2.0*gammad*xv; MultDeriv(&d_c1,&d_gammad,&d_xv); TimesDeriv(&d_c1,&d_c1,-2.0); /* dummy3 = c1 */ d1 = 2.0*v1*(v2+xv)-v2*v2-4.0/3.0*gammad*sarg3; MultDeriv(&d_d1,&d_gammad,&d_sarg3); TimesDeriv(&d_d1,&d_d1,4.0/3.0); MultDeriv(&d_dummy,&d_v2,&d_v2); PlusDeriv(&d_d1,&d_d1,&d_dummy); TimesDeriv(&d_d1,&d_d1,-1.0); PlusDeriv(&d_dummy,&d_v2,&d_xv); MultDeriv(&d_dummy,&d_dummy,&d_v1); TimesDeriv(&d_dummy,&d_dummy,2.0); PlusDeriv(&d_d1,&d_d1,&d_dummy); a = -b1; TimesDeriv(&d_a,&d_b1,-1.0); b = a1*c1-4.0*d1; TimesDeriv(&d_b,&d_d1,-4.0); MultDeriv(&d_dummy,&d_a1,&d_c1); /* mistake! - fixed Dec 8 '89 PlusDeriv(&d_d1,&d_d1,&d_dummy); */ PlusDeriv(&d_b,&d_b,&d_dummy); c = -d1*(a1*a1-4.0*b1)-c1*c1; TimesDeriv(&d_dummy,&d_b1,-4.0); MultDeriv(&d_c,&d_a1,&d_a1); PlusDeriv(&d_dummy,&d_dummy,&d_c); MultDeriv(&d_c,&d_dummy,&d_d1); MultDeriv(&d_dummy,&d_c1,&d_c1); PlusDeriv(&d_c,&d_c,&d_dummy); TimesDeriv(&d_c,&d_c,-1.0); r = -a*a/3.0+b; MultDeriv(&d_arr,&d_a,&d_a); TimesDeriv(&d_arr,&d_arr,-1.0/3.0); PlusDeriv(&d_arr,&d_arr,&d_b); s = 2.0*a*a*a/27.0-a*b/3.0+c; CubeDeriv(&d_s,&d_a); TimesDeriv(&d_s,&d_s,2.0/27.0); PlusDeriv(&d_s,&d_s,&d_c); MultDeriv(&d_dummy,&d_a,&d_b); TimesDeriv(&d_dummy,&d_dummy,-1.0/3.0); PlusDeriv(&d_s,&d_s,&d_dummy); r3 = r*r*r; CubeDeriv(&d_r3,&d_arr); s2 = s*s; MultDeriv(&d_s2,&d_s,&d_s); p = s2/4.0+r3/27.0; TimesDeriv(&d_dummy,&d_r3,1.0/27.0); TimesDeriv(&d_pee,&d_s2,0.25); PlusDeriv(&d_pee,&d_pee,&d_dummy); p0 = FABS(p); if (p < 0.0) /* mistake! fixed Dec 8 '89 TimesDeriv(&d_pee,&d_pee, -1.0); */ TimesDeriv(&d_p0,&d_pee, -1.0); p2 = sqrt(p0); SqrtDeriv(&d_p2,&d_p0); if (p < 0) { ro = sqrt(s2/4.0+p0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -