use r/res model parameter for elements w/o value as default
This commit is contained in:
parent
d269bd3805
commit
0fd4339c4d
|
|
@ -54,7 +54,8 @@ IFparm RESmPTable[] = { /* model parameters */
|
|||
IOPQ( "kf", RES_MOD_KF, IF_REAL,"Flicker noise coefficient"),
|
||||
IOPQ( "af", RES_MOD_AF, IF_REAL,"Flicker noise exponent"),
|
||||
IOPXU( "tnom", RES_MOD_TNOM, IF_REAL,"Parameter measurement temperature"),
|
||||
IP( "r", RES_MOD_R, IF_FLAG,"Device is a resistor model")
|
||||
IOP( "r", RES_MOD_R, IF_FLAG,"Resistor model default value"),
|
||||
IOPR( "res", RES_MOD_R, IF_FLAG,"Resistor model default value")
|
||||
};
|
||||
|
||||
char *RESnames[] = {
|
||||
|
|
|
|||
|
|
@ -104,6 +104,7 @@ typedef struct sRESmodel { /* model structure for a resistor */
|
|||
double RESshort; /* amount by which device is shorter than drawn */
|
||||
double RESfNcoef; /* Flicker noise coefficient */
|
||||
double RESfNexp; /* Flicker noise exponent */
|
||||
double RESres; /* Default model resistance */
|
||||
unsigned REStnomGiven :1; /* flag to indicate nominal temp. was given */
|
||||
unsigned REStc1Given :1; /* flag to indicate tc1 was specified */
|
||||
unsigned REStc2Given :1; /* flag to indicate tc2 was specified */
|
||||
|
|
@ -114,6 +115,7 @@ typedef struct sRESmodel { /* model structure for a resistor */
|
|||
unsigned RESshortGiven :1; /* flag to indicate short effect given */
|
||||
unsigned RESfNcoefGiven :1; /* flag to indicate kf given */
|
||||
unsigned RESfNexpGiven :1; /* flag to indicate af given */
|
||||
unsigned RESresGiven :1; /* flag to indicate model resistance given */
|
||||
} RESmodel;
|
||||
|
||||
/* device parameters */
|
||||
|
|
|
|||
|
|
@ -48,18 +48,21 @@ RESmodAsk(CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value)
|
|||
case RES_MOD_SHORT:
|
||||
value->rValue = model->RESshort;
|
||||
return(OK);
|
||||
case RES_MOD_KF:
|
||||
if (model->RESfNcoefGiven)
|
||||
value->rValue = model->RESfNcoef;
|
||||
else
|
||||
value->rValue = 0.0;
|
||||
return(OK);
|
||||
case RES_MOD_AF:
|
||||
if (model->RESfNexpGiven)
|
||||
value->rValue = model->RESfNexp;
|
||||
else
|
||||
value->rValue = 0.0;
|
||||
return(OK);
|
||||
case RES_MOD_KF:
|
||||
if (model->RESfNcoefGiven)
|
||||
value->rValue = model->RESfNcoef;
|
||||
else
|
||||
value->rValue = 0.0;
|
||||
return(OK);
|
||||
case RES_MOD_AF:
|
||||
if (model->RESfNexpGiven)
|
||||
value->rValue = model->RESfNexp;
|
||||
else
|
||||
value->rValue = 0.0;
|
||||
return(OK);
|
||||
case RES_MOD_R:
|
||||
value->rValue = model->RESres;
|
||||
return(OK);
|
||||
default:
|
||||
return(E_BADPARM);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,8 +60,8 @@ RESmParam(int param, IFvalue *value, GENmodel *inModel)
|
|||
break;
|
||||
|
||||
case RES_MOD_R:
|
||||
/* just being reassured by user that this is a resistor model */
|
||||
/* no-op */
|
||||
model->RESres = value->rValue;
|
||||
model->RESresGiven = TRUE;
|
||||
break;
|
||||
default:
|
||||
return(E_BADPARM);
|
||||
|
|
|
|||
|
|
@ -29,9 +29,7 @@ RESparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
|
|||
break;
|
||||
case RES_RESIST:
|
||||
/* 0 valued resistor causes ngspice to hang -- can't solve for initial voltage */
|
||||
if ( AlmostEqualUlps( value->rValue, 0, 3 ) ) value->rValue = 0.001; /* 0.0001 should be sufficiently small */
|
||||
/* it's the value that smartspice uses */
|
||||
|
||||
if ( AlmostEqualUlps( value->rValue, 0, 3 ) ) value->rValue = 0.001; /* 0.001 should be sufficiently small */
|
||||
here->RESresist = value->rValue;
|
||||
here->RESresGiven = TRUE;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -62,14 +62,17 @@ REStemp(GENmodel *inModel, CKTcircuit *ckt)
|
|||
if(!here->RESmGiven) here->RESm = 1.0;
|
||||
if(!here->RESnoisyGiven) here->RESnoisy = 1;
|
||||
if(!here->RESresGiven) {
|
||||
if(model->RESsheetResGiven && (model->RESsheetRes != 0) &&
|
||||
(here->RESlength != 0)) {
|
||||
if(here->RESlength * here->RESwidth * model->RESsheetRes > 0.0) {
|
||||
here->RESresist = model->RESsheetRes * (here->RESlength -
|
||||
model->RESshort) / (here->RESwidth - model->RESnarrow);
|
||||
} else {
|
||||
SPfrontEnd->IFerror (ERR_WARNING,
|
||||
"%s: resistance = 0 ohm, set to 1000 ohm",&(here->RESname));
|
||||
here->RESresist=1000;
|
||||
if(model->RESresGiven) {
|
||||
here->RESresist = model->RESres;
|
||||
} else {
|
||||
SPfrontEnd->IFerror (ERR_WARNING,
|
||||
"%s: resistance = 0 ohm, set to 1000 ohm",&(here->RESname));
|
||||
here->RESresist=1000;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue