aboutsummaryrefslogtreecommitdiffstats
path: root/frontends/verilog/verilog_lexer.l
diff options
context:
space:
mode:
authorPeter Crozier <peter@crozier.com>2020-03-23 20:07:22 +0000
committerPeter Crozier <peter@crozier.com>2020-03-23 20:07:22 +0000
commitecc22f7fedfa639482dbc55a05709da85116a60f (patch)
treef69ecdf848e4c3faa03552e5ef3ddca22fe8cb9e /frontends/verilog/verilog_lexer.l
parentb86905d9523767bccc9224ce33a0b51265e4950c (diff)
downloadyosys-ecc22f7fedfa639482dbc55a05709da85116a60f.tar.gz
yosys-ecc22f7fedfa639482dbc55a05709da85116a60f.tar.bz2
yosys-ecc22f7fedfa639482dbc55a05709da85116a60f.zip
Support module/package/interface/block scope for typedef names.
Diffstat (limited to 'frontends/verilog/verilog_lexer.l')
-rw-r--r--frontends/verilog/verilog_lexer.l17
1 files changed, 15 insertions, 2 deletions
diff --git a/frontends/verilog/verilog_lexer.l b/frontends/verilog/verilog_lexer.l
index 74e8dce7f..bccdf4841 100644
--- a/frontends/verilog/verilog_lexer.l
+++ b/frontends/verilog/verilog_lexer.l
@@ -99,6 +99,18 @@ YYLTYPE old_location;
#define YY_BUF_SIZE 65536
extern int frontend_verilog_yylex(YYSTYPE *yylval_param, YYLTYPE *yyloc_param);
+
+static bool isUserType(std::string &s)
+{
+ // check current scope then outer scopes for a name
+ for (auto it = user_type_stack.rbegin(); it != user_type_stack.rend(); ++it) {
+ if ((*it)->count(s) > 0) {
+ return true;
+ }
+ }
+ return false;
+}
+
%}
%option yylineno
@@ -376,7 +388,7 @@ supply1 { return TOK_SUPPLY1; }
// package qualifier
auto s = std::string("\\") + yytext;
if (pkg_user_types.count(s) > 0) {
- // found it
+ // package qualified typedefed name
yylval->string = new std::string(s);
return TOK_USER_TYPE;
}
@@ -391,7 +403,8 @@ supply1 { return TOK_SUPPLY1; }
[a-zA-Z_$][a-zA-Z0-9_$]* {
auto s = std::string("\\") + yytext;
- if (user_types.count(s) > 0) {
+ if (isUserType(s)) {
+ // previously typedefed name
yylval->string = new std::string(s);
return TOK_USER_TYPE;
}