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

📄 limit.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1991 Regents of the University of California.  All rights reserved.Author:	1987 Kartikeya Mayaram, U. C. Berkeley CAD Group**********//* limiting routines for junction voltages */double DvRevMax = 0.5, DvFwdMax = 50.0e-3;double limitResistorVoltage( vnew, vold, icheck )double vnew, vold;int *icheck;{    double vlim, vinc;    if( vnew > vold ) {	vinc = 0.5;	vlim = vold + vinc;	if( vnew < vlim ) {	    *icheck = 0;	    return( vnew );	} else {	    *icheck = 1;	    return( vlim );	}    } else if ( vnew < vold ) {	vinc = 0.5;	vlim = vold - vinc;	if( vnew > vlim ) {	    *icheck = 0;	    return( vnew );	} else {	    *icheck = 1;	    return( vlim );	}    } else { /* vnew == vold */	*icheck = 0;	return( vnew );    }    /* NOTREACHED */}double limitJunctionVoltage( vnew, vold, icheck )double vnew, vold;int *icheck;{    double vlim, vinc;    if( vold >= 0.0 ) {	if( vnew > vold ) {	    if( vold > 0.65 ) 		vinc = DvFwdMax;	    else 		vinc = 2.0 * DvFwdMax;	    vlim = vold + vinc;	    if( vnew < vlim ) {		*icheck = 0;		return( vnew );	    }	    else {		*icheck = 1;		return( vlim );	    }	}	else if ( vnew == vold )  {	    *icheck = 0;	    return ( vnew );	}	else {	    /* vnew is less than vold */	    /* case 1: vnew is positive */	    /* case 2: vnew is negative, ensure it goes thru zero */	    if( vnew < 0.0 && vold <= 0.05 && vold > 0.0) {		/* limit to zero when vnew < 0.0 and vold |= 0.0 */		*icheck = 1;		return( 0.0 );	    }	    vinc = 2.0 * DvFwdMax;	    vlim = vold - vinc;	    if( vlim > vnew ) {		*icheck = 1;		return( vlim );	    }	    else {		*icheck = 0;		return( vnew );	    }	}    }    else {	if( vnew < vold ) {	    vlim = vold - DvRevMax;	    if ( vlim > vnew ) {		*icheck = 1;		return( vlim );	    }	    else	    {		*icheck = 0;		return( vnew );	    }	}	else {	    /* vnew > vold. check if vnew less than 0.0 */	    if( vnew < 0.0 ) {		vlim = vold + 1.0;		if( vnew < vlim ) {		    *icheck = 0;		    return( vnew );		}		else {		    *icheck = 1;		    return( vlim );		}	    }	    else {		vlim = vold + 2.0 * DvRevMax;		*icheck = 1;		if( vlim > 0.0 )		    return( 0.0 );		else		    return( vlim );	    }	}    }}	    	    double limitVbe( vnew, vold, icheck )double vnew, vold;int *icheck;{    double vlim, vinc;    if( vold >= 0.0 ) {	if( vnew > vold ) {	    if( vold > 0.9 ) 		/* deep high-level injection conditions */		vinc = 0.01;	    else if( vold > 0.85 ) 		vinc = 0.025;	    else if( vold > 0.65 ) 		vinc = 0.05;	    else 		vinc = 0.10;	    vlim = vold + vinc;	    if( vnew < vlim ) {		*icheck = 0;		return( vnew );	    }	    else {		*icheck = 1;		return( vlim );	    }	}	else if ( vnew == vold )  {	    *icheck = 0;	    return ( vnew );	}	else {	    /* vnew is less than vold */	    /* case 1: vnew is positive */	    /* case 2: vnew is negative, ensure it goes thru zero */	    if( vnew < 0.0 && vold <= 0.05 && vold > 0.0) {		/* limit to zero when vnew < 0.0 and vold |= 0.0 */		*icheck = 1;		return( 0.0 );	    }	    vinc = 0.1;	    vlim = vold - vinc;	    if( vlim > vnew ) {		*icheck = 1;		return( vlim );	    }	    else {		*icheck = 0;		return( vnew );	    }	}    }    else {	if( vnew < vold ) {	    vlim = vold - 0.1;  /* XXX Originally 0.1 */	    if ( vlim > vnew ) {		*icheck = 1;		return( vlim );	    }	    else {		*icheck = 0;		return( vnew );	    }	}	else {	    /* vnew > vold. check if vnew less than 0.0 */	    if( vnew < 0.0 ) {		vlim = vold + 1.0;		if( vnew < vlim ) {		    *icheck = 0;		    return( vnew );		}		else {		    *icheck = 1;		    return( vlim );		}	    }	    else {		vlim = vold + 1.0;		*icheck = 1;		if( vlim > 0.0 )		    return( 0.0 );		else		    return( vlim );	    }	}    }}double limitVce( vnew, vold, icheck )double vnew, vold;int *icheck;{    double vlim;    if( vold >= 0.0 ) {	if( vnew > vold ) {	    vlim = vold + 1.0;	    if( vnew < vlim ) {		*icheck = 0;		return( vnew );	    } else {		*icheck = 1;		return( vlim );	    }	} else {	    vlim = vold - 0.5; /* XXX Originally 0.2 */	    if( vlim > vnew ) {		*icheck = 1;		return( vlim );	    } else {		*icheck = 0;		return( vnew );	    }	}    } else {	if( vnew < vold ) {	    vlim = vold - 1.0;	    if ( vlim > vnew ) {		*icheck = 1;		return( vlim );	    } else {		*icheck = 0;		return( vnew );	    }	} else {	    /* vnew > vold. check if vnew less than 0.0 */	    if( vnew < 0.0 ) {		vlim = vold + 1.0;		if( vnew < vlim ) {		    *icheck = 0;		    return( vnew );		} else {		    *icheck = 1;		    return( vlim );		}	    } else {		vlim = vold + 1.0;		*icheck = 1;		if( vlim > 0.0 )		    return( 0.0 );		else		    return( vlim );	    }	}    }}double limitVgb( vnew, vold, icheck )double vnew, vold;int *icheck;{    double vlim;    if( vold >= 0.0 ) {	if( vnew > vold ) {	    vlim = vold + 1.0;	    if( vnew < vlim ) {		*icheck = 0;		return( vnew );	    } else {		*icheck = 1;		return( vlim );	    }	} else {	    vlim = vold - 0.2;	    if( vlim > vnew ) {		*icheck = 1;		return( vlim );	    } else {		*icheck = 0;		return( vnew );	    }	}    } else {	if( vnew < vold ) {	    vlim = vold - 1.0;	    if ( vlim > vnew ) {		*icheck = 1;		return( vlim );	    } else {		*icheck = 0;		return( vnew );	    }	} else {	    /* vnew > vold. check if vnew less than 0.0 */	    if( vnew < 0.0 ) {		vlim = vold + 1.0;		if( vnew < vlim ) {		    *icheck = 0;		    return( vnew );		} else {		    *icheck = 1;		    return( vlim );		}	    } else {		vlim = vold + 1.0;		*icheck = 1;		if( vlim > 0.0 )		    return( 0.0 );		else		    return( vlim );	    }	}    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -