From 766514bdcfb51fe6086843655881f959b13b0a02 Mon Sep 17 00:00:00 2001 From: Geza Lore Date: Tue, 28 Oct 2025 18:02:21 +0100 Subject: [PATCH] Fix --hierarchical with --binary (#6602) Used to fail with "can't use --exe with --lib-create", and we didn't have any tests for it before. (The equivalent --main --exe --build --timing works) --- src/V3EmitMk.cpp | 4 ++-- src/V3Options.cpp | 3 ++- test_regress/t/t_hier_block_binary.py | 32 +++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) create mode 100755 test_regress/t/t_hier_block_binary.py diff --git a/src/V3EmitMk.cpp b/src/V3EmitMk.cpp index 338bae385..dbcc43315 100644 --- a/src/V3EmitMk.cpp +++ b/src/V3EmitMk.cpp @@ -747,9 +747,9 @@ public: if (v3Global.opt.exe()) { of.puts("\n### Link rules... (from --exe)\n"); - // let default rule depend on '{prefix}__ALL.a', for compatibility + // '{prefix}__ALL.a', contains all hierarchical libraries of.puts(v3Global.opt.exeName() - + ": $(VK_USER_OBJS) $(VK_GLOBAL_OBJS) $(VM_PREFIX)__ALL.a $(VM_HIER_LIBS)\n"); + + ": $(VK_USER_OBJS) $(VK_GLOBAL_OBJS) $(VM_PREFIX)__ALL.a\n"); of.puts("\t$(LINK) $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) $(LIBS) $(SC_LIBS) -o $@\n"); of.puts("\n"); } else if (!v3Global.opt.libCreate().empty()) { diff --git a/src/V3Options.cpp b/src/V3Options.cpp index 96851e397..46b1221c5 100644 --- a/src/V3Options.cpp +++ b/src/V3Options.cpp @@ -587,7 +587,8 @@ int V3Options::stripOptionsForChildRun(const string& opt, bool forTop) { || opt == "top-module") { return 2; } - if (opt == "build" || (!forTop && (opt == "cc" || opt == "exe" || opt == "sc")) + if (opt == "build" + || (!forTop && (opt == "cc" || opt == "exe" || opt == "sc" || opt == "binary")) || opt == "hierarchical" || (opt.length() > 2 && opt.substr(0, 2) == "G=")) { return 1; } diff --git a/test_regress/t/t_hier_block_binary.py b/test_regress/t/t_hier_block_binary.py new file mode 100755 index 000000000..3e0199a2c --- /dev/null +++ b/test_regress/t/t_hier_block_binary.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 +# DESCRIPTION: Verilator: Verilog Test driver/expect definition +# +# Copyright 2024 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 + +import vltest_bootstrap + +test.scenarios('vlt_all') +test.top_filename = "t/t_hier_block.v" + +# stats will be deleted but generation will be skipped if libs of hierarchical blocks exist. +test.clean_objs() + +test.compile(verilator_flags2=[ + 't/t_hier_block.cpp', '--stats', '--hierarchical', '--Wno-TIMESCALEMOD', '--CFLAGS', + '"-pipe -DCPP_MACRO=cplusplus"', '--binary' +]) + +test.execute() + +test.file_grep(test.obj_dir + "/Vsub0/sub0.sv", r'^\s+\/\/\s+timeprecision\s+(\d+)ps;', 1) +test.file_grep(test.obj_dir + "/Vsub0/sub0.sv", r'^module\s+(\S+)\s+', "sub0") +test.file_grep(test.obj_dir + "/Vsub1/sub1.sv", r'^module\s+(\S+)\s+', "sub1") +test.file_grep(test.obj_dir + "/Vsub2/sub2.sv", r'^module\s+(\S+)\s+', "sub2") +test.file_grep(test.stats, r'HierBlock,\s+Hierarchical blocks\s+(\d+)', 14) +test.file_grep(test.run_log_filename, r'MACRO:(\S+) is defined', "cplusplus") + +test.passes()