Added Mean DeltaVth calculation and refined the model to take temperature into account
This commit is contained in:
parent
76ff8c31f2
commit
06c2bd2334
|
|
@ -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) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ;
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
} ;
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ;
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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) ;
|
||||
|
|
|
|||
Loading…
Reference in New Issue