mirror of
https://git.code.sf.net/p/ngspice/ngspice
synced 2026-08-22 13:57:32 +02:00
Fix memory leaks in ff/latch code.
This commit is contained in:
committed by
Holger Vogt
parent
93bd661a3e
commit
41b7c867ff
+10
-10
@@ -8313,7 +8313,6 @@ static struct card *u_instances(struct card *startcard)
|
|||||||
int udev_ok = 0, udev_not_ok = 0;
|
int udev_ok = 0, udev_not_ok = 0;
|
||||||
BOOL create_called = FALSE, repeat_pass = FALSE;
|
BOOL create_called = FALSE, repeat_pass = FALSE;
|
||||||
BOOL skip_next = FALSE;
|
BOOL skip_next = FALSE;
|
||||||
char *tmp = NULL, *pos, *posp, *new_str = NULL;
|
|
||||||
|
|
||||||
card = startcard;
|
card = startcard;
|
||||||
while (card) {
|
while (card) {
|
||||||
@@ -8336,7 +8335,13 @@ static struct card *u_instances(struct card *startcard)
|
|||||||
}
|
}
|
||||||
initialize_udevice(subcktcard->line);
|
initialize_udevice(subcktcard->line);
|
||||||
create_called = TRUE;
|
create_called = TRUE;
|
||||||
} else {
|
}
|
||||||
|
} else if (ciprefix(".ends", cut_line)) {
|
||||||
|
level--;
|
||||||
|
if (repeat_pass) {
|
||||||
|
newcard = replacement_udevice_cards();
|
||||||
|
if (newcard) {
|
||||||
|
char *tmp = NULL, *pos, *posp, *new_str = NULL, *cl;
|
||||||
/* Pspice definition of .subckt card:
|
/* Pspice definition of .subckt card:
|
||||||
.SUBCKT <name> [node]*
|
.SUBCKT <name> [node]*
|
||||||
+ [OPTIONAL: < <interface node> = <default value> >*]
|
+ [OPTIONAL: < <interface node> = <default value> >*]
|
||||||
@@ -8345,8 +8350,9 @@ static struct card *u_instances(struct card *startcard)
|
|||||||
...
|
...
|
||||||
.ENDS
|
.ENDS
|
||||||
*/
|
*/
|
||||||
tmp = TMALLOC(char, strlen(cut_line) + 1);
|
cl = subcktcard->line;
|
||||||
(void) memcpy(tmp, cut_line, strlen(cut_line) + 1);
|
tmp = TMALLOC(char, strlen(cl) + 1);
|
||||||
|
(void) memcpy(tmp, cl, strlen(cl) + 1);
|
||||||
pos = strstr(tmp, "optional:");
|
pos = strstr(tmp, "optional:");
|
||||||
posp = strstr(tmp, "params:");
|
posp = strstr(tmp, "params:");
|
||||||
/* If there is an optional: and a param: then posp > pos */
|
/* If there is an optional: and a param: then posp > pos */
|
||||||
@@ -8359,12 +8365,6 @@ static struct card *u_instances(struct card *startcard)
|
|||||||
}
|
}
|
||||||
new_str = copy(tmp);
|
new_str = copy(tmp);
|
||||||
tfree(tmp);
|
tfree(tmp);
|
||||||
}
|
|
||||||
} else if (ciprefix(".ends", cut_line)) {
|
|
||||||
level--;
|
|
||||||
if (repeat_pass) {
|
|
||||||
newcard = replacement_udevice_cards();
|
|
||||||
if (newcard) {
|
|
||||||
remove_old_cards(subcktcard->nextcard, card);
|
remove_old_cards(subcktcard->nextcard, card);
|
||||||
subcktcard->nextcard = newcard;
|
subcktcard->nextcard = newcard;
|
||||||
tfree(subcktcard->line);
|
tfree(subcktcard->line);
|
||||||
|
|||||||
+14
-14
@@ -2766,16 +2766,16 @@ static struct dff_instance *add_dff_inout_timing_model(
|
|||||||
arrp = dffip->d_in;
|
arrp = dffip->d_in;
|
||||||
for (i = 0; i < num_gates; i++) {
|
for (i = 0; i < num_gates; i++) {
|
||||||
if (strncmp(arrp[i], "$d_", 3) == 0) {
|
if (strncmp(arrp[i], "$d_", 3) == 0) {
|
||||||
tfree(dffip);
|
delete_dff_instance(dffip);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (eq(dffip->prebar, "$d_lo") || eq(dffip->prebar, "$d_nc")) {
|
if (eq(dffip->prebar, "$d_lo") || eq(dffip->prebar, "$d_nc")) {
|
||||||
tfree(dffip);
|
delete_dff_instance(dffip);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (eq(dffip->clrbar, "$d_lo") || eq(dffip->clrbar, "$d_nc")) {
|
if (eq(dffip->clrbar, "$d_lo") || eq(dffip->clrbar, "$d_nc")) {
|
||||||
tfree(dffip);
|
delete_dff_instance(dffip);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2841,20 +2841,20 @@ static struct dltch_instance *add_dltch_inout_timing_model(
|
|||||||
arrp = dlp->d_in;
|
arrp = dlp->d_in;
|
||||||
for (i = 0; i < num_gates; i++) {
|
for (i = 0; i < num_gates; i++) {
|
||||||
if (strncmp(arrp[i], "$d_", 3) == 0) {
|
if (strncmp(arrp[i], "$d_", 3) == 0) {
|
||||||
tfree(dlp);
|
delete_dltch_instance(dlp);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (strncmp(dlp->gate, "$d_", 3) == 0) {
|
if (strncmp(dlp->gate, "$d_", 3) == 0) {
|
||||||
tfree(dlp);
|
delete_dltch_instance(dlp);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (eq(dlp->prebar, "$d_lo") || eq(dlp->prebar, "$d_nc")) {
|
if (eq(dlp->prebar, "$d_lo") || eq(dlp->prebar, "$d_nc")) {
|
||||||
tfree(dlp);
|
delete_dltch_instance(dlp);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (eq(dlp->clrbar, "$d_lo") || eq(dlp->clrbar, "$d_nc")) {
|
if (eq(dlp->clrbar, "$d_lo") || eq(dlp->clrbar, "$d_nc")) {
|
||||||
tfree(dlp);
|
delete_dltch_instance(dlp);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return dlp;
|
return dlp;
|
||||||
@@ -2930,16 +2930,16 @@ static struct jkff_instance *add_jkff_inout_timing_model(
|
|||||||
for (i = 0; i < num_gates; i++) {
|
for (i = 0; i < num_gates; i++) {
|
||||||
if (strncmp(arrp[i], "$d_", 3) == 0 ||
|
if (strncmp(arrp[i], "$d_", 3) == 0 ||
|
||||||
strncmp(arrpk[i], "$d_", 3) == 0) {
|
strncmp(arrpk[i], "$d_", 3) == 0) {
|
||||||
tfree(jkffip);
|
delete_jkff_instance(jkffip);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (eq(jkffip->prebar, "$d_lo") || eq(jkffip->prebar, "$d_nc")) {
|
if (eq(jkffip->prebar, "$d_lo") || eq(jkffip->prebar, "$d_nc")) {
|
||||||
tfree(jkffip);
|
delete_jkff_instance(jkffip);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (eq(jkffip->clrbar, "$d_lo") || eq(jkffip->clrbar, "$d_nc")) {
|
if (eq(jkffip->clrbar, "$d_lo") || eq(jkffip->clrbar, "$d_nc")) {
|
||||||
tfree(jkffip);
|
delete_jkff_instance(jkffip);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return jkffip;
|
return jkffip;
|
||||||
@@ -3019,20 +3019,20 @@ static struct srff_instance *add_srff_inout_timing_model(
|
|||||||
for (i = 0; i < num_gates; i++) {
|
for (i = 0; i < num_gates; i++) {
|
||||||
if (strncmp(arrp[i], "$d_", 3) == 0 ||
|
if (strncmp(arrp[i], "$d_", 3) == 0 ||
|
||||||
strncmp(arrpr[i], "$d_", 3) == 0) {
|
strncmp(arrpr[i], "$d_", 3) == 0) {
|
||||||
tfree(srffp);
|
delete_srff_instance(srffp);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (strncmp(srffp->gate, "$d_", 3) == 0) {
|
if (strncmp(srffp->gate, "$d_", 3) == 0) {
|
||||||
tfree(srffp);
|
delete_srff_instance(srffp);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (eq(srffp->prebar, "$d_lo") || eq(srffp->prebar, "$d_nc")) {
|
if (eq(srffp->prebar, "$d_lo") || eq(srffp->prebar, "$d_nc")) {
|
||||||
tfree(srffp);
|
delete_srff_instance(srffp);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (eq(srffp->clrbar, "$d_lo") || eq(srffp->clrbar, "$d_nc")) {
|
if (eq(srffp->clrbar, "$d_lo") || eq(srffp->clrbar, "$d_nc")) {
|
||||||
tfree(srffp);
|
delete_srff_instance(srffp);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return srffp;
|
return srffp;
|
||||||
|
|||||||
Reference in New Issue
Block a user