Add DEVmodDelete functions to reduce memoory leaks in Cider models. The model memory was not freed during remcirc or quit. In the future, some of the code duplication could be refactored. The cmosinv.cir is now down to just 1 memory leak.

This commit is contained in:
Brian Taylor 2023-06-28 22:11:11 -07:00 committed by Holger Vogt
parent db8ac72199
commit f39f89ea9b
15 changed files with 885 additions and 5 deletions

View File

@ -24,3 +24,177 @@ NBJTdelete(GENinstance *gen_inst)
return OK;
}
int NBJTmodDelete(GENmodel *gen_model)
{
NBJTmodel *model = (NBJTmodel *)gen_model;
MESHcard *xmesh = model->NBJTxMeshes; /* list of xmesh cards */
MESHcard *ymesh = model->NBJTyMeshes; /* list of ymesh cards */
DOMNcard *domains = model->NBJTdomains; /* list of domain cards */
BDRYcard *boundaries = model->NBJTboundaries; /* list of boundary cards */
DOPcard *dopings = model->NBJTdopings; /* list of doping cards */
ELCTcard *electrodes = model->NBJTelectrodes; /* list of electrode cards */
CONTcard *contacts = model->NBJTcontacts; /* list of contact cards */
MODLcard *models = model->NBJTmodels; /* list of model cards */
MATLcard *materials = model->NBJTmaterials; /* list of material cards */
MOBcard *mobility = model->NBJTmobility; /* list of mobility cards */
METHcard *methods = model->NBJTmethods; /* list of method cards */
OPTNcard *options = model->NBJToptions; /* list of option cards */
OUTPcard *outputs = model->NBJToutputs; /* list of output cards */
TWOtranInfo *pInfo = model->NBJTpInfo; /* transient analysis information */
DOPprofile *profiles = model->NBJTprofiles; /* expanded list of doping profiles */
DOPtable *dopTables = model->NBJTdopTables; /* list of tables used by profiles */
TWOmaterial *matlInfo = model->NBJTmatlInfo; /* list of material info structures */
{
MESHcard *next = NULL, *this = NULL;
next = xmesh;
while (next) {
this = next;
next = next->MESHnextCard;
FREE(this);
}
}
{
MESHcard *next = NULL, *this = NULL;
next = ymesh;
while (next) {
this = next;
next = next->MESHnextCard;
FREE(this);
}
}
{
DOMNcard *next = NULL, *this = NULL;
next = domains;
while (next) {
this = next;
next = next->DOMNnextCard;
FREE(this);
}
}
{
BDRYcard *next = NULL, *this = NULL;
next = boundaries;
while (next) {
this = next;
next = next->BDRYnextCard;
FREE(this);
}
}
{
DOPcard *next = NULL, *this = NULL;
next = dopings;
while (next) {
this = next;
next = next->DOPnextCard;
if (this->DOPdomains) {
FREE(this->DOPdomains);
}
if (this->DOPinFile) {
FREE(this->DOPinFile);
}
FREE(this);
}
}
{
ELCTcard *next = NULL, *this = NULL;
next = electrodes;
while (next) {
this = next;
next = next->ELCTnextCard;
FREE(this);
}
}
{
CONTcard *next = NULL, *this = NULL;
next = contacts;
while (next) {
this = next;
next = next->CONTnextCard;
FREE(this);
}
}
{
MODLcard *next = NULL, *this = NULL;
next = models;
while (next) {
this = next;
next = next->MODLnextCard;
FREE(this);
}
}
{
MATLcard *next = NULL, *this = NULL;
next = materials;
while (next) {
this = next;
next = next->MATLnextCard;
FREE(this);
}
}
{
MOBcard *next = NULL, *this = NULL;
next = mobility;
while (next) {
this = next;
next = next->MOBnextCard;
FREE(this);
}
}
{
METHcard *next = NULL, *this = NULL;
next = methods;
while (next) {
this = next;
next = next->METHnextCard;
FREE(this);
}
}
{
OPTNcard *next = NULL, *this = NULL;
next = options;
while (next) {
this = next;
next = next->OPTNnextCard;
FREE(this);
}
}
{
OUTPcard *next = NULL, *this = NULL;
next = outputs;
while (next) {
this = next;
next = next->OUTPnextCard;
if (this->OUTProotFile) {
FREE(this->OUTProotFile);
}
FREE(this);
}
}
{
if (pInfo) {
FREE(pInfo);
}
}
{
DOPprofile *next = NULL, *this = NULL;
next = profiles;
while (next) {
this = next;
next = next->next;
FREE(this);
}
}
(void)dopTables;
{
TWOmaterial *next = NULL, *this = NULL;
next = matlInfo;
while (next) {
this = next;
next = next->next;
FREE(this);
}
}
return OK;
}

