use r/res model parameter for elements w/o value as default

This commit is contained in:
dwarning 2013-06-09 21:41:11 +02:00
parent d269bd3805
commit 0fd4339c4d
6 changed files with 30 additions and 23 deletions

View File

@ -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[] = {

View File

@ -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 */

View File

@ -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);
}

View File

@ -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);

View File

@ -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;

View File

@ -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;
}
}
}