summaryrefslogtreecommitdiff
path: root/frontends
diff options
context:
space:
mode:
Diffstat (limited to 'frontends')
-rw-r--r--frontends/ilang/lexer.l24
1 files changed, 23 insertions, 1 deletions
diff --git a/frontends/ilang/lexer.l b/frontends/ilang/lexer.l
index d582d041..fd842b3d 100644
--- a/frontends/ilang/lexer.l
+++ b/frontends/ilang/lexer.l
@@ -25,6 +25,7 @@
%{
#include "kernel/rtlil.h"
#include "parser.tab.h"
+void update_autoidx(const char *p);
%}
%option yylineno
@@ -68,7 +69,7 @@
[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); return TOK_ID; }
+"$"[^ \t\r\n]+ { rtlil_frontend_ilang_yylval.string = strdup(yytext); update_autoidx(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; }
@@ -116,6 +117,27 @@
%%
+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;
+ }
+ }
+ }
+}
+
// this is a hack to avoid the 'yyinput defined but not used' error msgs
void *rtlil_frontend_ilang_avoid_input_warnings() {
return (void*)&yyinput;