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

📄 mos1dist.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1988 Jaijeet S Roychowdhury**********/#include "spice.h"#include <stdio.h>#include "cktdefs.h"#include "util.h"#include "mos1defs.h"#include "sperror.h"#include "distodef.h"#include "suffix.h"intMOS1disto(mode,genmodel,ckt) GENmodel *genmodel; register CKTcircuit *ckt; int mode;/* assuming here that ckt->CKTomega has been initialised to  * the correct value */{ MOS1model *model = (MOS1model *) genmodel; DISTOAN* job = (DISTOAN*) ckt->CKTcurJob; DpassStr pass; double r1h1x,i1h1x; double r1h1y,i1h1y; double r1h1z, i1h1z; double r1h2x, i1h2x; double r1h2y, i1h2y; double r1h2z, i1h2z; double r1hm2x,i1hm2x; double r1hm2y,i1hm2y; double r1hm2z, i1hm2z; double r2h11x,i2h11x; double r2h11y,i2h11y; double r2h11z, i2h11z; double r2h1m2x,i2h1m2x; double r2h1m2y,i2h1m2y; double r2h1m2z, i2h1m2z; double temp, itemp; register MOS1instance *here;if (mode == D_SETUP) return(MOS1dSetup(model,ckt));if ((mode == D_TWOF1) || (mode == D_THRF1) ||  (mode == D_F1PF2) || (mode == D_F1MF2) || (mode == D_2F1MF2)) { /* loop through all the MOS1 models */for( ; model != NULL; model = model->MOS1nextModel ) {  /* loop through all the instances of the model */  for (here = model->MOS1instances; here != NULL ;      here=here->MOS1nextInstance) {    if (here->MOS1owner != ARCHme) continue;            /* loading starts here */    switch (mode) {    case D_TWOF1:	/* x = vgs, y = vbs z = vds */	    /* getting first order (linear) Volterra kernel */	    r1h1x = *(job->r1H1ptr + (here->MOS1gNode)) -			*(job->r1H1ptr + (here->MOS1sNodePrime));	    i1h1x = *(job->i1H1ptr + (here->MOS1gNode)) -			*(job->i1H1ptr + (here->MOS1sNodePrime));	    r1h1y = *(job->r1H1ptr + (here->MOS1bNode)) -			*(job->r1H1ptr + (here->MOS1sNodePrime));	    i1h1y = *(job->i1H1ptr + (here->MOS1bNode)) -			*(job->i1H1ptr + (here->MOS1sNodePrime));	    r1h1z = *(job->r1H1ptr + (here->MOS1dNodePrime)) -			*(job->r1H1ptr + (here->MOS1sNodePrime));	    i1h1z = *(job->i1H1ptr + (here->MOS1dNodePrime)) -			*(job->i1H1ptr + (here->MOS1sNodePrime));	    /* loading starts here */	    /* loading cdrain term  */	    temp = DFn2F1(here->cdr_x2,					here->cdr_y2,					here->cdr_z2,					here->cdr_xy,					here->cdr_yz,					here->cdr_xz,					r1h1x,					i1h1x,					r1h1y,					i1h1y,					r1h1z,					i1h1z);	    itemp = DFi2F1(here->cdr_x2,					here->cdr_y2,					here->cdr_z2,					here->cdr_xy,					here->cdr_yz,					here->cdr_xz,					r1h1x,					i1h1x,					r1h1y,					i1h1y,					r1h1z,					i1h1z);	    *(ckt->CKTrhs + (here->MOS1dNodePrime)) -= temp;	    *(ckt->CKTirhs + (here->MOS1dNodePrime)) -= itemp;	    *(ckt->CKTrhs + (here->MOS1sNodePrime)) += temp;	    *(ckt->CKTirhs + (here->MOS1sNodePrime)) += itemp;		    /* cdrain term over */		/* loading gbs term */		temp = D1n2F1(here->gbs2,						r1h1y,						i1h1y);		itemp = D1i2F1(here->gbs2,						r1h1y,						i1h1y);	    *(ckt->CKTrhs + (here->MOS1bNode)) -= temp;	    *(ckt->CKTirhs + (here->MOS1bNode)) -= itemp;	    *(ckt->CKTrhs + (here->MOS1sNodePrime)) += temp;	    *(ckt->CKTirhs + (here->MOS1sNodePrime)) += itemp;		/* gbs over */		/* loading gbd term */		temp = D1n2F1(here->gbd2,						r1h1y - r1h1z,						i1h1y - i1h1z);		itemp = D1i2F1(here->gbd2,						r1h1y - r1h1z,						i1h1y - i1h1z);	    *(ckt->CKTrhs + (here->MOS1bNode)) -= temp;	    *(ckt->CKTirhs + (here->MOS1bNode)) -= itemp;	    *(ckt->CKTrhs + (here->MOS1dNodePrime)) += temp;	    *(ckt->CKTirhs + (here->MOS1dNodePrime)) += itemp;		/* gbd over */		/* loading capgs term */		temp = -ckt->CKTomega *				D1i2F1(here->capgs2,						r1h1x,						i1h1x);		itemp = ckt->CKTomega *				D1n2F1(here->capgs2,						r1h1x,						i1h1x);	    *(ckt->CKTrhs + (here->MOS1gNode)) -= temp;	    *(ckt->CKTirhs + (here->MOS1gNode)) -= itemp;	    *(ckt->CKTrhs + (here->MOS1sNodePrime)) += temp;	    *(ckt->CKTirhs + (here->MOS1sNodePrime)) += itemp;		/* capgs over */		/* loading capgd term */		temp = -ckt->CKTomega *				D1i2F1(here->capgd2,						r1h1x - r1h1z,						i1h1x - i1h1z);		itemp = ckt->CKTomega *				D1n2F1(here->capgd2,						r1h1x - r1h1z,						i1h1x - i1h1z);	    *(ckt->CKTrhs + (here->MOS1gNode)) -= temp;	    *(ckt->CKTirhs + (here->MOS1gNode)) -= itemp;	    *(ckt->CKTrhs + (here->MOS1dNodePrime)) += temp;	    *(ckt->CKTirhs + (here->MOS1dNodePrime)) += itemp;		/* capgd over */		/* loading capgb term */		temp = -ckt->CKTomega *				D1i2F1(here->capgb2,						r1h1x - r1h1y,						i1h1x - i1h1y);		itemp = ckt->CKTomega *				D1n2F1(here->capgb2,						r1h1x - r1h1y,						i1h1x - i1h1y);	    *(ckt->CKTrhs + (here->MOS1gNode)) -= temp;	    *(ckt->CKTirhs + (here->MOS1gNode)) -= itemp;	    *(ckt->CKTrhs + (here->MOS1bNode)) += temp;	    *(ckt->CKTirhs + (here->MOS1bNode)) += itemp;		/* capgb over */		/* loading capbs term */		temp = -ckt->CKTomega *				D1i2F1(here->capbs2,						r1h1y,						i1h1y);		itemp = ckt->CKTomega *				D1n2F1(here->capbs2,						r1h1y,						i1h1y);	    *(ckt->CKTrhs + (here->MOS1bNode)) -= temp;	    *(ckt->CKTirhs + (here->MOS1bNode)) -= itemp;	    *(ckt->CKTrhs + (here->MOS1sNodePrime)) += temp;	    *(ckt->CKTirhs + (here->MOS1sNodePrime)) += itemp;		/* capbs over */		/* loading capbd term */		temp = -ckt->CKTomega *				D1i2F1(here->capbd2,						r1h1y - r1h1z,						i1h1y - i1h1z);		itemp = ckt->CKTomega *				D1n2F1(here->capbd2,						r1h1y - r1h1z,						i1h1y - i1h1z);	    *(ckt->CKTrhs + (here->MOS1bNode)) -= temp;	    *(ckt->CKTirhs + (here->MOS1bNode)) -= itemp;	    *(ckt->CKTrhs + (here->MOS1dNodePrime)) += temp;	    *(ckt->CKTirhs + (here->MOS1dNodePrime)) += itemp;		/* capbd over */	/* all done */      break;    case D_THRF1:	/* x = vgs, y = vbs z = vds */	    /* getting first order (linear) Volterra kernel */	    r1h1x = *(job->r1H1ptr + (here->MOS1gNode)) -			*(job->r1H1ptr + (here->MOS1sNodePrime));	    i1h1x = *(job->i1H1ptr + (here->MOS1gNode)) -			*(job->i1H1ptr + (here->MOS1sNodePrime));	    r1h1y = *(job->r1H1ptr + (here->MOS1bNode)) -			*(job->r1H1ptr + (here->MOS1sNodePrime));	    i1h1y = *(job->i1H1ptr + (here->MOS1bNode)) -			*(job->i1H1ptr + (here->MOS1sNodePrime));	    r1h1z = *(job->r1H1ptr + (here->MOS1dNodePrime)) -			*(job->r1H1ptr + (here->MOS1sNodePrime));	    i1h1z = *(job->i1H1ptr + (here->MOS1dNodePrime)) -			*(job->i1H1ptr + (here->MOS1sNodePrime));	r2h11x = *(job->r2H11ptr + (here->MOS1gNode)) -		    *(job->r2H11ptr + (here->MOS1sNodePrime));	i2h11x = *(job->i2H11ptr + (here->MOS1gNode)) -		    *(job->i2H11ptr + (here->MOS1sNodePrime));	r2h11y = *(job->r2H11ptr + (here->MOS1bNode)) -		    *(job->r2H11ptr + (here->MOS1sNodePrime));	i2h11y = *(job->i2H11ptr + (here->MOS1bNode)) -		    *(job->i2H11ptr + (here->MOS1sNodePrime));	r2h11z = *(job->r2H11ptr + (here->MOS1dNodePrime)) -		    *(job->r2H11ptr + (here->MOS1sNodePrime));	i2h11z = *(job->i2H11ptr + (here->MOS1dNodePrime)) -		    *(job->i2H11ptr + (here->MOS1sNodePrime));		/* loading starts here */		/* loading cdrain term  */		temp = DFn3F1(here->cdr_x2,					    here->cdr_y2,					    here->cdr_z2,					    here->cdr_xy,					    here->cdr_yz,					    here->cdr_xz,					    here->cdr_x3,					    here->cdr_y3,					    here->cdr_z3,					here->cdr_x2y,					here->cdr_x2z,					here->cdr_xy2,					here->cdr_y2z,					here->cdr_xz2,					here->cdr_yz2,				    here->cdr_xyz,					r1h1x,					i1h1x,					r1h1y,					i1h1y,					r1h1z,					i1h1z,					r2h11x,					i2h11x,					r2h11y,					i2h11y,					r2h11z,					i2h11z);		itemp = DFi3F1(here->cdr_x2,					    here->cdr_y2,					    here->cdr_z2,					    here->cdr_xy,					here->cdr_yz,					here->cdr_xz,					here->cdr_x3,					here->cdr_y3,					here->cdr_z3,					here->cdr_x2y,					here->cdr_x2z,					here->cdr_xy2,					here->cdr_y2z,					here->cdr_xz2,					here->cdr_yz2,				    here->cdr_xyz,					r1h1x,					i1h1x,					r1h1y,					i1h1y,					r1h1z,					i1h1z,					r2h11x,					i2h11x,					r2h11y,					i2h11y,					r2h11z,					i2h11z);	    *(ckt->CKTrhs + (here->MOS1dNodePrime)) -= temp;	    *(ckt->CKTirhs + (here->MOS1dNodePrime)) -= itemp;	    *(ckt->CKTrhs + (here->MOS1sNodePrime)) += temp;	    *(ckt->CKTirhs + (here->MOS1sNodePrime)) += itemp;		    /* cdrain term over */		/* loading gbs term */		temp = D1n3F1(here->gbs2,						here->gbs3,						r1h1y,						i1h1y,						r2h11y,						i2h11y);		itemp = D1i3F1(here->gbs2,						here->gbs3,						r1h1y,						i1h1y,						r2h11y,						i2h11y);	    *(ckt->CKTrhs + (here->MOS1bNode)) -= temp;	    *(ckt->CKTirhs + (here->MOS1bNode)) -= itemp;	    *(ckt->CKTrhs + (here->MOS1sNodePrime)) += temp;	    *(ckt->CKTirhs + (here->MOS1sNodePrime)) += itemp;		/* gbs over */		/* loading gbd term */		temp = D1n3F1(here->gbd2,						here->gbd3,						r1h1y - r1h1z,						i1h1y - i1h1z,						r2h11y - r2h11z,						i2h11y - i2h11z);		itemp = D1i3F1(here->gbd2,						here->gbd3,						r1h1y - r1h1z,						i1h1y - i1h1z,						r2h11y - r2h11z,						i2h11y - i2h11z);	    *(ckt->CKTrhs + (here->MOS1bNode)) -= temp;	    *(ckt->CKTirhs + (here->MOS1bNode)) -= itemp;	    *(ckt->CKTrhs + (here->MOS1dNodePrime)) += temp;	    *(ckt->CKTirhs + (here->MOS1dNodePrime)) += itemp;		/* gbd over */		/* loading capgs term */		temp = -ckt->CKTomega *			    D1i3F1(here->capgs2,						here->capgs3,						r1h1x,						i1h1x,						r2h11x,						i2h11x);		itemp = ckt->CKTomega *			    D1n3F1(here->capgs2,						here->capgs3,						r1h1x,						i1h1x,						r2h11x,						i2h11x);	    *(ckt->CKTrhs + (here->MOS1gNode)) -= temp;	    *(ckt->CKTirhs + (here->MOS1gNode)) -= itemp;	    *(ckt->CKTrhs + (here->MOS1sNodePrime)) += temp;	    *(ckt->CKTirhs + (here->MOS1sNodePrime)) += itemp;		/* capgs over */		/* loading capgd term */		temp = -ckt->CKTomega *			    D1i3F1(here->capgd2,						here->capgd3,						r1h1x - r1h1z,						i1h1x - i1h1z,						r2h11x - r2h11z,						i2h11x - i2h11z);		itemp = ckt->CKTomega *			    D1n3F1(here->capgd2,						here->capgd3,						r1h1x - r1h1z,						i1h1x - i1h1z,						r2h11x - r2h11z,						i2h11x - i2h11z);	    *(ckt->CKTrhs + (here->MOS1gNode)) -= temp;	    *(ckt->CKTirhs + (here->MOS1gNode)) -= itemp;	    *(ckt->CKTrhs + (here->MOS1dNodePrime)) += temp;	    *(ckt->CKTirhs + (here->MOS1dNodePrime)) += itemp;		/* capgd over */		/* loading capgb term */		temp = -ckt->CKTomega *			    D1i3F1(here->capgb2,						here->capgb3,						r1h1x - r1h1y,						i1h1x - i1h1y,

⌨️ 快捷键说明

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