📄 nummdump.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 "numosdef.h"#include "suffix.h"/* External Declarations */extern void TWOprnSolution();extern void TWOmemStats(), TWOcpuStats();/* Forward Declarations */static void NUMOSputHeader();/* State Counter */static int state_numOP = 0;static int state_numDC = 0;static int state_numTR = 0;voidNUMOSdump(inModel, ckt) GENmodel *inModel; CKTcircuit *ckt;{ register NUMOSmodel *model = (NUMOSmodel *) inModel; register NUMOSinstance *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->NUMOSnextModel) { output = model->NUMOSoutputs; for (inst = model->NUMOSinstances; inst != NULL; inst = inst->NUMOSnextInstance) { if (inst->NUMOSowner != ARCHme) continue; if (inst->NUMOSprintGiven) { if ((ckt->CKTmode & MODETRAN) && ((ckt->CKTstat->STATaccepted - 1) % inst->NUMOSprint != 0)) { continue; } anyOutput = 1; sprintf(fileName, "%s%s.%d.%s", output->OUTProotFile, prefix, *state_num, inst->NUMOSname); if (!(fpState = fopen(fileName, "w"))) { perror(fileName); } else { NUMOSputHeader(fpState, ckt, inst); TWOprnSolution(fpState, inst->NUMOSpDevice, model->NUMOSoutputs); fclose(fpState); LOGmakeEntry(fileName, description); } } } } if (anyOutput) { (*state_num)++; }}#define NUMOSnumOutputs 10staticvoidNUMOSputHeader(file, ckt, inst) FILE *file; CKTcircuit *ckt; NUMOSinstance *inst;{ char *reference; double refVal; int numVars = NUMOSnumOutputs; 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->NUMOSname); 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 v14 voltage\n", numVars++); fprintf(file, "\t%d v24 voltage\n", numVars++); fprintf(file, "\t%d v34 voltage\n", numVars++); fprintf(file, "\t%d i1 current\n", numVars++); fprintf(file, "\t%d i2 current\n", numVars++); fprintf(file, "\t%d i3 current\n", numVars++); fprintf(file, "\t%d i4 current\n", numVars++); fprintf(file, "\t%d g11 conductance\n", numVars++); fprintf(file, "\t%d g12 conductance\n", numVars++); fprintf(file, "\t%d g13 conductance\n", numVars++); fprintf(file, "Values:\n0"); if (reference) { fprintf(file, "\t% e\n", refVal); } fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMOSvdb)); fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMOSvgb)); fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMOSvsb)); fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMOSid)); fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMOSig)); fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMOSis)); fprintf(file, "\t% e\n", -*(ckt->CKTstate0 + inst->NUMOSid) - *(ckt->CKTstate0 + inst->NUMOSig) - *(ckt->CKTstate0 + inst->NUMOSis)); fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMOSdIdDVdb)); fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMOSdIdDVgb)); fprintf(file, "\t% e\n", *(ckt->CKTstate0 + inst->NUMOSdIdDVsb));}intNUMOSacct(inModel, ckt, file) GENmodel *inModel; CKTcircuit *ckt; FILE *file;{ register NUMOSmodel *model = (NUMOSmodel *) inModel; register NUMOSinstance *inst; OUTPcard *output; for (; model != NULL; model = model->NUMOSnextModel) { output = model->NUMOSoutputs; for (inst = model->NUMOSinstances; inst != NULL; inst = inst->NUMOSnextInstance) { if (inst->NUMOSowner != ARCHme) continue; if (output->OUTPstats) { TWOmemStats(file, inst->NUMOSpDevice); TWOcpuStats(file, inst->NUMOSpDevice); } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -