Fix constant propagating DPI-written variables (#7074)

This commit is contained in:
Geza Lore 2026-02-13 18:28:14 +00:00 committed by GitHub
parent 7d71c3bb76
commit e0c626e48a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 75 additions and 1 deletions

View File

@ -171,7 +171,8 @@ public:
entr.init(false);
} else {
if (AstConst* const constp = entr.constNodep()) {
if (!varrefp->varp()->isSigPublic() && !varrefp->varp()->isVirtIface()) {
if (!varrefp->varp()->isSigPublic() && !varrefp->varp()->isWrittenByDpi()
&& !varrefp->varp()->isVirtIface()) {
// Aha, variable is constant; substitute in.
// We'll later constant propagate
UINFO(4, " replaceconst: " << varrefp);

View File

@ -0,0 +1,21 @@
// -*- mode: C++; c-file-style: "cc-mode" -*-
//*************************************************************************
//
// 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-FileCopyrightText: 2026-2026 Wilson Snyder
// SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
//
//*************************************************************************
#include "svdpi.h"
#include <iostream>
extern "C" void setDpi(int value);
extern "C" void setViaDpi(int value) {
std::cout << "setViaDpi " << value << std::endl;
setDpi(value);
}

View File

@ -0,0 +1,21 @@
#!/usr/bin/env python3
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
#
# 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-FileCopyrightText: 2026 Wilson Snyder
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
import vltest_bootstrap
test.scenarios('vlt_all')
test.compile(verilator_flags2=["--binary", "--stats", test.top_filename.replace(".v", ".cpp")])
test.execute()
test.file_grep_not(test.stats, r'Optimizations, Lifetime constant prop')
test.file_grep_not(test.stats, r'Optimizations, Lifetime assign deletions')
test.passes()

View File

@ -0,0 +1,31 @@
// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain.
// SPDX-FileCopyrightText: 2026 Wilson Snyder
// SPDX-License-Identifier: CC0-1.0
`define stop $stop
`define check(got ,exp) do if ((got) !== (exp)) begin $write("%%Error: %s:%0d: got='h%x exp='h%x\n", `__FILE__,`__LINE__, (got), (exp)); `stop; end while(0)
module t;
int dpiSet = 0;
function automatic void setDpi(int value);
dpiSet = value;
endfunction
export "DPI-C" function setDpi;
import "DPI-C" context function void setViaDpi(int value); // calls setDpi(value)
initial begin
dpiSet = 13;
setViaDpi(14);
`check(dpiSet, 14);
dpiSet = 15;
setViaDpi(16);
`check(dpiSet, 16);
dpiSet = 17;
setViaDpi(18);
`check(dpiSet, 18);
end
endmodule