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

📄 elctset.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1991 Regents of the University of California.  All rights reserved.Author:	1991 David A. Gates, U. C. Berkeley CAD Group**********/#include "spice.h"#include <stdio.h>#include <math.h>#include "const.h"#include "util.h"#include "cktdefs.h"#include "nummacs.h"#include "elctdefs.h"#include "meshext.h"#include "twomesh.h"#include "gendev.h"#include "sperror.h"#include "suffix.h"#ifdef __STDC__extern int ELCTcheck( ELCTcard * );extern int ELCTsetup( ELCTcard *, ELCTelectrode **, MESHcoord *, MESHcoord * );#elseextern int ELCTcheck();extern int ELCTsetup();#endif /* STDC *//* * Name:	ELCTcheck * Purpose:	checks a list of ELCTcards for input errors * Formals:	cardList: the list to check * Returns:	OK/E_PRIVATE * Users:	 numerical device setup routines * Calls:	error message handler */intELCTcheck( cardList )ELCTcard *cardList;{  register ELCTcard *card;  int cardNum = 0;  int error = OK;  char ebuf[512];		/* error message buffer */  for ( card = cardList; card != NIL(ELCTcard); card = card->ELCTnextCard ) {    cardNum++;    if (card->ELCTxLowGiven && card->ELCTixLowGiven) {      sprintf( ebuf,	  "electrode card %d uses both location and index - location ignored",	  cardNum );      SPfrontEnd->IFerror( ERR_INFO, ebuf, NIL(IFuid) );      card->ELCTxLowGiven = FALSE;    }    if (card->ELCTxHighGiven && card->ELCTixHighGiven) {      sprintf( ebuf,	  "electrode card %d uses both location and index - location ignored",	  cardNum );      SPfrontEnd->IFerror( ERR_INFO, ebuf, NIL(IFuid) );      card->ELCTxHighGiven = FALSE;    }    if (card->ELCTyLowGiven && card->ELCTiyLowGiven) {      sprintf( ebuf,	  "electrode card %d uses both location and index - location ignored",	  cardNum );      SPfrontEnd->IFerror( ERR_INFO, ebuf, NIL(IFuid) );      card->ELCTyLowGiven = FALSE;    }    if (card->ELCTyHighGiven && card->ELCTiyHighGiven) {      sprintf( ebuf,	  "electrode card %d uses both location and index - location ignored",	  cardNum );      SPfrontEnd->IFerror( ERR_INFO, ebuf, NIL(IFuid) );      card->ELCTyHighGiven = FALSE;    }    if (!card->ELCTnumberGiven) {      card->ELCTnumber = -1;    }/* Return now if anything has failed */    if (error) return(error);  }  return(OK);}/* * Name:	ELCTsetup * Purpose:	convert a list of ELCTcard's to ELCTelectrode's * Formals:	cardList: list of cards to setup *		electrodeList: returns the list of ELCTelectrode's *		xMeshList: list of coordinates in the x mesh *		yMeshList: list of coordinates in the y mesh * Returns:	OK/E_PRIVATE * Users:	 numerical devices * Calls:	ELCTcheck */intELCTsetup( cardList, electrodeList, xMeshList, yMeshList )ELCTcard *cardList;ELCTelectrode **electrodeList;MESHcoord *xMeshList;MESHcoord *yMeshList;{  register ELCTcard *card;  ELCTelectrode *newElectrode;  int ixMin, ixMax, iyMin, iyMax;  int cardNum = 0;  int error;  char ebuf[512];		/* error message buffer *//* Initialize list of electrodes */  *electrodeList = NIL(ELCTelectrode);/* Check the card list */  if (error = ELCTcheck( cardList )) return( error );/* Find the limits on the indices */  MESHiBounds( xMeshList, &ixMin, &ixMax );  MESHiBounds( yMeshList, &iyMin, &iyMax );  error = OK;  for ( card = cardList; card != NIL(ELCTcard); card = card->ELCTnextCard ) {    cardNum++;    if (*electrodeList == NIL(ELCTelectrode)) {      RALLOC( newElectrode, ELCTelectrode, 1 );      *electrodeList = newElectrode;    } else {      RALLOC( newElectrode->next, ELCTelectrode, 1 );      newElectrode = newElectrode->next;    }    newElectrode->next = NIL(ELCTelectrode);    newElectrode->id = card->ELCTnumber;    newElectrode->workf = 4.10 /* electron volts */;    if (card->ELCTixLowGiven) {      newElectrode->ixLo = MAX(card->ELCTixLow, ixMin);    }    else if (card->ELCTxLowGiven) {      newElectrode->ixLo = MESHlocate( xMeshList, card->ELCTxLow );    }    else {      newElectrode->ixLo = ixMin;    }    if (card->ELCTixHighGiven) {      newElectrode->ixHi = MIN(card->ELCTixHigh, ixMax);    }    else if (card->ELCTxHighGiven) {      newElectrode->ixHi = MESHlocate( xMeshList, card->ELCTxHigh );    }    else {      newElectrode->ixHi = ixMax;    }    if (newElectrode->ixLo > newElectrode->ixHi) {      sprintf( ebuf,	  "electrode card %d has low x index (%d) > high x index (%d)",	  cardNum, newElectrode->ixLo, newElectrode->ixHi );      SPfrontEnd->IFerror( ERR_WARNING, ebuf, NIL(IFuid) );      error = E_PRIVATE;    }    if (card->ELCTiyLowGiven) {      newElectrode->iyLo = MAX(card->ELCTiyLow, iyMin);    }    else if (card->ELCTyLowGiven) {      newElectrode->iyLo = MESHlocate( yMeshList, card->ELCTyLow );    }    else {      newElectrode->iyLo = iyMin;    }    if (card->ELCTiyHighGiven) {      newElectrode->iyHi = MIN(card->ELCTiyHigh, iyMax);    }    else if (card->ELCTyHighGiven) {      newElectrode->iyHi = MESHlocate( yMeshList, card->ELCTyHigh );    }    else {      newElectrode->iyHi = iyMax;    }    if (newElectrode->iyLo > newElectrode->iyHi) {      sprintf( ebuf,	  "electrode card %d has low y index (%d) > high y index (%d)",	  cardNum, newElectrode->iyLo, newElectrode->iyHi );      SPfrontEnd->IFerror( ERR_WARNING, ebuf, NIL(IFuid) );      error = E_PRIVATE;    }  }  return( error );}

⌨️ 快捷键说明

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