text: /**********
  Copyright 1990 Regents of the University of California.  All rights reserved.
  Author: 1985 Thomas L. Quarles
  Modified: September 2003 Paolo Nenzi
  **********/
  
  #ifndef CAP
  #define CAP
  
  
  #include "ngspice/ifsim.h"
  #include "ngspice/complex.h"
  #include "ngspice/gendefs.h"
  #include "ngspice/cktdefs.h"
  
  /* structures used to describe capacitors */
  
  
  /* information to describe each instance */
  
  typedef struct sCAPinstance {
  
      struct GENinstance gen;
  
  #define CAPmodPtr(inst) ((struct sCAPmodel *)((inst)->gen.GENmodPtr))
  #define CAPnextInstance(inst) ((struct sCAPinstance *)((inst)->gen.GENnextInstance))
  #define CAPname gen.GENname
  #define CAPstate gen.GENstate
  
      const int CAPposNode; /* number of positive node of capacitor */
      const int CAPnegNode; /* number of negative node of capacitor */
  
      double CAPtemp;     /* temperature at which this capacitor operates */
      double CAPdtemp;    /* delta-temperature of this instance */
      double CAPcapac;    /* capacitance */
      double CAPinitCond; /* initial capacitor voltage if specified */
      double CAPwidth;    /* width of the capacitor */
      double CAPlength;   /* length of the capacitor */
      double CAPscale;    /* scale factor */
      double CAPm;        /* parallel multiplier */
      double CAPtc1;      /* first temperature coefficient of capacitors */
      double CAPtc2;      /* second temperature coefficient of capacitors */
      double CAPbv_max;   /* Maximum capacitor voltage */
  
      double *CAPposPosPtr;    /* pointer to sparse matrix diagonal at
                                * (positive,positive) */
      double *CAPnegNegPtr;    /* pointer to sparse matrix diagonal at
                                * (negative,negative) */
      double *CAPposNegPtr;    /* pointer to sparse matrix offdiagonal at
                                * (positive,negative) */
      double *CAPnegPosPtr;    /* pointer to sparse matrix offdiagonal at
                                * (negative,positive) */
      unsigned CAPcapGiven    : 1;   /* flag to indicate capacitance was specified */
      unsigned CAPicGiven     : 1;   /* flag to indicate init. cond. was specified */
      unsigned CAPwidthGiven  : 1;   /* flag to indicate capacitor width given */
      unsigned CAPlengthGiven : 1;   /* flag to indicate capacitor length given*/
      unsigned CAPtempGiven   : 1;   /* flag to indicate operating temp given */
      unsigned CAPdtempGiven  : 1;   /* flag to indicate delta temp given */
      unsigned CAPscaleGiven  : 1;   /* flag to indicate scale factor given */
      unsigned CAPmGiven      : 1;   /* flag to indicate parallel multiplier given */
      unsigned CAPtc1Given    : 1;    /* flag indicates tc1 was specified */
      unsigned CAPtc2Given    : 1;    /* flag indicates tc2 was specified */
      unsigned CAPbv_maxGiven : 1;    /* flags indicates maximum voltage is given */
      int    CAPsenParmNo;         /* parameter # for sensitivity use;
                  set equal to  0 if not a design parameter*/
  
  } CAPinstance ;
  
  #define CAPqcap CAPstate    /* charge on the capacitor */
  #define CAPccap CAPstate+1  /* current through the capacitor */
  
  #define CAPnumStates 2
  
  #define CAPsensxp CAPstate+2 /* charge sensitivities and their derivatives.
                                * +3 for the derivatives - pointer to the
                                * beginning of the array */
  
  #define CAPnumSenStates 2
  
  
  /* data per model */
  
  typedef struct sCAPmodel {      /* model structure for a capacitor */
  
      struct GENmodel gen;
  
  #define CAPmodType gen.GENmodType
  #define CAPnextModel(inst) ((struct sCAPmodel *)((inst)->gen.GENnextModel))
  #define CAPinstances(inst) ((CAPinstance *)((inst)->gen.GENinstances))
  #define CAPmodName gen.GENmodName
  
      double CAPtnom;       /* temperature at which capacitance measured */
      double CAPtempCoeff1; /* linear temperature coefficient */
      double CAPtempCoeff2; /* quadratic temperature coefficient */
      double CAPmCap;       /* Model default capacitance */
      double CAPcj;         /* Unit Area Capacitance ( F/ M**2 ) */
      double CAPcjsw;       /* Unit Length Sidewall Capacitance ( F / M ) */
      double CAPdefWidth;   /* the default width of a capacitor */
      double CAPdefLength;  /* the default length of a capacitor */
      double CAPnarrow;     /* amount by which width are less than drawn */
      double CAPshort;      /* amount by which length are less than drawn */
      double CAPdel;        /* amount by which length and width are less than drawn */
      double CAPdi;         /* Relative dielectric constant */
      double CAPthick;      /* Insulator thickness */
      double CAPbv_max;     /* Maximum capacitor voltage */
      unsigned CAPmCapGiven      : 1;    /* flag indicates default capacitance given */
      unsigned CAPcjGiven        : 1;    /* Unit Area Capacitance ( F/ M**2 ) */
      unsigned CAPcjswGiven      : 1;    /* Unit Length Sidewall Capacitance( F/M )*/
      unsigned CAPdefWidthGiven  : 1;    /* flag indicates default width given*/
      unsigned CAPdefLengthGiven : 1;    /* flag indicates deafult lenght given */
      unsigned CAPnarrowGiven    : 1;    /* flag indicates narrowing factor given */
      unsigned CAPshortGiven     : 1;    /* flag indicates shortening factor given */
      unsigned CAPdelGiven       : 1;    /* flag indicates del factor given */
      unsigned CAPtnomGiven      : 1;    /* flag indicates nominal temp. given */
      unsigned CAPtc1Given       : 1;    /* flag indicates tc1 was specified */
      unsigned CAPtc2Given       : 1;    /* flag indicates tc2 was specified */
      unsigned CAPdiGiven        : 1;    /* flag indicates epsilon-ins given */
      unsigned CAPthickGiven     : 1;    /* flags indicates insulator thickness given */
      unsigned CAPbv_maxGiven    : 1;    /* flags indicates maximum voltage is given */
  
  } CAPmodel;
  
  /* device parameters */
  enum {
      CAP_CAP = 1,
      CAP_IC,
      CAP_WIDTH,
      CAP_LENGTH,
      CAP_CAP_SENS,
      CAP_CURRENT,
      CAP_POWER,
      CAP_TEMP,
      CAP_DTEMP,
      CAP_SCALE,
      CAP_M,
      CAP_TC1,
      CAP_TC2,
      CAP_BV_MAX,
  };
  
  /* model parameters */
  enum {
      CAP_MOD_CJ = 101,
      CAP_MOD_CJSW,
      CAP_MOD_DEFWIDTH,
      CAP_MOD_C,
      CAP_MOD_NARROW,
      CAP_MOD_SHORT,
      CAP_MOD_DEL,
      CAP_MOD_TC1,
      CAP_MOD_TC2,
      CAP_MOD_TNOM,
      CAP_MOD_DI,
      CAP_MOD_THICK,
      CAP_MOD_CAP,
      CAP_MOD_DEFLENGTH,
      CAP_MOD_BV_MAX,
  };
  
  /* device questions */
  enum {
      CAP_QUEST_SENS_REAL = 201,
      CAP_QUEST_SENS_IMAG,
      CAP_QUEST_SENS_MAG,
      CAP_QUEST_SENS_PH,
      CAP_QUEST_SENS_CPLX,
      CAP_QUEST_SENS_DC,
  };
  
  #include "capext.h"
  
  #endif /*CAP*/
  