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

📄 mos2dset.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
📖 第 1 页 / 共 4 页
字号:
	    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 + -