issue114 liberty colons round 2

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2024-11-01 18:24:44 -07:00
parent d889f03757
commit 54d85a97a8
4 changed files with 31 additions and 1 deletions

View File

@ -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 [,\:;|(){}+*&!'=]

View File

@ -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 */

View File

@ -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) :

View File

@ -303,6 +303,9 @@ void
libertyGroupBegin(const char *type,
LibertyAttrValueSeq *params,
int line);
LibertyAttrValueSeq *
makeLibertyGroupColonArgs(const char *name1,
const char *name2);
LibertyGroup *
libertyGroupEnd();
LibertyGroup *