Added updating of RTLIL::autoidx to ilang frontend
authorClifford Wolf <clifford@clifford.at>
Fri, 3 Jan 2014 16:51:05 +0000 (17:51 +0100)
committerClifford Wolf <clifford@clifford.at>
Fri, 3 Jan 2014 16:51:05 +0000 (17:51 +0100)
frontends/ilang/lexer.l

index d582d04130f4b5945319fddc205ae77fced09305..fd842b3dc04b099351a4b52d224a066affe52e76 100644 (file)
@@ -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; }
 
 %%
 
+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;