Merge pull request #779 from larsclausen/method-call-default

Handle default argument values for class function method calls
This commit is contained in:
Stephen Williams 2022-10-14 08:11:45 -07:00 committed by GitHub
commit 8bbddfb69f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 102 additions and 3 deletions

View File

@ -3185,13 +3185,13 @@ NetExpr* PECallFunction::elaborate_expr_method_(Design*des, NetScope*scope,
NetNet*res = method->find_signal(method->basename());
ivl_assert(*this, res);
vector<NetExpr*>parms;
vector<NetExpr*> parms(def->port_count());
ivl_assert(*this, def->port_count() >= 1);
NetESignal*ethis = new NetESignal(net);
ethis->set_line(*this);
parms.push_back(ethis);
parms[0] = ethis;
parms.resize(1 + parms_.size());
elaborate_arguments_(des, scope, def, false, parms, 1);
NetESignal*eres = new NetESignal(res);

View File

@ -0,0 +1,41 @@
// Check that default values on function methods are supported and it is
// possible to omit any of the arguments.
class C;
function integer f(integer x = 1, integer y = 2, integer z = 3);
return x + y + z;
endfunction
endclass
module test;
C c = new;
bit failed = 1'b0;
`define check(expr, val) \
if (expr !== val) begin \
$display("FAILED. %s, expected %d, got %d", `"expr`", val, expr); \
failed = 1'b1; \
end
initial begin
`check(c.f(), 6);
`check(c.f(4), 9);
`check(c.f(4, ), 9);
`check(c.f(4, , ), 9);
`check(c.f(4, 6), 13);
`check(c.f(4, 6, ), 13);
`check(c.f(4, , 8), 14);
`check(c.f(4, 6, 8), 18);
`check(c.f(, 6), 10);
`check(c.f(, 6, ), 10);
`check(c.f(, 6 ,8), 15);
`check(c.f(, , 8), 11);
if (!failed) begin
$display("PASSED");
end
end
endmodule

View File

@ -0,0 +1,54 @@
// Check that default values on task methods are supported and it is possible to
// omit any of the arguments.
class C;
integer r;
task t(integer x = 1, integer y = 2, integer z = 3);
r = x + y + z;
endtask
endclass
module test;
C c = new;
bit failed = 1'b0;
`define check(expr, val) \
if (expr !== val) begin \
$display("FAILED. %s, expected %0d, got %0d", `"expr`", val, expr); \
failed = 1'b1; \
end
initial begin
c.t();
`check(c.r, 6);
c.t(4);
`check(c.r, 9);
c.t(4, );
`check(c.r, 9);
c.t(4, ,);
`check(c.r, 9);
c.t(4, 6);
`check(c.r, 13);
c.t(4, 6, );
`check(c.r, 13);
c.t(4, , 8);
`check(c.r, 14);
c.t(4, 6, 8);
`check(c.r, 18);
c.t(, 6);
`check(c.r, 10);
c.t(, 6, );
`check(c.r, 10);
c.t(, 6, 8);
`check(c.r, 15);
c.t(, , 8);
`check(c.r, 11);
if (!failed) begin
$display("PASSED");
end
end
endmodule

View File

@ -527,6 +527,8 @@ sv_class_new_fail1 CE,-g2009 ivltests
sv_class_new_fail2 CE,-g2009 ivltests
sv_class_new_init normal,-g2009 ivltests
sv_class_in_module_decl normal,-g2009 ivltests
sv_class_method_default1 normal,-g2009 ivltests
sv_class_method_default2 normal,-g2009 ivltests
sv_class_method_signed1 normal,-g2009 ivltests
sv_class_method_signed2 normal,-g2009 ivltests
sv_class_property_signed1 normal,-g2009 ivltests

View File

@ -407,6 +407,8 @@ sv_class_extends_scoped CE,-g2009 ivltests
sv_class_localparam CE,-g2009 ivltests
sv_class_new_init CE,-g2009 ivltests
sv_class_in_module_decl CE,-g2009 ivltests
sv_class_method_default1 CE,-g2009 ivltests
sv_class_method_default2 CE,-g2009 ivltests
sv_class_method_signed1 CE,-g2009,-pallowsigned=1 ivltests
sv_class_method_signed2 CE,-g2009,-pallowsigned=1 ivltests
sv_class_property_signed1 CE,-g2009,-pallowsigned=1 ivltests