System Verilog supports closing names after endtask keyword.
This commit is contained in:
parent
f8e346f108
commit
cad7c74680
62
parse.y
62
parse.y
|
|
@ -728,12 +728,26 @@ task_declaration /* IEEE1800-2005: A.2.7 */
|
||||||
current_task_set_statement($7);
|
current_task_set_statement($7);
|
||||||
pform_pop_scope();
|
pform_pop_scope();
|
||||||
current_task = 0;
|
current_task = 0;
|
||||||
delete[]$3;
|
|
||||||
if ($7->size() > 1 && !gn_system_verilog()) {
|
if ($7->size() > 1 && !gn_system_verilog()) {
|
||||||
yyerror(@7, "error: Task body with multiple statements requres SystemVerilog.");
|
yyerror(@7, "error: Task body with multiple statements requres SystemVerilog.");
|
||||||
}
|
}
|
||||||
delete $7;
|
delete $7;
|
||||||
}
|
}
|
||||||
|
endname_opt
|
||||||
|
{ // Last step: check any closing name. This is done late so
|
||||||
|
// that the parser can look ahead to detect the present
|
||||||
|
// endname_opt but still have the pform_endmodule() called
|
||||||
|
// early enough that the lexor can know we are outside the
|
||||||
|
// module.
|
||||||
|
if ($10 && (strcmp($3,$10) != 0)) {
|
||||||
|
yyerror(@10, "error: End name doesn't match module/program name");
|
||||||
|
}
|
||||||
|
if ($10 && !gn_system_verilog()) {
|
||||||
|
yyerror(@10, "error: Task end names require System Verilog.");
|
||||||
|
}
|
||||||
|
delete[]$3;
|
||||||
|
if ($10) delete[]$10;
|
||||||
|
}
|
||||||
|
|
||||||
| K_task K_automatic_opt IDENTIFIER '('
|
| K_task K_automatic_opt IDENTIFIER '('
|
||||||
{ assert(current_task == 0);
|
{ assert(current_task == 0);
|
||||||
|
|
@ -747,12 +761,26 @@ task_declaration /* IEEE1800-2005: A.2.7 */
|
||||||
current_task_set_statement($10);
|
current_task_set_statement($10);
|
||||||
pform_pop_scope();
|
pform_pop_scope();
|
||||||
current_task = 0;
|
current_task = 0;
|
||||||
delete[]$3;
|
|
||||||
if ($10->size() > 1 && !gn_system_verilog()) {
|
if ($10->size() > 1 && !gn_system_verilog()) {
|
||||||
yyerror(@10, "error: Task body with multiple statements requres SystemVerilog.");
|
yyerror(@10, "error: Task body with multiple statements requres SystemVerilog.");
|
||||||
}
|
}
|
||||||
delete $10;
|
delete $10;
|
||||||
}
|
}
|
||||||
|
endname_opt
|
||||||
|
{ // Last step: check any closing name. This is done late so
|
||||||
|
// that the parser can look ahead to detect the present
|
||||||
|
// endname_opt but still have the pform_endmodule() called
|
||||||
|
// early enough that the lexor can know we are outside the
|
||||||
|
// module.
|
||||||
|
if ($13 && (strcmp($3,$13) != 0)) {
|
||||||
|
yyerror(@13, "error: End name doesn't match module/program name");
|
||||||
|
}
|
||||||
|
if ($13 && !gn_system_verilog()) {
|
||||||
|
yyerror(@13, "error: Task end names require System Verilog.");
|
||||||
|
}
|
||||||
|
delete[]$3;
|
||||||
|
if ($13) delete[]$13;
|
||||||
|
}
|
||||||
|
|
||||||
| K_task K_automatic_opt IDENTIFIER '(' ')' ';'
|
| K_task K_automatic_opt IDENTIFIER '(' ')' ';'
|
||||||
{ assert(current_task == 0);
|
{ assert(current_task == 0);
|
||||||
|
|
@ -767,17 +795,45 @@ task_declaration /* IEEE1800-2005: A.2.7 */
|
||||||
current_task = 0;
|
current_task = 0;
|
||||||
cerr << @3 << ": warning: task definition for \"" << $3
|
cerr << @3 << ": warning: task definition for \"" << $3
|
||||||
<< "\" has an empty port declaration list!" << endl;
|
<< "\" has an empty port declaration list!" << endl;
|
||||||
delete[]$3;
|
|
||||||
if ($9->size() > 1 && !gn_system_verilog()) {
|
if ($9->size() > 1 && !gn_system_verilog()) {
|
||||||
yyerror(@9, "error: Task body with multiple statements requres SystemVerilog.");
|
yyerror(@9, "error: Task body with multiple statements requres SystemVerilog.");
|
||||||
}
|
}
|
||||||
delete $9;
|
delete $9;
|
||||||
}
|
}
|
||||||
|
endname_opt
|
||||||
|
{ // Last step: check any closing name. This is done late so
|
||||||
|
// that the parser can look ahead to detect the present
|
||||||
|
// endname_opt but still have the pform_endmodule() called
|
||||||
|
// early enough that the lexor can know we are outside the
|
||||||
|
// module.
|
||||||
|
if ($12 && (strcmp($3,$12) != 0)) {
|
||||||
|
yyerror(@12, "error: End name doesn't match module/program name");
|
||||||
|
}
|
||||||
|
if ($12 && !gn_system_verilog()) {
|
||||||
|
yyerror(@12, "error: Task end names require System Verilog.");
|
||||||
|
}
|
||||||
|
delete[]$3;
|
||||||
|
if ($12) delete[]$12;
|
||||||
|
}
|
||||||
|
|
||||||
| K_task K_automatic_opt IDENTIFIER error K_endtask
|
| K_task K_automatic_opt IDENTIFIER error K_endtask
|
||||||
{
|
{
|
||||||
assert(current_task == 0);
|
assert(current_task == 0);
|
||||||
|
}
|
||||||
|
endname_opt
|
||||||
|
{ // Last step: check any closing name. This is done late so
|
||||||
|
// that the parser can look ahead to detect the present
|
||||||
|
// endname_opt but still have the pform_endmodule() called
|
||||||
|
// early enough that the lexor can know we are outside the
|
||||||
|
// module.
|
||||||
|
if ($7 && (strcmp($3,$7) != 0)) {
|
||||||
|
yyerror(@7, "error: End name doesn't match module/program name");
|
||||||
|
}
|
||||||
|
if ($7 && !gn_system_verilog()) {
|
||||||
|
yyerror(@7, "error: Task end names require System Verilog.");
|
||||||
|
}
|
||||||
delete[]$3;
|
delete[]$3;
|
||||||
|
if ($7) delete[]$7;
|
||||||
}
|
}
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue