diff --git a/src/ciderlib/input/optionsc.c b/src/ciderlib/input/optionsc.c new file mode 100644 index 000000000..c071cab93 --- /dev/null +++ b/src/ciderlib/input/optionsc.c @@ -0,0 +1,163 @@ +/********** +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.h" +#include "numcards.h" +#include "numgen.h" +#include "optndefs.h" +#include "devdefs.h" +#include "sperror.h" +#include "suffix.h" + +#define M_TO_CM 1.0e2 +#define M2_TO_CM2 (M_TO_CM * M_TO_CM) +#define UM_TO_CM 1.0e-4 +#define UM2_TO_CM2 (UM_TO_CM * UM_TO_CM) + +extern int OPTNnewCard(void**,void*); +extern int OPTNparam(int,IFvalue*,void*); + + + +IFparm OPTNpTable[] = { +/* Supported Types of Devices. Ideally should be automatically extracted */ + IP("resistor",OPTN_RESISTOR, IF_FLAG, "Resistor"), + IP("capacitor",OPTN_CAPACITOR, IF_FLAG, "Capacitor"), + IP("diode", OPTN_DIODE, IF_FLAG, "Diode"), + IP("bipolar", OPTN_BIPOLAR, IF_FLAG, "Bipolar Transistor"), + IP("bjt", OPTN_BIPOLAR, IF_FLAG, "Bipolar Transistor"), + IP("soibjt", OPTN_SOIBJT, IF_FLAG, "SOI Bipolar"), + IP("moscap", OPTN_MOSCAP, IF_FLAG, "MOS Capacitor"), + IP("mosfet", OPTN_MOSFET, IF_FLAG, "MOSFET"), + IP("soimos", OPTN_SOIMOS, IF_FLAG, "SOI MOSFET"), + IP("jfet", OPTN_JFET, IF_FLAG, "Junction FET"), + IP("mesfet", OPTN_MESFET, IF_FLAG, "MESFET"), +/* Various layout dimensions */ + IP("defa", OPTN_DEFA, IF_REAL, "Default Mask Area"), + IP("defw", OPTN_DEFW, IF_REAL, "Default Mask Width"), + IP("defl", OPTN_DEFL, IF_REAL, "Default Mask Length"), + IP("base.area",OPTN_BASE_AREA, IF_REAL, "1D BJT Base Area"), + IP("base.length",OPTN_BASE_LENGTH,IF_REAL, "1D BJT Base Length"), + IP("base.depth",OPTN_BASE_DEPTH, IF_REAL, "1D BJT Base Depth"), +/* Values */ + IP("tnom", OPTN_TNOM, IF_REAL, "Nominal Temperature"), +/* Device Initial Condition File */ + IP("ic.file", OPTN_IC_FILE, IF_STRING, "Initial condition file"), + IP("unique", OPTN_UNIQUE, IF_FLAG, "Generate unique filename") +}; + +IFcardInfo OPTNinfo = { + "options", + "Provide optional information and hints", + NUMELEMS(OPTNpTable), + OPTNpTable, + + OPTNnewCard, + OPTNparam, + NULL +}; + +int +OPTNnewCard(void **inCard, void *inModel) +{ + OPTNcard *tmpCard, *newCard; + GENnumModel *model = (GENnumModel *)inModel; + + tmpCard = model->GENoptions; + if (!tmpCard) { /* First in list */ + newCard = NEW( OPTNcard ); + if (!newCard) { + *inCard = (void *)NULL; + return(E_NOMEM); + } + newCard->OPTNnextCard = (OPTNcard *)NULL; + *inCard = (void *)newCard; + model->GENoptions = newCard; + } else { /* Only one card of this type allowed */ + *inCard = (void *)tmpCard; + } + return(OK); +} + +int +OPTNparam(int param, IFvalue *value, void *inCard) +{ + OPTNcard *card = (OPTNcard *)inCard; + + switch (param) { + case OPTN_RESISTOR: + card->OPTNdeviceType = OPTN_RESISTOR; + card->OPTNdeviceTypeGiven = TRUE; + break; + case OPTN_CAPACITOR: + card->OPTNdeviceType = OPTN_CAPACITOR; + card->OPTNdeviceTypeGiven = TRUE; + break; + case OPTN_DIODE: + card->OPTNdeviceType = OPTN_DIODE; + card->OPTNdeviceTypeGiven = TRUE; + break; + case OPTN_MOSCAP: + card->OPTNdeviceType = OPTN_MOSCAP; + card->OPTNdeviceTypeGiven = TRUE; + break; + case OPTN_BIPOLAR: + case OPTN_SOIBJT: /* XXX Treat SOI as normal */ + card->OPTNdeviceType = OPTN_BIPOLAR; + card->OPTNdeviceTypeGiven = TRUE; + break; + case OPTN_MOSFET: + case OPTN_SOIMOS: /* XXX Treat SOI as normal */ + card->OPTNdeviceType = OPTN_MOSFET; + card->OPTNdeviceTypeGiven = TRUE; + break; + case OPTN_JFET: + case OPTN_MESFET: /* XXX Treat MES as junction */ + card->OPTNdeviceType = OPTN_JFET; + card->OPTNdeviceTypeGiven = TRUE; + break; + case OPTN_DEFA: + card->OPTNdefa = value->rValue * M2_TO_CM2; + card->OPTNdefaGiven = TRUE; + break; + case OPTN_DEFW: + card->OPTNdefw = value->rValue * M_TO_CM; + card->OPTNdefwGiven = TRUE; + break; + case OPTN_DEFL: + card->OPTNdefl = value->rValue * M_TO_CM; + card->OPTNdeflGiven = TRUE; + break; + case OPTN_BASE_AREA: + card->OPTNbaseArea = value->rValue; + card->OPTNbaseAreaGiven = TRUE; + break; + case OPTN_BASE_LENGTH: + card->OPTNbaseLength = value->rValue * UM_TO_CM; + card->OPTNbaseLengthGiven = TRUE; + break; + case OPTN_BASE_DEPTH: + card->OPTNbaseDepth = value->rValue * UM_TO_CM; + card->OPTNbaseDepthGiven = TRUE; + break; + case OPTN_TNOM: + card->OPTNtnom = value->rValue; + card->OPTNtnomGiven = TRUE; + break; + case OPTN_IC_FILE: + card->OPTNicFile = value->sValue; + card->OPTNicFileGiven = TRUE; + break; + case OPTN_UNIQUE: + card->OPTNunique = value->iValue; + card->OPTNuniqueGiven = TRUE; + break; + default: + return(E_BADPARM); + break; + } + return(OK); +}