From 0fd4339c4d5cb7c6927051db51eae2997781dc4e Mon Sep 17 00:00:00 2001 From: dwarning Date: Sun, 9 Jun 2013 21:41:11 +0200 Subject: [PATCH] use r/res model parameter for elements w/o value as default --- src/spicelib/devices/res/res.c | 3 ++- src/spicelib/devices/res/resdefs.h | 2 ++ src/spicelib/devices/res/resmask.c | 27 +++++++++++++++------------ src/spicelib/devices/res/resmpar.c | 4 ++-- src/spicelib/devices/res/resparam.c | 4 +--- src/spicelib/devices/res/restemp.c | 13 ++++++++----- 6 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/spicelib/devices/res/res.c b/src/spicelib/devices/res/res.c index 693489766..2b5f4c7dc 100644 --- a/src/spicelib/devices/res/res.c +++ b/src/spicelib/devices/res/res.c @@ -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[] = { diff --git a/src/spicelib/devices/res/resdefs.h b/src/spicelib/devices/res/resdefs.h index 3aaec4fb1..ed8581e71 100644 --- a/src/spicelib/devices/res/resdefs.h +++ b/src/spicelib/devices/res/resdefs.h @@ -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 */ diff --git a/src/spicelib/devices/res/resmask.c b/src/spicelib/devices/res/resmask.c index 437e0e504..28af7fc82 100644 --- a/src/spicelib/devices/res/resmask.c +++ b/src/spicelib/devices/res/resmask.c @@ -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); } diff --git a/src/spicelib/devices/res/resmpar.c b/src/spicelib/devices/res/resmpar.c index c5c5896e4..7e92919e1 100644 --- a/src/spicelib/devices/res/resmpar.c +++ b/src/spicelib/devices/res/resmpar.c @@ -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); diff --git a/src/spicelib/devices/res/resparam.c b/src/spicelib/devices/res/resparam.c index a11505f2e..d00ff04a6 100644 --- a/src/spicelib/devices/res/resparam.c +++ b/src/spicelib/devices/res/resparam.c @@ -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; diff --git a/src/spicelib/devices/res/restemp.c b/src/spicelib/devices/res/restemp.c index bd19bd03b..16f32526a 100644 --- a/src/spicelib/devices/res/restemp.c +++ b/src/spicelib/devices/res/restemp.c @@ -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; + } } }