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

📄 cktdisto.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1988 Jaijeet S Roychowdhury**********//* * CKTdisto (ckt, mode) */#include "spice.h"#include "cktdefs.h"#include "devdefs.h"#ifdef HAS_FLAT_INCLUDES#include "vsrcdefs.h"#include "isrcdefs.h"#else#include "vsrc/vsrcdefs.h"#include "isrc/isrcdefs.h"#endif#include "fteconst.h"#include "iferrmsg.h"#include "distodef.h"#include "sperror.h"#include <stdio.h>#include "util.h"#include "suffix.h"intCKTdisto (ckt, mode)register CKTcircuit *ckt;int mode;{    extern SPICEdev *DEVices[];    register DISTOAN* cv = (DISTOAN*) (ckt->CKTcurJob);    register int i;    int error;    int size;    switch(mode) {    case D_SETUP:	    for (i=0;i<DEVmaxnum;i++) {		if ( ((*DEVices[i]).DEVdisto != NULL) && (ckt->CKThead[i] != NULL) ){		    error = (*((*DEVices[i]).DEVdisto))(mode,ckt->CKThead[i],ckt);		    if(error) return(error);		}	    }	    break;    case D_TWOF1:    case D_THRF1:    case D_F1PF2:    case D_F1MF2:    case D_2F1MF2:	    size = SMPmatSize(ckt->CKTmatrix);	    for (i=1; i<=size; i++)	    {	    ckt->CKTrhs[i] = 0.0;	    ckt->CKTirhs[i] = 0.0;	    }	    for (i=0;i<DEVmaxnum;i++) {		if ( ((*DEVices[i]).DEVdisto != NULL) && (ckt->CKThead[i] != NULL) ){		    error = (*((*DEVices[i]).DEVdisto))(mode,ckt->CKThead[i],ckt);		    if(error) return(error);		}	    }	    break;    case D_RHSF1: 	   cv->Df2given = 0; /* will change if any F2 source is found */    case D_RHSF2:{    int vcode;    int icode;    int error;    double mag;    double phase;    int size;    size = SMPmatSize(ckt->CKTmatrix);    for (i=0;i<=size;i++) {        *(ckt->CKTrhs+i)=0;        *(ckt->CKTirhs+i)=0;	}    vcode = CKTtypelook("Vsource");    icode = CKTtypelook("Isource");        if(vcode >= 0) {            /* voltage sources are in this version, so use them */            register VSRCinstance *here;            register VSRCmodel *model;            for(model = (VSRCmodel *)ckt->CKThead[vcode];model != NULL;                    model=model->VSRCnextModel){                for(here=model->VSRCinstances;here!=NULL;                        here=here->VSRCnextInstance) {/* check if the source has a distortion input*/if (here->VSRCdGiven) {  if (here->VSRCdF2given) cv->Df2given = 1;  if ((here->VSRCdF1given) && (mode == D_RHSF1)) {      mag = here->VSRCdF1mag;     phase = here->VSRCdF1phase;}else if ((here->VSRCdF2given) && (mode == D_RHSF2)) {     mag = here->VSRCdF2mag;     phase = here->VSRCdF2phase;}if (((here->VSRCdF1given) && (mode == D_RHSF1)) || 	((here->VSRCdF2given) && (mode == D_RHSF2))) {   	*(ckt->CKTrhs + here->VSRCbranch) = 0.5*mag* cos(M_PI*phase/180.0);	*(ckt->CKTirhs + here->VSRCbranch) = 0.5*mag*sin(M_PI*phase/180.0); }                    }                }            }        }        if(icode >= 0 ) {            /* current sources are in this version, so use them */            register ISRCinstance *here;            register ISRCmodel *model;            for(model= (ISRCmodel *)ckt->CKThead[icode];model != NULL;                    model=model->ISRCnextModel){                for(here=model->ISRCinstances;here!=NULL;                        here=here->ISRCnextInstance) {/* check if the source has a distortion input*/if (here->ISRCdGiven) {  if (here->ISRCdF2given) cv->Df2given = 1;  if ((here->ISRCdF1given) && (mode == D_RHSF1)) {      mag = here->ISRCdF1mag;     phase = here->ISRCdF1phase;}else if ((here->ISRCdF2given) && (mode == D_RHSF2)) {     mag = here->ISRCdF2mag;     phase = here->ISRCdF2phase;}if (((here->ISRCdF1given) && (mode == D_RHSF1)) || 	((here->ISRCdF2given) && (mode == D_RHSF2))) {   	*(ckt->CKTrhs + here->ISRCposNode) = - 0.5 * mag		* cos(M_PI*phase/180.0);        *(ckt->CKTrhs + here->ISRCnegNode) =   0.5 * mag * cos(		M_PI*phase/180.0);	*(ckt->CKTirhs + here->ISRCposNode) = - 0.5 * mag * sin(		M_PI*phase/180.0);	*(ckt->CKTirhs + here->ISRCnegNode) = 0.5 * mag * sin(		M_PI*phase/180.0); }                    }                }            }        }}error = 0;break;    default: 	    error = E_BADPARM;	    break;    }    return(error);}

⌨️ 快捷键说明

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