View File

@ -9,6 +9,7 @@ Author: 1987 Karti Mayaram
extern int NBJTacLoad(GENmodel *, CKTcircuit *);
extern int NBJTask(CKTcircuit *, GENinstance *, int, IFvalue *, IFvalue *);
extern int NBJTdelete(GENinstance *);
extern int NBJTmodDelete(GENmodel *);
extern int NBJTgetic(GENmodel *, CKTcircuit *);
extern int NBJTload(GENmodel *, CKTcircuit *);
extern int NBJTmParam(int, IFvalue *, GENmodel *);

View File

@ -43,7 +43,7 @@ SPICEdev NBJTinfo = {
.DEVacLoad = NBJTacLoad,
.DEVaccept = NULL,
.DEVdestroy = NULL,
.DEVmodDelete = NULL,
.DEVmodDelete = NBJTmodDelete,
.DEVdelete = NBJTdelete,
.DEVsetic = NULL,
.DEVask = NBJTask,

View File

@ -10,6 +10,7 @@ Author: 1987 Karti Mayaram
extern int NBJT2acLoad(GENmodel *, CKTcircuit *);
extern int NBJT2ask(CKTcircuit *, GENinstance *, int, IFvalue *, IFvalue *);
extern int NBJT2delete(GENinstance *);
extern int NBJT2modDelete(GENmodel *);
extern int NBJT2getic(GENmodel *, CKTcircuit *);
extern int NBJT2load(GENmodel *, CKTcircuit *);
extern int NBJT2mParam(int, IFvalue *, GENmodel *);

View File

@ -14,6 +14,7 @@ Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group
#include "../../../ciderlib/twod/twodext.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
#include "ngspice/carddefs.h"
int
@ -25,3 +26,177 @@ NBJT2delete(GENinstance *gen_inst)
return OK;
}
int NBJT2modDelete(GENmodel *gen_model)
{
NBJT2model *model = (NBJT2model *)gen_model;
MESHcard *xmesh = model->NBJT2xMeshes; /* list of xmesh cards */
MESHcard *ymesh = model->NBJT2yMeshes; /* list of ymesh cards */
DOMNcard *domains = model->NBJT2domains; /* list of domain cards */
BDRYcard *boundaries = model->NBJT2boundaries; /* list of boundary cards */
DOPcard *dopings = model->NBJT2dopings; /* list of doping cards */
ELCTcard *electrodes = model->NBJT2electrodes; /* list of electrode cards */
CONTcard *contacts = model->NBJT2contacts; /* list of contact cards */
MODLcard *models = model->NBJT2models; /* list of model cards */
MATLcard *materials = model->NBJT2materials; /* list of material cards */
MOBcard *mobility = model->NBJT2mobility; /* list of mobility cards */
METHcard *methods = model->NBJT2methods; /* list of method cards */
OPTNcard *options = model->NBJT2options; /* list of option cards */
OUTPcard *outputs = model->NBJT2outputs; /* list of output cards */
TWOtranInfo *pInfo = model->NBJT2pInfo; /* transient analysis information */
DOPprofile *profiles = model->NBJT2profiles; /* expanded list of doping profiles */
DOPtable *dopTables = model->NBJT2dopTables; /* list of tables used by profiles */
TWOmaterial *matlInfo = model->NBJT2matlInfo; /* list of material info structures */
{
MESHcard *next = NULL, *this = NULL;
next = xmesh;
while (next) {
this = next;
next = next->MESHnextCard;
FREE(this);
}
}
{
MESHcard *next = NULL, *this = NULL;
next = ymesh;
while (next) {
this = next;
next = next->MESHnextCard;
FREE(this);
}
}
{
DOMNcard *next = NULL, *this = NULL;
next = domains;
while (next) {
this = next;
next = next->DOMNnextCard;
FREE(this);
}
}
{
BDRYcard *next = NULL, *this = NULL;
next = boundaries;
while (next) {
this = next;
next = next->BDRYnextCard;
FREE(this);
}
}
{
DOPcard *next = NULL, *this = NULL;
next = dopings;
while (next) {
this = next;
next = next->DOPnextCard;
if (this->DOPdomains) {
FREE(this->DOPdomains);
}
if (this->DOPinFile) {
FREE(this->DOPinFile);
}
FREE(this);
}
}
{
ELCTcard *next = NULL, *this = NULL;
next = electrodes;
while (next) {
this = next;
next = next->ELCTnextCard;
FREE(this);
}
}
{
CONTcard *next = NULL, *this = NULL;
next = contacts;
while (next) {
this = next;
next = next->CONTnextCard;
FREE(this);
}
}
{
MODLcard *next = NULL, *this = NULL;
next = models;
while (next) {
this = next;
next = next->MODLnextCard;
FREE(this);
}
}
{
MATLcard *next = NULL, *this = NULL;
next = materials;
while (next) {
this = next;
next = next->MATLnextCard;
FREE(this);
}
}
{
MOBcard *next = NULL, *this = NULL;
next = mobility;
while (next) {
this = next;
next = next->MOBnextCard;
FREE(this);
}
}
{
METHcard *next = NULL, *this = NULL;
next = methods;
while (next) {
this = next;
next = next->METHnextCard;
FREE(this);
}
}
{
OPTNcard *next = NULL, *this = NULL;
next = options;
while (next) {
this = next;
next = next->OPTNnextCard;
FREE(this);
}
}
{
OUTPcard *next = NULL, *this = NULL;
next = outputs;
while (next) {
this = next;
next = next->OUTPnextCard;
if (this->OUTProotFile) {
FREE(this->OUTProotFile);
}
FREE(this);
}
}
{
if (pInfo) {
FREE(pInfo);
}
}
{
DOPprofile *next = NULL, *this = NULL;
next = profiles;
while (next) {
this = next;
next = next->next;
FREE(this);
}
}
(void)dopTables;
{
TWOmaterial *next = NULL, *this = NULL;
next = matlInfo;
while (next) {
this = next;
next = next->next;
FREE(this);
}
}
return OK;
}

