From 39d9a6e677cf800a37eca16c91270ffc8167000e Mon Sep 17 00:00:00 2001 From: pnenzi Date: Thu, 23 Oct 2003 22:05:59 +0000 Subject: [PATCH] Enhanced diode model (should work). --- src/spicelib/devices/dio/dio.c | 10 +++++++--- src/spicelib/devices/dio/dioask.c | 2 +- src/spicelib/devices/dio/diodefs.h | 5 ++++- src/spicelib/devices/dio/diodset.c | 2 +- src/spicelib/devices/dio/dioload.c | 5 +++-- src/spicelib/devices/dio/diomask.c | 5 ++++- src/spicelib/devices/dio/diompar.c | 8 ++++++-- src/spicelib/devices/dio/dioparam.c | 2 +- src/spicelib/devices/dio/diosacl.c | 2 ++ src/spicelib/devices/dio/diosetup.c | 6 ++++-- src/spicelib/devices/dio/diosload.c | 2 ++ src/spicelib/devices/dio/diosprt.c | 2 ++ src/spicelib/devices/dio/diosset.c | 2 ++ src/spicelib/devices/dio/diosupd.c | 2 ++ src/spicelib/devices/dio/diotemp.c | 5 +++-- 15 files changed, 44 insertions(+), 16 deletions(-) diff --git a/src/spicelib/devices/dio/dio.c b/src/spicelib/devices/dio/dio.c index 285cdedf2..55aa0eb25 100644 --- a/src/spicelib/devices/dio/dio.c +++ b/src/spicelib/devices/dio/dio.c @@ -1,7 +1,7 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles -Modified by Dietmar Warning 2003 +Modified by Dietmar Warning 2003 and Paolo Nenzi 2003 **********/ #include "ngspice.h" @@ -43,7 +43,9 @@ IFparm DIOmPTable[] = { /* model parameters */ IOPU( "tnom",DIO_MOD_TNOM,IF_REAL, "Parameter measurement temperature"), IOP( "rs", DIO_MOD_RS, IF_REAL, "Ohmic resistance"), - IOP( "trs", DIO_MOD_TRS, IF_REAL, "Ohmic resistance temp. coeff."), + IOP( "trs", DIO_MOD_TRS, IF_REAL, "Ohmic resistance 1st order temp. coeff."), + IOPR( "trs1", DIO_MOD_TRS, IF_REAL, "Ohmic resistance 1st order temp. coeff."), + IOP( "trs2", DIO_MOD_TRS2, IF_REAL, "Ohmic resistance 2nd order temp. coeff."), IOP( "n", DIO_MOD_N, IF_REAL, "Emission Coefficient"), IOPA( "tt", DIO_MOD_TT, IF_REAL, "Transit Time"), IOPA( "ttt1", DIO_MOD_TTT1, IF_REAL, "Transit Time 1st order temp. coeff."), @@ -51,10 +53,11 @@ IFparm DIOmPTable[] = { /* model parameters */ IOPA( "cjo", DIO_MOD_CJO, IF_REAL, "Junction capacitance"), IOPR( "cj0", DIO_MOD_CJO, IF_REAL, "Junction capacitance"), IOP( "vj", DIO_MOD_VJ, IF_REAL, "Junction potential"), + IOPR( "pb", DIO_MOD_VJ, IF_REAL, "Junction potential"), IOP( "m", DIO_MOD_M, IF_REAL, "Grading coefficient"), IOPR("mj", DIO_MOD_M, IF_REAL, "Grading coefficient"), IOP("tm1", DIO_MOD_TM1, IF_REAL, " Grading coefficient 1st temp. coeff."), - IOP("tm1", DIO_MOD_TM2, IF_REAL, " Grading coefficient 2nd temp. coeff."), + IOP("tm2", DIO_MOD_TM2, IF_REAL, " Grading coefficient 2nd temp. coeff."), IOP( "cjp", DIO_MOD_CJSW, IF_REAL, "Sidewall junction capacitance"), IOPR( "cjsw", DIO_MOD_CJSW, IF_REAL, "Sidewall junction capacitance"), IOP( "php", DIO_MOD_VJSW, IF_REAL, "Sidewall junction potential"), @@ -68,6 +71,7 @@ IFparm DIOmPTable[] = { /* model parameters */ IOP( "kf", DIO_MOD_KF, IF_REAL, "flicker noise coefficient"), IOP( "af", DIO_MOD_AF, IF_REAL, "flicker noise exponent"), IOP( "fc", DIO_MOD_FC, IF_REAL, "Forward bias junction fit parameter"), + IOP( "fcs", DIO_MOD_FCS, IF_REAL, "Forward bias sidewall junction fit parameter"), IOP( "bv", DIO_MOD_BV, IF_REAL, "Reverse breakdown voltage"), IOP( "ibv", DIO_MOD_IBV, IF_REAL, "Current at reverse breakdown voltage"), OPU( "cond", DIO_MOD_COND,IF_REAL, "Ohmic conductance"), diff --git a/src/spicelib/devices/dio/dioask.c b/src/spicelib/devices/dio/dioask.c index 7d5a2a622..2ca82d4a9 100644 --- a/src/spicelib/devices/dio/dioask.c +++ b/src/spicelib/devices/dio/dioask.c @@ -1,7 +1,7 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles -Modified by Dietmar Warning 2003 +Modified by Dietmar Warning 2003 and Paolo Nenzi 2003 **********/ #include "ngspice.h" diff --git a/src/spicelib/devices/dio/diodefs.h b/src/spicelib/devices/dio/diodefs.h index 9cdda6830..7d347e94e 100644 --- a/src/spicelib/devices/dio/diodefs.h +++ b/src/spicelib/devices/dio/diodefs.h @@ -1,7 +1,7 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles -Modified by Dietmar Warning 2003 +Modified by Dietmar Warning 2003 and Paolo Nenzi 2003 **********/ #ifndef DIO #define DIO @@ -164,6 +164,7 @@ typedef struct sDIOmodel { /* model structure for a diode */ unsigned DIOresistGiven : 1; unsigned DIOresistTemp1Given : 1; + unsigned DIOresistTemp2Given : 1; unsigned DIOemissionCoeffGiven : 1; unsigned DIOtransitTimeGiven : 1; unsigned DIOtranTimeTemp1Given : 1; @@ -194,6 +195,7 @@ typedef struct sDIOmodel { /* model structure for a diode */ double DIOresist; /* ohmic series resistance */ double DIOresistTemp1; /* series resistance 1st order temp. coeff. */ + double DIOresistTemp2; /* series resistance 2nd order temp. coeff. */ double DIOconductance; /* conductance corresponding to ohmic R */ double DIOemissionCoeff; /* emission coefficient (N) */ double DIOtransitTime; /* transit time (TT) */ @@ -277,6 +279,7 @@ typedef struct sDIOmodel { /* model structure for a diode */ #define DIO_MOD_TM1 127 #define DIO_MOD_TM2 128 #define DIO_MOD_TRS 129 +#define DIO_MOD_TRS2 130 #include "dioext.h" #endif /*DIO*/ diff --git a/src/spicelib/devices/dio/diodset.c b/src/spicelib/devices/dio/diodset.c index 241b3710e..2561ba4b3 100644 --- a/src/spicelib/devices/dio/diodset.c +++ b/src/spicelib/devices/dio/diodset.c @@ -1,7 +1,7 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1988 Jaijeet S Roychowdhury -Modified by Dietmar Warning 2003 +Modified by Dietmar Warning 2003 and Paolo Nenzi 2003 **********/ #include "ngspice.h" diff --git a/src/spicelib/devices/dio/dioload.c b/src/spicelib/devices/dio/dioload.c index a06769dc3..7ff7ceba7 100644 --- a/src/spicelib/devices/dio/dioload.c +++ b/src/spicelib/devices/dio/dioload.c @@ -2,7 +2,7 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles Modified: 2000 AlansFixes -Modified by Dietmar Warning 2003 +Modified by Dietmar Warning 2003 and Paolo Nenzi 2003 **********/ #include "ngspice.h" @@ -143,6 +143,7 @@ DIOload(GENmodel *inModel, CKTcircuit *ckt) /* * bypass if solution has not changed */ +#ifndef NOBYPASS if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass)) { tol=ckt->CKTvoltTol + ckt->CKTreltol* MAX(fabs(vd),fabs(*(ckt->CKTstate0 +here->DIOvoltage))); @@ -159,7 +160,7 @@ DIOload(GENmodel *inModel, CKTcircuit *ckt) } } } - +#endif /* NOBYPASS */ /* * limit new junction voltage */ diff --git a/src/spicelib/devices/dio/diomask.c b/src/spicelib/devices/dio/diomask.c index f76bb2439..9496ec1a5 100644 --- a/src/spicelib/devices/dio/diomask.c +++ b/src/spicelib/devices/dio/diomask.c @@ -1,7 +1,7 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles -Modified by Dietmar Warning 2003 +Modified by Dietmar Warning 2003 and Paolo Nenzi 2003 **********/ /* */ @@ -37,6 +37,9 @@ DIOmAsk (CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value) case DIO_MOD_TRS: value->rValue = model->DIOresistTemp1; return(OK); + case DIO_MOD_TRS2: + value->rValue = model->DIOresistTemp2; + return(OK); case DIO_MOD_N: value->rValue = model->DIOemissionCoeff; return(OK); diff --git a/src/spicelib/devices/dio/diompar.c b/src/spicelib/devices/dio/diompar.c index 0296dd09f..ab0d82eaa 100644 --- a/src/spicelib/devices/dio/diompar.c +++ b/src/spicelib/devices/dio/diompar.c @@ -1,7 +1,7 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles -Modified by Dietmar Warning 2003 +Modified by Dietmar Warning 2003 and Paolo Nenzi 2003 **********/ /* */ @@ -39,7 +39,11 @@ DIOmParam(int param, IFvalue *value, GENmodel *inModel) case DIO_MOD_TRS: model->DIOresistTemp1 = value->rValue; model->DIOresistTemp1Given = TRUE; - break; + break; + case DIO_MOD_TRS2: + model->DIOresistTemp2 = value->rValue; + model->DIOresistTemp2Given = TRUE; + break; case DIO_MOD_N: model->DIOemissionCoeff = value->rValue; model->DIOemissionCoeffGiven = TRUE; diff --git a/src/spicelib/devices/dio/dioparam.c b/src/spicelib/devices/dio/dioparam.c index df438f389..1bb85b8ef 100644 --- a/src/spicelib/devices/dio/dioparam.c +++ b/src/spicelib/devices/dio/dioparam.c @@ -1,7 +1,7 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles -Modified by Dietmar Warning 2003 +Modified by Dietmar Warning 2003 and Paolo Nenzi 2003 **********/ /* */ diff --git a/src/spicelib/devices/dio/diosacl.c b/src/spicelib/devices/dio/diosacl.c index cb25b5425..0df179530 100644 --- a/src/spicelib/devices/dio/diosacl.c +++ b/src/spicelib/devices/dio/diosacl.c @@ -1,6 +1,8 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles + +This function is obsolete (was used by an old sensitivity analysis) **********/ /* */ diff --git a/src/spicelib/devices/dio/diosetup.c b/src/spicelib/devices/dio/diosetup.c index e2d727c29..bbe34b94f 100644 --- a/src/spicelib/devices/dio/diosetup.c +++ b/src/spicelib/devices/dio/diosetup.c @@ -2,7 +2,7 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles Modified: 2000 AlansFixes -Modified by Dietmar Warning 2003 +Modified by Dietmar Warning 2003 and Paolo Nenzi 2003 **********/ /* load the diode structure with those pointers needed later @@ -100,7 +100,9 @@ DIOsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) if(!model->DIOresistTemp1Given) { model->DIOresistTemp1 = 0.0; } - + if(!model->DIOresistTemp2Given) { + model->DIOresistTemp2 = 0.0; + } /* loop through all the instances of the model */ for (here = model->DIOinstances; here != NULL ; here=here->DIOnextInstance) { diff --git a/src/spicelib/devices/dio/diosload.c b/src/spicelib/devices/dio/diosload.c index ce6d37c92..8412894f5 100644 --- a/src/spicelib/devices/dio/diosload.c +++ b/src/spicelib/devices/dio/diosload.c @@ -1,6 +1,8 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles + +This function is obsolete (was used by an old sensitivity analysis) **********/ /* */ diff --git a/src/spicelib/devices/dio/diosprt.c b/src/spicelib/devices/dio/diosprt.c index 7ddfb1dd7..798b3778e 100644 --- a/src/spicelib/devices/dio/diosprt.c +++ b/src/spicelib/devices/dio/diosprt.c @@ -1,6 +1,8 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles + +This function is obsolete (was used by an old sensitivity analysis) **********/ /* */ diff --git a/src/spicelib/devices/dio/diosset.c b/src/spicelib/devices/dio/diosset.c index 5cebd88e3..bb0a60d4c 100644 --- a/src/spicelib/devices/dio/diosset.c +++ b/src/spicelib/devices/dio/diosset.c @@ -1,6 +1,8 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles + +This function is obsolete (was used by an old sensitivity analysis) **********/ /* */ diff --git a/src/spicelib/devices/dio/diosupd.c b/src/spicelib/devices/dio/diosupd.c index ea6d3acd3..6a57d2b31 100644 --- a/src/spicelib/devices/dio/diosupd.c +++ b/src/spicelib/devices/dio/diosupd.c @@ -1,6 +1,8 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles + +This function is obsolete (was used by an old sensitivity analysis) **********/ /* */ diff --git a/src/spicelib/devices/dio/diotemp.c b/src/spicelib/devices/dio/diotemp.c index 3934aa5f7..fb2036cf4 100644 --- a/src/spicelib/devices/dio/diotemp.c +++ b/src/spicelib/devices/dio/diotemp.c @@ -2,7 +2,7 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles Modified: 2000 AlansFixes -Modified by Dietmar Warning 2003 +Modified by Dietmar Warning 2003 and Paolo Nenzi 2003 **********/ /* perform the temperature update to the diode */ @@ -215,7 +215,8 @@ DIOtemp(GENmodel *inModel, CKTcircuit *ckt) here->DIOtConductance = model->DIOconductance; if(model->DIOresistGiven && model->DIOresist!=0.0) { difference = here->DIOtemp - model->DIOnomTemp; - factor = 1.0 + (model->DIOresistTemp1)*difference; + factor = 1.0 + (model->DIOresistTemp1) * difference + + (model->DIOresistTemp2 * difference * difference); here->DIOtConductance = model->DIOconductance / factor; }