mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-13 04:28:18 +00:00
Added support for task and function args in parentheses
This commit is contained in:
parent
c4a2b3c1e9
commit
f9c096eeda
|
@ -449,7 +449,7 @@ task_func_decl:
|
||||||
} opt_dpi_function_args ';' {
|
} opt_dpi_function_args ';' {
|
||||||
current_function_or_task = NULL;
|
current_function_or_task = NULL;
|
||||||
} |
|
} |
|
||||||
attr TOK_TASK TOK_ID ';' {
|
attr TOK_TASK TOK_ID {
|
||||||
current_function_or_task = new AstNode(AST_TASK);
|
current_function_or_task = new AstNode(AST_TASK);
|
||||||
current_function_or_task->str = *$3;
|
current_function_or_task->str = *$3;
|
||||||
append_attr(current_function_or_task, $1);
|
append_attr(current_function_or_task, $1);
|
||||||
|
@ -457,11 +457,11 @@ task_func_decl:
|
||||||
ast_stack.push_back(current_function_or_task);
|
ast_stack.push_back(current_function_or_task);
|
||||||
current_function_or_task_port_id = 1;
|
current_function_or_task_port_id = 1;
|
||||||
delete $3;
|
delete $3;
|
||||||
} task_func_body TOK_ENDTASK {
|
} task_func_args_opt ';' task_func_body TOK_ENDTASK {
|
||||||
current_function_or_task = NULL;
|
current_function_or_task = NULL;
|
||||||
ast_stack.pop_back();
|
ast_stack.pop_back();
|
||||||
} |
|
} |
|
||||||
attr TOK_FUNCTION opt_signed range_or_signed_int TOK_ID ';' {
|
attr TOK_FUNCTION opt_signed range_or_signed_int TOK_ID {
|
||||||
current_function_or_task = new AstNode(AST_FUNCTION);
|
current_function_or_task = new AstNode(AST_FUNCTION);
|
||||||
current_function_or_task->str = *$5;
|
current_function_or_task->str = *$5;
|
||||||
append_attr(current_function_or_task, $1);
|
append_attr(current_function_or_task, $1);
|
||||||
|
@ -478,7 +478,7 @@ task_func_decl:
|
||||||
current_function_or_task->children.push_back(outreg);
|
current_function_or_task->children.push_back(outreg);
|
||||||
current_function_or_task_port_id = 1;
|
current_function_or_task_port_id = 1;
|
||||||
delete $5;
|
delete $5;
|
||||||
} task_func_body TOK_ENDFUNCTION {
|
} task_func_args_opt ';' task_func_body TOK_ENDFUNCTION {
|
||||||
current_function_or_task = NULL;
|
current_function_or_task = NULL;
|
||||||
ast_stack.pop_back();
|
ast_stack.pop_back();
|
||||||
};
|
};
|
||||||
|
@ -512,6 +512,45 @@ opt_signed:
|
||||||
$$ = false;
|
$$ = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
task_func_args_opt:
|
||||||
|
'(' ')' | /* empty */ | '(' {
|
||||||
|
albuf = nullptr;
|
||||||
|
astbuf1 = nullptr;
|
||||||
|
astbuf2 = nullptr;
|
||||||
|
} task_func_args optional_comma {
|
||||||
|
delete astbuf1;
|
||||||
|
if (astbuf2 != NULL)
|
||||||
|
delete astbuf2;
|
||||||
|
free_attr(albuf);
|
||||||
|
} ')';
|
||||||
|
|
||||||
|
task_func_args:
|
||||||
|
task_func_port | task_func_args ',' task_func_port;
|
||||||
|
|
||||||
|
task_func_port:
|
||||||
|
attr wire_type range {
|
||||||
|
if (albuf) {
|
||||||
|
delete astbuf1;
|
||||||
|
if (astbuf2 != NULL)
|
||||||
|
delete astbuf2;
|
||||||
|
free_attr(albuf);
|
||||||
|
}
|
||||||
|
albuf = $1;
|
||||||
|
astbuf1 = $2;
|
||||||
|
astbuf2 = $3;
|
||||||
|
if (astbuf1->range_left >= 0 && astbuf1->range_right >= 0) {
|
||||||
|
if (astbuf2) {
|
||||||
|
frontend_verilog_yyerror("Syntax error.");
|
||||||
|
} else {
|
||||||
|
astbuf2 = new AstNode(AST_RANGE);
|
||||||
|
astbuf2->children.push_back(AstNode::mkconst_int(astbuf1->range_left, true));
|
||||||
|
astbuf2->children.push_back(AstNode::mkconst_int(astbuf1->range_right, true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (astbuf2 && astbuf2->children.size() != 2)
|
||||||
|
frontend_verilog_yyerror("Syntax error.");
|
||||||
|
} wire_name | wire_name;
|
||||||
|
|
||||||
task_func_body:
|
task_func_body:
|
||||||
task_func_body behavioral_stmt |
|
task_func_body behavioral_stmt |
|
||||||
/* empty */;
|
/* empty */;
|
||||||
|
@ -609,12 +648,12 @@ wire_decl:
|
||||||
}
|
}
|
||||||
if (astbuf2 && astbuf2->children.size() != 2)
|
if (astbuf2 && astbuf2->children.size() != 2)
|
||||||
frontend_verilog_yyerror("Syntax error.");
|
frontend_verilog_yyerror("Syntax error.");
|
||||||
} wire_name_list ';' {
|
} wire_name_list {
|
||||||
delete astbuf1;
|
delete astbuf1;
|
||||||
if (astbuf2 != NULL)
|
if (astbuf2 != NULL)
|
||||||
delete astbuf2;
|
delete astbuf2;
|
||||||
free_attr(albuf);
|
free_attr(albuf);
|
||||||
} |
|
} ';' |
|
||||||
attr TOK_SUPPLY0 TOK_ID ';' {
|
attr TOK_SUPPLY0 TOK_ID ';' {
|
||||||
ast_stack.back()->children.push_back(new AstNode(AST_WIRE));
|
ast_stack.back()->children.push_back(new AstNode(AST_WIRE));
|
||||||
ast_stack.back()->children.back()->str = *$3;
|
ast_stack.back()->children.back()->str = *$3;
|
||||||
|
|
|
@ -33,8 +33,42 @@ end
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
|
||||||
module task_func_test02( input [7:0] din_a, input [7:0] din_b, output [7:0] dout_a);
|
module task_func_test02(clk, a, b, c, x, y, z, w);
|
||||||
|
|
||||||
|
input clk;
|
||||||
|
input [7:0] a, b, c;
|
||||||
|
output reg [7:0] x, y, z, w;
|
||||||
|
|
||||||
|
function [7:0] sum_shift(input [3:0] s1, s2, s3);
|
||||||
|
sum_shift = s1 + (s2 << 2) + (s3 << 4);
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
task reset_w;
|
||||||
|
w = 0;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task add_to(output [7:0] out, input [7:0] in);
|
||||||
|
out = out + in;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
|
x = sum_shift(a, b, c);
|
||||||
|
y = sum_shift(a[7:4], b[5:2], c[3:0]);
|
||||||
|
z = sum_shift(a[0], b[5:4], c >> 5) ^ sum_shift(1, 2, 3);
|
||||||
|
|
||||||
|
reset_w;
|
||||||
|
add_to(w, x);
|
||||||
|
add_to(w, y);
|
||||||
|
add_to(w, z);
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
|
||||||
|
module task_func_test03( input [7:0] din_a, input [7:0] din_b, output [7:0] dout_a);
|
||||||
assign dout_a = test(din_a,din_b);
|
assign dout_a = test(din_a,din_b);
|
||||||
function [7:0] test;
|
function [7:0] test;
|
||||||
input [7:0] a;
|
input [7:0] a;
|
||||||
|
|
Loading…
Reference in a new issue