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

📄 jfetdset.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 "distodef.h"#include "cktdefs.h"#include "jfetdefs.h"#include "const.h"#include "trandefs.h"#include "sperror.h"#include "devdefs.h"#include "suffix.h"intJFETdSetup(inModel,ckt)    GENmodel *inModel;    CKTcircuit *ckt;        /* actually load the current resistance value into the          * sparse matrix previously provided          */{    register JFETmodel *model = (JFETmodel*)inModel;    register JFETinstance *here;    double beta;    double betap;    double lcapgd1;    double lcapgd2;    double lcapgd3;    double lcapgs2;    double lcapgs3;    double lcapgs1;    double cd;    double cdrain;    double temp;    double cg;    double cgd;    double csat;    double czgd;    double czgdf2;    double czgs;    double czgsf2;    double evgd;    double evgs;    double fcpb2;    double gdpr;    double gds1;    double gds2;    double gds3;    double lggd1;    double lggd2;    double lggd3;    double lggs1;    double lggs2;    double lggs3;    double gm1;    double gm2;    double gm3;    double gmds;    double gm2ds;    double gmds2;    double gspr;    double sarg;    double twob;    double twop;    double vds;    double vgd;    double vgs;    double vgst;    /*  loop through all the models */    for( ; model != NULL; model = model->JFETnextModel ) {        /* loop through all the instances of the model */        for (here = model->JFETinstances; here != NULL ;                here=here->JFETnextInstance) {	    if (here->JFETowner != ARCHme) continue;            /*             *  dc model parameters              */            beta = model->JFETbeta * here->JFETarea;            gdpr=model->JFETdrainConduct*here->JFETarea;            gspr=model->JFETsourceConduct*here->JFETarea;            csat=here->JFETtSatCur*here->JFETarea;            /*             *    initialization             */                vgs= model->JFETtype*(*(ckt->CKTrhsOld + here->JFETgateNode)			- *(ckt->CKTrhsOld + here->JFETsourcePrimeNode));                vgd= model->JFETtype*(*(ckt->CKTrhsOld + here->JFETgateNode)			- *(ckt->CKTrhsOld + here->JFETdrainPrimeNode));            /*             *   determine dc current and derivatives              */            vds=vgs-vgd;	    if (vds < 0.0) {		vds = -vds;		temp = vgs;		vgs = vgd;		vgd = temp;		/* so now these have become the						local variables */		here->JFETmode = -1;		} else {		here->JFETmode = 1;		}            if (vgs <= -5*here->JFETtemp*CONSTKoverQ) {                lggs1 = -csat/vgs+ckt->CKTgmin;		lggs2=lggs3=0;                cg = lggs1*vgs;            } else {                evgs = exp(vgs/(here->JFETtemp*CONSTKoverQ));                lggs1 = csat*evgs/(here->JFETtemp*CONSTKoverQ)+ckt->CKTgmin;		lggs2 = (lggs1-ckt->CKTgmin)/((here->JFETtemp*CONSTKoverQ)*2);		lggs3 = lggs2/(3*(here->JFETtemp*CONSTKoverQ));                cg = csat*(evgs-1)+ckt->CKTgmin*vgs;            }            if (vgd <= -5*(here->JFETtemp*CONSTKoverQ)) {                lggd1 = -csat/vgd+ckt->CKTgmin;		lggd2=lggd3=0;                cgd = lggd1*vgd;            } else {                evgd = exp(vgd/(here->JFETtemp*CONSTKoverQ));                lggd1 = csat*evgd/(here->JFETtemp*CONSTKoverQ)+ckt->CKTgmin;		lggd2 = (lggd1-ckt->CKTgmin)/((here->JFETtemp*CONSTKoverQ)*2);		lggd3 = lggd2/(3*(here->JFETtemp*CONSTKoverQ));                cgd = csat*(evgd-1)+ckt->CKTgmin*vgd;            }            cg = cg+cgd;            /*             *   compute drain current and derivatives             */                vgst=vgs-model->JFETthreshold;                /*                 *   cutoff region                  */                if (vgst <= 0) {                    cdrain=0;                    gm1=gm2=gm3=0;                    gds1=gds2=gds3=0;		    gmds=gm2ds=gmds2=0;                } else {                    betap=beta*(1+model->JFETlModulation*vds);                    twob=betap+betap;                    if (vgst <= vds) {                        /*                         *   normal mode, saturation region                          */			 /* note - for cdrain, all the g's refer to the			  * derivatives which have not been divided to			  * become Taylor coeffs. A notational 			  * inconsistency but simplifies processing later.			  */                        cdrain=betap*vgst*vgst;                        gm1=twob*vgst;			gm2=twob;			gm3=0;                        gds1=model->JFETlModulation*beta*vgst*vgst;			gds2=gds3=gmds2=0;			gm2ds=2*model->JFETlModulation*beta;			gmds=gm2ds*vgst;                    } else {                        /*                         *   normal mode, linear region                          */                        cdrain=betap*vds*(vgst+vgst-vds);                        gm1=twob*vds;			gm2=0;			gm3=0;			gmds=(beta+beta)*(1+2*model->JFETlModulation*vds);			gm2ds=0;			gds2=2*beta*(2*model->JFETlModulation*vgst - 1 -				3*model->JFETlModulation*vds);                        gds1=beta*(2*(vgst-vds) + 4*vgst*vds*		model->JFETlModulation - 3*model->JFETlModulation*vds*vds);			gmds2=4*beta*model->JFETlModulation;			gds3= -6*beta*model->JFETlModulation;                    }                }            /*             *   compute equivalent drain current source              */            cd=cdrain-cgd;                /*                  *    charge storage elements                  */                czgs=here->JFETtCGS*here->JFETarea;                czgd=here->JFETtCGD*here->JFETarea;                twop=here->JFETtGatePot+here->JFETtGatePot;                fcpb2=here->JFETcorDepCap*here->JFETcorDepCap;                czgsf2=czgs/model->JFETf2;                czgdf2=czgd/model->JFETf2;                if (vgs < here->JFETcorDepCap) {                    sarg=sqrt(1-vgs/here->JFETtGatePot);                    lcapgs1=czgs/sarg;		    lcapgs2=lcapgs1/(here->JFETtGatePot*4*sarg*sarg);		    lcapgs3=lcapgs2/(here->JFETtGatePot*2*sarg*sarg);                } else {                    lcapgs1=czgsf2*(model->JFETf3+vgs/twop);		    lcapgs2=czgsf2/twop*0.5;		    lcapgs3=0;                }                if (vgd < here->JFETcorDepCap) {                    sarg=sqrt(1-vgd/here->JFETtGatePot);                    lcapgd1=czgd/sarg;		    lcapgd2=lcapgd1/(here->JFETtGatePot*4*sarg*sarg);		    lcapgd3=lcapgd2/(here->JFETtGatePot*2*sarg*sarg);                } else {                    lcapgd1=czgdf2*(model->JFETf3+vgd/twop);		    lcapgd2=czgdf2/twop*0.5;		    lcapgd3=0;                }                /*                 *   process to get Taylor coefficients, taking into		 * account type and mode.                 */	if (here->JFETmode == 1)		{		/* normal mode - no source-drain interchange */here->cdr_x = gm1;here->cdr_y = gds1;here->cdr_x2 = gm2;here->cdr_y2 = gds2;here->cdr_xy = gmds;here->cdr_x3 = gm3;here->cdr_y3 = gds3;here->cdr_x2y = gm2ds;here->cdr_xy2 = gmds2;here->ggs1 = lggs1;here->ggd1 = lggd1;here->ggs2 = lggs2;here->ggd2 = lggd2;here->ggs3 = lggs3;here->ggd3 = lggd3;here->capgs1 = lcapgs1;here->capgd1 = lcapgd1;here->capgs2 = lcapgs2;here->capgd2 = lcapgd2;here->capgs3 = lcapgs3;here->capgd3 = lcapgd3;} else {		/*		 * inverse mode - source and drain interchanged		 */here->cdr_x = -gm1;here->cdr_y = gm1 + gds1;here->cdr_x2 = -gm2;here->cdr_y2 = -(gm2 + gds2 + 2*gmds);here->cdr_xy = gm2 + gmds;here->cdr_x3 = -gm3;here->cdr_y3 = gm3 + gds3 + 3*(gm2ds + gmds2 ) ;here->cdr_x2y = gm3 + gm2ds;here->cdr_xy2 = -(gm3 + 2*gm2ds + gmds2);here->ggs1 = lggd1;here->ggd1 = lggs1;here->ggs2 = lggd2;here->ggd2 = lggs2;here->ggs3 = lggd3;here->ggd3 = lggs3;here->capgs1 = lcapgd1;here->capgd1 = lcapgs1;here->capgs2 = lcapgd2;here->capgd2 = lcapgs2;here->capgs3 = lcapgd3;here->capgd3 = lcapgs3;}/* now to adjust for type and multiply by factors to convert to Taylor coeffs. */here->cdr_x2 = 0.5*model->JFETtype*here->cdr_x2;here->cdr_y2 = 0.5*model->JFETtype*here->cdr_y2;here->cdr_xy = model->JFETtype*here->cdr_xy;here->cdr_x3 = here->cdr_x3/6.;here->cdr_y3 = here->cdr_y3/6.;here->cdr_x2y = 0.5*here->cdr_x2y;here->cdr_xy2 = 0.5*here->cdr_xy2;here->ggs2 = model->JFETtype*lggs2;here->ggd2 = model->JFETtype*lggd2;here->capgs2 = model->JFETtype*lcapgs2;here->capgd2 = model->JFETtype*lcapgd2;		 }		 }		 return(OK);		 }

⌨️ 快捷键说明

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