From 367cdf5708659bf10c934185f2efa3f10304b548 Mon Sep 17 00:00:00 2001 From: Brian Taylor Date: Fri, 29 Mar 2024 18:26:01 -0700 Subject: [PATCH] Add variable ps_scan_gates_optimize (default 1). If < 1, then turn off the optimizations in scan_gates. --- src/frontend/logicexp.c | 23 ++++++++++------------- src/frontend/udevices.c | 6 +++++- src/include/ngspice/logicexp.h | 2 +- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/frontend/logicexp.c b/src/frontend/logicexp.c index 8d2ccad37..62befc434 100644 --- a/src/frontend/logicexp.c +++ b/src/frontend/logicexp.c @@ -570,16 +570,12 @@ static void move_inputs(struct gate_data *curr, struct gate_data *prev) prev->finished = TRUE; } -static void scan_gates(DSTRING *lhs) +static void scan_gates(DSTRING *lhs, int optimize) { 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) { + if (optimize < 1) { current = last_gate; if (ds_get_length(lhs) > 0) { assert(current->finished == FALSE); @@ -982,7 +978,7 @@ err_return: /* Start of logicexp parser */ static void aerror(char *s); static BOOL amatch(int t); -static BOOL bparse(char *line, BOOL new_lexer); +static BOOL bparse(char *line, BOOL new_lexer, int optimize); static int lookahead = 0; static int number_of_instances = 0; @@ -1077,7 +1073,7 @@ static BOOL amatch(int t) return TRUE; } -static BOOL bstmt_postfix(void) +static BOOL bstmt_postfix(int optimize) { /* A stmt is: output_name_id = '{' expr '}' */ DS_CREATE(lhs, 32); @@ -1129,7 +1125,7 @@ static BOOL bstmt_postfix(void) retval = FALSE; goto bail_out; } - scan_gates(&lhs); + scan_gates(&lhs, optimize); gen_scanned_gates(first_gate); lookahead = lex_scan(); while (lookahead != '}') { @@ -1172,7 +1168,7 @@ static char *get_logicexp_tmodel_delays( return ds_get_buf(mname); } -static BOOL bparse(char *line, BOOL new_lexer) +static BOOL bparse(char *line, BOOL new_lexer, int optimize) { BOOL ret_val = TRUE; DS_CREATE(stmt, LEX_BUF_SZ); @@ -1187,7 +1183,7 @@ static BOOL bparse(char *line, BOOL new_lexer) while (lookahead != '\0') { ds_clear(&stmt); ds_cat_str(&stmt, parse_lexer->lexer_buf); - if (!bstmt_postfix()) { + if (!bstmt_postfix(optimize)) { cleanup_parser(); ret_val= FALSE; break; @@ -1249,8 +1245,9 @@ static BOOL expect_token( return TRUE; } -BOOL f_logicexp(char *line) +BOOL f_logicexp(char *line, int optimize) { + /* If optimize > 0 then perform optimizations in scan_gates */ int t, num_ins = 0, num_outs = 0, i; char *endp; BOOL ret_val = TRUE; @@ -1335,7 +1332,7 @@ BOOL f_logicexp(char *line) } (void) add_sym_tab_entry(parse_lexer->lexer_buf, SYM_TMODEL, &parse_lexer->lexer_sym_tab); - ret_val = bparse(line, FALSE); + ret_val = bparse(line, FALSE, optimize); current_lexer = NULL; if (!ret_val) { diff --git a/src/frontend/udevices.c b/src/frontend/udevices.c index dcbe5d054..b7437f45e 100644 --- a/src/frontend/udevices.c +++ b/src/frontend/udevices.c @@ -280,6 +280,7 @@ static int ps_udevice_msgs = 0; // Controls the verbosity of U* warnings If ps_udevice_exit is non-zero then exit when u_process_instance fails */ static int ps_udevice_exit = 0; +static int ps_scan_gates_optimize = 1; // Allow optimization in scan_gates static int ps_tpz_delays = 0; // For tristate delays static int ps_with_inverters = 0; // For ff/latch control inputs static int ps_with_tri_inverters = 0; // For inv3/inv3a data inputs @@ -965,6 +966,9 @@ void initialize_udevice(char *subckt_line) if (!cp_getvar("ps_udevice_exit", CP_NUM, &ps_udevice_exit, 0)) { ps_udevice_exit = 0; } + if (!cp_getvar("ps_scan_gates_optimize", CP_NUM, &ps_scan_gates_optimize, 0)) { + ps_scan_gates_optimize = 1; + } /* If non-zero use inverters with ff/latch control inputs */ if (!cp_getvar("ps_with_inverters", CP_NUM, &ps_with_inverters, 0)) { ps_with_inverters = 0; @@ -4318,7 +4322,7 @@ BOOL u_process_instance(char *nline) if (ps_ports_and_pins & 4) { printf("TRANS_IN %s\n", nline); } - behav_ret = f_logicexp(nline); + behav_ret = f_logicexp(nline, ps_scan_gates_optimize); if (!behav_ret && current_subckt) { fprintf(stderr, "ERROR in %s\n", current_subckt); } diff --git a/src/include/ngspice/logicexp.h b/src/include/ngspice/logicexp.h index 556835a43..8c77e9a09 100644 --- a/src/include/ngspice/logicexp.h +++ b/src/include/ngspice/logicexp.h @@ -3,7 +3,7 @@ #ifndef INCLUDED_LOGICEXP_H #define INCLUDED_LOGICEXP_H -BOOL f_logicexp(char *line); +BOOL f_logicexp(char *line, int optimize); BOOL f_pindly(char *line); #endif