View File

@ -43,7 +43,7 @@ SPICEdev NBJT2info = {
.DEVacLoad = NBJT2acLoad,
.DEVaccept = NULL,
.DEVdestroy = NULL,
.DEVmodDelete = NULL,
.DEVmodDelete = NBJT2modDelete,
.DEVdelete = NBJT2delete,
.DEVsetic = NULL,
.DEVask = NBJT2ask,

View File

@ -8,6 +8,7 @@ Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group
#include "../../../ciderlib/oned/onedext.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
#include "ngspice/carddefs.h"
int
@ -19,3 +20,177 @@ NUMDdelete(GENinstance *gen_inst)
return OK;
}
int NUMDmodDelete(GENmodel *gen_model)
{
NUMDmodel *model = (NUMDmodel *)gen_model;
MESHcard *xmesh = model->NUMDxMeshes; /* list of xmesh cards */
MESHcard *ymesh = model->NUMDyMeshes; /* list of ymesh cards */
DOMNcard *domains = model->NUMDdomains; /* list of domain cards */
BDRYcard *boundaries = model->NUMDboundaries; /* list of boundary cards */
DOPcard *dopings = model->NUMDdopings; /* list of doping cards */
ELCTcard *electrodes = model->NUMDelectrodes; /* list of electrode cards */
CONTcard *contacts = model->NUMDcontacts; /* list of contact cards */
MODLcard *models = model->NUMDmodels; /* list of model cards */
MATLcard *materials = model->NUMDmaterials; /* list of material cards */
MOBcard *mobility = model->NUMDmobility; /* list of mobility cards */
METHcard *methods = model->NUMDmethods; /* list of method cards */
OPTNcard *options = model->NUMDoptions; /* list of option cards */
OUTPcard *outputs = model->NUMDoutputs; /* list of output cards */
ONEtranInfo *pInfo = model->NUMDpInfo; /* transient analysis information */
DOPprofile *profiles = model->NUMDprofiles; /* expanded list of doping profiles */
DOPtable *dopTables = model->NUMDdopTables; /* list of tables used by profiles */
ONEmaterial *matlInfo = model->NUMDmatlInfo; /* list of material info structures */
{
MESHcard *next = NULL, *this = NULL;
next = xmesh;
while (next) {
this = next;
next = next->MESHnextCard;
FREE(this);
}
}
{
MESHcard *next = NULL, *this = NULL;
next = ymesh;
while (next) {
this = next;
next = next->MESHnextCard;
FREE(this);
}
}
{
DOMNcard *next = NULL, *this = NULL;
next = domains;
while (next) {
this = next;
next = next->DOMNnextCard;
FREE(this);
}
}
{
BDRYcard *next = NULL, *this = NULL;
next = boundaries;
while (next) {
this = next;
next = next->BDRYnextCard;
FREE(this);
}
}
{
DOPcard *next = NULL, *this = NULL;
next = dopings;
while (next) {
this = next;
next = next->DOPnextCard;
if (this->DOPdomains) {
FREE(this->DOPdomains);
}
if (this->DOPinFile) {
FREE(this->DOPinFile);
}
FREE(this);
}
}
{
ELCTcard *next = NULL, *this = NULL;
next = electrodes;
while (next) {
this = next;
next = next->ELCTnextCard;
FREE(this);
}
}
{
CONTcard *next = NULL, *this = NULL;
next = contacts;
while (next) {
this = next;
next = next->CONTnextCard;
FREE(this);
}
}
{
MODLcard *next = NULL, *this = NULL;
next = models;
while (next) {
this = next;
next = next->MODLnextCard;
FREE(this);
}
}
{
MATLcard *next = NULL, *this = NULL;
next = materials;
while (next) {
this = next;
next = next->MATLnextCard;
FREE(this);
}
}
{
MOBcard *next = NULL, *this = NULL;
next = mobility;
while (next) {
this = next;
next = next->MOBnextCard;
FREE(this);
}
}
{
METHcard *next = NULL, *this = NULL;
next = methods;
while (next) {
this = next;
next = next->METHnextCard;
FREE(this);
}
}
{
OPTNcard *next = NULL, *this = NULL;
next = options;
while (next) {
this = next;
next = next->OPTNnextCard;
FREE(this);
}
}
{
OUTPcard *next = NULL, *this = NULL;
next = outputs;
while (next) {
this = next;
next = next->OUTPnextCard;
if (this->OUTProotFile) {
FREE(this->OUTProotFile);
}
FREE(this);
}
}
{
if (pInfo) {
FREE(pInfo);
}
}
{
DOPprofile *next = NULL, *this = NULL;
next = profiles;
while (next) {
this = next;
next = next->next;
FREE(this);
}
}
(void)dopTables;
{
TWOmaterial *next = NULL, *this = NULL;
next = matlInfo;
while (next) {
this = next;
next = next->next;
FREE(this);
}
}
return OK;
}

