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("w", CAP_WIDTH, IF_REAL, "Device width"),
|
||||||
IOPAU("l", CAP_LENGTH, IF_REAL, "Device length"),
|
IOPAU("l", CAP_LENGTH, IF_REAL, "Device length"),
|
||||||
IOPU( "m", CAP_M, IF_REAL, "Parallel multiplier"),
|
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"),
|
IOPU( "scale", CAP_SCALE, IF_REAL, "Scale factor"),
|
||||||
IP( "sens_cap", CAP_CAP_SENS, IF_FLAG, "flag to request sens. WRT cap."),
|
IP( "sens_cap", CAP_CAP_SENS, IF_FLAG, "flag to request sens. WRT cap."),
|
||||||
OP( "i", CAP_CURRENT, IF_REAL, "Device current"),
|
OP( "i", CAP_CURRENT, IF_REAL, "Device current"),
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,8 @@ typedef struct sCAPinstance {
|
||||||
double CAPlength; /* length of the capacitor */
|
double CAPlength; /* length of the capacitor */
|
||||||
double CAPscale; /* scale factor */
|
double CAPscale; /* scale factor */
|
||||||
double CAPm; /* parallel multiplier */
|
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
|
double *CAPposPosptr; /* pointer to sparse matrix diagonal at
|
||||||
* (positive,positive) */
|
* (positive,positive) */
|
||||||
|
|
@ -52,6 +54,8 @@ typedef struct sCAPinstance {
|
||||||
unsigned CAPdtempGiven : 1; /* flag to indicate delta temp given */
|
unsigned CAPdtempGiven : 1; /* flag to indicate delta temp given */
|
||||||
unsigned CAPscaleGiven : 1; /* flag to indicate scale factor given */
|
unsigned CAPscaleGiven : 1; /* flag to indicate scale factor given */
|
||||||
unsigned CAPmGiven : 1; /* flag to indicate parallel multiplier 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;
|
int CAPsenParmNo; /* parameter # for sensitivity use;
|
||||||
set equal to 0 if not a design parameter*/
|
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_DTEMP 9
|
||||||
#define CAP_SCALE 10
|
#define CAP_SCALE 10
|
||||||
#define CAP_M 11
|
#define CAP_M 11
|
||||||
|
#define CAP_TC1 12
|
||||||
|
#define CAP_TC2 13
|
||||||
|
|
||||||
/* model parameters */
|
/* model parameters */
|
||||||
#define CAP_MOD_CJ 101
|
#define CAP_MOD_CJ 101
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,14 @@ CAPparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
|
||||||
case CAP_CAP_SENS:
|
case CAP_CAP_SENS:
|
||||||
here->CAPsenParmNo = value->iValue;
|
here->CAPsenParmNo = value->iValue;
|
||||||
break;
|
break;
|
||||||
|
case CAP_TC1:
|
||||||
|
here->CAPtc1 = value->rValue;
|
||||||
|
here->CAPtc1Given = TRUE;
|
||||||
|
break;
|
||||||
|
case CAP_TC2:
|
||||||
|
here->CAPtc2 = value->rValue;
|
||||||
|
here->CAPtc2Given = TRUE;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return(E_BADPARM);
|
return(E_BADPARM);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ CAPtemp(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
CAPinstance *here;
|
CAPinstance *here;
|
||||||
double difference;
|
double difference;
|
||||||
double factor;
|
double factor;
|
||||||
|
double tc1, tc2;
|
||||||
|
|
||||||
/* loop through all the capacitor models */
|
/* loop through all the capacitor models */
|
||||||
for( ; model != NULL; model = model->CAPnextModel ) {
|
for( ; model != NULL; model = model->CAPnextModel ) {
|
||||||
|
|
@ -66,10 +67,22 @@ CAPtemp(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
}
|
}
|
||||||
|
|
||||||
difference = (here->CAPtemp + here->CAPdtemp) - model->CAPtnom;
|
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;
|
here->CAPcapac = here->CAPcapac * factor * here->CAPscale;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue