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

📄 diodisto.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 "cktdefs.h"#include "util.h"#include "diodefs.h"#include "sperror.h"#include "distodef.h"#include "suffix.h"intDIOdisto(mode,genmodel,ckt) GENmodel *genmodel; register CKTcircuit *ckt; int mode;/* assuming here that ckt->CKTomega has been initialised to  * the correct value */{ DIOmodel *model = (DIOmodel *) genmodel; DISTOAN* job = (DISTOAN*) ckt->CKTcurJob; double td; DpassStr pass; double g2,g3; double cdiff2,cdiff3; double cjunc2,cjunc3; double r1h1x,i1h1x; double r1h2x, i1h2x; double r1hm2x,i1hm2x; double r2h11x,i2h11x; double r2h1m2x,i2h1m2x; double temp, itemp; register DIOinstance *here;if (mode == D_SETUP) return(DIOdSetup(model,ckt));if ((mode == D_TWOF1) || (mode == D_THRF1) ||  (mode == D_F1PF2) || (mode == D_F1MF2) || (mode == D_2F1MF2)) { /* loop through all the DIO 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;    /* loading starts here */    switch (mode) {    case D_TWOF1:            g2=here->id_x2;	    cdiff2=here->cdif_x2;	     	    cjunc2=here->cjnc_x2;	    /* getting first order (linear) Volterra kernel */	    r1h1x = *(job->r1H1ptr + (here->DIOposPrimeNode)) -			*(job->r1H1ptr + (here->DIOnegNode));	    i1h1x = *(job->i1H1ptr + (here->DIOposPrimeNode)) -			*(job->i1H1ptr + (here->DIOnegNode));	    /* formulae start here */	    temp = D1n2F1(g2,r1h1x,i1h1x);	    itemp = D1i2F1(g2,r1h1x,i1h1x);	    /* the above are for the memoryless nonlinearity */	    if ((cdiff2 + cjunc2) != 0.0) {	    temp +=  - ckt->CKTomega * D1i2F1				(cdiff2+cjunc2,r1h1x,i1h1x);	    itemp += ckt->CKTomega * D1n2F1				((cdiff2 + cjunc2),r1h1x,i1h1x);	    }	    *(ckt->CKTrhs + (here->DIOposPrimeNode)) -= temp;	    *(ckt->CKTirhs + (here->DIOposPrimeNode)) -= itemp;	    *(ckt->CKTrhs + (here->DIOnegNode)) += temp;	    *(ckt->CKTirhs + (here->DIOnegNode)) += itemp;      break;    case D_THRF1:            g2=here->id_x2;	    g3=here->id_x3;	    cdiff2=here->cdif_x2;	    cdiff3=here->cdif_x3;	     	    cjunc2=here->cjnc_x2;	    cjunc3=here->cjnc_x3;	    /* getting first order (linear) Volterra kernel */	    r1h1x = *(job->r1H1ptr + (here->DIOposPrimeNode)) -			*(job->r1H1ptr + (here->DIOnegNode));	    i1h1x = *(job->i1H1ptr + (here->DIOposPrimeNode)) -			*(job->i1H1ptr + (here->DIOnegNode));	    /* getting second order kernel at (F1_F1) */	    r2h11x = *(job->r2H11ptr + (here->DIOposPrimeNode)) -			*(job->r2H11ptr + (here->DIOnegNode));	    i2h11x = *(job->i2H11ptr + (here->DIOposPrimeNode)) -			*(job->i2H11ptr + (here->DIOnegNode));	    /* formulae start here */	    temp = D1n3F1(g2,g3,r1h1x,i1h1x,r2h11x,						i2h11x);	    itemp = D1i3F1(g2,g3,r1h1x,i1h1x,r2h11x,						i2h11x);	    /* the above are for the memoryless nonlinearity */	    /* the following are for the capacitors */	    if ((cdiff2 + cjunc2) != 0.0) {	    temp += -ckt->CKTomega * D1i3F1				(cdiff2+cjunc2,cdiff3+cjunc3,r1h1x,						i1h1x,r2h11x,i2h11x);	    itemp += ckt->CKTomega * D1n3F1				(cdiff2+cjunc2,cdiff3+cjunc3,r1h1x,						i1h1x,r2h11x,i2h11x);	    }	    /* end of formulae */	    *(ckt->CKTrhs + (here->DIOposPrimeNode)) -= temp;	    *(ckt->CKTirhs + (here->DIOposPrimeNode)) -= itemp;	    *(ckt->CKTrhs + (here->DIOnegNode)) += temp;	    *(ckt->CKTirhs + (here->DIOnegNode)) += itemp;      break;    case D_F1PF2:            g2=here->id_x2;	    g3=here->id_x3;	    cdiff2=here->cdif_x2;	    cdiff3=here->cdif_x3;	     	    cjunc2=here->cjnc_x2;	    cjunc3=here->cjnc_x3;	    /* getting first order (linear) Volterra kernel for F1*/	    r1h1x = *(job->r1H1ptr + (here->DIOposPrimeNode)) -			*(job->r1H1ptr + (here->DIOnegNode));	    i1h1x = *(job->i1H1ptr + (here->DIOposPrimeNode)) -			*(job->i1H1ptr + (here->DIOnegNode));	    /* getting first order (linear) Volterra kernel for F2*/	    r1h2x = *(job->r1H2ptr + (here->DIOposPrimeNode)) -			*(job->r1H2ptr + (here->DIOnegNode));	    i1h2x = *(job->i1H2ptr + (here->DIOposPrimeNode)) -			*(job->i1H2ptr + (here->DIOnegNode));	    /* formulae start here */	    temp = D1nF12(g2,r1h1x,i1h1x,r1h2x,i1h2x);	    itemp = D1iF12(g2,r1h1x,i1h1x,r1h2x,i1h2x);	    /* the above are for the memoryless nonlinearity */	    /* the following are for the capacitors */	    if ((cdiff2 + cjunc2) != 0.0) {	    temp += - ckt->CKTomega * D1iF12				(cdiff2+cjunc2,r1h1x,i1h1x,r1h2x,i1h2x);	    itemp += ckt->CKTomega * D1nF12				(cdiff2+cjunc2,r1h1x,i1h1x,r1h2x,i1h2x);	    }	    /* end of formulae */	    *(ckt->CKTrhs + (here->DIOposPrimeNode)) -= temp;	    *(ckt->CKTirhs + (here->DIOposPrimeNode)) -= itemp;	    *(ckt->CKTrhs + (here->DIOnegNode)) += temp;	    *(ckt->CKTirhs + (here->DIOnegNode)) += itemp;      break;    case D_F1MF2:            g2=here->id_x2;	    g3=here->id_x3;	    cdiff2=here->cdif_x2;	    cdiff3=here->cdif_x3;	     	    cjunc2=here->cjnc_x2;	    cjunc3=here->cjnc_x3;	    /* getting first order (linear) Volterra kernel for F1*/	    r1h1x = *(job->r1H1ptr + (here->DIOposPrimeNode)) -			*(job->r1H1ptr + (here->DIOnegNode));	    i1h1x = *(job->i1H1ptr + (here->DIOposPrimeNode)) -			*(job->i1H1ptr + (here->DIOnegNode));	    /* getting first order (linear) Volterra kernel for F2*/	    r1h2x = *(job->r1H2ptr + (here->DIOposPrimeNode)) -			*(job->r1H2ptr + (here->DIOnegNode));	    i1hm2x = -(*(job->i1H2ptr + (here->DIOposPrimeNode)) -			*(job->i1H2ptr + (here->DIOnegNode)));	    /* formulae start here */	    temp = D1nF12(g2,r1h1x,i1h1x,r1h2x,i1hm2x);	    itemp = D1iF12(g2,r1h1x,i1h1x,r1h2x,i1hm2x);	    /* the above are for the memoryless nonlinearity */	    /* the following are for the capacitors */	    if ((cdiff2 + cjunc2) != 0.0) {	    temp += - ckt->CKTomega * D1iF12				(cdiff2+cjunc2,r1h1x,i1h1x,r1h2x,i1hm2x);	    itemp += ckt->CKTomega * D1nF12				(cdiff2+cjunc2,r1h1x,i1h1x,r1h2x,i1hm2x);	    }	    /* end of formulae */	    *(ckt->CKTrhs + (here->DIOposPrimeNode)) -= temp;	    *(ckt->CKTirhs + (here->DIOposPrimeNode)) -= itemp;	    *(ckt->CKTrhs + (here->DIOnegNode)) += temp;	    *(ckt->CKTirhs + (here->DIOnegNode)) += itemp;      break;    case D_2F1MF2:            g2=here->id_x2;	    g3=here->id_x3;	    cdiff2=here->cdif_x2;	    cdiff3=here->cdif_x3;	     	    cjunc2=here->cjnc_x2;	    cjunc3=here->cjnc_x3;	    /* getting first order (linear) Volterra kernel at F1*/	    r1h1x = *(job->r1H1ptr + (here->DIOposPrimeNode)) -			*(job->r1H1ptr + (here->DIOnegNode));	    i1h1x = *(job->i1H1ptr + (here->DIOposPrimeNode)) -			*(job->i1H1ptr + (here->DIOnegNode));	    /* getting first order (linear) Volterra kernel at minusF2*/	    r1h2x = *(job->r1H2ptr + (here->DIOposPrimeNode)) -			*(job->r1H2ptr + (here->DIOnegNode));	    i1hm2x = -(*(job->i1H2ptr + (here->DIOposPrimeNode)) -			*(job->i1H2ptr + (here->DIOnegNode)));	    /* getting second order kernel at (F1_F1) */	    r2h11x = *(job->r2H11ptr + (here->DIOposPrimeNode)) -			*(job->r2H11ptr + (here->DIOnegNode));	    i2h11x = *(job->i2H11ptr + (here->DIOposPrimeNode)) -			*(job->i2H11ptr + (here->DIOnegNode));	    /* getting second order kernel at (F1_minusF2) */	    r2h1m2x = *(job->r2H1m2ptr + (here->DIOposPrimeNode)) -			*(job->r2H1m2ptr + (here->DIOnegNode));	    i2h1m2x = *(job->i2H1m2ptr + (here->DIOposPrimeNode)) -			*(job->i2H1m2ptr + (here->DIOnegNode));	    /* formulae start here */	    temp = D1n2F12(g2,g3,r1h1x,i1h1x,r1h2x,				i1hm2x,r2h11x,i2h11x,					r2h1m2x,i2h1m2x);	    itemp = D1i2F12(g2,g3,r1h1x,i1h1x,				r1h2x,i1hm2x,r2h11x,i2h11x,					r2h1m2x,i2h1m2x);	    /* the above are for the memoryless nonlinearity */	    /* the following are for the capacitors */	    if ((cdiff2 + cjunc2) != 0.0) {	    temp += -ckt->CKTomega * 	    D1i2F12(cdiff2+cjunc2,cdiff3+cjunc3,			r1h1x,i1h1x,r1h2x,i1hm2x,r2h11x,				i2h11x,r2h1m2x,i2h1m2x);	    itemp += ckt->CKTomega *	    D1n2F12(cdiff2+cjunc2,cdiff3+cjunc3,			r1h1x,i1h1x,r1h2x,i1hm2x,r2h11x,				i2h11x,r2h1m2x,i2h1m2x);	    }	    /* end of formulae */	    *(ckt->CKTrhs + (here->DIOposPrimeNode)) -= temp;	    *(ckt->CKTirhs + (here->DIOposPrimeNode)) -= itemp;	    *(ckt->CKTrhs + (here->DIOnegNode)) += temp;	    *(ckt->CKTirhs + (here->DIOnegNode)) += itemp;      break;    default:;    }  }}return(OK);}  else    return(E_BADPARM);}

⌨️ 快捷键说明

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