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

📄 oneprint.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 "onemesh.h"#include "onedev.h"#include "carddefs.h"#include "spmatrix.h"voidONEprnSolution(file, pDevice, output)  FILE *file;  ONEdevice *pDevice;  OUTPcard *output;{  int index, i;  int numVars = 0;  ONEnode **nodeArray;  ONEnode *pNode;  ONEelem *pElem, *pPrevElem;  ONEmaterial *info;  double data[50];  double eField, refPsi = 0.0, eGap, dGap;  double mun, mup, jc, jd, jn, jp, jt;  double coeff1, coeff2;  if (output->OUTPnumVars == -1) {    /* First pass. Need to count number of variables in output. */    numVars++;			/* For the X scale */    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++;    }    if (output->OUTPjc) {      numVars++;    }    if (output->OUTPjd) {      numVars++;    }    if (output->OUTPjn) {      numVars++;    }    if (output->OUTPjp) {      numVars++;    }    if (output->OUTPjt) {      numVars++;    }    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, ONEnode *, 1 + pDevice->numNodes);  /* store the nodes in this work array and print out later */  for (index = 1; index < pDevice->numNodes; index++) {    pElem = pDevice->elemArray[index];    if (refPsi == 0.0 && pElem->matlInfo->type == SEMICON) {      refPsi = pElem->matlInfo->refPsi;    }    for (i = 0; i <= 1; i++) {      if (pElem->evalNodes[i]) {	pNode = pElem->pNodes[i];	nodeArray[pNode->nodeI] = 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->numNodes);  numVars = 0;  fprintf(file, "Variables:\n");  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	e	electric_field\n", numVars++);  }  if (output->OUTPjc) {    fprintf(file, "\t%d	jc	current_density\n", numVars++);  }  if (output->OUTPjd) {    fprintf(file, "\t%d	jd	current_density\n", numVars++);  }  if (output->OUTPjn) {    fprintf(file, "\t%d	jn	current_density\n", numVars++);  }  if (output->OUTPjp) {    fprintf(file, "\t%d	jp	current_density\n", numVars++);  }  if (output->OUTPjt) {    fprintf(file, "\t%d	jt	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 (index = 1; index <= pDevice->numNodes; index++) {    pNode = nodeArray[index];    if (index > 1 AND index < pDevice->numNodes) {      pElem = pNode->pRightElem;      pPrevElem = pNode->pLeftElem;      if (pElem->evalNodes[0]) {	info = pElem->matlInfo;      } else if (pPrevElem->evalNodes[1]) {	info = pPrevElem->matlInfo;      }      coeff1 = pPrevElem->dx / (pPrevElem->dx + pElem->dx);      coeff2 = pElem->dx / (pPrevElem->dx + pElem->dx);      eField = -coeff1 * pElem->pEdge->dPsi * pElem->rDx	  - coeff2 * pPrevElem->pEdge->dPsi * pPrevElem->rDx;      mun = coeff1 * pElem->pEdge->mun + coeff2 * pPrevElem->pEdge->mun;      mup = coeff1 * pElem->pEdge->mup + coeff2 * pPrevElem->pEdge->mup;      jn = coeff1 * pElem->pEdge->jn + coeff2 * pPrevElem->pEdge->jn;      jp = coeff1 * pElem->pEdge->jp + coeff2 * pPrevElem->pEdge->jp;      jd = coeff1 * pElem->pEdge->jd + coeff2 * pPrevElem->pEdge->jd;    } else if (index == 1) {      info = pNode->pRightElem->matlInfo;      eField = 0.0;      mun = pNode->pRightElem->pEdge->mun;      mup = pNode->pRightElem->pEdge->mup;      jn = pNode->pRightElem->pEdge->jn;      jp = pNode->pRightElem->pEdge->jp;      jd = pNode->pRightElem->pEdge->jd;    } else {      info = pNode->pLeftElem->matlInfo;      eField = 0.0;      mun = pNode->pLeftElem->pEdge->mun;      mup = pNode->pLeftElem->pEdge->mup;      jn = pNode->pLeftElem->pEdge->jn;      jp = pNode->pLeftElem->pEdge->jp;      jd = pNode->pLeftElem->pEdge->jd;    }    jc = jn + jp;    jt = jc + jd;    /* Crude hack to get around the fact that the base node wipes out 'eg' */    if (index == pDevice->baseIndex) {      eGap = info->eg0;      dGap = 0.0;    } else {      eGap = pNode->eg * VNorm;      dGap = 0.5 * (info->eg0 - eGap);    }    /* Now fill in the data array */    numVars = 0;    data[numVars++] = pNode->x * 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) {

⌨️ 快捷键说明

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