home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 13 / 13.iso / p / p064 / 3.ddi / DEV.H < prev    next >
Encoding:
C/C++ Source or Header  |  1991-07-01  |  6.1 KB  |  215 lines

  1. /****************************************************************************/
  2. /*        Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991                  */
  3. /*          By MicroSim Corporation, All Rights Reserved                    */
  4. /****************************************************************************/
  5. /* dev.h
  6.  *   $Revision:   1.19  $
  7.  *   $Author:   whb  $
  8.  *   $Date:   11 Apr 1991 16:08:00  $ */
  9.  
  10. /******************* USERS OF DEVICE EQUATIONS OPTION ***********************/
  11. /********                Do not change this file                   **********/
  12.  
  13. /*
  14.  * Common device definitions
  15.  */
  16.  
  17. #define    N_TYPE    1
  18. #define    P_TYPE    -1
  19.  
  20. /* MDLPARM is Model Parameter size (double or float) */
  21. /* FLOAT  casts its parameter to MDLPARM */
  22. /* DOUBLE casts its parameter to double */
  23. /* OMITTED indicates an omitted (defaulted) parameter value.  It is
  24.    initialized to the value DEFAULT */
  25.  
  26. #define    MDLPARM        float
  27. #define FLOAT(v)    ((MDLPARM) (v))
  28. #define DOUBLE(v)    ((double) (v))
  29. #define    OMITTED        1.10250E-36
  30. GLOBAL    float    OMIT;
  31.  
  32. /* array index typedefs: array size may vary with machines */
  33.  
  34. typedef int CKT_IDX;        /* circuit matrix */
  35. typedef double *MTX_IDX;    /* MatPrm matrix */
  36.  
  37.  
  38. /* gen_ is a generic device header
  39.  * Gen_ is a generic model  header
  40.  */
  41.   struct gen_    {
  42.     struct gen_ *gen_next;
  43.     char    *gen_name;
  44.     struct Gen_ *gen_model;
  45.     CKT_IDX    gen_N1, /* node 1 */
  46.         gen_N2; /* node 2 */
  47.     };
  48.  
  49.   struct Gen_    {
  50.     struct Gen_ *Gen_next;
  51.     char    *Gen_name;
  52.     struct Nom_ *Gen_nom;
  53.     struct Gen_ *Gen_ako;    /* ->model to support "AKO:" syntax */
  54.     int         Gen_type;    /* N_TYPE or P_TYPE */
  55.     };
  56.  
  57. /* Nom_ is a header for a model with
  58.  * monte carlo analysis parameters:
  59.  * mcdev = ptr to device's tolerances or NULL;
  60.  * mclot = ptr to model's  tolerances or NULL;
  61.  * updated_model = ptr to updated (global) model.
  62.  * it is important to note that Nom_ does NOT have TEMPERATURE_STORAGE
  63.  * in it!!
  64.  */
  65.  
  66.   struct Nom_    {
  67.     struct MCInfo *mcdev,
  68.           *mclot;
  69.     struct Gen_   *updated_model;
  70.     };
  71.  
  72. /* device capacitor: charge & current values */
  73.  
  74. struct qi_def {
  75.   double
  76.     qi_q,        /* charge on "plates" */
  77.     qi_i;        /* current thru capacitor */
  78.   };
  79.  
  80. /* state-vector access: be sure to define
  81.  *
  82.  *    struct sv_type sv[ max. # of prev. states ];
  83.  *
  84.  * then evaluate the matrix elements using the def's below.
  85.  */
  86. #define EVAL_SV0(sv_name,dev_ptr,member) \
  87.     sv_name[0] = dev_ptr->member+JSTVCT
  88.  
  89. #define EVAL_SV1(sv_name,dev_ptr,member) \
  90.     EVAL_SV0(sv_name,dev_ptr,member),\
  91.     sv_name[1] = JSTVCT == 0 ? dev_ptr->member+MSTVCT-1 : sv_name[0]-1
  92.  
  93. #define EVAL_SV2(sv_name,dev_ptr,member) \
  94.     EVAL_SV1(sv_name,dev_ptr,member),\
  95.     sv_name[2] = JSTVCT == 1 ? dev_ptr->member+MSTVCT-1 : sv_name[1]-1
  96.  
  97. #define EVAL_SV3(sv_name,dev_ptr,member) \
  98.     EVAL_SV2(sv_name,dev_ptr,member),\
  99.     sv_name[3] = JSTVCT == 2 ? dev_ptr->member+MSTVCT-1 : sv_name[2]-1
  100.  
  101. #define EVAL_SV(sv_name,dev_ptr,member) \
  102.     EVAL_SV3(sv_name,dev_ptr,member)    /* redundant (get 'em all) */
  103.  
  104. /* macros for evaluating polynomials */
  105.  
  106. #define POLY1(x,k0,k1)          ((k1)*(x)+(k0))
  107. #define POLY2(x,k0,k1,k2)       POLY1(x,k0,      (k2)*(x)+(k1))
  108. #define POLY3(x,k0,k1,k2,k3)    POLY2(x,k0,k1,   (k3)*(x)+(k2))
  109. #define POLY4(x,k0,k1,k2,k3,k4) POLY3(x,k0,k1,k2,(k4)*(x)+(k3))
  110.  
  111. #define TRAP    1
  112. #define GEAR    2
  113. #define INTEGR8(geq,ieq,cap_val,sv0,sv1,sv2) {\
  114.         sv0.qi_i = AG1*sv0.qi_q + AG2*sv1.qi_q + AG3*sv2.qi_q + AG4*sv1.qi_i;\
  115.     ieq = sv0.qi_i - AG1*sv0.qi_q;\
  116.     geq      = AG1*(cap_val);\
  117.     }
  118.  
  119. /* PNJLIM expansion (using regular logarithms, not the MIN(log(x),10.) kind)
  120.  */
  121. #define PNJLIM(Vnew,Vold,Vte,Vcrit)\
  122.     ( Vnew <= (Vcrit) || Vnew <= 0.0 || fabs( Vnew-(Vold) ) <= (Vte)+(Vte)\
  123.     ? NO\
  124.     : ( Vnew = ( (Vold) <= 0.\
  125.         ? (Vte)*log( Vnew/(Vte) )\
  126.         : ( Vnew <= (Vold)-(Vte)\
  127.             ? (Vcrit)\
  128.             : (Vold) + (Vte)*log( 1 + (Vnew-(Vold))/(Vte) )\
  129.         )), YES\
  130.     ))
  131.  
  132. /* tolerance check */
  133.  
  134. #define TOL(a,b,relval,absval) ( relval * MAX( fabs(a), fabs(b) ) + absval )
  135.  
  136. /* junction charge & capacitance calculation */
  137. /*
  138. ?? ??? 87 pwt    creation
  139. 11 Aug 88 pwt    allow grading coefficient, m, to be 1.0 (and beyond)
  140. */
  141.  
  142. #define PNJCHG(chg,cap,cjo,vj,pb,fcpb,m,f1,f2,f3)\
  143.     if ( (vj) < (fcpb) ) {\
  144.       double\
  145.         arg  = 1-(vj)/(pb),\
  146.         sarg = (m)==.5 ? 1/sqrt(arg) : pow(arg,-(m));\
  147.       chg = (cjo)*(pb)*( (m)==1.? -log(arg) : (1-arg*sarg)/(1-(m)) );\
  148.       cap = (cjo)*sarg;\
  149.       }\
  150.     else {\
  151.       chg = (cjo)*( (f1) + ( (f3)*((vj)-(fcpb)) + ( (m)/((pb)+(pb)) )*( (vj)*(vj)-(fcpb)*(fcpb) ) )/(f2) );\
  152.       cap = (cjo)*( (f3) + (m)*(vj)/(pb) )/(f2);\
  153.       }
  154. /* to include transit-time capacitance, include this after the macro-call:
  155.  *
  156.  *    chg += TT*ij;
  157.  *    cap += TT*gj;
  158.  */
  159.  
  160. /* same as PNJCHG, except FC==0 (e.g. bipolar Cjs capacitor) */
  161.  
  162. #define PNJCHG0(chg,cap,cjo,vj,pb,m)\
  163.     if ( (vj) < 0.) {\
  164.       double\
  165.         arg  = 1-(vj)/(pb),\
  166.         sarg = (m)==.5 ? 1/sqrt(arg) : pow(arg,-(m));\
  167.       chg = (cjo)*(pb)*( (m)==1.? -log(arg) : (1-arg*sarg)/(1-(m)) );\
  168.       cap = (cjo)*sarg;\
  169.       }\
  170.     else {\
  171.       chg = (vj)*(cjo)*(1 + (m)*(vj)/((pb)+(pb)));\
  172.       cap =      (cjo)*(1 + (m)*(vj)/(pb));\
  173.     }
  174.  
  175. /* Type definition for FETlim (only relevant for Microsoft C) */
  176.  
  177. #if CTYPE & PC
  178. extern    void    FETlim(double *,double ,double );
  179. #endif
  180.  
  181. /* Matrix references */
  182.  
  183. #define Y_MATRIX(a)    *(Instance->a)
  184. #define AC_MAT_R(a)    *(Instance->a)
  185. #define AC_MAT_I(a)    *(Instance->a + 1)
  186.  
  187. /* VltVct references */
  188.  
  189. #define VOLTAGE(a)    VltVct[ Instance->a ]
  190. GLOBAL    double HGE    *VltVct, *VltVctI;
  191. #define    NGND    1        /* Internal node number for ground */
  192.  
  193. /* model parameter macros */
  194.  
  195. struct    Assoc {
  196.   char    *AssocName;
  197.   char    *AssocAddr;
  198.   float  AssocValue;
  199.   char  *AssocTextValue;
  200.   int   AssocType;
  201. #define ASSOCTYPE_FLOAT    0    /* Floating point model Value (default) */
  202. #define ASSOCTYPE_TEXT     1    /* Text string model value */
  203.   } ;
  204.  
  205. #define    ASSOCIATE(sname,value,string)        \
  206. {    string, (char *) (&(BASE . sname)), FLOAT(value), NULL, ASSOCTYPE_FLOAT}
  207.  
  208. #define    ASSOCIATE_TEXT(sname,value,string)        \
  209. {    string, (char *) (&(BASE . sname)), FLOAT(0), value, ASSOCTYPE_TEXT}
  210.  
  211. #define END_PARMS                            \
  212. {    NULL, NULL, FLOAT(sizeof(BASE)), NULL, ASSOCTYPE_FLOAT}
  213.  
  214.  
  215.