From 06c2bd2334200fcac22db876317d24081505e6f8 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Wed, 2 Nov 2016 16:15:46 +0100 Subject: [PATCH] Added Mean DeltaVth calculation and refined the model to take temperature into account --- src/spicelib/devices/bsim4/b4reliability.c | 83 +++++++++- src/spicelib/devices/bsim4/b4set.c | 1 + src/spicelib/devices/bsim4/bsim4def.h | 6 + src/spicelib/devices/relmodel/relmodel.c | 15 ++ .../devices/relmodel/relmodelcalcaging.c | 145 +++++++++++++----- src/spicelib/devices/relmodel/relmodeldefs.h | 46 ++++++ src/spicelib/devices/relmodel/relmodelsetup.c | 69 +++++++++ 7 files changed, 317 insertions(+), 48 deletions(-) diff --git a/src/spicelib/devices/bsim4/b4reliability.c b/src/spicelib/devices/bsim4/b4reliability.c index 7bd3fcd4d..f873e4f03 100644 --- a/src/spicelib/devices/bsim4/b4reliability.c +++ b/src/spicelib/devices/bsim4/b4reliability.c @@ -7,6 +7,53 @@ Author: 2015 Francesco Lannutti - July 2015 #include "bsim4def.h" #include "ngspice/sperror.h" +static int +listInsert (BSIM4vgsList **list, double vgs) +{ + BSIM4vgsList *current, *previous ; + + /* Loop until the end of the list */ + previous = NULL ; + current = *list ; + while (current != NULL) + { + previous = current ; + current = current->next ; + } + + /* Insert the new element into the list */ + if (previous == NULL) + { + *list = TMALLOC (BSIM4vgsList, 1) ; + current = *list ; + } else { + current = TMALLOC (BSIM4vgsList, 1) ; + previous->next = current ; + } + + /* Populate the element */ + current->vgs = vgs ; + current->next = NULL ; + + return 0 ; +} + +static int +listPurge (BSIM4vgsList **list) +{ + BSIM4vgsList *current, *previous ; + + current = *list ; + while (current != NULL) { + previous = current ; + current = current->next ; + free (previous) ; + } + *list = NULL ; + + return 0 ; +} + static int BSIM4reliability_internal (BSIM4instance *here, CKTcircuit *ckt, unsigned int mode) { @@ -22,7 +69,11 @@ BSIM4reliability_internal (BSIM4instance *here, CKTcircuit *ckt, unsigned int mo von = here->BSIM4von ; if (vds >= 0) { -// printf ("VDS >= 0\tBSIM4type: %d\tBSIM4instance: %s\tVgs: %-.9g\tVon: %-.9g\t", model->BSIM4type, here->BSIM4name, vgs, von) ; + /* Insert 'vgs' into the list for the later average calculation */ + listInsert (&(here->vgsList), vgs) ; +// listInsert (&(here->vgsList), ckt->CKTrhsOld [here->BSIM4gNodePrime]) ; + +// printf ("VDS >= 0\tBSIM4type: %d\tBSIM4instance: %s\tVgs: %-.9g\tVon: %-.9g\n", model->BSIM4type, here->BSIM4name, vgs, von) ; if (vgs > von) { if (here->BSIM4rgateMod == 3) @@ -60,7 +111,12 @@ BSIM4reliability_internal (BSIM4instance *here, CKTcircuit *ckt, unsigned int mo } else { double vgd ; vgd = vgs - vds ; -// printf ("VDS < 0\tBSIM4type: %d\tBSIM4instance: %s\tVgd: %-.9g\tVon: %-.9g\t", model->BSIM4type, here->BSIM4name, vgd, von) ; + + /* Insert 'vgd' into the list for the later average calculation */ + listInsert (&(here->vgsList), vgd) ; +// listInsert (&(here->vgsList), ckt->CKTrhsOld [here->BSIM4gNodePrime]) ; + +// printf ("VDS < 0\tBSIM4type: %d\tBSIM4instance: %s\tVgd: %-.9g\tVon: %-.9g\n", model->BSIM4type, here->BSIM4name, vgd, von) ; if (vgd > von) { if (here->BSIM4rgateMod == 3) @@ -131,6 +187,9 @@ BSIM4reliability_internal (BSIM4instance *here, CKTcircuit *ckt, unsigned int mo // Update the semiperiod counter here->relStruct->semiPeriods++ ; + + // Free the vgs average list + listPurge (&(here->vgsList)) ; } else { fprintf (stderr, "Reliability Analysis Error\n") ; } @@ -153,6 +212,9 @@ BSIM4reliability_internal (BSIM4instance *here, CKTcircuit *ckt, unsigned int mo // Update the semiperiod counter here->relStruct->semiPeriods++ ; + + // Free the vgs average list + listPurge (&(here->vgsList)) ; } else if (here->relStruct->IsON == 0) { // Until now, the device was OFF - Do NOTHING delta = -1 ; @@ -243,14 +305,11 @@ BSIM4reliability_internal (BSIM4instance *here, CKTcircuit *ckt, unsigned int mo } if (here->relStruct->deltaVth > 0) { - model->number_of_aged_instances++ ; - model->total_deltaVth += here->relStruct->deltaVth * 1000 ; - printf ("DEVICE OK!!!\tTime: %-.9gs\t\t", ckt->CKTtime) ; printf ("DeltaVth: %-.9gmV\t\t", here->relStruct->deltaVth * 1000) ; printf ("Device Name: %s\t\t", here->BSIM4name) ; printf ("Device Type: %s\n\n", model->BSIM4modName) ; - } else if (here->relStruct->deltaVth > 0) { + } else if (here->relStruct->deltaVth < 0) { printf ("\n\n\n\nWarning: PROBLEMATIC DEVICE!!!\tTime: %-.9gs\t\t", ckt->CKTtime) ; printf ("DeltaVth: %-.9gmV\t\t", here->relStruct->deltaVth * 1000) ; printf ("Device Name: %s\t\t", here->BSIM4name) ; @@ -313,7 +372,15 @@ BSIM4reliability_internal (BSIM4instance *here, CKTcircuit *ckt, unsigned int mo } } - printf ("\n\nExtrapolation at 10 years:\n\t\t\t\tDeltaVth: %-.9gmV\n\n\n\n", here->relStruct->deltaVth * 1000) ; + printf ("\n\nExtrapolation at %-.9g years:\n\t\t\t\tDeltaVth: %-.9gmV\n\n\n\n", ckt->CKTtargetFitting, here->relStruct->deltaVth * 1000) ; + } + + // Free the vgs average list + listPurge (&(here->vgsList)) ; + + if (here->relStruct->deltaVth > 0) { + model->number_of_aged_instances++ ; + model->total_deltaVth += here->relStruct->deltaVth ; } } else { fprintf (stderr, "Reliability Analysis Error\n") ; @@ -356,7 +423,7 @@ BSIM4reliability (GENmodel *inModel, CKTcircuit *ckt, unsigned int mode) if (mode == 1) { printf ("Number of aged BSIM4 PMOS instances: %u\n\twith a mean DeltaVth of: %-.9gmV\n\n\n", - model->number_of_aged_instances, model->total_deltaVth / model->number_of_aged_instances) ; + model->number_of_aged_instances, model->total_deltaVth * 1000 / model->number_of_aged_instances) ; } } } diff --git a/src/spicelib/devices/bsim4/b4set.c b/src/spicelib/devices/bsim4/b4set.c index f30e89b2e..0fb10486e 100644 --- a/src/spicelib/devices/bsim4/b4set.c +++ b/src/spicelib/devices/bsim4/b4set.c @@ -2667,6 +2667,7 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL here->relStruct->IsON = -1 ; here->relStruct->deltaVthList = NULL ; here->relStruct->semiPeriods = 0 ; + here->relStruct->Vstress = 0 ; } #endif diff --git a/src/spicelib/devices/bsim4/bsim4def.h b/src/spicelib/devices/bsim4/bsim4def.h index 76d8bef44..0eac70157 100644 --- a/src/spicelib/devices/bsim4/bsim4def.h +++ b/src/spicelib/devices/bsim4/bsim4def.h @@ -31,6 +31,11 @@ Modified by Pankaj Kumar Thakur, 07/23/2012 #ifdef RELAN #include "../relmodel/relmodeldefs.h" + +typedef struct sBSIM4vgsList { + double vgs ; + struct sBSIM4vgsList *next ; +} BSIM4vgsList ; #endif typedef struct sBSIM4instance @@ -580,6 +585,7 @@ typedef struct sBSIM4instance #ifdef RELAN RELMODELrelStruct *relStruct ; + BSIM4vgsList *vgsList ; #endif } BSIM4instance ; diff --git a/src/spicelib/devices/relmodel/relmodel.c b/src/spicelib/devices/relmodel/relmodel.c index 9cafead6f..9a48c6ead 100644 --- a/src/spicelib/devices/relmodel/relmodel.c +++ b/src/spicelib/devices/relmodel/relmodel.c @@ -22,6 +22,21 @@ IOP ("tau_0", RELMODEL_MOD_TAU0, IF_REAL, "tau_0"), IOP ("beta", RELMODEL_MOD_BETA, IF_REAL, "beta"), IOP ("tau_e", RELMODEL_MOD_TAUE, IF_REAL, "tau_e"), IOP ("beta1", RELMODEL_MOD_BETA1, IF_REAL, "beta1"), + +IOP ("type", RELMODEL_MOD_TYPE, IF_INTEGER, "beta1"), + +IOP ("alpha_new", RELMODEL_MOD_ALPHA_NEW, IF_REAL, "beta1"), +IOP ("b_new", RELMODEL_MOD_B_NEW, IF_REAL, "beta1"), +IOP ("beta_new", RELMODEL_MOD_BETA_NEW, IF_REAL, "beta1"), +IOP ("e0_new", RELMODEL_MOD_E0_NEW, IF_REAL, "beta1"), +IOP ("k_new", RELMODEL_MOD_K_NEW, IF_REAL, "beta1"), +IOP ("kb_new", RELMODEL_MOD_K_NEW, IF_REAL, "beta1"), +IOP ("tau_c_fast_new", RELMODEL_MOD_TAU_C_FAST_NEW, IF_REAL, "beta1"), +IOP ("tau_c_slow_new", RELMODEL_MOD_TAU_C_SLOW_NEW, IF_REAL, "beta1"), +IOP ("tau_e_fast_new", RELMODEL_MOD_TAU_E_FAST_NEW, IF_REAL, "beta1"), +IOP ("tau_e_slow_new", RELMODEL_MOD_TAU_E_SLOW_NEW, IF_REAL, "beta1"), +IOP ("t_r_new", RELMODEL_MOD_T_R_NEW, IF_REAL, "beta1"), +IOP ("t_s_new", RELMODEL_MOD_T_S_NEW, IF_REAL, "beta1"), IP ("relmodel", RELMODEL_MOD_RELMODEL, IF_FLAG, "Flag to indicate RELMODEL") } ; diff --git a/src/spicelib/devices/relmodel/relmodelcalcaging.c b/src/spicelib/devices/relmodel/relmodelcalcaging.c index 865b1cdb3..25abb7ae8 100644 --- a/src/spicelib/devices/relmodel/relmodelcalcaging.c +++ b/src/spicelib/devices/relmodel/relmodelcalcaging.c @@ -49,8 +49,6 @@ listInsert (RELMODELrelList **list, double time, double deltaVth) int RELMODELcalculateAging (GENinstance *inInstance, int modType, CKTcircuit *ckt, double t_aging, double t_step, unsigned int stress_or_recovery) { - double A, i, Nt, R ; - double b, qFI ; BSIM4instance *here ; RELMODELmodel *relmodel ; @@ -69,52 +67,119 @@ RELMODELcalculateAging (GENinstance *inInstance, int modType, CKTcircuit *ckt, d return 1 ; } - Nt = pow ((sqrt (relmodel->RELMODELnts)), 3) * 1e-21 ; - A = (CHARGE / (4 * CONSTepsZero * 1e-9 * relmodel->RELMODELeps_hk)) * pow ((relmodel->RELMODELh_cut / (2 * sqrt (2 * relmodel->RELMODELm_star * relmodel->RELMODELw)) * 1e9), 2) ; + if (relmodel->RELMODELtype == 1) { + // Giorgio Liatis' Model - if (t_step == 0) - { - /* Extrapolation for 10 years when there is only stress */ - here->relStruct->t_star = 0 ; - if (relmodel->RELMODELh_cut / (2 * sqrt (2 * relmodel->RELMODELm_star * relmodel->RELMODELw)) * log (1 + pow (((t_aging + here->relStruct->t_star) / relmodel->RELMODELtau_0), relmodel->RELMODELbeta)) * 1e9 <= 2) + double A, i, Nt, R ; + double b, qFI ; + + Nt = pow ((sqrt (relmodel->RELMODELnts)), 3) * 1e-21 ; + A = (CHARGE / (4 * CONSTepsZero * 1e-9 * relmodel->RELMODELeps_hk)) * pow ((relmodel->RELMODELh_cut / (2 * sqrt (2 * relmodel->RELMODELm_star * relmodel->RELMODELw)) * 1e9), 2) ; + + if (t_step == 0) { - here->relStruct->deltaVth = Nt * A * pow (log (1 + pow (((t_aging + here->relStruct->t_star) / relmodel->RELMODELtau_0), relmodel->RELMODELbeta)), 2) ; - } else { - here->relStruct->deltaVth = (CHARGE / (4 * CONSTepsZero * 1e-9 * relmodel->RELMODELeps_hk)) * Nt * pow (here->BSIM4modPtr->BSIM4toxe * 1e9, 2) ; - } - } else { - for (i = 0 ; i < t_aging ; i += t_step) - { - if (stress_or_recovery) + // Extrapolation for 10 years when there is only stress + here->relStruct->t_star = 0 ; + if (relmodel->RELMODELh_cut / (2 * sqrt (2 * relmodel->RELMODELm_star * relmodel->RELMODELw)) * log (1 + pow (((t_aging + here->relStruct->t_star) / relmodel->RELMODELtau_0), relmodel->RELMODELbeta)) * 1e9 <= 2) { - if (relmodel->RELMODELh_cut / (2 * sqrt (2 * relmodel->RELMODELm_star * relmodel->RELMODELw)) * log (1 + pow (((i + here->relStruct->t_star) / relmodel->RELMODELtau_0), relmodel->RELMODELbeta)) * 1e9 <= 2) - { - here->relStruct->deltaVth = Nt * A * pow (log (1 + pow (((i + here->relStruct->t_star) / relmodel->RELMODELtau_0), relmodel->RELMODELbeta)), 2) ; - } else { - here->relStruct->deltaVth = (CHARGE / (4 * CONSTepsZero * 1e-9 * relmodel->RELMODELeps_hk)) * Nt * pow (here->BSIM4modPtr->BSIM4toxe * 1e9, 2) ; - } - here->relStruct->deltaVthMax = here->relStruct->deltaVth ; + here->relStruct->deltaVth = Nt * A * pow (log (1 + pow (((t_aging + here->relStruct->t_star) / relmodel->RELMODELtau_0), relmodel->RELMODELbeta)), 2) ; } else { - /* Without Temperature Dependency */ -// here->relStruct->deltaVth = here->relStruct->deltaVthMax * log (1 + (1.718 / (1 + pow ((i / relmodel->RELMODELtau_e), relmodel->RELMODELbeta1)))) ; - - /* With Temperature Dependency */ -// b = 5.621 * 1.2e6 ; - b = 0.706 ; - qFI = 1.03 ; - R = b * pow (ckt->CKTtemp, 2) * exp (-qFI / (relmodel->RELMODELk_b * ckt->CKTtemp)) ; // R = b * pow (T, 2) * exp (-qFI/kT) ; - here->relStruct->deltaVth = (1 - R) * here->relStruct->deltaVthMax * (1 - log (1 + (1.718 / (1 + pow ((i / relmodel->RELMODELtau_e), relmodel->RELMODELbeta1))))) ; + here->relStruct->deltaVth = (CHARGE / (4 * CONSTepsZero * 1e-9 * relmodel->RELMODELeps_hk)) * Nt * pow (here->BSIM4modPtr->BSIM4toxe * 1e9, 2) ; } + } else { + for (i = 0 ; i < t_aging ; i += t_step) + { + if (stress_or_recovery) + { + if (relmodel->RELMODELh_cut / (2 * sqrt (2 * relmodel->RELMODELm_star * relmodel->RELMODELw)) * log (1 + pow (((i + here->relStruct->t_star) / relmodel->RELMODELtau_0), relmodel->RELMODELbeta)) * 1e9 <= 2) + { + here->relStruct->deltaVth = Nt * A * pow (log (1 + pow (((i + here->relStruct->t_star) / relmodel->RELMODELtau_0), relmodel->RELMODELbeta)), 2) ; + } else { + here->relStruct->deltaVth = (CHARGE / (4 * CONSTepsZero * 1e-9 * relmodel->RELMODELeps_hk)) * Nt * pow (here->BSIM4modPtr->BSIM4toxe * 1e9, 2) ; + } + here->relStruct->deltaVthMax = here->relStruct->deltaVth ; + } else { + // Without Temperature Dependency +// here->relStruct->deltaVth = here->relStruct->deltaVthMax * log (1 + (1.718 / (1 + pow ((i / relmodel->RELMODELtau_e), relmodel->RELMODELbeta1)))) ; - /* Insert 'here->relStruct->deltaVth' into the list for the later fitting */ - listInsert (&(here->relStruct->deltaVthList), here->relStruct->offsetTime + i, here->relStruct->deltaVth) ; + // With Temperature Dependency +// b = 5.621 * 1.2e6 ; + b = 0.706 ; + qFI = 1.03 ; + R = b * pow (ckt->CKTtemp, 2) * exp (-qFI / (relmodel->RELMODELk_b * ckt->CKTtemp)) ; // R = b * pow (T, 2) * exp (-qFI/kT) ; + here->relStruct->deltaVth = (1 - R) * here->relStruct->deltaVthMax * (1 - log (1 + (1.718 / (1 + pow ((i / relmodel->RELMODELtau_e), relmodel->RELMODELbeta1))))) ; + } + + // Insert 'here->relStruct->deltaVth' into the list for the later fitting + listInsert (&(here->relStruct->deltaVthList), here->relStruct->offsetTime + i, here->relStruct->deltaVth) ; + } + here->relStruct->offsetTime += i ; } - here->relStruct->offsetTime += i ; - } - if (!stress_or_recovery) - { - here->relStruct->t_star = pow ((exp (sqrt (here->relStruct->deltaVth / (Nt * A))) - 1), (1 / relmodel->RELMODELbeta)) * relmodel->RELMODELtau_0 ; + if (!stress_or_recovery) + { + here->relStruct->t_star = pow ((exp (sqrt (here->relStruct->deltaVth / (Nt * A))) - 1), (1 / relmodel->RELMODELbeta)) * relmodel->RELMODELtau_0 ; + } + } else if (relmodel->RELMODELtype == 2) { + // Model taken from the following article for 65nm devices with 1.4nm plasma-nitrided oxide + // A compact model for NBTI degradation and recovery under use-profile variations and its application to aging analysis of digital integrated circuits + + BSIM4vgsList *current ; + double A, delta_Vth_fast, delta_Vth_slow, i, vgs_average ; + +// V = 2 ; + + if (stress_or_recovery) { + // Calculate the Average Vgs + current = here->vgsList ; + vgs_average = 0 ; + i = 0 ; + while (current != NULL) + { + vgs_average += fabs (current->vgs) ; + i++ ; + current = current->next ; + } + here->relStruct->Vstress = vgs_average / i ; +// printf ("Device Type: %s\t\t", here->BSIM4modPtr->BSIM4modName) ; +// printf ("V: %-.9g\t\t", V) ; +// printf ("Vgs: %-.9g\t\t", ckt->CKTstate0 [here->BSIM4vgs]) ; +// printf ("Vges: %-.9g\t\t", ckt->CKTstate0 [here->BSIM4vges]) ; +// printf ("Vds: %-.9g\n\n", ckt->CKTstate0 [here->BSIM4vds]) ; + } + + if (t_step == 0) + { + // Extrapolation for 10 years when there is only stress + A = relmodel->RELMODELk_new * exp (-relmodel->RELMODELe0_new / (relmodel->RELMODELkb_new * ckt->CKTtemp)) * exp (relmodel->RELMODELb_new * here->relStruct->Vstress / (here->BSIM4modPtr->BSIM4toxe * 1e9 * relmodel->RELMODELkb_new * ckt->CKTtemp)) ; + delta_Vth_fast = A * log (1 + ((t_aging / relmodel->RELMODELtau_c_fast_new))) ; + delta_Vth_slow = A * log (1 + ((t_aging / relmodel->RELMODELtau_c_slow_new))) ; + here->relStruct->deltaVth = relmodel->RELMODELalpha_new * delta_Vth_fast + (1 - relmodel->RELMODELalpha_new) * delta_Vth_slow ; + + // Saturation at 10% of the Average Vgs - This is not in the original aging model + if (here->relStruct->deltaVth > here->relStruct->Vstress * 0.5) + { + here->relStruct->deltaVth = here->relStruct->Vstress * 0.5 ; + } + } else { + for (i = 0 ; i < t_aging ; i += t_step) + { + if (stress_or_recovery) + { + relmodel->RELMODELt_s_new += i ; + } else { + relmodel->RELMODELt_r_new += i ; + } + A = relmodel->RELMODELk_new * exp (-relmodel->RELMODELe0_new / (relmodel->RELMODELkb_new * ckt->CKTtemp)) * exp (relmodel->RELMODELb_new * here->relStruct->Vstress / (here->BSIM4modPtr->BSIM4toxe * 1e9 * relmodel->RELMODELkb_new * ckt->CKTtemp)) ; + delta_Vth_fast = A * log (1 + ((relmodel->RELMODELt_s_new / relmodel->RELMODELtau_c_fast_new) / (1 + pow (relmodel->RELMODELt_r_new / relmodel->RELMODELtau_e_fast_new, relmodel->RELMODELbeta_new)))) ; + delta_Vth_slow = A * log (1 + ((relmodel->RELMODELt_s_new / relmodel->RELMODELtau_c_slow_new) / (1 + pow (relmodel->RELMODELt_r_new / relmodel->RELMODELtau_e_slow_new, relmodel->RELMODELbeta_new)))) ; + here->relStruct->deltaVth = relmodel->RELMODELalpha_new * delta_Vth_fast + (1 - relmodel->RELMODELalpha_new) * delta_Vth_slow ; + + // Insert 'here->relStruct->deltaVth' into the list for the later fitting + listInsert (&(here->relStruct->deltaVthList), here->relStruct->offsetTime + i, here->relStruct->deltaVth) ; + } + here->relStruct->offsetTime += i ; + } } return 0 ; diff --git a/src/spicelib/devices/relmodel/relmodeldefs.h b/src/spicelib/devices/relmodel/relmodeldefs.h index 3e420e4d1..5226540c9 100644 --- a/src/spicelib/devices/relmodel/relmodeldefs.h +++ b/src/spicelib/devices/relmodel/relmodeldefs.h @@ -26,6 +26,7 @@ typedef struct sRELMODELrelStruct { int IsON ; RELMODELrelList *deltaVthList ; unsigned int semiPeriods ; + double Vstress ; } RELMODELrelStruct ; typedef struct sRELMODELmodel @@ -47,6 +48,21 @@ typedef struct sRELMODELmodel double RELMODELbeta1 ; int RELMODELrelmodel ; + int RELMODELtype ; + + double RELMODELalpha_new ; + double RELMODELb_new ; + double RELMODELbeta_new ; + double RELMODELe0_new ; + double RELMODELk_new ; + double RELMODELkb_new ; + double RELMODELtau_c_fast_new ; + double RELMODELtau_c_slow_new ; + double RELMODELtau_e_fast_new ; + double RELMODELtau_e_slow_new ; + double RELMODELt_r_new ; + double RELMODELt_s_new ; + unsigned RELMODELk_bGiven : 1 ; unsigned RELMODELh_cutGiven : 1 ; unsigned RELMODELntsGiven : 1 ; @@ -59,6 +75,21 @@ typedef struct sRELMODELmodel unsigned RELMODELtau_eGiven : 1 ; unsigned RELMODELbeta1Given : 1 ; unsigned RELMODELrelmodelGiven : 1 ; + + unsigned RELMODELtypeGiven : 1 ; + + unsigned RELMODELalpha_newGiven : 1 ; + unsigned RELMODELb_newGiven : 1 ; + unsigned RELMODELbeta_newGiven : 1 ; + unsigned RELMODELe0_newGiven : 1 ; + unsigned RELMODELk_newGiven : 1 ; + unsigned RELMODELkb_newGiven : 1 ; + unsigned RELMODELtau_c_fast_newGiven : 1 ; + unsigned RELMODELtau_c_slow_newGiven : 1 ; + unsigned RELMODELtau_e_fast_newGiven : 1 ; + unsigned RELMODELtau_e_slow_newGiven : 1 ; + unsigned RELMODELt_r_newGiven : 1 ; + unsigned RELMODELt_s_newGiven : 1 ; } RELMODELmodel ; @@ -76,6 +107,21 @@ typedef struct sRELMODELmodel #define RELMODEL_MOD_BETA1 11 #define RELMODEL_MOD_RELMODEL 12 +#define RELMODEL_MOD_TYPE 13 + +#define RELMODEL_MOD_ALPHA_NEW 14 +#define RELMODEL_MOD_B_NEW 15 +#define RELMODEL_MOD_BETA_NEW 16 +#define RELMODEL_MOD_E0_NEW 17 +#define RELMODEL_MOD_K_NEW 18 +#define RELMODEL_MOD_KB_NEW 19 +#define RELMODEL_MOD_TAU_C_FAST_NEW 20 +#define RELMODEL_MOD_TAU_C_SLOW_NEW 21 +#define RELMODEL_MOD_TAU_E_FAST_NEW 22 +#define RELMODEL_MOD_TAU_E_SLOW_NEW 23 +#define RELMODEL_MOD_T_R_NEW 24 +#define RELMODEL_MOD_T_S_NEW 25 + #include "relmodelext.h" #endif /* RELMODEL */ diff --git a/src/spicelib/devices/relmodel/relmodelsetup.c b/src/spicelib/devices/relmodel/relmodelsetup.c index 91fe82dc7..68f4f0d66 100644 --- a/src/spicelib/devices/relmodel/relmodelsetup.c +++ b/src/spicelib/devices/relmodel/relmodelsetup.c @@ -74,6 +74,75 @@ RELMODELsetup (SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *state { model->RELMODELbeta1 = 0.112 ; } + +///// + + if (!model->RELMODELtypeGiven) + { + model->RELMODELtype = 2 ; + } + + + + if (!model->RELMODELalpha_newGiven) + { + model->RELMODELalpha_new = 0.3 ; + } + + if (!model->RELMODELb_newGiven) + { + model->RELMODELb_new = 0.075 ; + } + + if (!model->RELMODELbeta_newGiven) + { + model->RELMODELbeta_new = 0.5 ; + } + + if (!model->RELMODELe0_newGiven) + { + model->RELMODELe0_new = 0.1897 ; + } + + if (!model->RELMODELk_newGiven) + { + model->RELMODELk_new = 420 ; + } + + if (!model->RELMODELkb_newGiven) + { + model->RELMODELkb_new = 8.6e-5 ; + } + + if (!model->RELMODELtau_c_fast_newGiven) + { + model->RELMODELtau_c_fast_new = 1e-3 ; + } + + if (!model->RELMODELtau_c_slow_newGiven) + { + model->RELMODELtau_c_slow_new = 1e3 ; + } + + if (!model->RELMODELtau_e_fast_newGiven) + { + model->RELMODELtau_e_fast_new = 20e-6 ; + } + + if (!model->RELMODELtau_e_slow_newGiven) + { + model->RELMODELtau_e_slow_new = 1e6 ; + } + + if (!model->RELMODELt_r_newGiven) + { + model->RELMODELt_r_new = 0.0 ; + } + + if (!model->RELMODELt_s_newGiven) + { + model->RELMODELt_s_new = 0.0 ; + } } return (OK) ;