diff --git a/liberty/LibertyLex.ll b/liberty/LibertyLex.ll index 617d004a..4001db06 100644 --- a/liberty/LibertyLex.ll +++ b/liberty/LibertyLex.ll @@ -70,7 +70,7 @@ HNAME ({PIN_NAME}|{BUS_NAME}|{MIXED_NAME})([\/.]({PIN_NAME}|{BUS_NAME}|{MIXED_NA /* default_operating_conditions : slow_100_3.00 ; */ /* revision : 1.0.17; */ /* default_wire_load : xc2v250-5_avg; */ -TOKEN ({ALPHA}|{DIGIT}|_)({ALPHA}|{DIGIT}|[._\-:])* +TOKEN ({ALPHA}|{DIGIT}|_)({ALPHA}|{DIGIT}|[._\-])* /* bus_naming_style : %s[%d] ; */ BUS_STYLE "%s"{BUS_LEFT}"%d"{BUS_RIGHT} PUNCTUATION [,\:;|(){}+*&!'=] diff --git a/liberty/LibertyParse.yy b/liberty/LibertyParse.yy index 1424fa29..609826f7 100644 --- a/liberty/LibertyParse.yy +++ b/liberty/LibertyParse.yy @@ -86,6 +86,18 @@ group: { sta::libertyGroupBegin($1, $3, $5); } statements '}' semi_opt { $$ = sta::libertyGroupEnd(); } + /* group(name1:name2) { stmts } */ +| KEYWORD '(' KEYWORD ':' KEYWORD ')' line '{' + { sta::LibertyAttrValueSeq *args = sta::makeLibertyGroupColonArgs($3, $5); + sta::libertyGroupBegin($1, args, $7); } + statements '}' semi_opt + { $$ = sta::libertyGroupEnd(); } + /* group(name1:name2); */ +| KEYWORD '(' KEYWORD ':' KEYWORD ')' line + { sta::LibertyAttrValueSeq *args = sta::makeLibertyGroupColonArgs($3, $5); + sta::libertyGroupBegin($1, args, $7); } + semi_opt + { $$ = sta::libertyGroupEnd(); } ; line: /* empty */ diff --git a/liberty/LibertyParser.cc b/liberty/LibertyParser.cc index 45a79802..f172229a 100644 --- a/liberty/LibertyParser.cc +++ b/liberty/LibertyParser.cc @@ -127,6 +127,21 @@ libertyGroupEnd() } } +// Helper for brain damaged group args with embedded colon. +// group(name1:name2) { stmts } +LibertyAttrValueSeq * +makeLibertyGroupColonArgs(const char *name1, + const char *name2) +{ + LibertyAttrValueSeq *attr_values = new sta::LibertyAttrValueSeq; + char *str_arg = stringPrint("%s:%s", name1, name2); + stringDelete(name1); + stringDelete(name2); + LibertyAttrValue *arg = makeLibertyStringAttrValue(str_arg); + attr_values->push_back(arg); + return attr_values; +} + //////////////////////////////////////////////////////////////// LibertyStmt::LibertyStmt(int line) : diff --git a/liberty/LibertyParser.hh b/liberty/LibertyParser.hh index bd3a8804..8b82059c 100644 --- a/liberty/LibertyParser.hh +++ b/liberty/LibertyParser.hh @@ -303,6 +303,9 @@ void libertyGroupBegin(const char *type, LibertyAttrValueSeq *params, int line); +LibertyAttrValueSeq * +makeLibertyGroupColonArgs(const char *name1, + const char *name2); LibertyGroup * libertyGroupEnd(); LibertyGroup *