Skip to content

Commit

Permalink
Fix --protect-ids when using SV classes (verilator#2994)
Browse files Browse the repository at this point in the history
A few names were incorrectly mangled, which made --protect-ids produce
invalid output when certain SV class constructs were uses. Now fixed and
added a few extra tests to catch this.
  • Loading branch information
gezalore committed May 31, 2021
1 parent e4dcbb2 commit e1f9fff
Show file tree
Hide file tree
Showing 7 changed files with 139 additions and 2 deletions.
1 change: 1 addition & 0 deletions Changes
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ Verilator 4.203 devel
* Split always blocks to better respect --output-split-cfuncs. [Geza Lore]
* Fix initialization of assoc in assoc array (#2914). [myftptoyman]
* Fix merging of assignments in C++ code (#2970). [Ruper Swarbrick]
* Fix --protect-ids when using SV classes (#2994). [Geza Lore]


Verilator 4.202 2021-04-24
Expand Down
4 changes: 3 additions & 1 deletion src/V3File.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1016,7 +1016,8 @@ class VIdProtectImp final {
}
}
string protectWordsIf(const string& old, bool doIt) {
// Split at " " (for traces), "." (for scopes), or "->" (for scopes)
// Split at " " (for traces), "." (for scopes), "->" (for scopes), "::" (for superclass
// reference)
if (!(doIt && v3Global.opt.protectIds())) return old;
string out;
string::size_type start = 0;
Expand All @@ -1028,6 +1029,7 @@ class VIdProtectImp final {
trySep(old, start, " ", pos /*ref*/, separator /*ref*/);
trySep(old, start, ".", pos /*ref*/, separator /*ref*/);
trySep(old, start, "->", pos /*ref*/, separator /*ref*/);
trySep(old, start, "::", pos /*ref*/, separator /*ref*/);
if (pos == string::npos) break;
out += protectIf(old.substr(start, pos - start), true) + separator;
start = pos + separator.length();
Expand Down
3 changes: 2 additions & 1 deletion src/V3Task.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1157,7 +1157,8 @@ class TaskVisitor final : public AstNVisitor {
cfuncp->argTypes(EmitCBaseVisitor::symClassVar());
if (cfuncp->name() == "new") {
cfuncp->addInitsp(
new AstCStmt(nodep->fileline(), "_ctor_var_reset(vlSymsp);\n"));
new AstCStmt(nodep->fileline(),
VIdProtect::protect("_ctor_var_reset") + "(vlSymsp);\n"));
}
}
}
Expand Down
34 changes: 34 additions & 0 deletions test_regress/t/t_class_extends_protect_ids.pl
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#!/usr/bin/env perl
if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; }
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
#
# Copyright 2021 by Wilson Snyder. This program is free software; you
# can redistribute it and/or modify it under the terms of either the GNU
# Lesser General Public License Version 3 or the Perl Artistic License
# Version 2.0.
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0

scenarios(vlt_all => 1);

# This test makes randomly named .cpp/.h files, which tend to collect, so remove them first
foreach my $filename (glob ("$Self->{obj_dir}/*_PS*.cpp"
." $Self->{obj_dir}/*_PS*.h"
." $Self->{obj_dir}/*.d" )) {
print "rm $filename\n" if $Self->{verbose};
unlink $filename;
}

top_filename("t/t_class_extends.v");

compile(
make_flags => 'VM_PARALLEL_BUILDS=1', # bug2775
verilator_flags2 => ["--protect-ids",
"--protect-key SECRET_KEY"]
);

execute(
check_finished => 1,
);

ok(1);
1;
33 changes: 33 additions & 0 deletions test_regress/t/t_class_local_protect_ids.pl
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#!/usr/bin/env perl
if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; }
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
#
# Copyright 2021 by Wilson Snyder. This program is free software; you
# can redistribute it and/or modify it under the terms of either the GNU
# Lesser General Public License Version 3 or the Perl Artistic License
# Version 2.0.
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0

scenarios(vlt_all => 1);

# This test makes randomly named .cpp/.h files, which tend to collect, so remove them first
foreach my $filename (glob ("$Self->{obj_dir}/*_PS*.cpp"
." $Self->{obj_dir}/*_PS*.h"
." $Self->{obj_dir}/*.d" )) {
print "rm $filename\n" if $Self->{verbose};
unlink $filename;
}

top_filename("t/t_class_local.v");

compile(
verilator_flags2 => ["--protect-ids",
"--protect-key SECRET_KEY"]
);

execute(
check_finished => 1,
);

ok(1);
1;
33 changes: 33 additions & 0 deletions test_regress/t/t_class_static_method_protect_ids.pl
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#!/usr/bin/env perl
if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; }
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
#
# Copyright 2021 by Wilson Snyder. This program is free software; you
# can redistribute it and/or modify it under the terms of either the GNU
# Lesser General Public License Version 3 or the Perl Artistic License
# Version 2.0.
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0

scenarios(vlt_all => 1);

# This test makes randomly named .cpp/.h files, which tend to collect, so remove them first
foreach my $filename (glob ("$Self->{obj_dir}/*_PS*.cpp"
." $Self->{obj_dir}/*_PS*.h"
." $Self->{obj_dir}/*.d" )) {
print "rm $filename\n" if $Self->{verbose};
unlink $filename;
}

top_filename("t/t_class_static_method.v");

compile(
verilator_flags2 => ["--protect-ids",
"--protect-key SECRET_KEY"]
);

execute(
check_finished => 1,
);

ok(1);
1;
33 changes: 33 additions & 0 deletions test_regress/t/t_class_virtual_protect_ids.pl
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#!/usr/bin/env perl
if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; }
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
#
# Copyright 2021 by Wilson Snyder. This program is free software; you
# can redistribute it and/or modify it under the terms of either the GNU
# Lesser General Public License Version 3 or the Perl Artistic License
# Version 2.0.
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0

scenarios(vlt_all => 1);

# This test makes randomly named .cpp/.h files, which tend to collect, so remove them first
foreach my $filename (glob ("$Self->{obj_dir}/*_PS*.cpp"
." $Self->{obj_dir}/*_PS*.h"
." $Self->{obj_dir}/*.d" )) {
print "rm $filename\n" if $Self->{verbose};
unlink $filename;
}

top_filename("t/t_class_virtual.v");

compile(
verilator_flags2 => ["--protect-ids",
"--protect-key SECRET_KEY"]
);

execute(
check_finished => 1,
);

ok(1);
1;

0 comments on commit e1f9fff

Please sign in to comment.