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

  1. /****************************************************************************/
  2. /*        Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991                  */
  3. /*          By MicroSim Corporation, All Rights Reserved                    */
  4. /****************************************************************************/
  5. /* q.h
  6.  *   $Revision:   1.11  $
  7.  *   $Author:   sv  $
  8.  *   $Date:   14 Feb 1991 14:29:54  $ */
  9.  
  10. /******************* USERS OF DEVICE EQUATIONS OPTION ***********************/
  11. /******** The procedure for changing the bipolar model parameters  **********/
  12. /******** and device equations is the same as for the MOSFET.  See **********/
  13. /******** the comments in the files mos.c and m.h for details.     **********/
  14.  
  15. /* bipolar transistor definitions */
  16.  
  17. /*
  18. pwt    ?? Aug 86    creation
  19. pwt    17 Mar 88    implement shared data area in device instance
  20. imw    17 Aug 88    expressions
  21. pwt    10 Oct 89    add quasi-saturation data
  22. pwt    13 Dec 89    add high-injection parameter NK
  23. */
  24.  
  25. struct qac_def {    /* AC values */
  26.   double        /* capacitances */
  27.     qac_cbn,
  28.     qac_cbc,
  29.     qac_cbe,
  30.     qac_cjs,
  31.     qac_cBc,
  32.     qac_cteq;    /* equiv. transit capacitance */
  33.   };
  34.  
  35. struct qsv_def {    /* state vector */
  36.   struct qi_def        /* capacitor charges & currents */
  37.     qsv_cbn,
  38.     qsv_cbc,
  39.     qsv_cbe,
  40.     qsv_cjs,
  41.     qsv_cBc;
  42.   double        /* voltages (mostly) */
  43.     qsv_vbn,
  44.     qsv_vbc,
  45.     qsv_vbe,
  46.     qsv_vjs,
  47.     qsv_iteq;    /* excess phase current */
  48.   };
  49.  
  50. /* state-vector access */
  51.  
  52. #define Q_QIBN(vect)    (sv[vect]->qsv_cbn)
  53. #define Q_QCBN(vect)    (sv[vect]->qsv_cbn.qi_q)
  54. #define Q_ICBN(vect)    (sv[vect]->qsv_cbn.qi_i)
  55.  
  56. #define Q_QIBC(vect)    (sv[vect]->qsv_cbc)
  57. #define Q_QCBC(vect)    (sv[vect]->qsv_cbc.qi_q)
  58. #define Q_ICBC(vect)    (sv[vect]->qsv_cbc.qi_i)
  59.  
  60. #define Q_QIBE(vect)    (sv[vect]->qsv_cbe)
  61. #define Q_QCBE(vect)    (sv[vect]->qsv_cbe.qi_q)
  62. #define Q_ICBE(vect)    (sv[vect]->qsv_cbe.qi_i)
  63.  
  64. #define Q_QIJS(vect)    (sv[vect]->qsv_cjs)
  65. #define Q_QCJS(vect)    (sv[vect]->qsv_cjs.qi_q)
  66. #define Q_ICJS(vect)    (sv[vect]->qsv_cjs.qi_i)
  67.  
  68. #define Q_QIBX(vect)    (sv[vect]->qsv_cBc)
  69. #define Q_QCBX(vect)    (sv[vect]->qsv_cBc.qi_q)
  70. #define Q_ICBX(vect)    (sv[vect]->qsv_cBc.qi_i)
  71.  
  72. #define Q_VBE(vect)    (sv[vect]->qsv_vbe)
  73. #define Q_VBC(vect)    (sv[vect]->qsv_vbc)
  74. #define Q_VBN(vect)    (sv[vect]->qsv_vbn)
  75. #define Q_VJS(vect)    (sv[vect]->qsv_vjs)
  76. #define Q_IEXBC(vect)    (sv[vect]->qsv_iteq)
  77.  
  78. /* device instance */
  79.  
  80. struct q_ {
  81.   struct q_ *q_next;
  82.   char      *q_name;
  83.   struct Q_ *q_model;
  84.  
  85.   CKT_IDX        /* circuit matrix indices: external nodes */
  86.     q_C,
  87.     q_B,
  88.     q_E,
  89.     q_S;
  90.  
  91.   int    q_off;
  92.  
  93.   /* device parameters and expressions */
  94.   /* MUST FOLLOW q_off */
  95.   DXPR( q_area,  qx_area);
  96.   DXPR( q_vbe,   qx_vbe);   /* IC= */
  97.   DXPR( q_vce,   qx_vce);
  98.  
  99.   CKT_IDX        /* circuit matrix indices: internal nodes */
  100.     q_n,
  101.     q_c,
  102.     q_b,
  103.     q_e;
  104.  
  105.   MTX_IDX        /* MatPrm indices: conductance terms */
  106.     q_CC,
  107.     q_Cn,        /* formerly q_Cc */
  108.     q_cn,
  109.     q_cc,
  110.     q_cb,
  111.     q_cB,
  112.     q_ce,
  113.     q_nC,        /* formerly q_cC */
  114.     q_nn,
  115.     q_nc,
  116.     q_nb,
  117.     q_bn,
  118.     q_bc,
  119.     q_bb,
  120.     q_bB,
  121.     q_be,
  122.     q_Bc,
  123.     q_Bb,
  124.     q_BB,
  125.     q_ec,
  126.     q_eb,
  127.     q_ee,
  128.     q_eE,
  129.     q_Ee,
  130.     q_EE,
  131.     q_jS,
  132.     q_Sj,
  133.     q_SS;
  134.  
  135.   MTX_IDX        /* MatPrm indices: branch currents */
  136.     q_in,
  137.     q_ic,
  138.     q_ib,
  139.     q_ie,
  140.     q_iS,
  141.     q_iB;
  142.  
  143.   double        /* "current" values */
  144.     qcv_in,        /* branch currents */
  145.     qcv_ic,
  146.     qcv_ib,
  147.     qcv_ijs,
  148.     qcv_gpi,    /* derivitives */
  149.     qcv_gmu,
  150.     qcv_gm,
  151.     qcv_go,
  152.     qcv_gx,
  153.     qcv_gjs,
  154.     qcv_gnbn,
  155.     qcv_gnbc,
  156.     qcv_gnbeq,
  157.     qcv_gcbeq;
  158.  
  159.   struct {        /* shared data area */
  160.     struct qac_def    q_ac;        /* AC (capacitance values) */
  161.     struct qsv_def    q_sv[MSTVCT];    /* state vectors (transient values) */
  162.     }    q_sda;
  163.   };
  164.  
  165. /* device model */
  166.  
  167. struct Q_ {
  168.   struct Q_ *Q_next;
  169.   char      *Q_name;
  170.   struct Q_ *Q_nom;
  171.   struct Q_ *Q_ako;
  172.  
  173.   int    Q_type,        /* device type == N_TYPE (npn) or P_TYPE (pnp) */
  174.     Q_lpnp;        /* Cjs hooked to base ? YES : NO */
  175.  
  176.   double        /* reserved: pre-computed values */
  177.     Q_fcpe,        /* = fc*vje */
  178.     Q_f1be,        /* = vje*(1-(1-fc)^(1-mje))/(1-mje) */
  179.     Q_f2be,        /* = (1-fc)^(1+mje) */
  180.     Q_f3be,        /* = 1-fc*(1+mje) */
  181.     Q_fcpc,        /* = fc*vjc */
  182.     Q_f1bc,        /* = vjc*(1-(1-fc)^(1-mjc))/(1-mjc) */
  183.     Q_f2bc,        /* = (1-fc)^(1+mjc) */
  184.     Q_f3bc,        /* = 1-fc*(1+mjc) */
  185.     Q_vcrit;    /* = vt*ln(vt/(is*sqrt(2))) */
  186.  
  187.    /* model parameters and expressions */
  188.   MXPR( Q_is,    Qx_is);
  189.   MXPR( Q_eg,    Qx_eg);
  190.   MXPR( Q_bf,    Qx_bf);
  191.   MXPR( Q_nf,    Qx_nf);
  192.   MDLPARM Q_vaf;
  193.   MXPR( Q_User_vaf,    Qx_User_vaf);    /* = 1/vaf */
  194.   MDLPARM Q_ikf;
  195.   MXPR( Q_User_ikf,    Qx_User_ikf);    /* = 1/ikf */
  196.   MDLPARM Q_ise;
  197.   MXPR( Q_User_ise,    Qx_User_ise);
  198.   MXPR( Q_ne,    Qx_ne);
  199.   MXPR( Q_br,    Qx_br);
  200.   MXPR( Q_nr,    Qx_nr);
  201.   MDLPARM Q_var;
  202.   MXPR( Q_User_var,    Qx_User_var);    /* = 1/var */
  203.   MDLPARM Q_ikr;
  204.   MXPR( Q_User_ikr,    Qx_User_ikr);    /* = 1/ikr */
  205.   MDLPARM Q_isc;
  206.   MXPR( Q_User_isc,    Qx_User_isc);
  207.   MXPR( Q_nc,    Qx_nc);
  208.   MXPR( Q_nk,    Qx_nk);
  209.   MDLPARM Q_iss;    /* rev. sat. current for substrate junction */
  210.   MXPR( Q_User_iss,    Qx_User_iss);    /* rev. sat. current for substrate junction */
  211.   MXPR( Q_ns,    Qx_ns);        /* emission coefficient for substrate junction */
  212.   MXPR( Q_rb,    Qx_rb);        /***** NOT 1/rb  *****/
  213.   MXPR( Q_rbm,    Qx_rbm);    /***** NOT 1/rbm *****/
  214.   MXPR( Q_irb,    Qx_irb);
  215.   MDLPARM Q_re;
  216.   MXPR( Q_User_re,    Qx_User_rbe);    /* = 1/re */
  217.   MDLPARM Q_rc;
  218.   MXPR( Q_User_rc,    Qx_User_rc);        /* = 1/rc */
  219.   MXPR( Q_cje,    Qx_cje);
  220.   MXPR( Q_vje,    Qx_vje);
  221.   MXPR( Q_mje,    Qx_mje);
  222.   MXPR( Q_cjc,    Qx_cjc);
  223.   MXPR( Q_vjc,    Qx_vjc);
  224.   MXPR( Q_mjc,    Qx_mjc);
  225.   MXPR( Q_xcjc,    Qx_xcjc);
  226.   MXPR( Q_cjs,    Qx_cjs);
  227.   MXPR( Q_vjs,    Qx_vjs);
  228.   MXPR( Q_mjs,    Qx_mjs);
  229.   MDLPARM Q_fc;
  230.   MXPR( Q_User_fc,    Qx_User_fc);
  231.   MXPR( Q_tf,    Qx_tf);
  232.   MXPR( Q_xtf,    Qx_xtf);
  233.   MDLPARM Q_vtf;
  234.   MXPR( Q_User_vtf,    Qx_User_vtf);
  235.   MXPR( Q_itf,    Qx_itf);
  236.   MDLPARM Q_ptf;
  237.   MXPR( Q_User_ptf,    Qx_User_ptf);
  238.   MXPR( Q_tr,    Qx_tr);
  239.   MXPR( Q_qco,    Qx_qco);
  240.   MXPR( Q_rco,    Qx_rco);
  241.   MXPR( Q_vo,    Qx_vo);
  242.   MXPR( Q_gamma,Qx_gamma);
  243.   MXPR( Q_xtb,    Qx_xtb);
  244.   MXPR( Q_xti,    Qx_xti);
  245.   MXPR( Q_trb1,    Qx_trb1);        /* temp. coef: 1st order correction for RB */
  246.   MXPR( Q_trb2,    Qx_trb2);        /* temp. coef: 2nd order correction for RB */
  247.   MXPR( Q_trm1,    Qx_trm1);        /* temp. coef: 1st order correction for RBM */
  248.   MXPR( Q_trm2,    Qx_trm2);        /* temp. coef: 2nd order correction for RBM */
  249.   MXPR( Q_tre1,    Qx_tre1);        /* temp. coef: 1st order correction for RE */
  250.   MXPR( Q_tre2,    Qx_tre2);        /* temp. coef: 2nd order correction for RE */
  251.   MXPR( Q_trc1,    Qx_trc1);        /* temp. coef: 1st order correction for RC */
  252.   MXPR( Q_trc2,    Qx_trc2);        /* temp. coef: 2nd order correction for RC */
  253.   MXPR( Q_kf,    Qx_kf);
  254.   MXPR( Q_af,    Qx_af);    
  255.   } ;
  256.  
  257. #ifdef Q_DEVICE
  258.  
  259. struct    Q_    Q_default;
  260.  
  261. #define BASE    Q_default
  262.  
  263. struct    Assoc    Q_Assoc[] = {            /*IGNORE*/ /* for Pre-C */
  264.     ASSOCIATE (Q_is,    1E-16,    "*IS"    ),    /* force print */
  265.     ASSOCIATE (Q_eg,    1.11,    "EG"    ),
  266.     ASSOCIATE (Q_bf,    100.,    "*BF"    ),    /* force print */
  267.     ASSOCIATE (Q_nf,    1.,    "*NF"    ),    /* force print */
  268.     ASSOCIATE (Q_User_vaf,    0.,    "VAF"    ),
  269.     ASSOCIATE (Q_User_ikf,    0.,    "IKF"    ),
  270.     ASSOCIATE (Q_User_ise,    0.,    "ISE"    ),
  271.     ASSOCIATE (Q_ne,    1.5,    "NE"    ),
  272.     ASSOCIATE (Q_br,    1.,    "*BR"    ),    /* force print */
  273.     ASSOCIATE (Q_nr,    1.,    "*NR"    ),    /* force print */
  274.     ASSOCIATE (Q_User_var,    0.,    "VAR"    ),
  275.     ASSOCIATE (Q_User_ikr,    0.,    "IKR"    ),
  276.     ASSOCIATE (Q_User_isc,    0.,    "ISC"    ),
  277.     ASSOCIATE (Q_nc,    2.,    "NC"    ),
  278.     ASSOCIATE (Q_nk,    .5,    "NK"    ),    /* high-injection exponent */
  279.     ASSOCIATE (Q_User_iss,    0.,    "ISS"    ),
  280.     ASSOCIATE (Q_ns,    1.,    "NS"    ),
  281.     ASSOCIATE (Q_rb,    0.,    "RB"    ),
  282.     ASSOCIATE (Q_rbm,    0.,    "RBM"    ),
  283.     ASSOCIATE (Q_irb,    0.,    "IRB"    ),
  284.     ASSOCIATE (Q_User_re,    0.,    "RE"    ),
  285.     ASSOCIATE (Q_User_rc,    0.,    "RC"    ),
  286.     ASSOCIATE (Q_cje,    0.,    "CJE"    ),
  287.     ASSOCIATE (Q_vje,    .75,    "VJE"    ),
  288.     ASSOCIATE (Q_mje,    .33,    "MJE"    ),
  289.     ASSOCIATE (Q_cjc,    0.,    "CJC"    ),
  290.     ASSOCIATE (Q_vjc,    .75,    "VJC"    ),
  291.     ASSOCIATE (Q_mjc,    .33,    "MJC"    ),
  292.     ASSOCIATE (Q_xcjc,    1.,    "XCJC"    ),
  293.     ASSOCIATE (Q_cjs,    0.,    "CJS"    ),
  294.     ASSOCIATE (Q_vjs,    .75,    "VJS"    ),
  295.     ASSOCIATE (Q_mjs,    0.,    "MJS"    ),
  296.     ASSOCIATE (Q_User_fc,    .5,    "FC"    ),
  297.     ASSOCIATE (Q_tf,    0.,    "TF"    ),
  298.     ASSOCIATE (Q_xtf,    0.,    "XTF"    ),
  299.     ASSOCIATE (Q_User_vtf,    0.,    "VTF"    ),
  300.     ASSOCIATE (Q_itf,    0.,    "ITF"    ),
  301.     ASSOCIATE (Q_User_ptf,    0.,    "PTF"    ),
  302.     ASSOCIATE (Q_tr,    0.,    "TR"    ),
  303.     ASSOCIATE (Q_qco,    0.,    "QCO"    ),    /* epi charge */
  304.     ASSOCIATE (Q_rco,    0.,    "RCO"    ),    /* epi resistance */
  305.     ASSOCIATE (Q_vo,    10.,    "VO"    ),    /* epi carrier velocity */
  306.     ASSOCIATE (Q_gamma,    1e-11,    "GAMMA"    ),    /* epi doping factor */
  307.     ASSOCIATE (Q_xtb,    0.,    "XTB"    ),
  308.     ASSOCIATE (Q_xti,    3.,    "XTI"    ),
  309.     ASSOCIATE (Q_trb1,    0.,    "TRB1"    ),
  310.     ASSOCIATE (Q_trb2,    0.,    "TRB2"    ),
  311.     ASSOCIATE (Q_trm1,    0.,    "TRM1"    ),
  312.     ASSOCIATE (Q_trm2,    0.,    "TRM2"    ),
  313.     ASSOCIATE (Q_tre1,    0.,    "TRE1"    ),
  314.     ASSOCIATE (Q_tre2,    0.,    "TRE2"    ),
  315.     ASSOCIATE (Q_trc1,    0.,    "TRC1"    ),
  316.     ASSOCIATE (Q_trc2,    0.,    "TRC2"    ),
  317.     ASSOCIATE (Q_kf,    0.,    "KF"    ),
  318.     ASSOCIATE (Q_af,    1.,    "AF"    ),
  319.     END_PARMS                /*ENDIGNORE*/
  320. } ;
  321.  
  322. #undef    BASE
  323. #endif
  324.  
  325. #ifdef  UnAlias_Def
  326.  
  327. static char *Q_alias[] = {
  328.     "PT", "XTI",
  329.     "VA", "VAF",
  330.     "IK", "IKF",
  331.     "C2", "ISE",
  332.     "VB", "VAR",
  333.     "C4", "ISC",
  334.     "PE", "VJE",
  335.     "ME", "MJE",
  336.     "PC", "VJC",
  337.     "MC", "MJC",
  338.     "CCS","CJS",
  339.     "PS", "VJS",
  340.     "MS", "MJS",
  341.     "" };
  342. #endif
  343.  
  344.