void ILANG_BACKEND::dump_design(FILE *f, const RTLIL::Design *design, bool only_selected, bool flag_m, bool flag_n)
{
+ int init_autoidx = RTLIL::autoidx;
+
if (!flag_m) {
int count_selected_mods = 0;
- for (auto it = design->modules.begin(); it != design->modules.end(); it++)
+ for (auto it = design->modules.begin(); it != design->modules.end(); it++) {
+ if (design->selected_whole_module(it->first))
+ flag_m = true;
if (design->selected(it->second))
count_selected_mods++;
+ }
if (count_selected_mods > 1)
flag_m = true;
}
+ if (!only_selected || flag_m) {
+ if (only_selected)
+ fprintf(f, "\n");
+ fprintf(f, "autoidx %d\n", RTLIL::autoidx);
+ }
+
for (auto it = design->modules.begin(); it != design->modules.end(); it++) {
if (!only_selected || design->selected(it->second)) {
if (only_selected)
dump_module(f, "", it->second, design, only_selected, flag_m, flag_n);
}
}
+
+ log_assert(init_autoidx == RTLIL::autoidx);
}
struct IlangBackend : public Backend {
#include "kernel/rtlil.h"
#include "parser.tab.h"
-void update_autoidx(const char *p);
%}
%%
+"autoidx" { return TOK_AUTOIDX; }
"module" { return TOK_MODULE; }
"attribute" { return TOK_ATTRIBUTE; }
"parameter" { return TOK_PARAMETER; }
[a-z]+ { return TOK_INVALID; }
"\\"[^ \t\r\n]+ { rtlil_frontend_ilang_yylval.string = strdup(yytext); return TOK_ID; }
-"$"[^ \t\r\n]+ { rtlil_frontend_ilang_yylval.string = strdup(yytext); update_autoidx(yytext); return TOK_ID; }
+"$"[^ \t\r\n]+ { rtlil_frontend_ilang_yylval.string = strdup(yytext); return TOK_ID; }
"."[0-9]+ { rtlil_frontend_ilang_yylval.string = strdup(yytext); return TOK_ID; }
[0-9]+'[01xzm-]* { rtlil_frontend_ilang_yylval.string = strdup(yytext); return TOK_VALUE; }
-[0-9]+ { rtlil_frontend_ilang_yylval.integer = atoi(yytext); return TOK_INT; }
+-?[0-9]+ { rtlil_frontend_ilang_yylval.integer = atoi(yytext); return TOK_INT; }
\" { BEGIN(STRING); }
<STRING>\\. { yymore(); }
%%
-void update_autoidx(const char *p)
-{
- if (*p != '$')
- return;
-
- while (*p) {
- if (*(p++) != '$')
- continue;
- if ('0' <= *p && *p <= '9') {
- const char *q = p;
- while ('0' <= *q && *q <= '9')
- q++;
- if ((q - p) < 10) {
- int idx = atoi(p);
- if (idx >= RTLIL::autoidx)
- RTLIL::autoidx = idx+1;
- }
- }
- }
-}
-
// this is a hack to avoid the 'yyinput defined but not used' error msgs
void *rtlil_frontend_ilang_avoid_input_warnings() {
return (void*)&yyinput;
%token <string> TOK_ID TOK_VALUE TOK_STRING
%token <integer> TOK_INT
-%token TOK_MODULE TOK_WIRE TOK_WIDTH TOK_INPUT TOK_OUTPUT TOK_INOUT
+%token TOK_AUTOIDX TOK_MODULE TOK_WIRE TOK_WIDTH TOK_INPUT TOK_OUTPUT TOK_INOUT
%token TOK_CELL TOK_CONNECT TOK_SWITCH TOK_CASE TOK_ASSIGN TOK_SYNC
%token TOK_LOW TOK_HIGH TOK_POSEDGE TOK_NEGEDGE TOK_EDGE TOK_ALWAYS TOK_INIT
%token TOK_UPDATE TOK_PROCESS TOK_END TOK_INVALID TOK_EOL TOK_OFFSET
design:
design module |
design attr_stmt |
+ design autoidx_stmt |
/* empty */;
module:
free($2);
};
+autoidx_stmt:
+ TOK_AUTOIDX TOK_INT EOL {
+ RTLIL::autoidx = std::max(RTLIL::autoidx, $2);
+ };
+
wire_stmt:
TOK_WIRE {
current_wire = new RTLIL::Wire;