View File

@ -10,6 +10,7 @@ Author: 1987 Karti Mayaram
extern int NUMDacLoad(GENmodel *, CKTcircuit *);
extern int NUMDask(CKTcircuit *, GENinstance *, int, IFvalue *, IFvalue *);
extern int NUMDdelete(GENinstance *);
extern int NUMDmodDelete(GENmodel *);
extern int NUMDgetic(GENmodel *, CKTcircuit *);
extern int NUMDload(GENmodel *, CKTcircuit *);
extern int NUMDmParam(int, IFvalue *, GENmodel *);

View File

@ -43,7 +43,7 @@ SPICEdev NUMDinfo = {
.DEVacLoad = NUMDacLoad,
.DEVaccept = NULL,
.DEVdestroy = NULL,
.DEVmodDelete = NULL,
.DEVmodDelete = NUMDmodDelete,
.DEVdelete = NUMDdelete,
.DEVsetic = NULL,
.DEVask = NUMDask,

View File

@ -9,6 +9,7 @@ Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group
#include "../../../ciderlib/twod/twodext.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
#include "ngspice/carddefs.h"
int
@ -20,3 +21,177 @@ NUMD2delete(GENinstance *gen_inst)
return OK;
}
int NUMD2modDelete(GENmodel *gen_model)
{
NUMD2model *model = (NUMD2model *)gen_model;
MESHcard *xmesh = model->NUMD2xMeshes; /* list of xmesh cards */
MESHcard *ymesh = model->NUMD2yMeshes; /* list of ymesh cards */
DOMNcard *domains = model->NUMD2domains; /* list of domain cards */
BDRYcard *boundaries = model->NUMD2boundaries; /* list of boundary cards */
DOPcard *dopings = model->NUMD2dopings; /* list of doping cards */
ELCTcard *electrodes = model->NUMD2electrodes; /* list of electrode cards */
CONTcard *contacts = model->NUMD2contacts; /* list of contact cards */
MODLcard *models = model->NUMD2models; /* list of model cards */
MATLcard *materials = model->NUMD2materials; /* list of material cards */
MOBcard *mobility = model->NUMD2mobility; /* list of mobility cards */
METHcard *methods = model->NUMD2methods; /* list of method cards */
OPTNcard *options = model->NUMD2options; /* list of option cards */
OUTPcard *outputs = model->NUMD2outputs; /* list of output cards */
TWOtranInfo *pInfo = model->NUMD2pInfo; /* transient analysis information */
DOPprofile *profiles = model->NUMD2profiles; /* expanded list of doping profiles */
DOPtable *dopTables = model->NUMD2dopTables; /* list of tables used by profiles */
TWOmaterial *matlInfo = model->NUMD2matlInfo; /* list of material info structures */
{
MESHcard *next = NULL, *this = NULL;
next = xmesh;
while (next) {
this = next;
next = next->MESHnextCard;
FREE(this);
}
}
{
MESHcard *next = NULL, *this = NULL;
next = ymesh;
while (next) {
this = next;
next = next->MESHnextCard;
FREE(this);
}
}
{
DOMNcard *next = NULL, *this = NULL;
next = domains;
while (next) {
this = next;
next = next->DOMNnextCard;
FREE(this);
}
}
{
BDRYcard *next = NULL, *this = NULL;
next = boundaries;
while (next) {
this = next;
next = next->BDRYnextCard;
FREE(this);
}
}
{
DOPcard *next = NULL, *this = NULL;
next = dopings;
while (next) {
this = next;
next = next->DOPnextCard;
if (this->DOPdomains) {
FREE(this->DOPdomains);
}
if (this->DOPinFile) {
FREE(this->DOPinFile);
}
FREE(this);
}
}
{
ELCTcard *next = NULL, *this = NULL;
next = electrodes;
while (next) {
this = next;
next = next->ELCTnextCard;
FREE(this);
}
}
{
CONTcard *next = NULL, *this = NULL;
next = contacts;
while (next) {
this = next;
next = next->CONTnextCard;
FREE(this);
}
}
{
MODLcard *next = NULL, *this = NULL;
next = models;
while (next) {
this = next;
next = next->MODLnextCard;
FREE(this);
}
}
{
MATLcard *next = NULL, *this = NULL;
next = materials;
while (next) {
this = next;
next = next->MATLnextCard;
FREE(this);
}
}
{
MOBcard *next = NULL, *this = NULL;
next = mobility;
while (next) {
this = next;
next = next->MOBnextCard;
FREE(this);
}
}
{
METHcard *next = NULL, *this = NULL;
next = methods;
while (next) {
this = next;
next = next->METHnextCard;
FREE(this);
}
}
{
OPTNcard *next = NULL, *this = NULL;
next = options;
while (next) {
this = next;
next = next->OPTNnextCard;
FREE(this);
}
}
{
OUTPcard *next = NULL, *this = NULL;
next = outputs;
while (next) {
this = next;
next = next->OUTPnextCard;
if (this->OUTProotFile) {
FREE(this->OUTProotFile);
}
FREE(this);
}
}
{
if (pInfo) {
FREE(pInfo);
}
}
{
DOPprofile *next = NULL, *this = NULL;
next = profiles;
while (next) {
this = next;
next = next->next;
FREE(this);
}
}
(void)dopTables;
{
TWOmaterial *next = NULL, *this = NULL;
next = matlInfo;
while (next) {
this = next;
next = next->next;
FREE(this);
}
}
return OK;
}

