Fix bug in the LOGICEXP scan_gates optimizer. Some gates with an inverting output were generated with bad logic which gave incorrect simulation results.

This commit is contained in:
Brian Taylor 2024-03-28 15:11:38 -07:00
parent 84afb22f78
commit ed250cc147
1 changed files with 16 additions and 17 deletions

View File

@ -22,6 +22,7 @@
#include "ngspice/dstring.h"
#include "ngspice/logicexp.h"
#include "ngspice/udevices.h"
#include "ngspice/cpextern.h"
static char *get_pindly_instance_name(void);
static char *get_inst_name(void);
@ -573,6 +574,21 @@ static void scan_gates(DSTRING *lhs)
{
struct gate_data *current = NULL, *previous = NULL, *last_curr = NULL;
struct gate_data *prev = NULL;
int ps_scan_gates_noopt = 0;
if (!cp_getvar("ps_scan_gates_noopt", CP_NUM, &ps_scan_gates_noopt, 0)) {
ps_scan_gates_noopt = 0;
}
if (ps_scan_gates_noopt) {
current = last_gate;
if (ds_get_length(lhs) > 0) {
assert(current->finished == FALSE);
tfree(current->outp);
current->outp = TMALLOC(char, ds_get_length(lhs) + 1);
strcpy(current->outp, ds_get_buf(lhs));
}
return;
}
current = first_gate;
while (current) {
@ -638,19 +654,6 @@ static void scan_gates(DSTRING *lhs)
}
}
static void scan_gates_noopt(DSTRING *lhs)
{
struct gate_data *current = NULL;
current = last_gate;
if (ds_get_length(lhs) > 0) {
assert(current->finished == FALSE);
tfree(current->outp);
current->outp = TMALLOC(char, ds_get_length(lhs) + 1);
strcpy(current->outp, ds_get_buf(lhs));
}
}
static void gen_scanned_gates(struct gate_data *gp)
{
DS_CREATE(instance, 64);
@ -1141,11 +1144,7 @@ static BOOL bstmt_postfix(void)
retval = FALSE;
goto bail_out;
}
if (getenv("SCAN_NOOPT")) {
scan_gates_noopt(&lhs);
} else {
scan_gates(&lhs);
}
gen_scanned_gates(first_gate);
lookahead = lex_scan();
while (lookahead != '}') {