Browse Source

Go back to before previous merge.

pre-master-46
Brian Taylor 2 years ago
committed by Holger Vogt
parent
commit
0ec0c92eae
  1. 28
      src/frontend/logicexp.c
  2. 6
      src/frontend/udevices.c
  3. 2
      src/include/ngspice/logicexp.h

28
src/frontend/logicexp.c

@ -569,22 +569,11 @@ static void move_inputs(struct gate_data *curr, struct gate_data *prev)
prev->finished = TRUE; prev->finished = TRUE;
} }
static void scan_gates(DSTRING *lhs, int optimize)
static void scan_gates(DSTRING *lhs)
{ {
struct gate_data *current = NULL, *previous = NULL, *last_curr = NULL; struct gate_data *current = NULL, *previous = NULL, *last_curr = NULL;
struct gate_data *prev = NULL; struct gate_data *prev = NULL;
if (optimize < 1) {
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; current = first_gate;
while (current) { while (current) {
int is_gate = (current->type == '&' int is_gate = (current->type == '&'
@ -977,7 +966,7 @@ err_return:
/* Start of logicexp parser */ /* Start of logicexp parser */
static void aerror(char *s); static void aerror(char *s);
static BOOL amatch(int t); static BOOL amatch(int t);
static BOOL bparse(char *line, BOOL new_lexer, int optimize);
static BOOL bparse(char *line, BOOL new_lexer);
static int lookahead = 0; static int lookahead = 0;
static int number_of_instances = 0; static int number_of_instances = 0;
@ -1072,7 +1061,7 @@ static BOOL amatch(int t)
return TRUE; return TRUE;
} }
static BOOL bstmt_postfix(int optimize)
static BOOL bstmt_postfix(void)
{ {
/* A stmt is: output_name_id = '{' expr '}' */ /* A stmt is: output_name_id = '{' expr '}' */
DS_CREATE(lhs, 32); DS_CREATE(lhs, 32);
@ -1124,7 +1113,7 @@ static BOOL bstmt_postfix(int optimize)
retval = FALSE; retval = FALSE;
goto bail_out; goto bail_out;
} }
scan_gates(&lhs, optimize);
scan_gates(&lhs);
gen_scanned_gates(first_gate); gen_scanned_gates(first_gate);
lookahead = lex_scan(); lookahead = lex_scan();
while (lookahead != '}') { while (lookahead != '}') {
@ -1167,7 +1156,7 @@ static char *get_logicexp_tmodel_delays(
return ds_get_buf(mname); return ds_get_buf(mname);
} }
static BOOL bparse(char *line, BOOL new_lexer, int optimize)
static BOOL bparse(char *line, BOOL new_lexer)
{ {
BOOL ret_val = TRUE; BOOL ret_val = TRUE;
DS_CREATE(stmt, LEX_BUF_SZ); DS_CREATE(stmt, LEX_BUF_SZ);
@ -1182,7 +1171,7 @@ static BOOL bparse(char *line, BOOL new_lexer, int optimize)
while (lookahead != '\0') { while (lookahead != '\0') {
ds_clear(&stmt); ds_clear(&stmt);
ds_cat_str(&stmt, parse_lexer->lexer_buf); ds_cat_str(&stmt, parse_lexer->lexer_buf);
if (!bstmt_postfix(optimize)) {
if (!bstmt_postfix()) {
cleanup_parser(); cleanup_parser();
ret_val= FALSE; ret_val= FALSE;
break; break;
@ -1244,9 +1233,8 @@ static BOOL expect_token(
return TRUE; return TRUE;
} }
BOOL f_logicexp(char *line, int optimize)
BOOL f_logicexp(char *line)
{ {
/* If optimize > 0 then perform optimizations in scan_gates */
int t, num_ins = 0, num_outs = 0, i; int t, num_ins = 0, num_outs = 0, i;
char *endp; char *endp;
BOOL ret_val = TRUE; BOOL ret_val = TRUE;
@ -1331,7 +1319,7 @@ BOOL f_logicexp(char *line, int optimize)
} }
(void) add_sym_tab_entry(parse_lexer->lexer_buf, (void) add_sym_tab_entry(parse_lexer->lexer_buf,
SYM_TMODEL, &parse_lexer->lexer_sym_tab); SYM_TMODEL, &parse_lexer->lexer_sym_tab);
ret_val = bparse(line, FALSE, optimize);
ret_val = bparse(line, FALSE);
current_lexer = NULL; current_lexer = NULL;
if (!ret_val) { if (!ret_val) {

6
src/frontend/udevices.c

@ -280,7 +280,6 @@ 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 If ps_udevice_exit is non-zero then exit when u_process_instance fails
*/ */
static int ps_udevice_exit = 0; 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_tpz_delays = 0; // For tristate delays
static int ps_with_inverters = 0; // For ff/latch control inputs static int ps_with_inverters = 0; // For ff/latch control inputs
static int ps_with_tri_inverters = 0; // For inv3/inv3a data inputs static int ps_with_tri_inverters = 0; // For inv3/inv3a data inputs
@ -966,9 +965,6 @@ void initialize_udevice(char *subckt_line)
if (!cp_getvar("ps_udevice_exit", CP_NUM, &ps_udevice_exit, 0)) { if (!cp_getvar("ps_udevice_exit", CP_NUM, &ps_udevice_exit, 0)) {
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 non-zero use inverters with ff/latch control inputs */
if (!cp_getvar("ps_with_inverters", CP_NUM, &ps_with_inverters, 0)) { if (!cp_getvar("ps_with_inverters", CP_NUM, &ps_with_inverters, 0)) {
ps_with_inverters = 0; ps_with_inverters = 0;
@ -4322,7 +4318,7 @@ BOOL u_process_instance(char *nline)
if (ps_ports_and_pins & 4) { if (ps_ports_and_pins & 4) {
printf("TRANS_IN %s\n", nline); printf("TRANS_IN %s\n", nline);
} }
behav_ret = f_logicexp(nline, ps_scan_gates_optimize);
behav_ret = f_logicexp(nline);
if (!behav_ret && current_subckt) { if (!behav_ret && current_subckt) {
fprintf(stderr, "ERROR in %s\n", current_subckt); fprintf(stderr, "ERROR in %s\n", current_subckt);
} }

2
src/include/ngspice/logicexp.h

@ -3,7 +3,7 @@
#ifndef INCLUDED_LOGICEXP_H #ifndef INCLUDED_LOGICEXP_H
#define INCLUDED_LOGICEXP_H #define INCLUDED_LOGICEXP_H
BOOL f_logicexp(char *line, int optimize);
BOOL f_logicexp(char *line);
BOOL f_pindly(char *line); BOOL f_pindly(char *line);
#endif #endif
Loading…
Cancel
Save