aboutsummaryrefslogtreecommitdiffstats
path: root/passes/techmap/libparse.cc
diff options
context:
space:
mode:
authorNiels Moseley <n.a.moseley@moseleyinstruments.com>2019-03-27 15:15:53 +0100
committerNiels Moseley <n.a.moseley@moseleyinstruments.com>2019-03-27 15:15:53 +0100
commit487cb45b87ce1cbcc8c2b8127e37d85dd192dceb (patch)
treeb94e88d08574cf3ee10b8a7c0449b85fae75ca94 /passes/techmap/libparse.cc
parent7682629b79fd59f5ed49fb35a3a2441a405bfd63 (diff)
downloadyosys-487cb45b87ce1cbcc8c2b8127e37d85dd192dceb.tar.gz
yosys-487cb45b87ce1cbcc8c2b8127e37d85dd192dceb.tar.bz2
yosys-487cb45b87ce1cbcc8c2b8127e37d85dd192dceb.zip
Liberty file parser now accepts superfluous ;
Diffstat (limited to 'passes/techmap/libparse.cc')
-rw-r--r--passes/techmap/libparse.cc61
1 files changed, 54 insertions, 7 deletions
diff --git a/passes/techmap/libparse.cc b/passes/techmap/libparse.cc
index 8eadd8735..510a24c24 100644
--- a/passes/techmap/libparse.cc
+++ b/passes/techmap/libparse.cc
@@ -155,11 +155,13 @@ int LibertyParser::lexer(std::string &str)
// check for a backslash
if (c == '\\') {
- c = f.get();
+ c = f.get();
if (c == '\r')
c = f.get();
- if (c == '\n')
+ if (c == '\n') {
+ line++;
return lexer(str);
+ }
f.unget();
return '\\';
}
@@ -186,14 +188,39 @@ LibertyAst *LibertyParser::parse()
int tok = lexer(str);
- while (tok == 'n')
+ // there are liberty files in the while that
+ // have superfluous ';' at the end of
+ // a { ... }. We simply ignore a ';' here.
+ // and get to the next statement.
+
+ while ((tok == 'n') || (tok == ';'))
tok = lexer(str);
if (tok == '}' || tok < 0)
return NULL;
- if (tok != 'v')
- error();
+ if (tok != 'v') {
+ std::string eReport;
+ switch(tok)
+ {
+ case 'n':
+ error("Unexpected newline.");
+ break;
+ case '[':
+ case ']':
+ case '}':
+ case '{':
+ case '\"':
+ case ':':
+ eReport = "Unexpected '";
+ eReport += static_cast<char>(tok);
+ eReport += "'.";
+ error(eReport);
+ break;
+ default:
+ error();
+ }
+ }
LibertyAst *ast = new LibertyAst;
ast->id = str;
@@ -282,8 +309,28 @@ LibertyAst *LibertyParser::parse()
}
continue;
}
- if (tok != 'v')
- error();
+ if (tok != 'v') {
+ std::string eReport;
+ switch(tok)
+ {
+ case 'n':
+ error("Unexpected newline.");
+ break;
+ case '[':
+ case ']':
+ case '}':
+ case '{':
+ case '\"':
+ case ':':
+ eReport = "Unexpected '";
+ eReport += static_cast<char>(tok);
+ eReport += "'.";
+ error(eReport);
+ break;
+ default:
+ error();
+ }
+ }
ast->args.push_back(arg);
}
continue;