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

📄 numddump.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1992 Regents of the University of California.  All rights reserved.Author:	1987 Kartikeya Mayaram, U. C. Berkeley CAD GroupAuthor:	1991 David A. Gates, U. C. Berkeley CAD Group**********//* * This is a simple routine to dump the internal device states. It produces * states for .OP, .DC, & .TRAN simulations. */#include "spice.h"#include "misc.h"#include <stdio.h>#include "cktdefs.h"#include "numddefs.h"#include "suffix.h"/* External Declarations */extern void ONEprnSolution();extern void ONEmemStats();/* Forward Declarations */static void NUMDputHeader();/* State Counter */static int state_numOP = 0;static int state_numDC = 0;static int state_numTR = 0;voidNUMDdump(inModel, ckt)  GENmodel *inModel;  CKTcircuit *ckt;{  register NUMDmodel *model = (NUMDmodel *) inModel;  register NUMDinstance *inst;  OUTPcard *output;  FILE *fpState;  char fileName[BSIZE_SP];  char description[BSIZE_SP];  char *prefix;  int *state_num;  int anyOutput = 0;  if (ckt->CKTmode & MODEDCOP) {    prefix = "OP";    state_num = &state_numOP;    sprintf(description, "...");  } else if (ckt->CKTmode & MODEDCTRANCURVE) {    prefix = "DC";    state_num = &state_numDC;    sprintf(description, "sweep = % e", ckt->CKTtime);  } else if (ckt->CKTmode & MODETRAN) {    prefix = "TR";    state_num = &state_numTR;    sprintf(description, "time = % e", ckt->CKTtime);  } else {    /* Not a recognized CKT mode. */    return;  }  for (; model != NULL; model = model->NUMDnextModel) {    output = model->NUMDoutputs;    for (inst = model->NUMDinstances; inst != NULL;	inst = inst->NUMDnextInstance) {      if (inst->NUMDowner != ARCHme) continue;      if (inst->NUMDprintGiven) {	if ((ckt->CKTmode & MODETRAN) &&	    ((ckt->CKTstat->STATaccepted - 1) % inst->NUMDprint != 0)) {	  continue;	}	anyOutput = 1;	sprintf(fileName, "%s%s.%d.%s", output->OUTProotFile, prefix,	    *state_num, inst->NUMDname);	if (!(fpState = fopen(fileName, "w"))) {	  perror(fileName);	} else {	  NUMDputHeader(fpState, ckt, inst);	  ONEprnSolution(fpState, inst->NUMDpDevice,	      model->NUMDoutputs);	  fclose(fpState);	  LOGmakeEntry(fileName, description);	}      }    }  }  if (anyOutput) {    (*state_num)++;  }}#define NUMDnumOutputs 4staticvoid NUMDputHeader(file, ckt, inst)  FILE *file;  CKTcircuit *ckt;  NUMDinstance *inst;{  char *reference;  double refVal;  int numVars = NUMDnumOutputs;  if (ckt->CKTmode & MODEDCOP) {    reference = NULL;  } else if (ckt->CKTmode & MODEDCTRANCURVE) {    reference = "sweep";    refVal = ckt->CKTtime;    numVars++;  } else if (ckt->CKTmode & MODETRAN) {    reference = "time";    refVal = ckt->CKTtime;    numVars++;  } else {    reference = NULL;  }  fprintf(file, "Title: Device %s external state\n", inst->NUMDname);  fprintf(file, "Plotname: Device Operating Point\n");  fprintf(file, "Command: deftype v conductance S\n");  fprintf(file, "Flags: real\n");  fprintf(file, "No. Variables: %d\n", numVars);  fprintf(file, "No. Points: 1\n");  numVars = 0;  fprintf(file, "Variables:\n");  if (reference) {    fprintf(file, "\t%d	%s	unknown\n", numVars++, reference);  }  fprintf(file, "\t%d	v12 	voltage\n", numVars++);  fprintf(file, "\t%d	i1 	current\n", numVars++);  fprintf(file, "\t%d	i2 	current\n", numVars++);  fprintf(file, "\t%d	g11 	conductance\n", numVars++);  fprintf(file, "Values:\n0");  if (reference) {    fprintf(file, "\t% e\n", refVal);  }  fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMDvoltage));  fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMDid));  fprintf(file, "\t% e\n", - *(ckt->CKTstate0 + inst->NUMDid));  fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMDconduct));}intNUMDacct(inModel, ckt, file)  GENmodel *inModel;  CKTcircuit *ckt;  FILE *file;{  register NUMDmodel *model = (NUMDmodel *) inModel;  register NUMDinstance *inst;  OUTPcard *output;  for (; model != NULL; model = model->NUMDnextModel) {    output = model->NUMDoutputs;    for (inst = model->NUMDinstances; inst != NULL;	inst = inst->NUMDnextInstance) {      if (inst->NUMDowner != ARCHme) continue;      if (output->OUTPstats) {	ONEmemStats(file, inst->NUMDpDevice);	ONEcpuStats(file, inst->NUMDpDevice);      }    }  }}

⌨️ 快捷键说明

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