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

📄 diodset.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author:  1988 Jaijeet S Roychowdhury**********/#include "spice.h"#include <stdio.h>#include "util.h"#include "cktdefs.h"#include "diodefs.h"#include "const.h"#include "sperror.h"#include "suffix.h"intDIOdSetup(model,ckt)register DIOmodel *model;CKTcircuit *ckt;/* actually load the current resistance value into the          * sparse matrix previously provided          */{	register DIOinstance *here;	double arg;	double csat;    /* area-scaled saturation current */	double czero;	double czof2;	double evd;	double evrev;	double gd;	double sarg;	double vd;      /* current diode voltage */	double vt;      /* K t / Q */	double vte;	double g2,g3;	double cdiff2,cdiff3;	double cjunc1,cjunc2,cjunc3;	/*  loop through all the diode models */	for( ; model != NULL; model = model->DIOnextModel ) {		/* loop through all the instances of the model */		for (here = model->DIOinstances; here != NULL ;                here=here->DIOnextInstance) {		    if (here->DIOowner != ARCHme) continue;			    /*			     *  this routine loads diodes for dc and transient analyses.			     */			csat=here->DIOtSatCur*here->DIOarea;			vt = CONSTKoverQ * here->DIOtemp;			vte=model->DIOemissionCoeff * vt;	    		vd = *(ckt->CKTrhsOld + (here->DIOposPrimeNode)) -			*(ckt->CKTrhsOld + (here->DIOnegNode));			/*			             *   compute derivatives			             */next1:      			if (vd >= -5*vte) {				evd = exp(vd/vte);				gd = csat*evd/vte+ckt->CKTgmin;				g2 = 0.5*(gd-ckt->CKTgmin)/vte;				cdiff2 = g2*model->DIOtransitTime;				g3 = g2/3/vte;				cdiff3 = g3*model->DIOtransitTime;			} 			else if((!(here->DIOtBrkdwnV))|| 			    (vd >= -here->DIOtBrkdwnV)) {				gd = -csat/vd+ckt->CKTgmin;				g2=g3=cdiff2=cdiff3=0.0;				/* off */			} 			else {				/* reverse breakdown */				/* why using csat instead of breakdowncurrent? */				evrev=exp(-(here->DIOtBrkdwnV+vd)/vt);				/*				                cd = -csat*(evrev-1+here->DIOtBrkdwnV/vt);						*/				/* should there be a minus here above? */				gd=csat*evrev/vt;				g2 = -gd/2/vt;				g3 = -g2/3/vt;				cdiff3 = cdiff2 = 0;			}			/*			                 *   junction charge storage elements			                 */			czero=here->DIOtJctCap*here->DIOarea;			if (czero != 0.0) {			if (vd < here->DIOtDepCap){				arg=1-vd/model->DIOjunctionPot;				sarg=exp(-model->DIOgradingCoeff*log(arg));				/* the expression for depletion charge 				                        model->DIOjunctionPot*czero*                            (1-arg*sarg)/(1-model->DIOgradingCoeff);						    */				cjunc1 = czero*sarg;				cjunc2 = cjunc1/2/model->DIOjunctionPot*model->DIOgradingCoeff/arg;				cjunc3 = cjunc2/3/model->DIOjunctionPot/arg*(model->DIOgradingCoeff + 1);			} 			else {				czof2=czero/model->DIOf2;				/* depletion charge equation 				                        czero*here->DIOtF1+czof2*                        (model->DIOf3*(vd-here->DIOtDepCap)+				                        (model->DIOgradingCoeff/(model->DIOjunctionPot+				                        model->DIOjunctionPot))*(vd*vd-here->DIOtDepCap*                        here->DIOtDepCap));							*/				cjunc2 = czof2/2/model->DIOjunctionPot*model->DIOgradingCoeff;				cjunc3 =0.0;			}			} 			else 			{			cjunc1 = cjunc2 = cjunc3 = 0.0;			}			/*			                 *   store small-signal parameters			                 */			here->id_x2 = g2;			here->id_x3 = g3;			here->cdif_x2 = cdiff2;			here->cdif_x3 = cdiff3;			here->cjnc_x2 = cjunc2;			here->cjnc_x3 = cjunc3;		}	}		return(OK);}

⌨️ 快捷键说明

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