Improve $specrule interface

Signed-off-by: Clifford Wolf <clifford@clifford.at>
This commit is contained in:
Clifford Wolf 2019-04-23 22:57:10 +02:00
parent 4575e4ad86
commit 64925b4e8f
4 changed files with 23 additions and 13 deletions

View File

@ -301,7 +301,7 @@ supply1 { return TOK_SUPPLY1; }
return TOK_ID; return TOK_ID;
} }
"$"(setup|hold|skew) { "$"(setup|hold|setuphold|removal|recovery|recrem|skew|timeskew|fullskew|nochange) {
if (!specify_mode) REJECT; if (!specify_mode) REJECT;
frontend_verilog_yylval.string = new std::string(yytext); frontend_verilog_yylval.string = new std::string(yytext);
return TOK_ID; return TOK_ID;

View File

@ -153,7 +153,7 @@ struct specify_rise_fall {
%type <specify_target_ptr> specify_target %type <specify_target_ptr> specify_target
%type <specify_triple_ptr> specify_triple %type <specify_triple_ptr> specify_triple
%type <specify_rise_fall_ptr> specify_rise_fall %type <specify_rise_fall_ptr> specify_rise_fall
%type <ast> specify_if specify_condition %type <ast> specify_if specify_condition specify_opt_arg
%type <ch> specify_edge %type <ch> specify_edge
// operator precedence from low to high // operator precedence from low to high
@ -816,8 +816,9 @@ specify_item:
delete target; delete target;
delete timing; delete timing;
} | } |
TOK_ID '(' specify_edge expr specify_condition ',' specify_edge expr specify_condition ',' expr ')' ';' { TOK_ID '(' specify_edge expr specify_condition ',' specify_edge expr specify_condition ',' expr specify_opt_arg ')' ';' {
if (*$1 != "$setup" && *$1 != "$hold" && *$1 != "$skew") if (*$1 != "$setup" && *$1 != "$hold" && *$1 != "$setuphold" && *$1 != "$removal" && *$1 != "$recovery" &&
*$1 != "$recrem" && *$1 != "$skew" && *$1 != "$timeskew" && *$1 != "$fullskew" && *$1 != "$nochange")
frontend_verilog_yyerror("Unsupported specify rule type: %s\n", $1->c_str()); frontend_verilog_yyerror("Unsupported specify rule type: %s\n", $1->c_str());
AstNode *src_pen = AstNode::mkconst_int($3 != 0, false, 1); AstNode *src_pen = AstNode::mkconst_int($3 != 0, false, 1);
@ -829,6 +830,7 @@ specify_item:
AstNode *dst_expr = $8, *dst_en = $9 ? $9 : AstNode::mkconst_int(1, false, 1); AstNode *dst_expr = $8, *dst_en = $9 ? $9 : AstNode::mkconst_int(1, false, 1);
AstNode *limit = $11; AstNode *limit = $11;
AstNode *limit2 = $12;
AstNode *cell = new AstNode(AST_CELL); AstNode *cell = new AstNode(AST_CELL);
ast_stack.back()->children.push_back(cell); ast_stack.back()->children.push_back(cell);
@ -836,15 +838,15 @@ specify_item:
cell->children.push_back(new AstNode(AST_CELLTYPE)); cell->children.push_back(new AstNode(AST_CELLTYPE));
cell->children.back()->str = "$specrule"; cell->children.back()->str = "$specrule";
cell->children.push_back(new AstNode(AST_PARASET, AstNode::mkconst_int(*$1 == "$skew", false, 1))); cell->children.push_back(new AstNode(AST_PARASET, AstNode::mkconst_str(*$1)));
cell->children.back()->str = "\\SKEW"; cell->children.back()->str = "\\TYPE";
cell->children.push_back(new AstNode(AST_PARASET, AstNode::mkconst_int(*$1 == "$hold", false, 1)));
cell->children.back()->str = "\\HOLD";
cell->children.push_back(new AstNode(AST_PARASET, limit)); cell->children.push_back(new AstNode(AST_PARASET, limit));
cell->children.back()->str = "\\T_LIMIT"; cell->children.back()->str = "\\T_LIMIT";
cell->children.push_back(new AstNode(AST_PARASET, limit2 ? limit2 : AstNode::mkconst_int(0, true)));
cell->children.back()->str = "\\T_LIMIT2";
cell->children.push_back(new AstNode(AST_PARASET, src_pen)); cell->children.push_back(new AstNode(AST_PARASET, src_pen));
cell->children.back()->str = "\\SRC_PEN"; cell->children.back()->str = "\\SRC_PEN";
@ -872,6 +874,14 @@ specify_item:
delete $1; delete $1;
}; };
specify_opt_arg:
',' expr {
$$ = $2;
} |
/* empty */ {
$$ = nullptr;
};
specify_if: specify_if:
TOK_IF '(' expr ')' { TOK_IF '(' expr ')' {
$$ = $3; $$ = $3;

View File

@ -1219,13 +1219,13 @@ namespace {
} }
if (cell->type == "$specrule") { if (cell->type == "$specrule") {
param("\\TYPE");
param_bool("\\SRC_PEN"); param_bool("\\SRC_PEN");
param_bool("\\SRC_POL"); param_bool("\\SRC_POL");
param_bool("\\DST_PEN"); param_bool("\\DST_PEN");
param_bool("\\DST_POL"); param_bool("\\DST_POL");
param_bool("\\SKEW");
param_bool("\\HOLD");
param("\\T_LIMIT"); param("\\T_LIMIT");
param("\\T_LIMIT2");
port("\\SRC_EN", 1); port("\\SRC_EN", 1);
port("\\DST_EN", 1); port("\\DST_EN", 1);
port("\\SRC", param("\\SRC_WIDTH")); port("\\SRC", param("\\SRC_WIDTH"));

View File

@ -1419,9 +1419,9 @@ endmodule
module \$specrule (EN_SRC, EN_DST, SRC, DST); module \$specrule (EN_SRC, EN_DST, SRC, DST);
parameter SKEW = 0; parameter TYPE = "";
parameter HOLD = 0;
parameter T_LIMIT = 0; parameter T_LIMIT = 0;
parameter T_LIMIT2 = 0;
parameter SRC_WIDTH = 1; parameter SRC_WIDTH = 1;
parameter DST_WIDTH = 1; parameter DST_WIDTH = 1;