View File

@ -10,6 +10,7 @@ Author: 1987 Karti Mayaram
extern int NUMD2acLoad(GENmodel *, CKTcircuit *);
extern int NUMD2ask(CKTcircuit *, GENinstance *, int, IFvalue *, IFvalue *);
extern int NUMD2delete(GENinstance *);
extern int NUMD2modDelete(GENmodel *);
extern int NUMD2getic(GENmodel *, CKTcircuit *);
extern int NUMD2load(GENmodel *, CKTcircuit *);
extern int NUMD2mParam(int, IFvalue *, GENmodel *);

View File

@ -43,7 +43,7 @@ SPICEdev NUMD2info = {
.DEVacLoad = NUMD2acLoad,
.DEVaccept = NULL,
.DEVdestroy = NULL,
.DEVmodDelete = NULL,
.DEVmodDelete = NUMD2modDelete,
.DEVdelete = NUMD2delete,
.DEVsetic = NULL,
.DEVask = NUMD2ask,

View File

@ -14,6 +14,7 @@ Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group
#include "../../../ciderlib/twod/twodext.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
#include "ngspice/carddefs.h"
int
@ -25,3 +26,178 @@ NUMOSdelete(GENinstance *gen_inst)
return OK;
}
int NUMOSmodDelete(GENmodel *gen_model)
{
NUMOSmodel *model = (NUMOSmodel *)gen_model;
MESHcard *xmesh = model->NUMOSxMeshes; /* list of xmesh cards */
MESHcard *ymesh = model->NUMOSyMeshes; /* list of ymesh cards */
DOMNcard *domains = model->NUMOSdomains; /* list of domain cards */
BDRYcard *boundaries = model->NUMOSboundaries; /* list of boundary cards */
DOPcard *dopings = model->NUMOSdopings; /* list of doping cards */
ELCTcard *electrodes = model->NUMOSelectrodes; /* list of electrode cards */
CONTcard *contacts = model->NUMOScontacts; /* list of contact cards */
MODLcard *models = model->NUMOSmodels; /* list of model cards */
MATLcard *materials = model->NUMOSmaterials; /* list of material cards */
MOBcard *mobility = model->NUMOSmobility; /* list of mobility cards */
METHcard *methods = model->NUMOSmethods; /* list of method cards */
OPTNcard *options = model->NUMOSoptions; /* list of option cards */
OUTPcard *outputs = model->NUMOSoutputs; /* list of output cards */
TWOtranInfo *pInfo = model->NUMOSpInfo; /* transient analysis information */
DOPprofile *profiles = model->NUMOSprofiles; /* expanded list of doping profiles */
DOPtable *dopTables = model->NUMOSdopTables; /* list of tables used by profiles */
TWOmaterial *matlInfo = model->NUMOSmatlInfo; /* list of material info structures */
{
MESHcard *next = NULL, *this = NULL;
next = xmesh;
while (next) {
this = next;
next = next->MESHnextCard;
FREE(this);
}
}
{
MESHcard *next = NULL, *this = NULL;
next = ymesh;
while (next) {
this = next;
next = next->MESHnextCard;
FREE(this);
}
}
{
DOMNcard *next = NULL, *this = NULL;
next = domains;
while (next) {
this = next;
next = next->DOMNnextCard;
FREE(this);
}
}
{
BDRYcard *next = NULL, *this = NULL;
next = boundaries;
while (next) {
this = next;
next = next->BDRYnextCard;
FREE(this);
}
}
{
DOPcard *next = NULL, *this = NULL;
next = dopings;
while (next) {
this = next;
next = next->DOPnextCard;
if (this->DOPdomains) {
FREE(this->DOPdomains);
}
if (this->DOPinFile) {
FREE(this->DOPinFile);
}
FREE(this);
}
}
{
ELCTcard *next = NULL, *this = NULL;
next = electrodes;
while (next) {
this = next;
next = next->ELCTnextCard;
FREE(this);
}
}
{
CONTcard *next = NULL, *this = NULL;
next = contacts;
while (next) {
this = next;
next = next->CONTnextCard;
FREE(this);
}
}
{
MODLcard *next = NULL, *this = NULL;
next = models;
while (next) {
this = next;
next = next->MODLnextCard;
FREE(this);
}
}
{
MATLcard *next = NULL, *this = NULL;
next = materials;
while (next) {
this = next;
next = next->MATLnextCard;
FREE(this);
}
}
{
MOBcard *next = NULL, *this = NULL;
next = mobility;
while (next) {
this = next;
next = next->MOBnextCard;
FREE(this);
}
}
{
METHcard *next = NULL, *this = NULL;
next = methods;
while (next) {
this = next;
next = next->METHnextCard;
FREE(this);
}
}
{
OPTNcard *next = NULL, *this = NULL;
next = options;
while (next) {
this = next;
next = next->OPTNnextCard;
FREE(this);
}
}
{
OUTPcard *next = NULL, *this = NULL;
next = outputs;
while (next) {
this = next;
next = next->OUTPnextCard;
if (this->OUTProotFile) {
FREE(this->OUTProotFile);
}
FREE(this);
}
}
{
if (pInfo) {
FREE(pInfo);
}
}
{
DOPprofile *next = NULL, *this = NULL;
next = profiles;
while (next) {
this = next;
next = next->next;
FREE(this);
}
}
(void)dopTables;
{
TWOmaterial *next = NULL, *this = NULL;
next = matlInfo;
while (next) {
this = next;
next = next->next;
FREE(this);
}
}
return OK;
}

View File

@ -10,6 +10,7 @@ Author: 1987 Karti Mayaram
extern int NUMOSacLoad(GENmodel *, CKTcircuit *);
extern int NUMOSask(CKTcircuit *, GENinstance *, int, IFvalue *, IFvalue *);
extern int NUMOSdelete(GENinstance *);
extern int NUMOSmodDelete(GENmodel *);
extern int NUMOSgetic(GENmodel *, CKTcircuit *);
extern int NUMOSload(GENmodel *, CKTcircuit *);
extern int NUMOSmParam(int, IFvalue *, GENmodel *);

View File

@ -43,7 +43,7 @@ SPICEdev NUMOSinfo = {
.DEVacLoad = NUMOSacLoad,
.DEVaccept = NULL,
.DEVdestroy = NULL,
.DEVmodDelete = NULL,
.DEVmodDelete = NUMOSmodDelete,
.DEVdelete = NUMOSdelete,
.DEVsetic = NULL,
.DEVask = NUMOSask,