forked from The-OpenROAD-Project/OpenSTA
-
Notifications
You must be signed in to change notification settings - Fork 0
/
LibertyExprParse.yy
85 lines (69 loc) · 2.17 KB
/
LibertyExprParse.yy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
%{
// OpenSTA, Static Timing Analyzer
// Copyright (c) 2020, Parallax Software, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
// Liberty function expression parser.
#include "FuncExpr.hh"
#include "liberty/LibertyExpr.hh"
#include "liberty/LibertyExprPvt.hh"
int LibertyExprLex_lex();
#define LibertyExprParse_lex LibertyExprLex_lex
%}
%union {
int int_val;
const char *string;
sta::FuncExpr *expr;
}
%token PORT
%left '+' '|'
%left '*' '&'
%left '^'
%left '!' '\''
%type <string> PORT
%type <expr> expr terminal terminal_expr implicit_and
%{
%}
%%
result_expr:
expr { sta::libexpr_parser->setResult($1); }
| expr ';'{ sta::libexpr_parser->setResult($1); }
;
terminal:
PORT { $$ = sta::libexpr_parser->makeFuncExprPort($1); }
| '0' { $$ = sta::FuncExpr::makeZero(); }
| '1' { $$ = sta::FuncExpr::makeOne(); }
| '(' expr ')' { $$ = $2; }
;
terminal_expr:
terminal
| '!' terminal { $$ = sta::libexpr_parser->makeFuncExprNot($2); }
| terminal '\'' { $$ = sta::libexpr_parser->makeFuncExprNot($1); }
;
implicit_and:
terminal_expr terminal_expr
{ $$ = sta::libexpr_parser->makeFuncExprAnd($1, $2); }
| implicit_and terminal_expr
{ $$ = sta::libexpr_parser->makeFuncExprAnd($1, $2); }
;
expr:
terminal_expr
| implicit_and
| expr '+' expr { $$ = sta::libexpr_parser->makeFuncExprOr($1, $3); }
| expr '|' expr { $$ = sta::libexpr_parser->makeFuncExprOr($1, $3); }
| expr '*' expr { $$ = sta::libexpr_parser->makeFuncExprAnd($1, $3); }
| expr '&' expr { $$ = sta::libexpr_parser->makeFuncExprAnd($1, $3); }
| expr '^' expr { $$ = sta::libexpr_parser->makeFuncExprXor($1, $3); }
;
%%