|
|
|
@ -16,25 +16,45 @@ |
|
|
|
|
|
|
|
void |
|
|
|
BSIM4v6destroy( |
|
|
|
GENmodel **inModel) |
|
|
|
GENmodel **inModel) |
|
|
|
{ |
|
|
|
BSIM4v6model **model = (BSIM4v6model**)inModel; |
|
|
|
BSIM4v6instance *here; |
|
|
|
BSIM4v6instance *prev = NULL; |
|
|
|
BSIM4v6model *mod = *model; |
|
|
|
BSIM4v6model *oldmod = NULL; |
|
|
|
BSIM4v6model **model = (BSIM4v6model**)inModel; |
|
|
|
BSIM4v6instance *here; |
|
|
|
BSIM4v6instance *prev = NULL; |
|
|
|
BSIM4v6model *mod = *model; |
|
|
|
BSIM4v6model *oldmod = NULL; |
|
|
|
|
|
|
|
for (; mod ; mod = mod->BSIM4v6nextModel) |
|
|
|
{ if(oldmod) FREE(oldmod); |
|
|
|
oldmod = mod; |
|
|
|
prev = NULL; |
|
|
|
for (here = mod->BSIM4v6instances; here; here = here->BSIM4v6nextInstance) |
|
|
|
{ if(prev) FREE(prev); |
|
|
|
prev = here; |
|
|
|
} |
|
|
|
if(prev) FREE(prev); |
|
|
|
for (; mod ; mod = mod->BSIM4v6nextModel) { |
|
|
|
/** added to get rid of link list pSizeDependParamKnot **/ |
|
|
|
struct bsim4v6SizeDependParam *pParam, *pParamOld=NULL; |
|
|
|
|
|
|
|
pParam = mod->pSizeDependParamKnot; |
|
|
|
|
|
|
|
for (; pParam ; pParam = pParam->pNext) { |
|
|
|
FREE(pParamOld); |
|
|
|
pParamOld = pParam; |
|
|
|
} |
|
|
|
FREE(pParamOld); |
|
|
|
pParam = NULL; |
|
|
|
/** end of extra code **/ |
|
|
|
|
|
|
|
if(oldmod) |
|
|
|
FREE(oldmod); |
|
|
|
oldmod = mod; |
|
|
|
prev = NULL; |
|
|
|
for (here = mod->BSIM4v6instances; here; here = here->BSIM4v6nextInstance) { |
|
|
|
if(prev) FREE(prev); |
|
|
|
prev = here; |
|
|
|
} |
|
|
|
if(prev) FREE(prev); |
|
|
|
} |
|
|
|
if(oldmod) { |
|
|
|
#ifdef USE_OMP4 |
|
|
|
/* free just once for all models */ |
|
|
|
FREE(oldmod->BSIM4v6InstanceArray); |
|
|
|
#endif |
|
|
|
FREE(oldmod); |
|
|
|
} |
|
|
|
if(oldmod) FREE(oldmod); |
|
|
|
*model = NULL; |
|
|
|
return; |
|
|
|
} |