Use tilde '~' inputs instead of creating inverters.
This commit is contained in:
parent
59e28ac2a2
commit
fe733a8ca2
|
|
@ -583,6 +583,16 @@ static int lookahead = 0;
|
|||
static int adepth = 0;
|
||||
static int max_adepth = 0;
|
||||
static DSTRING d_curr_line;
|
||||
static int number_of_instances = 0;
|
||||
|
||||
static BOOL inverters_needed(void)
|
||||
{
|
||||
#ifdef LOGICEXP_INVERTERS
|
||||
return TRUE;
|
||||
#else
|
||||
return FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
static char *get_inst_name(void)
|
||||
{
|
||||
|
|
@ -590,6 +600,7 @@ static char *get_inst_name(void)
|
|||
static int number = 0;
|
||||
number++;
|
||||
(void) sprintf(name, "a_%d", number);
|
||||
number_of_instances++;
|
||||
return name;
|
||||
}
|
||||
|
||||
|
|
@ -723,8 +734,9 @@ static void amatch(int t)
|
|||
|
||||
static void bfactor(void)
|
||||
{
|
||||
/* factor is : [~] (optional) rest
|
||||
where rest is: id (input_name) | ( expr ) | error
|
||||
/* factor is : ['~'] rest
|
||||
where rest is: input_name_id | '(' expr ')' | error
|
||||
[] means optional
|
||||
*/
|
||||
BOOL is_not = FALSE;
|
||||
SYM_TAB entry = NULL;
|
||||
|
|
@ -792,7 +804,9 @@ static void bfactor(void)
|
|||
|
||||
static void bexpr(void)
|
||||
{
|
||||
/* expr is: factor { gate_op factor } (0 or more times). */
|
||||
/* expr is: factor { gate_op factor }+
|
||||
where {}+ means 0 or more times.
|
||||
*/
|
||||
bfactor();
|
||||
|
||||
while (lex_gate_op(lookahead)) {
|
||||
|
|
@ -805,7 +819,7 @@ static void bexpr(void)
|
|||
|
||||
static void bstmt(void)
|
||||
{
|
||||
/* A stmt is: output_name = { expr } */
|
||||
/* A stmt is: output_name_id = '{' expr '}' */
|
||||
SYM_TAB entry = NULL;
|
||||
LEXER lx = parse_lexer;
|
||||
DS_CREATE(tname, 64);
|
||||
|
|
@ -1010,8 +1024,6 @@ static PTABLE optimize_gen_tab(PTABLE pt)
|
|||
new_gen = NULL;
|
||||
goto quick_return;
|
||||
}
|
||||
if (val == '~')
|
||||
found_tilde = TRUE;
|
||||
ds_cat_printf(&scratch, "%c ", val);
|
||||
}
|
||||
val = lexer_scan(lxr);
|
||||
|
|
@ -1077,6 +1089,7 @@ static void gen_gates(PTABLE gate_tab, SYM_TAB parser_symbols)
|
|||
LEXER lxr = NULL;
|
||||
int val, tok_count = 0, gate_op = 0, idnum = 0, in_count = 0;
|
||||
BOOL found_tilde = FALSE;
|
||||
BOOL prit = PRINT_ALL;
|
||||
DS_CREATE(out_name, 64);
|
||||
DS_CREATE(in_names, 64);
|
||||
DS_CREATE(gate_name, 64);
|
||||
|
|
@ -1110,7 +1123,22 @@ static void gen_gates(PTABLE gate_tab, SYM_TAB parser_symbols)
|
|||
ds_cat_str(&out_name, lxr->lexer_buf);
|
||||
} else { // input name
|
||||
in_count++;
|
||||
ds_cat_printf(&in_names, " %s", lxr->lexer_buf);
|
||||
if (!inverters_needed()) {
|
||||
char *tail = NULL;
|
||||
tail = get_inv_tail(lxr->lexer_buf);
|
||||
if (tail && strlen(tail) > 0) {
|
||||
ds_cat_printf(&in_names, " ~%s", tail);
|
||||
if (prit) {
|
||||
printf(
|
||||
"change input name \"%s\" tail \"~%s\"\n",
|
||||
lxr->lexer_buf, tail);
|
||||
}
|
||||
} else {
|
||||
ds_cat_printf(&in_names, " %s", lxr->lexer_buf);
|
||||
}
|
||||
} else {
|
||||
ds_cat_printf(&in_names, " %s", lxr->lexer_buf);
|
||||
}
|
||||
}
|
||||
} else if (val == '~') {
|
||||
found_tilde = TRUE;
|
||||
|
|
@ -1150,8 +1178,12 @@ static void gen_gates(PTABLE gate_tab, SYM_TAB parser_symbols)
|
|||
ds_cat_printf(&instance, "%s %s ", tail,
|
||||
ds_get_buf(&out_name));
|
||||
ent = member_sym_tab(tail, parser_symbols);
|
||||
if (!ent) goto quick_return;
|
||||
if ((ent->attribute & SYM_INVERTER) == 0) goto quick_return;
|
||||
if (!ent) {
|
||||
goto quick_return;
|
||||
}
|
||||
if ((ent->attribute & SYM_INVERTER) == 0) {
|
||||
goto quick_return;
|
||||
}
|
||||
ent->ref_count--;
|
||||
} else {
|
||||
ds_cat_printf(&instance, "%s %s ", ds_get_buf(&in_names),
|
||||
|
|
@ -1168,7 +1200,9 @@ static void gen_gates(PTABLE gate_tab, SYM_TAB parser_symbols)
|
|||
delete_lexer(lxr);
|
||||
lxr = new_lexer(t->line);
|
||||
}
|
||||
u_add_instance(ds_get_buf(&instance));
|
||||
if (ds_get_length(&instance) > 0) {
|
||||
u_add_instance(ds_get_buf(&instance));
|
||||
}
|
||||
}
|
||||
|
||||
quick_return:
|
||||
|
|
@ -1216,10 +1250,11 @@ static void bevaluate(TLINE t, int deep)
|
|||
if (strstr(t->line + ds_get_length(&this), " ~ ")) {
|
||||
ds_cat_printf(&new_line, "%s = ~ ", ds_get_buf(&this));
|
||||
} else {
|
||||
if (deep == 1)
|
||||
if (deep == 1) {
|
||||
ds_cat_printf(&new_line, "%s ", parse_tab->first->line);
|
||||
else
|
||||
} else {
|
||||
ds_cat_printf(&new_line, "%s = ", ds_get_buf(&this));
|
||||
}
|
||||
}
|
||||
t = t->next;
|
||||
while (t) {
|
||||
|
|
@ -1374,7 +1409,8 @@ static BOOL bparse(char *line, BOOL new_lexer)
|
|||
}
|
||||
|
||||
ds_free(&d_curr_line);
|
||||
gen_inverters(lx->lexer_sym_tab);
|
||||
if (inverters_needed())
|
||||
gen_inverters(lx->lexer_sym_tab);
|
||||
gen_models();
|
||||
ds_free(&stmt);
|
||||
delete_lexer(lx);
|
||||
|
|
|
|||
Loading…
Reference in New Issue