141 lines
6.2 KiB
C
141 lines
6.2 KiB
C
/**********
|
|
Copyright 1990 Regents of the University of California. All rights reserved.
|
|
Author: 1985 Thomas L. Quarles
|
|
**********/
|
|
|
|
#ifndef DEV
|
|
#define DEV
|
|
|
|
#include "optdefs.h"
|
|
#include "gendefs.h"
|
|
#include "ifsim.h"
|
|
#include "cktdefs.h"
|
|
#include "noisedef.h"
|
|
#include "complex.h"
|
|
|
|
double DEVlimvds(double,double);
|
|
double DEVpnjlim(double,double,double,double,int*);
|
|
double DEVfetlim(double,double,double);
|
|
void DEVcmeyer(double,double,double,double,double,double,double,double,double,
|
|
double,double,double*,double*,double*,double,double,double,double);
|
|
void DEVqmeyer(double,double,double,double,double,double*,double*,double*,
|
|
double,double);
|
|
double DEVpred(CKTcircuit*,int);
|
|
|
|
typedef struct SPICEdev {
|
|
IFdevice DEVpublic;
|
|
|
|
int (*DEVparam)(int,IFvalue*,GENinstance*,IFvalue *);
|
|
/* routine to input a parameter to a device instance */
|
|
int (*DEVmodParam)(int,IFvalue*,GENmodel*);
|
|
/* routine to input a paramater to a model */
|
|
int (*DEVload)(GENmodel*,CKTcircuit*);
|
|
/* routine to load the device into the matrix */
|
|
int (*DEVsetup)(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
|
|
/* setup routine to preprocess devices once before soloution begins */
|
|
int (*DEVunsetup)(GENmodel*,CKTcircuit*);
|
|
/* clean up before running again */
|
|
int (*DEVpzSetup)(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
|
|
/* setup routine to process devices specially for pz analysis */
|
|
int (*DEVtemperature)(GENmodel*,CKTcircuit*);
|
|
/* subroutine to do temperature dependent setup processing */
|
|
int (*DEVtrunc)(GENmodel*,CKTcircuit*,double*);
|
|
/* subroutine to perform truncation error calc. */
|
|
int (*DEVfindBranch)(CKTcircuit*,GENmodel*,IFuid);
|
|
/* subroutine to search for device branch eq.s */
|
|
int (*DEVacLoad)(GENmodel*,CKTcircuit*);
|
|
/* ac analysis loading function */
|
|
int (*DEVaccept)(CKTcircuit*,GENmodel*);
|
|
/* subroutine to call on acceptance of a timepoint */
|
|
void (*DEVdestroy)(GENmodel**);
|
|
/* subroutine to destroy all models and instances */
|
|
int (*DEVmodDelete)(GENmodel**,IFuid,GENmodel*);
|
|
/* subroutine to delete a model and all instances */
|
|
int (*DEVdelete)(GENmodel*,IFuid,GENinstance**);
|
|
/* subroutine to delete an instance */
|
|
int (*DEVsetic)(GENmodel*,CKTcircuit*);
|
|
/* routine to pick up device init conds from rhs */
|
|
int (*DEVask)(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*);
|
|
/* routine to ask about device details*/
|
|
int (*DEVmodAsk)(CKTcircuit*,GENmodel*,int,IFvalue*);
|
|
/* routine to ask about model details*/
|
|
int (*DEVpzLoad)(GENmodel*,CKTcircuit*,SPcomplex*);
|
|
/* routine to load for pole-zero analysis */
|
|
int (*DEVconvTest)(GENmodel*,CKTcircuit*);
|
|
/* convergence test function */
|
|
|
|
int (*DEVsenSetup)(SENstruct*,GENmodel*);
|
|
/* routine to setup the device sensitivity info */
|
|
int (*DEVsenLoad)(GENmodel*,CKTcircuit*);
|
|
/* routine to load the device sensitivity info */
|
|
int (*DEVsenUpdate)(GENmodel*,CKTcircuit*);
|
|
/* routine to update the device sensitivity info */
|
|
int (*DEVsenAcLoad)(GENmodel*,CKTcircuit*);
|
|
/* routine to load the device ac sensitivity info */
|
|
void (*DEVsenPrint)(GENmodel*,CKTcircuit*);
|
|
/* subroutine to print out sensitivity info */
|
|
int (*DEVsenTrunc)(GENmodel*,CKTcircuit*,double*);
|
|
/* subroutine to print out sensitivity info */
|
|
int (*DEVdisto)(int,GENmodel*,CKTcircuit*);
|
|
/* procedure to do distortion operations */
|
|
int (*DEVnoise)(int, int, GENmodel*,CKTcircuit*, Ndata *, double *);
|
|
/* noise routine */
|
|
int *DEVinstSize; /* size of an instance */
|
|
int *DEVmodSize; /* size of a model */
|
|
|
|
} SPICEdev; /* instance of structure for each possible type of device */
|
|
|
|
|
|
/* IOP( ) Input/output parameter
|
|
* IOPP( ) IO parameter which the principle value of a device (used
|
|
* for naming output variables in sensetivity)
|
|
* IOPA( ) IO parameter significant for time-varying (non-dc) analyses
|
|
* IOPAP( ) Principle value is significant for time-varying analyses
|
|
* IOPAA( ) IO parameter significant for ac analyses only
|
|
* IOPAAP( ) IO parameter principle value for ac analyses only
|
|
* IOPN( ) IO parameter significant for noise analyses only
|
|
* IOPR( ) Redundant IO parameter name (e.g. "vto" vs. "vt0")
|
|
* IOPX( ) IO parameter which is not used by sensetivity in any case
|
|
*
|
|
* IOPQ( ) This (Q) parameter must be non-zero for sensetivity of
|
|
* following Z parameter (model params done first)
|
|
* IOPZ( ) Prev. 'Q' parameter must be non-zero for sensetivity
|
|
* IOPQO( ) Like Q, but or-ed with previous Q value
|
|
* ....U( ) uninteresting for default "show" command output
|
|
*/
|
|
|
|
|
|
# define IOP(a,b,c,d) { a, b, c|IF_SET|IF_ASK, d }
|
|
# define IOPU(a,b,c,d) { a, b, c|IF_SET|IF_ASK|IF_UNINTERESTING, d }
|
|
# define IOPP(a,b,c,d) { a, b, c|IF_SET|IF_ASK|IF_PRINCIPAL, d }
|
|
# define IOPA(a,b,c,d) { a, b, c|IF_SET|IF_ASK|IF_AC, d }
|
|
# define IOPAU(a,b,c,d) { a, b, c|IF_SET|IF_ASK|IF_AC|IF_UNINTERESTING,d }
|
|
# define IOPAP(a,b,c,d) { a, b, c|IF_SET|IF_ASK|IF_AC|IF_PRINCIPAL, d }
|
|
# define IOPAA(a,b,c,d) { a, b, c|IF_SET|IF_ASK|IF_AC_ONLY, d }
|
|
# define IOPAAU(a,b,c,d) { a, b, c|IF_SET|IF_ASK|IF_AC_ONLY|IF_UNINTERESTING,d}
|
|
# define IOPPA(a,b,c,d) { a, b, c|IF_SET|IF_ASK|IF_AC_ONLY|IF_PRINCIPAL, d }
|
|
# define IOPN(a,b,c,d) { a, b, c|IF_SET|IF_ASK|IF_NOISE, d }
|
|
# define IOPR(a,b,c,d) { a, b, c|IF_SET|IF_ASK|IF_REDUNDANT, NULL }
|
|
# define IOPX(a,b,c,d) { a, b, c|IF_SET|IF_ASK|IF_NONSENSE, d }
|
|
# define IOPXU(a,b,c,d) { a, b, c|IF_SET|IF_ASK|IF_NONSENSE|IF_UNINTERESTING,\
|
|
d }
|
|
# define IOPQ(a,b,c,d) { a, b, c|IF_SET|IF_ASK|IF_SETQUERY, d }
|
|
# define IOPQU(a,b,c,d) { a, b, c|IF_SET|IF_ASK|IF_SETQUERY|IF_UNINTERESTING,\
|
|
d }
|
|
# define IOPZ(a,b,c,d) { a, b, c|IF_SET|IF_ASK|IF_CHKQUERY, d }
|
|
# define IOPZU(a,b,c,d) { a, b, c|IF_SET|IF_ASK|IF_CHKQUERY|IF_UNINTERESTING,\
|
|
d }
|
|
# define IOPQO(a,b,c,d) { a, b, c|IF_SET|IF_ASK|IF_ORQUERY, d }
|
|
|
|
# define IP(a,b,c,d) { a , b , c|IF_SET , d }
|
|
# define OP(a,b,c,d) { a , b , c|IF_ASK , d }
|
|
# define OPU(a,b,c,d) { a , b , c|IF_ASK|IF_UNINTERESTING , d }
|
|
# define OPR(a,b,c,d) { a , b , c|IF_ASK|IF_REDUNDANT , d }
|
|
# define P(a,b,c,d) { a , b , c , d }
|
|
|
|
|
|
|
|
#define DEV_DEFAULT 0x1
|
|
|
|
#endif /*DEV*/
|