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

📄 twoprint.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/**********Copyright 1992 Regents of the University of California.  All rights reserved.Author:	1987 Kartikeya Mayaram, U. C. Berkeley CAD GroupAuthor:	1992 David A. Gates, U. C. Berkeley CAD Group**********/#include <math.h>#include "numglobs.h"#include "numconst.h"#include "numenum.h"#include "nummacs.h"#include "twomesh.h"#include "twodev.h"#include "carddefs.h"#include "spmatrix.h"voidTWOprnSolution(file, pDevice, output)  FILE *file;  TWOdevice *pDevice;  OUTPcard *output;{  int i, index, xIndex, yIndex;  int numVars = 0;  TWOnode ***nodeArray;  TWOnode *pNode;  TWOelem *pElem, *pNextElem;  TWOmaterial *info;  double data[50];  double ex, ey, refPsi = 0.0, eGap, dGap;  double mun, mup;  double jcx, jdx, jnx, jpx, jtx;  double jcy, jdy, jny, jpy, jty;  double *xScale = pDevice->xScale;  double *yScale = pDevice->yScale;  BOOLEAN foundElem;  if (output->OUTPnumVars == -1) {    /* First pass. Need to count number of variables in output. */    numVars += 2;		/* For the X & Y scales */    if (output->OUTPdoping) {      numVars++;    }    if (output->OUTPpsi) {      numVars++;    }    if (output->OUTPequPsi) {      numVars++;    }    if (output->OUTPvacPsi) {      numVars++;    }    if (output->OUTPnConc) {      numVars++;    }    if (output->OUTPpConc) {      numVars++;    }    if (output->OUTPphin) {      numVars++;    }    if (output->OUTPphip) {      numVars++;    }    if (output->OUTPphic) {      numVars++;    }    if (output->OUTPphiv) {      numVars++;    }    if (output->OUTPeField) {      numVars += 2;    }    if (output->OUTPjc) {      numVars += 2;    }    if (output->OUTPjd) {      numVars += 2;    }    if (output->OUTPjn) {      numVars += 2;    }    if (output->OUTPjp) {      numVars += 2;    }    if (output->OUTPjt) {      numVars += 2;    }    if (output->OUTPuNet) {      numVars++;    }    if (output->OUTPmun) {      numVars++;    }    if (output->OUTPmup) {      numVars++;    }    output->OUTPnumVars = numVars;  }  /* generate the work array for printing node info */  ALLOC(nodeArray, TWOnode **, 1 + pDevice->numXNodes);  for (xIndex = 1; xIndex <= pDevice->numXNodes; xIndex++) {    ALLOC(nodeArray[xIndex], TWOnode *, 1 + pDevice->numYNodes);  }  /* store the nodes in this work array and print out later */  for (xIndex = 1; xIndex < pDevice->numXNodes; xIndex++) {    for (yIndex = 1; yIndex < pDevice->numYNodes; yIndex++) {      pElem = pDevice->elemArray[xIndex][yIndex];      if (pElem ISNOT NIL(TWOelem)) {	if (refPsi == 0.0 && pElem->matlInfo->type == SEMICON) {	  refPsi = pElem->matlInfo->refPsi;	}	for (index = 0; index <= 3; index++) {	  if (pElem->evalNodes[index]) {	    pNode = pElem->pNodes[index];	    nodeArray[pNode->nodeI][pNode->nodeJ] = pNode;	  }	}      }    }  }  /* Initialize rawfile */  numVars = output->OUTPnumVars;  fprintf(file, "Title: Device %s internal state\n", pDevice->name);  fprintf(file, "Plotname: Device Cross Section\n");  fprintf(file, "Flags: real\n");  fprintf(file, "Command: deftype p xs cross\n");  fprintf(file, "Command: deftype v distance m\n");  fprintf(file, "Command: deftype v concentration cm^-3\n");  fprintf(file, "Command: deftype v electric_field V/cm\n");  fprintf(file, "Command: deftype v current_density A/cm^2\n");  fprintf(file, "Command: deftype v concentration/time cm^-3/s\n");  fprintf(file, "Command: deftype v mobility cm^2/Vs\n");  fprintf(file, "No. Variables: %d\n", numVars);  fprintf(file, "No. Points: %d\n",      pDevice->numXNodes * pDevice->numYNodes);  fprintf(file, "Dimensions: %d,%d\n",      pDevice->numXNodes, pDevice->numYNodes);  numVars = 0;  fprintf(file, "Variables:\n");  fprintf(file, "\t%d	y	distance\n", numVars++);  fprintf(file, "\t%d	x	distance\n", numVars++);  if (output->OUTPpsi) {    fprintf(file, "\t%d	psi	voltage\n", numVars++);  }  if (output->OUTPequPsi) {    fprintf(file, "\t%d	equ.psi	voltage\n", numVars++);  }  if (output->OUTPvacPsi) {    fprintf(file, "\t%d	vac.psi	voltage\n", numVars++);  }  if (output->OUTPphin) {    fprintf(file, "\t%d	phin	voltage\n", numVars++);  }  if (output->OUTPphip) {    fprintf(file, "\t%d	phip	voltage\n", numVars++);  }  if (output->OUTPphic) {    fprintf(file, "\t%d	phic	voltage\n", numVars++);  }  if (output->OUTPphiv) {    fprintf(file, "\t%d	phiv	voltage\n", numVars++);  }  if (output->OUTPdoping) {    fprintf(file, "\t%d	dop	concentration\n", numVars++);  }  if (output->OUTPnConc) {    fprintf(file, "\t%d	n	concentration\n", numVars++);  }  if (output->OUTPpConc) {    fprintf(file, "\t%d	p	concentration\n", numVars++);  }  if (output->OUTPeField) {    fprintf(file, "\t%d	ex	electric_field\n", numVars++);    fprintf(file, "\t%d	ey	electric_field\n", numVars++);  }  if (output->OUTPjc) {    fprintf(file, "\t%d	jcx	current_density\n", numVars++);    fprintf(file, "\t%d	jcy	current_density\n", numVars++);  }  if (output->OUTPjd) {    fprintf(file, "\t%d	jdx	current_density\n", numVars++);    fprintf(file, "\t%d	jdy	current_density\n", numVars++);  }  if (output->OUTPjn) {    fprintf(file, "\t%d	jnx	current_density\n", numVars++);    fprintf(file, "\t%d	jny	current_density\n", numVars++);  }  if (output->OUTPjp) {    fprintf(file, "\t%d	jpx	current_density\n", numVars++);    fprintf(file, "\t%d	jpy	current_density\n", numVars++);  }  if (output->OUTPjt) {    fprintf(file, "\t%d	jtx	current_density\n", numVars++);    fprintf(file, "\t%d	jty	current_density\n", numVars++);  }  if (output->OUTPuNet) {    fprintf(file, "\t%d	unet	concentration/time\n", numVars++);  }  if (output->OUTPmun) {    fprintf(file, "\t%d	mun	mobility\n", numVars++);  }  if (output->OUTPmup) {    fprintf(file, "\t%d	mup	mobility\n", numVars++);  }  fprintf(file, "Binary:\n");  for (xIndex = 1; xIndex <= pDevice->numXNodes; xIndex++) {    for (yIndex = 1; yIndex <= pDevice->numYNodes; yIndex++) {      pNode = nodeArray[xIndex][yIndex];      if (pNode ISNOT NIL(TWOnode)) {	/* Find the element to which this node belongs. */	foundElem = FALSE;	for (index = 0; index <= 3 AND NOT foundElem; index++) {	  pElem = pNode->pElems[index];	  if (pElem ISNOT NIL(TWOelem) && pElem->evalNodes[(index + 2) % 4]) {	    foundElem = TRUE;	  }	}	nodeFields(pElem, pNode, &ex, &ey);	nodeCurrents(pElem, pNode, &mun, &mup,	    &jnx, &jny, &jpx, &jpy, &jdx, &jdy);	jcx = jnx + jpx;	jcy = jny + jpy;	jtx = jcx + jdx;	jty = jcy + jdy;	info = pElem->matlInfo;	eGap = pNode->eg * VNorm;	dGap = 0.5 * (info->eg0 - eGap);	/* Now fill in the data array */	numVars = 0;	data[numVars++] = yScale[yIndex] * 1e-2;	data[numVars++] = xScale[xIndex] * 1e-2;	if (output->OUTPpsi) {	  data[numVars++] = (pNode->psi - refPsi) * VNorm;	}	if (output->OUTPequPsi) {	  data[numVars++] = (pNode->psi0 - refPsi) * VNorm;	}	if (output->OUTPvacPsi) {	  data[numVars++] = pNode->psi * VNorm;	}	if (output->OUTPphin) {	  if (info->type != INSULATOR) {	    data[numVars++] = (pNode->psi - refPsi		- log(pNode->nConc / pNode->nie)) * VNorm;	  } else {	    data[numVars++] = 0.0;	  }	}	if (output->OUTPphip) {	  if (info->type != INSULATOR) {	    data[numVars++] = (pNode->psi - refPsi		+ log(pNode->pConc / pNode->nie)) * VNorm;	  } else {	    data[numVars++] = 0.0;	  }	}	if (output->OUTPphic) {	  data[numVars++] = (pNode->psi + pNode->eaff) * VNorm + dGap;	}	if (output->OUTPphiv) {	  data[numVars++] = (pNode->psi + pNode->eaff) * VNorm + dGap + eGap;	}	if (output->OUTPdoping) {	  data[numVars++] = pNode->netConc * NNorm;	}	if (output->OUTPnConc) {	  data[numVars++] = pNode->nConc * NNorm;	}	if (output->OUTPpConc) {	  data[numVars++] = pNode->pConc * NNorm;	}	if (output->OUTPeField) {	  data[numVars++] = ex * ENorm;	  data[numVars++] = ey * ENorm;	}	if (output->OUTPjc) {	  data[numVars++] = jcx * JNorm;	  data[numVars++] = jcy * JNorm;

⌨️ 快捷键说明

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