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

📄 twoelect.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1991 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**********/#include "numglobs.h"#include "numconst.h"#include "numenum.h"#include "nummacs.h"#include "twomesh.h"#include "twodev.h"/* Use list-sorting header file to create electrode sorter */#define TYPE		TWOelectrode#define NEXT		next#define SORT		TWOssortElectrodes#define SORT1		TWOsortElectrodes#include "lsort.h"#define ARG_MIN(a,b,c) ((a) > (b) ? 1 : ((a) < (b) ? -1 : (c)))int TWOcmpElectrode(a, b)TWOelectrode *a, *b;{    return ARG_MIN(a->id, b->id, 0);}/* * checkElectrodes *   debug list of electrodes for errors, exit on any error: *   1. list doesn't have only contiguous id's from 1 to idHigh *   2. electrodes with box shapes *   3. order of node numbers is correct */voidcheckElectrodes( pElectrode, idHigh )TWOelectrode *pElectrode;int idHigh;{  TWOelectrode *pE;  int id;  BOOLEAN error = FALSE;  /*   * order the electrodes   * assign electrode numbers to uninitialized electrodes ( id == -1 )   * uninit electrodes are in reverse order from order in input file   * resort electrodes   */  pElectrode = TWOsortElectrodes( pElectrode, TWOcmpElectrode );  id = 1;  for (pE = pElectrode; pE != NIL(TWOelectrode); pE = pE->next) {    if (pE->id == -1) pE->id = id++;  }  pElectrode = TWOsortElectrodes( pElectrode, TWOcmpElectrode );  for (pE = pElectrode, id = 1; pE != NIL(TWOelectrode); pE = pE->next) {  /* Check id's */    if ( pE->id < 1 || pE->id > idHigh) {      fprintf(stderr, "Error: electrode %d out of range\n",pE->id);      error = TRUE;    } else if ( pE->id != id ) {      if ( pE->id != ++id ) {	fprintf(stderr, "Error: electrode(s) %d to %d missing\n",id,pE->id-1);	id = pE->id;	error = TRUE;      }    }  }  /* Make sure total number of distinct electrodes is correct */  if ( id != idHigh ) {    fprintf(stderr, "Error: %d electrode%s not equal to %d required\n",	id, (id != 1) ? "s are" : " is", idHigh);    error = TRUE;  }      if (error) {    exit(-1);  }}/* * setupContacts *   go through each set of electrode segments, find its size and find nodes */#define MAXTERMINALS 5  /* One more than max number of terminals */#define ELCT_ID poiEqnvoidsetupContacts( pDevice, pElectrode, nodeArray )TWOdevice *pDevice;TWOelectrode *pElectrode;TWOnode ***nodeArray;{  TWOelectrode *pE;  TWOcontact *pNew, *pTail;  TWOnode *pNode;  int xIndex, yIndex, nIndex;  int id = 0, electrodeSize[MAXTERMINALS], electrodeType;  int error = FALSE;  /* INITIALIZATION   * 0. Assume ELCT_ID's are initialized to 0 before setup is called   * 1. Add a node only once to only one electrode   * 2. Compute number of nodes in each electrode   * 3. Overwrite SEMICON or INSULATOR nodeType at electrodes   */  for ( pE = pElectrode; pE != NIL(TWOelectrode); pE = pE->next ) {    if (pE->id != id) { /* Found the next electrode */      id = pE->id;      electrodeSize[id] = 0;      electrodeType = NULL;    }    for ( xIndex = pE->ixLo; xIndex <= pE->ixHi; xIndex++ ) {      for ( yIndex = pE->iyLo; yIndex <= pE->iyHi; yIndex++ ) {        pNode = nodeArray[ xIndex ][ yIndex ];        if ( pNode != NIL( TWOnode ) ) {          pNode->nodeType = CONTACT;	  /* Assign each node to an electrode only once */	  if (pNode->ELCT_ID == 0) { /* Is this a new node? */	    pNode->ELCT_ID = id;     /* Mark electrode ownership */	    electrodeSize[id]++;    /* Increase electrode size */	  } else if (pNode->ELCT_ID != id) {				   /* Node already owned by another electrode */	    fprintf(stderr, "Error: electrodes %d and %d overlap at (%d,%d)\n",		pNode->ELCT_ID, id, xIndex, yIndex);	    error = TRUE;	  }        }      }    }  }  if (error) {    exit(-1);  }  /* ALLOCATION AND NODE GRABBING   * 1. For each electrode, create a new contact structure for the electrode.   * 2. Fill in entries of contact structure   * 3. Update First and Last Contact pointers of device   *//*  printElectrodes( pDevice->pFirstContact );*/  id = 0;  pDevice->pFirstContact = pTail = NIL(TWOcontact);  for ( pE = pElectrode; pE != NIL(TWOelectrode); pE = pE->next ) {    if (pE->id != id) { /* Found the next electrode */      if ( pDevice->pFirstContact == NIL(TWOcontact) ) {	ALLOC( pNew, TWOcontact, 1 );	pDevice->pFirstContact = pTail = pNew;      } else {	ALLOC( pNew->next, TWOcontact, 1 );	pTail = pNew = pNew->next;      }      pNew->next = NIL(TWOcontact);      id = pNew->id = pE->id;      pNew->workf = pE->workf;      pNew->numNodes = electrodeSize[id];      nIndex = 0;      ALLOC( pNew->pNodes, TWOnode *, electrodeSize[id] );    }    for ( xIndex = pE->ixLo; xIndex <= pE->ixHi; xIndex++ ) {      for ( yIndex = pE->iyLo; yIndex <= pE->iyHi; yIndex++ ) {        pNode = nodeArray[ xIndex ][ yIndex ];        if ( pNode != NIL( TWOnode ) ) {	  /* Make sure node belongs to this electrode, then	   * clear ELCT_ID so that it is not grabbed again.	   */	  if (pNode->ELCT_ID == id) {	    pNew->pNodes[ nIndex++ ] = pNode;	    pNode->ELCT_ID = 0;	  }	}      }    }  }  pDevice->pLastContact = pTail;}

⌨️ 快捷键说明

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