home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************/
- /* Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991 */
- /* By MicroSim Corporation, All Rights Reserved */
- /****************************************************************************/
- /* dev.h
- * $Revision: 1.19 $
- * $Author: whb $
- * $Date: 11 Apr 1991 16:08:00 $ */
-
- /******************* USERS OF DEVICE EQUATIONS OPTION ***********************/
- /******** Do not change this file **********/
-
- /*
- * Common device definitions
- */
-
- #define N_TYPE 1
- #define P_TYPE -1
-
- /* MDLPARM is Model Parameter size (double or float) */
- /* FLOAT casts its parameter to MDLPARM */
- /* DOUBLE casts its parameter to double */
- /* OMITTED indicates an omitted (defaulted) parameter value. It is
- initialized to the value DEFAULT */
-
- #define MDLPARM float
- #define FLOAT(v) ((MDLPARM) (v))
- #define DOUBLE(v) ((double) (v))
- #define OMITTED 1.10250E-36
- GLOBAL float OMIT;
-
- /* array index typedefs: array size may vary with machines */
-
- typedef int CKT_IDX; /* circuit matrix */
- typedef double *MTX_IDX; /* MatPrm matrix */
-
-
- /* gen_ is a generic device header
- * Gen_ is a generic model header
- */
- struct gen_ {
- struct gen_ *gen_next;
- char *gen_name;
- struct Gen_ *gen_model;
- CKT_IDX gen_N1, /* node 1 */
- gen_N2; /* node 2 */
- };
-
- struct Gen_ {
- struct Gen_ *Gen_next;
- char *Gen_name;
- struct Nom_ *Gen_nom;
- struct Gen_ *Gen_ako; /* ->model to support "AKO:" syntax */
- int Gen_type; /* N_TYPE or P_TYPE */
- };
-
- /* Nom_ is a header for a model with
- * monte carlo analysis parameters:
- * mcdev = ptr to device's tolerances or NULL;
- * mclot = ptr to model's tolerances or NULL;
- * updated_model = ptr to updated (global) model.
- * it is important to note that Nom_ does NOT have TEMPERATURE_STORAGE
- * in it!!
- */
-
- struct Nom_ {
- struct MCInfo *mcdev,
- *mclot;
- struct Gen_ *updated_model;
- };
-
- /* device capacitor: charge & current values */
-
- struct qi_def {
- double
- qi_q, /* charge on "plates" */
- qi_i; /* current thru capacitor */
- };
-
- /* state-vector access: be sure to define
- *
- * struct sv_type sv[ max. # of prev. states ];
- *
- * then evaluate the matrix elements using the def's below.
- */
- #define EVAL_SV0(sv_name,dev_ptr,member) \
- sv_name[0] = dev_ptr->member+JSTVCT
-
- #define EVAL_SV1(sv_name,dev_ptr,member) \
- EVAL_SV0(sv_name,dev_ptr,member),\
- sv_name[1] = JSTVCT == 0 ? dev_ptr->member+MSTVCT-1 : sv_name[0]-1
-
- #define EVAL_SV2(sv_name,dev_ptr,member) \
- EVAL_SV1(sv_name,dev_ptr,member),\
- sv_name[2] = JSTVCT == 1 ? dev_ptr->member+MSTVCT-1 : sv_name[1]-1
-
- #define EVAL_SV3(sv_name,dev_ptr,member) \
- EVAL_SV2(sv_name,dev_ptr,member),\
- sv_name[3] = JSTVCT == 2 ? dev_ptr->member+MSTVCT-1 : sv_name[2]-1
-
- #define EVAL_SV(sv_name,dev_ptr,member) \
- EVAL_SV3(sv_name,dev_ptr,member) /* redundant (get 'em all) */
-
- /* macros for evaluating polynomials */
-
- #define POLY1(x,k0,k1) ((k1)*(x)+(k0))
- #define POLY2(x,k0,k1,k2) POLY1(x,k0, (k2)*(x)+(k1))
- #define POLY3(x,k0,k1,k2,k3) POLY2(x,k0,k1, (k3)*(x)+(k2))
- #define POLY4(x,k0,k1,k2,k3,k4) POLY3(x,k0,k1,k2,(k4)*(x)+(k3))
-
- #define TRAP 1
- #define GEAR 2
- #define INTEGR8(geq,ieq,cap_val,sv0,sv1,sv2) {\
- sv0.qi_i = AG1*sv0.qi_q + AG2*sv1.qi_q + AG3*sv2.qi_q + AG4*sv1.qi_i;\
- ieq = sv0.qi_i - AG1*sv0.qi_q;\
- geq = AG1*(cap_val);\
- }
-
- /* PNJLIM expansion (using regular logarithms, not the MIN(log(x),10.) kind)
- */
- #define PNJLIM(Vnew,Vold,Vte,Vcrit)\
- ( Vnew <= (Vcrit) || Vnew <= 0.0 || fabs( Vnew-(Vold) ) <= (Vte)+(Vte)\
- ? NO\
- : ( Vnew = ( (Vold) <= 0.\
- ? (Vte)*log( Vnew/(Vte) )\
- : ( Vnew <= (Vold)-(Vte)\
- ? (Vcrit)\
- : (Vold) + (Vte)*log( 1 + (Vnew-(Vold))/(Vte) )\
- )), YES\
- ))
-
- /* tolerance check */
-
- #define TOL(a,b,relval,absval) ( relval * MAX( fabs(a), fabs(b) ) + absval )
-
- /* junction charge & capacitance calculation */
- /*
- ?? ??? 87 pwt creation
- 11 Aug 88 pwt allow grading coefficient, m, to be 1.0 (and beyond)
- */
-
- #define PNJCHG(chg,cap,cjo,vj,pb,fcpb,m,f1,f2,f3)\
- if ( (vj) < (fcpb) ) {\
- double\
- arg = 1-(vj)/(pb),\
- sarg = (m)==.5 ? 1/sqrt(arg) : pow(arg,-(m));\
- chg = (cjo)*(pb)*( (m)==1.? -log(arg) : (1-arg*sarg)/(1-(m)) );\
- cap = (cjo)*sarg;\
- }\
- else {\
- chg = (cjo)*( (f1) + ( (f3)*((vj)-(fcpb)) + ( (m)/((pb)+(pb)) )*( (vj)*(vj)-(fcpb)*(fcpb) ) )/(f2) );\
- cap = (cjo)*( (f3) + (m)*(vj)/(pb) )/(f2);\
- }
- /* to include transit-time capacitance, include this after the macro-call:
- *
- * chg += TT*ij;
- * cap += TT*gj;
- */
-
- /* same as PNJCHG, except FC==0 (e.g. bipolar Cjs capacitor) */
-
- #define PNJCHG0(chg,cap,cjo,vj,pb,m)\
- if ( (vj) < 0.) {\
- double\
- arg = 1-(vj)/(pb),\
- sarg = (m)==.5 ? 1/sqrt(arg) : pow(arg,-(m));\
- chg = (cjo)*(pb)*( (m)==1.? -log(arg) : (1-arg*sarg)/(1-(m)) );\
- cap = (cjo)*sarg;\
- }\
- else {\
- chg = (vj)*(cjo)*(1 + (m)*(vj)/((pb)+(pb)));\
- cap = (cjo)*(1 + (m)*(vj)/(pb));\
- }
-
- /* Type definition for FETlim (only relevant for Microsoft C) */
-
- #if CTYPE & PC
- extern void FETlim(double *,double ,double );
- #endif
-
- /* Matrix references */
-
- #define Y_MATRIX(a) *(Instance->a)
- #define AC_MAT_R(a) *(Instance->a)
- #define AC_MAT_I(a) *(Instance->a + 1)
-
- /* VltVct references */
-
- #define VOLTAGE(a) VltVct[ Instance->a ]
- GLOBAL double HGE *VltVct, *VltVctI;
- #define NGND 1 /* Internal node number for ground */
-
- /* model parameter macros */
-
- struct Assoc {
- char *AssocName;
- char *AssocAddr;
- float AssocValue;
- char *AssocTextValue;
- int AssocType;
- #define ASSOCTYPE_FLOAT 0 /* Floating point model Value (default) */
- #define ASSOCTYPE_TEXT 1 /* Text string model value */
- } ;
-
- #define ASSOCIATE(sname,value,string) \
- { string, (char *) (&(BASE . sname)), FLOAT(value), NULL, ASSOCTYPE_FLOAT}
-
- #define ASSOCIATE_TEXT(sname,value,string) \
- { string, (char *) (&(BASE . sname)), FLOAT(0), value, ASSOCTYPE_TEXT}
-
- #define END_PARMS \
- { NULL, NULL, FLOAT(sizeof(BASE)), NULL, ASSOCTYPE_FLOAT}
-
-