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

📄 suprmitf.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1991 Regents of the University of California.  All rights reserved.Author:	1991 David A. Gates, U. C. Berkeley CAD Group**********//* *   Translated FORTRAN subroutine to read the SUPREM-3 binary file *   the data is read and stored in two arrays x and conc */#include "nummacs.h"#define MAXMAT 10#define MAXIMP 4#define MAXLAYER 10#define MAXGRID 500#define GFREAD( fp, ptr, type, num ) if (num && (fread( ptr,\		sizeof(type), (unsigned)num, fp ) != (unsigned)num)) {\		return;\		}#define DEBUG	if (0)voidSUPbinRead( inFile, x, conc, impId, numNod )char *inFile;float *x, *conc;int *impId, *numNod;{  int idata, recordMark;  int ldata;  int i, j;  float rdata;  char cdata[21];  int numLay, numImp, numGrid;  int impTyp[4], matTyp[10], topNod[10], siIndex, offset;  float xStart;  float layerTh[10];  float con[500];  FILE *fpSuprem;  /* Clear Concentration Array */  for ( i=0; i < MAXGRID; i++ ) {    conc[i] = 0.0;  }  /* Open Input File */  if (!(fpSuprem = fopen( inFile, "r" ))) {    perror(inFile);    return;  }/* * The first record contains the number of layers (I4), the number of  * impurities (I4), and the number of nodes (I4) present in the structure. */  GFREAD( fpSuprem, &recordMark, int, 1 );  GFREAD( fpSuprem, &numLay, int, 1 );  GFREAD( fpSuprem, &numImp, int, 1 );  GFREAD( fpSuprem, &numGrid, int, 1 );  DEBUG fprintf(stderr,"rec 1: %d %d %d\n", numLay, numImp, numGrid);  GFREAD( fpSuprem, &recordMark, int, 1 );/* * The second record contains, for each layer, the material type (I4), the * layer thickness (R4), and the pointer to the top node of the layer (I4). */  GFREAD( fpSuprem, &recordMark, int, 1 );  for ( i=0; i < numLay; i++ ) {    GFREAD( fpSuprem, &matTyp[i], int, 1 );    GFREAD( fpSuprem, &layerTh[i], float, 1 );    GFREAD( fpSuprem, &topNod[i], int, 1 );    DEBUG fprintf(stderr,"rec 2: %d %f %d\n", matTyp[i], layerTh[i], topNod[i] );  }  GFREAD( fpSuprem, &recordMark, int, 1 );/* * The third record contains, for each layer, the material name (A20). */  /* Put a null at the end */  cdata[20] = '\0';  GFREAD( fpSuprem, &recordMark, int, 1 );  for ( i=0; i < numLay; i++ ) {    GFREAD( fpSuprem, cdata, char, 20 );    DEBUG fprintf(stderr,"rec 3: %s\n", cdata );  }  GFREAD( fpSuprem, &recordMark, int, 1 );/* * The fourth record contains, for each layer, the crystalline orientation * (I4), and the poly-crystalline grain size in microns (R4). */  GFREAD( fpSuprem, &recordMark, int, 1 );  for ( i=0; i < numLay; i++ ) {    GFREAD( fpSuprem, &idata, int, 1 );    GFREAD( fpSuprem, &rdata, float, 1 );    DEBUG fprintf(stderr,"rec 4: %d %f\n", idata, rdata );  }  GFREAD( fpSuprem, &recordMark, int, 1 );     /* * The fifth record contains, for each impurity, the type of impurity (I4). */  GFREAD( fpSuprem, &recordMark, int, 1 );  for ( i=0; i < numImp; i++ ) {    GFREAD( fpSuprem, &impTyp[i], int, 1 );    DEBUG fprintf(stderr,"rec 5: %d\n", impTyp[i] );  }  GFREAD( fpSuprem, &recordMark, int, 1 );/* * The sixth record contains, for each impurity, the impurity name (A20). */  GFREAD( fpSuprem, &recordMark, int, 1 );  for ( i=0; i < numImp; i++ ) {    GFREAD( fpSuprem, cdata, char, 20 );    DEBUG fprintf(stderr,"rec 6: %s\n", cdata );  }  GFREAD( fpSuprem, &recordMark, int, 1 );/* * The seventh record contains, for each layer by each impurity, the * integrated dopant (R4), and the interior concentration of the * polysilicon grains (R4). */  GFREAD( fpSuprem, &recordMark, int, 1 );  for ( j=0; j < numLay; j++ ) {    for ( i=0; i < numImp; i++ ) {      GFREAD( fpSuprem, &rdata, float, 1 );      DEBUG fprintf(stderr,"rec 7: %e", rdata );      GFREAD( fpSuprem, &rdata, float, 1 );      DEBUG fprintf(stderr," %e\n", rdata );    }  }  GFREAD( fpSuprem, &recordMark, int, 1 );/* * The eighth record contains, for each node in the structure, the distance * to the next deepest node (R4). */  GFREAD( fpSuprem, &recordMark, int, 1 );  for ( i=0; i < numGrid; i++ ) {    GFREAD( fpSuprem, &rdata, float, 1 );  }  DEBUG fprintf(stderr,"rec 8: %f\n", rdata );  GFREAD( fpSuprem, &recordMark, int, 1 );/* * The ninth record contains, for each node in the structure, the distance * from the surface (R4). */  GFREAD( fpSuprem, &recordMark, int, 1 );  GFREAD( fpSuprem, &x[1], float, numGrid );  DEBUG fprintf(stderr,"rec 9: %f\n", x[1] );  GFREAD( fpSuprem, &recordMark, int, 1 );/* * Next, for each impurity there is a record containing the impurity's * chemical concentration at each node (R4) and a record containing the * impurity's active concentration at each node (R4). */  for ( j=0; j < numImp; j++ ) {/* chemical concentration - not required */    GFREAD( fpSuprem, &recordMark, int, 1 );    GFREAD( fpSuprem, &con[1], float, numGrid );    DEBUG fprintf(stderr,"rec 10: %e\n", con[1] );    GFREAD( fpSuprem, &recordMark, int, 1 );        /* store active concentration */    GFREAD( fpSuprem, &recordMark, int, 1 );    GFREAD( fpSuprem, &con[1], float, numGrid );    DEBUG fprintf(stderr,"rec 11: %e\n", con[1] );    GFREAD( fpSuprem, &recordMark, int, 1 );    if (impTyp[j] == *impId) {/*...Boron...*/      if (impTyp[j] == 1) {	for ( i=1; i <= numGrid; i++ ) conc[i] = - con[i];      } else {/*...All Other Impurities: P, As, Sb ...*/	for ( i=1; i <= numGrid; i++ ) conc[i] = con[i];      }    }  }/* * The last record in the file contains some random stuff that might be * useful to some people, the temperature in degrees Kelvin of the last * diffusion step (R4), the phosphorus implant dose (R4), the arsenic * implant flag (L4). */  GFREAD( fpSuprem, &recordMark, int, 1 );  GFREAD( fpSuprem, &rdata, float, 1 );  DEBUG fprintf(stderr,"rec 12: %f", rdata );  GFREAD( fpSuprem, &rdata, float, 1 );  DEBUG fprintf(stderr," %e", rdata );  GFREAD( fpSuprem, &ldata, int, 1 );  DEBUG fprintf(stderr," %d\n", ldata );  GFREAD( fpSuprem, &recordMark, int, 1 );  fclose( fpSuprem );/* shift silicon layer to beginning of array */  for ( j=0; j < numLay; j++ ) {    if (matTyp[ j ] == 1) {      siIndex = j;    }  }  offset = topNod[ siIndex ] - 1;  numGrid -= offset;  xStart = x[1 + offset];  for ( i=1; i <= numGrid; i++ ) {    x[i] = x[i + offset] - xStart;    conc[i] = conc[i + offset];  }/* Store number of valid nodes using pointer */  *numNod = numGrid;  return;}voidSUPascRead( inFile, x, conc, impId, numNod )char *inFile;float *x, *conc;int *impId, *numNod;{  int idata;  int ldata;  int i, j;  float rdata;  char cdata[21];  int numLay, numImp, numGrid;  int impTyp[4], matTyp[10], topNod[10], siIndex, offset;  float xStart;  float layerTh[10];  float con[500];  FILE *fpSuprem;  /* Clear Concentration Array */  for ( i=0; i < MAXGRID; i++ ) {    conc[i] = 0.0;  }  /* Open Input File */  if (!(fpSuprem = fopen( inFile, "r" ))) {    perror(inFile);    return;  }/* * The first line contains the number of layers (I4), the number of  * impurities (I4), and the number of nodes (I4) present in the structure. */  fscanf( fpSuprem, "%d %d %d\n", &numLay, &numImp, &numGrid );  DEBUG fprintf( stderr, "set 1: %d %d %d\n", numLay, numImp, numGrid);/* * The second set of lines contains, for each layer, the material name (A20), * the material type (I4), the layer thickness (R4), and the pointer to * the top node of the layer (I4), and an unknown int and unknown float. * The material type code: *   1 - Si *   2 - SiO2 *   3 - Poly *   4 - Si3N4 *   5 - Alum */  for ( i=0; i < numLay; i++ ) {    fscanf( fpSuprem, "%s\n %d %e %d %d %e\n",	cdata, &matTyp[i], &layerTh[i], &topNod[i], &idata, &rdata );    DEBUG fprintf(stderr,"set 2: %s: %d %f %d\n",	cdata, matTyp[i], layerTh[i], topNod[i] );  }/* * The third set of lines contains, for each impurity, the name of the * impurity (A20) and the type of impurity (I4). */  for ( i=0; i < numImp; i++ ) {    fscanf( fpSuprem, "%s\n %d\n", cdata, &impTyp[i] );    DEBUG fprintf(stderr,"set 3: %s: %d\n", cdata, impTyp[i] );  }/* * The fourth set of lines contains, for each layer by each impurity, the * integrated dopant (R4), and the interior concentration of the * polysilicon grains (R4). */  for ( j=0; j < numLay; j++ ) {    for ( i=0; i < numImp; i++ ) {      fscanf( fpSuprem, "%e", &rdata );      fscanf( fpSuprem, "%e", &rdata );    }  }  DEBUG fprintf(stderr,"set 4:\n" );/* * The fifth set of lines contains, for each node in the structure, * the distance to the next deepest node (R4), the distance from the * surface (R4), and, for each impurity type, the impurity's * chemical concentration (R4) and the impurity's active concentration (R4). */  for ( i=1; i <= numGrid; i++ ) {    fscanf( fpSuprem, "%e %e", &rdata, &x[i] );    for ( j=0; j < numImp; j++ ) {/* chemical concentration - not required */      fscanf( fpSuprem, "%e", &con[i] );        /* store active concentration */      fscanf( fpSuprem, "%e", &con[i] );/* orient sign properly */      if (impTyp[j] == *impId) {/*...Boron...*/	if (impTyp[j] == 1) {	  conc[i] = - con[i];	} else {/*...All Other Impurities: P, As, Sb ...*/	  conc[i] = con[i];	}      }    }  }  DEBUG fprintf( stderr, "set 5: %e %e\n", x[1], conc[1] );/* * The last line in the file contains some random stuff that might be * useful to some people, the temperature in degrees Kelvin of the last * diffusion step (R4), the phosphorus implant dose (R4), the arsenic * implant flag (L4).  However, we can just ignore that stuff. */  fclose( fpSuprem );/* shift silicon layer to beginning of array */  for ( j=0; j < numLay; j++ ) {    if (matTyp[ j ] == 1) {      siIndex = j;    }  }  offset = topNod[ siIndex ] - 1;  numGrid -= offset;  xStart = x[1 + offset];  for ( i=1; i <= numGrid; i++ ) {    x[i] = x[i + offset] - xStart;    conc[i] = conc[i + offset];  }/* Store number of valid nodes using pointer */  *numNod = numGrid;  return;}

⌨️ 快捷键说明

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