devices/cap: implement `tc1', `tc2' instance parameters
This commit is contained in:
parent
0facd43319
commit
b50f9b97bb
|
|
@ -20,6 +20,8 @@ IFparm CAPpTable[] = { /* parameters */
|
|||
IOPAU("w", CAP_WIDTH, IF_REAL, "Device width"),
|
||||
IOPAU("l", CAP_LENGTH, IF_REAL, "Device length"),
|
||||
IOPU( "m", CAP_M, IF_REAL, "Parallel multiplier"),
|
||||
IOPU( "tc1", CAP_TC1, IF_REAL, "First order temp. coefficient"),
|
||||
IOPU( "tc2", CAP_TC2, IF_REAL, "Second order temp. coefficient"),
|
||||
IOPU( "scale", CAP_SCALE, IF_REAL, "Scale factor"),
|
||||
IP( "sens_cap", CAP_CAP_SENS, IF_FLAG, "flag to request sens. WRT cap."),
|
||||
OP( "i", CAP_CURRENT, IF_REAL, "Device current"),
|
||||
|
|
|
|||
|
|
@ -35,6 +35,8 @@ typedef struct sCAPinstance {
|
|||
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 *CAPposPosptr; /* pointer to sparse matrix diagonal at
|
||||
* (positive,positive) */
|
||||
|
|
@ -52,6 +54,8 @@ typedef struct sCAPinstance {
|
|||
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 */
|
||||
int CAPsenParmNo; /* parameter # for sensitivity use;
|
||||
set equal to 0 if not a design parameter*/
|
||||
|
||||
|
|
@ -113,6 +117,8 @@ typedef struct sCAPmodel { /* model structure for a capacitor */
|
|||
#define CAP_DTEMP 9
|
||||
#define CAP_SCALE 10
|
||||
#define CAP_M 11
|
||||
#define CAP_TC1 12
|
||||
#define CAP_TC2 13
|
||||
|
||||
/* model parameters */
|
||||
#define CAP_MOD_CJ 101
|
||||
|
|
|
|||
|
|
@ -59,6 +59,14 @@ CAPparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
|
|||
case CAP_CAP_SENS:
|
||||
here->CAPsenParmNo = value->iValue;
|
||||
break;
|
||||
case CAP_TC1:
|
||||
here->CAPtc1 = value->rValue;
|
||||
here->CAPtc1Given = TRUE;
|
||||
break;
|
||||
case CAP_TC2:
|
||||
here->CAPtc2 = value->rValue;
|
||||
here->CAPtc2Given = TRUE;
|
||||
break;
|
||||
default:
|
||||
return(E_BADPARM);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ CAPtemp(GENmodel *inModel, CKTcircuit *ckt)
|
|||
CAPinstance *here;
|
||||
double difference;
|
||||
double factor;
|
||||
double tc1, tc2;
|
||||
|
||||
/* loop through all the capacitor models */
|
||||
for( ; model != NULL; model = model->CAPnextModel ) {
|
||||
|
|
@ -66,10 +67,22 @@ CAPtemp(GENmodel *inModel, CKTcircuit *ckt)
|
|||
}
|
||||
|
||||
difference = (here->CAPtemp + here->CAPdtemp) - model->CAPtnom;
|
||||
|
||||
factor = 1.0 + (model->CAPtempCoeff1)*difference +
|
||||
(model->CAPtempCoeff2)*difference*difference;
|
||||
|
||||
/* instance parameters tc1 and tc2 will override
|
||||
model parameters tc1 and tc2 */
|
||||
if (here->CAPtc1Given)
|
||||
tc1 = here->CAPtc1; /* instance */
|
||||
else
|
||||
tc1 = model->CAPtempCoeff1; /* model */
|
||||
|
||||
if (here->CAPtc2Given)
|
||||
tc2 = here->CAPtc2;
|
||||
else
|
||||
tc2 = model->CAPtempCoeff2;
|
||||
|
||||
factor = 1.0 + tc1*difference +
|
||||
tc2*difference*difference;
|
||||
|
||||
here->CAPcapac = here->CAPcapac * factor * here->CAPscale;
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue