aboutsummaryrefslogtreecommitdiffstats
path: root/passes
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2019-03-28 09:32:05 +0100
committerGitHub <noreply@github.com>2019-03-28 09:32:05 +0100
commit32bd0f22ec93202e67395901cdc64c20df7f0da7 (patch)
tree4c438282926d7bac304ad3ad6ad89523c4c1d784 /passes
parent662429cc49bb2b2f2dd53f05a3ef903b78e43345 (diff)
parent263ab60b43f3994e83bfa46b793669147d765bcc (diff)
downloadyosys-32bd0f22ec93202e67395901cdc64c20df7f0da7.tar.gz
yosys-32bd0f22ec93202e67395901cdc64c20df7f0da7.tar.bz2
yosys-32bd0f22ec93202e67395901cdc64c20df7f0da7.zip
Merge pull request #901 from trcwm/libertyfixes
Libertyfixes: accept superfluous ; at end of group.
Diffstat (limited to 'passes')
-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..991cc4498 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 wild 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;