aboutsummaryrefslogtreecommitdiffstats
path: root/frontends/verilog/verilog_lexer.l
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2019-03-10 16:27:18 -0700
committerClifford Wolf <clifford@clifford.at>2019-03-10 16:27:18 -0700
commitb02d9c2634de0898b2c483c438ba56540e0f3f69 (patch)
treeec65a09c68f324f5358e93a473ae1506b860d7ad /frontends/verilog/verilog_lexer.l
parentff4c2a14ae34eeb899c3cf0ca1109f0106b41679 (diff)
downloadyosys-b02d9c2634de0898b2c483c438ba56540e0f3f69.tar.gz
yosys-b02d9c2634de0898b2c483c438ba56540e0f3f69.tar.bz2
yosys-b02d9c2634de0898b2c483c438ba56540e0f3f69.zip
Fix handling of cases that look like sva labels, fixes #862
Signed-off-by: Clifford Wolf <clifford@clifford.at>
Diffstat (limited to 'frontends/verilog/verilog_lexer.l')
-rw-r--r--frontends/verilog/verilog_lexer.l59
1 files changed, 10 insertions, 49 deletions
diff --git a/frontends/verilog/verilog_lexer.l b/frontends/verilog/verilog_lexer.l
index e51a12f76..6ef38252a 100644
--- a/frontends/verilog/verilog_lexer.l
+++ b/frontends/verilog/verilog_lexer.l
@@ -189,57 +189,18 @@ YOSYS_NAMESPACE_END
"always_ff" { SV_KEYWORD(TOK_ALWAYS); }
"always_latch" { SV_KEYWORD(TOK_ALWAYS); }
- /* parse labels on assert, assume, cover, and restrict right here because it's insanley complex
- to do it in the parser (because we force the parser too early to reduce when parsing cells..) */
-([a-zA-Z_$][a-zA-Z0-9_$]*[ \t\r\n]*:[ \t\r\n]*)?(assert|assume|cover|restrict)/[^a-zA-Z0-9_$\.] {
- frontend_verilog_yylval.string = new std::string(yytext);
- auto &str = *frontend_verilog_yylval.string;
- std::string keyword;
- int cursor = 0;
-
- while (1) {
- if (cursor == GetSize(str)) {
- keyword = str;
- delete frontend_verilog_yylval.string;
- frontend_verilog_yylval.string = nullptr;
- goto sva_without_label;
- }
- char c = str[cursor];
- if (c != ' ' && c != '\t' && c != '\r' && c != '\n' && c != ':') {
- cursor++;
- continue;
- }
-
- keyword = str.substr(cursor);
- str = "\\" + str.substr(0, cursor);
- break;
- }
-
- cursor = 0;
- while (1) {
- log_assert(cursor < GetSize(keyword));
- char c = keyword[cursor];
- if (c != ' ' && c != '\t' && c != '\r' && c != '\n' && c != ':') {
- keyword = keyword.substr(cursor);
- break;
- }
- cursor++;
- }
-
- if (keyword == "assert") { return TOK_ASSERT; }
- else if (keyword == "assume") { return TOK_ASSUME; }
- else if (keyword == "cover") { return TOK_COVER; }
- else if (keyword == "restrict") { return TOK_RESTRICT; }
- else log_abort();
-
-sva_without_label:
- if (keyword == "assert") { if (formal_mode) return TOK_ASSERT; SV_KEYWORD(TOK_ASSERT); }
- else if (keyword == "assume") { if (formal_mode) return TOK_ASSUME; SV_KEYWORD(TOK_ASSUME); }
- else if (keyword == "cover") { if (formal_mode) return TOK_COVER; SV_KEYWORD(TOK_COVER); }
- else if (keyword == "restrict") { if (formal_mode) return TOK_RESTRICT; SV_KEYWORD(TOK_RESTRICT); }
- else log_abort();
+ /* use special token for labels on assert, assume, cover, and restrict because it's insanley complex
+ to fix parsing of cells otherwise. (the current cell parser forces a reduce very early to update some
+ global state.. its a mess) */
+[a-zA-Z_$][a-zA-Z0-9_$]*/[ \t\r\n]*:[ \t\r\n]*(assert|assume|cover|restrict)[^a-zA-Z0-9_$\.] {
+ frontend_verilog_yylval.string = new std::string(std::string("\\") + yytext);
+ return TOK_SVA_LABEL;
}
+"assert" { if (formal_mode) return TOK_ASSERT; SV_KEYWORD(TOK_ASSERT); }
+"assume" { if (formal_mode) return TOK_ASSUME; SV_KEYWORD(TOK_ASSUME); }
+"cover" { if (formal_mode) return TOK_COVER; SV_KEYWORD(TOK_COVER); }
+"restrict" { if (formal_mode) return TOK_RESTRICT; SV_KEYWORD(TOK_RESTRICT); }
"property" { if (formal_mode) return TOK_PROPERTY; SV_KEYWORD(TOK_PROPERTY); }
"rand" { if (formal_mode) return TOK_RAND; SV_KEYWORD(TOK_RAND); }
"const" { if (formal_mode) return TOK_CONST; SV_KEYWORD(TOK_CONST); }