| /* |
| * yosys -- Yosys Open SYnthesis Suite |
| * |
| * Copyright (C) 2012 Clifford Wolf <clifford@clifford.at> |
| * |
| * Permission to use, copy, modify, and/or distribute this software for any |
| * purpose with or without fee is hereby granted, provided that the above |
| * copyright notice and this permission notice appear in all copies. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
| * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
| * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
| * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| * |
| * --- |
| * |
| * A very simple and straightforward frontend for the RTLIL text |
| * representation (as generated by the 'ilang' backend). |
| * |
| */ |
| |
| %{ |
| |
| #ifdef __clang__ |
| // bison generates code using the 'register' storage class specifier |
| #pragma clang diagnostic ignored "-Wdeprecated-register" |
| #endif |
| |
| #include "frontends/ilang/ilang_frontend.h" |
| #include "ilang_parser.tab.hh" |
| |
| USING_YOSYS_NAMESPACE |
| |
| #define YY_INPUT(buf,result,max_size) \ |
| result = readsome(*ILANG_FRONTEND::lexin, buf, max_size) |
| |
| %} |
| |
| %option yylineno |
| %option noyywrap |
| %option nounput |
| %option prefix="rtlil_frontend_ilang_yy" |
| |
| %x STRING |
| |
| %% |
| |
| "autoidx" { return TOK_AUTOIDX; } |
| "module" { return TOK_MODULE; } |
| "attribute" { return TOK_ATTRIBUTE; } |
| "parameter" { return TOK_PARAMETER; } |
| "signed" { return TOK_SIGNED; } |
| "real" { return TOK_REAL; } |
| "wire" { return TOK_WIRE; } |
| "memory" { return TOK_MEMORY; } |
| "width" { return TOK_WIDTH; } |
| "upto" { return TOK_UPTO; } |
| "offset" { return TOK_OFFSET; } |
| "size" { return TOK_SIZE; } |
| "input" { return TOK_INPUT; } |
| "output" { return TOK_OUTPUT; } |
| "inout" { return TOK_INOUT; } |
| "cell" { return TOK_CELL; } |
| "connect" { return TOK_CONNECT; } |
| "switch" { return TOK_SWITCH; } |
| "case" { return TOK_CASE; } |
| "assign" { return TOK_ASSIGN; } |
| "sync" { return TOK_SYNC; } |
| "low" { return TOK_LOW; } |
| "high" { return TOK_HIGH; } |
| "posedge" { return TOK_POSEDGE; } |
| "negedge" { return TOK_NEGEDGE; } |
| "edge" { return TOK_EDGE; } |
| "always" { return TOK_ALWAYS; } |
| "global" { return TOK_GLOBAL; } |
| "init" { return TOK_INIT; } |
| "update" { return TOK_UPDATE; } |
| "process" { return TOK_PROCESS; } |
| "end" { return TOK_END; } |
| |
| [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; } |
| "."[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; } |
| |
| \" { BEGIN(STRING); } |
| <STRING>\\. { yymore(); } |
| <STRING>\" { |
| BEGIN(0); |
| char *yystr = strdup(yytext); |
| yystr[strlen(yytext) - 1] = 0; |
| int i = 0, j = 0; |
| while (yystr[i]) { |
| if (yystr[i] == '\\' && yystr[i + 1]) { |
| i++; |
| if (yystr[i] == 'n') |
| yystr[i] = '\n'; |
| else if (yystr[i] == 't') |
| yystr[i] = '\t'; |
| else if ('0' <= yystr[i] && yystr[i] <= '7') { |
| yystr[i] = yystr[i] - '0'; |
| if ('0' <= yystr[i + 1] && yystr[i + 1] <= '7') { |
| yystr[i + 1] = yystr[i] * 8 + yystr[i + 1] - '0'; |
| i++; |
| } |
| if ('0' <= yystr[i + 1] && yystr[i + 1] <= '7') { |
| yystr[i + 1] = yystr[i] * 8 + yystr[i + 1] - '0'; |
| i++; |
| } |
| } |
| } |
| yystr[j++] = yystr[i++]; |
| } |
| yystr[j] = 0; |
| rtlil_frontend_ilang_yylval.string = yystr; |
| return TOK_STRING; |
| } |
| <STRING>. { yymore(); } |
| |
| "#"[^\n]* /* ignore comments */ |
| [ \t] /* ignore non-newline whitespaces */ |
| [\r\n]+ { return TOK_EOL; } |
| |
| . { return *yytext; } |
| |
| %% |
| |
| // this is a hack to avoid the 'yyinput defined but not used' error msgs |
| void *rtlil_frontend_ilang_avoid_input_warnings() { |
| return (void*)&yyinput; |
| } |
| |