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

📄 cktnoise.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1987 Gary W. Ng**********//* * CKTnoise (ckt, mode, operation, data) * *   This routine is responsible for naming and evaluating all of the *   noise sources in the circuit.  It uses a series of subroutines to *   name and evaluate the sources associated with each model, and then *   it evaluates the noise for the entire circuit. */#include "spice.h"#include <stdio.h>#include "cktdefs.h"#include "devdefs.h"#include "fteconst.h"#include "iferrmsg.h"#include "noisedef.h"#include "sperror.h"#include "util.h"#include "suffix.h"intCKTnoise (ckt, mode, operation, data)    CKTcircuit *ckt;    int mode;    int operation;    Ndata *data;{    double outNdens;    int i;    extern SPICEdev *DEVices[];    IFvalue outData;    /* output variable (points to list of outputs)*/    IFvalue refVal; /* reference variable (always 0)*/    int error;    outNdens = 0.0;    /* let each device decide how many and what type of noise sources it has */    for (i=0; i < DEVmaxnum; i++) {	if ( ((*DEVices[i]).DEVnoise != NULL) && (ckt->CKThead[i] != NULL) ) {	    error = (*((*DEVices[i]).DEVnoise))(mode,operation,ckt->CKThead[i],		ckt,data, &outNdens);            if (error) return (error);        }    }    switch (operation) {    case N_OPEN:	/* take care of the noise for the circuit as a whole */	switch (mode) {	case N_DENS:	    data->namelist = (IFuid *)trealloc((char *)data->namelist,		    (data->numPlots + 1)*sizeof(IFuid));	    (*(SPfrontEnd->IFnewUid))(ckt, &(data->namelist[data->numPlots++]),		    (IFuid)NULL,"onoise_spectrum",UID_OTHER,(GENERIC **)NULL);	    data->namelist = (IFuid *)trealloc((char *)data->namelist,		    (data->numPlots + 1)*sizeof(IFuid));	    (*(SPfrontEnd->IFnewUid))(ckt, &(data->namelist[data->numPlots++]),		    (IFuid)NULL,"inoise_spectrum",UID_OTHER,(GENERIC **)NULL);	    /* we've added two more plots */	    data->outpVector =		(double *)MALLOC(data->numPlots * sizeof(double));            break;	case INT_NOIZ:	    data->namelist = (IFuid *)trealloc((char *)data->namelist,		    (data->numPlots + 1)*sizeof(IFuid));	    (*(SPfrontEnd->IFnewUid))(ckt, &(data->namelist[data->numPlots++]),		(IFuid)NULL,"onoise_total",UID_OTHER,(GENERIC **)NULL);	    data->namelist = (IFuid *)trealloc((char *)data->namelist,		    (data->numPlots + 1)*sizeof(IFuid));	    (*(SPfrontEnd->IFnewUid))(ckt, &(data->namelist[data->numPlots++]),		(IFuid)NULL,"inoise_total",UID_OTHER,(GENERIC **)NULL);	    /* we've added two more plots */	    data->outpVector =		(double *) MALLOC(data->numPlots * sizeof(double));	    break;        default:	    return (E_INTERN);        }	break;    case N_CALC:	switch (mode) {	case N_DENS:            if ((((NOISEAN*)ckt->CKTcurJob)->NStpsSm == 0)		|| data->prtSummary)	    {		data->outpVector[data->outNumber++] = outNdens;		data->outpVector[data->outNumber++] =		    (outNdens * data->GainSqInv);		refVal.rValue = data->freq; /* the reference is the freq */		outData.v.numValue = data->outNumber; /* vector number */		outData.v.vec.rVec = data->outpVector; /* vector of outputs */		(*(SPfrontEnd->OUTpData))(data->NplotPtr,&refVal,&outData);            }            break;	case INT_NOIZ:	    data->outpVector[data->outNumber++] =  data->outNoiz; 	    data->outpVector[data->outNumber++] =  data->inNoise;	    outData.v.vec.rVec = data->outpVector; /* vector of outputs */	    outData.v.numValue = data->outNumber; /* vector number */	    (*(SPfrontEnd->OUTpData))(data->NplotPtr,&refVal,&outData);	    break;	default:	    return (E_INTERN);        }        break;    case N_CLOSE:	(*(SPfrontEnd->OUTendPlot))(data->NplotPtr);	FREE(data->namelist);	FREE(data->outpVector);        break;    default:	return (E_INTERN);    }    return (OK);}

⌨️ 快捷键说明

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