119 lines
3.0 KiB
C
119 lines
3.0 KiB
C
/**********
|
|
Copyright 1991 Regents of the University of California. All rights reserved.
|
|
Author: 1991 David A. Gates, U. C. Berkeley CAD Group
|
|
Modified: 2001 Paolo Nenzi
|
|
**********/
|
|
|
|
#include "ngspice/ngspice.h"
|
|
#include "ngspice/numcards.h"
|
|
#include "ngspice/numgen.h"
|
|
#include "ngspice/elctdefs.h"
|
|
#include "ngspice/devdefs.h"
|
|
#include "ngspice/sperror.h"
|
|
#include "ngspice/suffix.h"
|
|
|
|
#define UM_TO_CM 1.0e-4
|
|
|
|
extern int ELCTnewCard(GENcard**,GENmodel*);
|
|
extern int ELCTparam(int,IFvalue*,GENcard*);
|
|
|
|
|
|
IFparm ELCTpTable[] = {
|
|
IP("x.low", ELCT_X_LOW, IF_REAL, "Location of left edge"),
|
|
IP("x.high", ELCT_X_HIGH, IF_REAL, "Location of right edge"),
|
|
IP("y.low", ELCT_Y_LOW, IF_REAL, "Location of top edge"),
|
|
IP("y.high", ELCT_Y_HIGH, IF_REAL, "Location of bottom edge"),
|
|
IP("ix.low", ELCT_IX_LOW, IF_INTEGER, "Index of left edge"),
|
|
IP("ix.high", ELCT_IX_HIGH, IF_INTEGER, "Index of right edge"),
|
|
IP("iy.low", ELCT_IY_LOW, IF_INTEGER, "Index of top edge"),
|
|
IP("iy.high", ELCT_IY_HIGH, IF_INTEGER, "Index of bottom edge"),
|
|
IP("number", ELCT_NUMBER, IF_INTEGER, "Electrode ID number")
|
|
};
|
|
|
|
IFcardInfo ELCTinfo = {
|
|
"electrode",
|
|
"Location of a contact to the device",
|
|
NUMELEMS(ELCTpTable),
|
|
ELCTpTable,
|
|
|
|
ELCTnewCard,
|
|
ELCTparam,
|
|
NULL
|
|
};
|
|
|
|
int
|
|
ELCTnewCard(GENcard **inCard, GENmodel *inModel)
|
|
{
|
|
ELCTcard *tmpCard, *newCard;
|
|
GENnumModel *model = (GENnumModel *)inModel;
|
|
|
|
newCard = TMALLOC(ELCTcard, 1);
|
|
if (!newCard) {
|
|
*inCard = NULL;
|
|
return(E_NOMEM);
|
|
}
|
|
newCard->ELCTnextCard = NULL;
|
|
*inCard = (GENcard *) newCard;
|
|
|
|
tmpCard = model->GENelectrodes;
|
|
if (!tmpCard) { /* First in list */
|
|
model->GENelectrodes = newCard;
|
|
} else {
|
|
/* Go to end of list */
|
|
while (tmpCard->ELCTnextCard) tmpCard = tmpCard->ELCTnextCard;
|
|
/* And add new card */
|
|
tmpCard->ELCTnextCard = newCard;
|
|
}
|
|
return(OK);
|
|
}
|
|
|
|
|
|
int
|
|
ELCTparam(int param, IFvalue *value, GENcard *inCard)
|
|
{
|
|
ELCTcard *card = (ELCTcard *)inCard;
|
|
|
|
switch (param) {
|
|
case ELCT_X_LOW:
|
|
card->ELCTxLow = value->rValue * UM_TO_CM;
|
|
card->ELCTxLowGiven = TRUE;
|
|
break;
|
|
case ELCT_X_HIGH:
|
|
card->ELCTxHigh = value->rValue * UM_TO_CM;
|
|
card->ELCTxHighGiven = TRUE;
|
|
break;
|
|
case ELCT_Y_LOW:
|
|
card->ELCTyLow = value->rValue * UM_TO_CM;
|
|
card->ELCTyLowGiven = TRUE;
|
|
break;
|
|
case ELCT_Y_HIGH:
|
|
card->ELCTyHigh = value->rValue * UM_TO_CM;
|
|
card->ELCTyHighGiven = TRUE;
|
|
break;
|
|
case ELCT_IX_LOW:
|
|
card->ELCTixLow = value->iValue;
|
|
card->ELCTixLowGiven = TRUE;
|
|
break;
|
|
case ELCT_IX_HIGH:
|
|
card->ELCTixHigh = value->iValue;
|
|
card->ELCTixHighGiven = TRUE;
|
|
break;
|
|
case ELCT_IY_LOW:
|
|
card->ELCTiyLow = value->iValue;
|
|
card->ELCTiyLowGiven = TRUE;
|
|
break;
|
|
case ELCT_IY_HIGH:
|
|
card->ELCTiyHigh = value->iValue;
|
|
card->ELCTiyHighGiven = TRUE;
|
|
break;
|
|
case ELCT_NUMBER:
|
|
card->ELCTnumber = value->iValue;
|
|
card->ELCTnumberGiven = TRUE;
|
|
break;
|
|
default:
|
|
return(E_BADPARM);
|
|
break;
|
|
}
|
|
return(OK);
|
|
}
|