verilator/test_regress/t/t_gate_ormux.pl

30 lines
879 B
Perl
Raw Normal View History

#!/usr/bin/env perl
2020-03-08 13:18:12 +00:00
if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; }
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
#
# Copyright 2004 by Wilson Snyder. This program is free software; you
# can redistribute it and/or modify it under the terms of either the GNU
2020-03-08 13:18:12 +00:00
# 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
2020-03-08 13:18:12 +00:00
scenarios(simulator => 1);
$Self->{cycles} = ($Self->{benchmark} ? 100_000_000 : 100);
$Self->{sim_time} = $Self->{cycles} * 10 + 1000;
compile(
v_flags2 => ["+define+SIM_CYCLES=$Self->{cycles}",],
Introduce DFG based combinational logic optimizer (#3527) Added a new data-flow graph (DFG) based combinational logic optimizer. The capabilities of this covers a combination of V3Const and V3Gate, but is also more capable of transforming combinational logic into simplified forms and more. This entail adding a new internal representation, `DfgGraph`, and appropriate `astToDfg` and `dfgToAst` conversion functions. The graph represents some of the combinational equations (~continuous assignments) in a module, and for the duration of the DFG passes, it takes over the role of AstModule. A bulk of the Dfg vertices represent expressions. These vertex classes, and the corresponding conversions to/from AST are mostly auto-generated by astgen, together with a DfgVVisitor that can be used for dynamic dispatch based on vertex (operation) types. The resulting combinational logic graph (a `DfgGraph`) is then optimized in various ways. Currently we perform common sub-expression elimination, variable inlining, and some specific peephole optimizations, but there is scope for more optimizations in the future using the same representation. The optimizer is run directly before and after inlining. The pre inline pass can operate on smaller graphs and hence converges faster, but still has a chance of substantially reducing the size of the logic on some designs, making inlining both faster and less memory intensive. The post inline pass can then optimize across the inlined module boundaries. No optimization is performed across a module boundary. For debugging purposes, each peephole optimization can be disabled individually via the -fno-dfg-peepnole-<OPT> option, where <OPT> is one of the optimizations listed in V3DfgPeephole.h, for example -fno-dfg-peephole-remove-not-not. The peephole patterns currently implemented were mostly picked based on the design that inspired this work, and on that design the optimizations yields ~30% single threaded speedup, and ~50% speedup on 4 threads. As you can imagine not having to haul around redundant combinational networks in the rest of the compilation pipeline also helps with memory consumption, and up to 30% peak memory usage of Verilator was observed on the same design. Gains on other arbitrary designs are smaller (and can be improved by analyzing those designs). For example OpenTitan gains between 1-15% speedup depending on build type.
2022-09-23 15:46:22 +00:00
verilator_flags2 => ["-Wno-UNOPTTHREADS", "--stats", "-fno-dfg"],
2020-03-08 13:18:12 +00:00
);
Optimize bit op tree #2186, #2632, and #2633 (#2751) * Tests:Add some more signals to t_const_opt_red.v * Optimize bit op trees such as ~a[2] & a[1] & ~a[0] to 3'b010 == (3'111 & a) * Update src/V3Const.cpp Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> * Update src/V3Const.cpp Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> * Update src/V3Const.cpp Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> * Apply clang-format * Don't edit and-or tree. * Call matchBitOpTree() after V3Expand does its job. * Internals: Rename newNodep -> newp. No functional change is intended. * Internals: Remove m_sels. No functional change is intended. * Internals: Remove stringstream. No functional change is intended. * Internals: Use V3Number::bitIs1(). No functional change is intended. * Internals: Use V3Number instead of std::map. Resolved laek. Result should be same. * Internals: Resolve overload of setPolarity. No functional change is intended. * Internals: Pass failure reason. No functional change is intended. * Internals: Add VNUser::toPtr(). No functional change is intended. * Internals: Use user4 instead of std::map. No functional change is intended. * Catch up with the AST style aftre V3Expand * Internals: Rename Context to VarInfo. No functional change is intended. * Add some more test case * tests:Add stats to tests Update stats in t_merge_cond.pl as matchBitopTree does some of them. * insert CCast if necessary * small optimization to remove redundant bit mask * No quick exit even when unoptimizable node is found. * Simplify removing redundant And * simplify * Revert "Internals: Add VNUser::toPtr(). No functional change is intended." This reverts commit f98dce10db5923c743ebe7e0392049f1dd39f2ab. * Consider AstWordSel and cleanup * Update test * Update src/V3Const.cpp Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> * Update src/V3Const.cpp Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> * Update src/V3Const.cpp Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> * Update src/V3Const.cpp Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> * Update src/V3Const.cpp Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> * Update src/V3Const.cpp Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> * Apply clang-format * Internals: rename variables. No functional change is intended. Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> Co-authored-by: github action <action@example.com>
2021-02-21 09:11:33 +00:00
if ($Self->{vlt}) {
file_grep($Self->{stats}, qr/Optimizations, Const bit op reduction\s+(\d+)/i, 1058);
Optimize bit op tree #2186, #2632, and #2633 (#2751) * Tests:Add some more signals to t_const_opt_red.v * Optimize bit op trees such as ~a[2] & a[1] & ~a[0] to 3'b010 == (3'111 & a) * Update src/V3Const.cpp Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> * Update src/V3Const.cpp Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> * Update src/V3Const.cpp Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> * Apply clang-format * Don't edit and-or tree. * Call matchBitOpTree() after V3Expand does its job. * Internals: Rename newNodep -> newp. No functional change is intended. * Internals: Remove m_sels. No functional change is intended. * Internals: Remove stringstream. No functional change is intended. * Internals: Use V3Number::bitIs1(). No functional change is intended. * Internals: Use V3Number instead of std::map. Resolved laek. Result should be same. * Internals: Resolve overload of setPolarity. No functional change is intended. * Internals: Pass failure reason. No functional change is intended. * Internals: Add VNUser::toPtr(). No functional change is intended. * Internals: Use user4 instead of std::map. No functional change is intended. * Catch up with the AST style aftre V3Expand * Internals: Rename Context to VarInfo. No functional change is intended. * Add some more test case * tests:Add stats to tests Update stats in t_merge_cond.pl as matchBitopTree does some of them. * insert CCast if necessary * small optimization to remove redundant bit mask * No quick exit even when unoptimizable node is found. * Simplify removing redundant And * simplify * Revert "Internals: Add VNUser::toPtr(). No functional change is intended." This reverts commit f98dce10db5923c743ebe7e0392049f1dd39f2ab. * Consider AstWordSel and cleanup * Update test * Update src/V3Const.cpp Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> * Update src/V3Const.cpp Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> * Update src/V3Const.cpp Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> * Update src/V3Const.cpp Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> * Update src/V3Const.cpp Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> * Update src/V3Const.cpp Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> * Apply clang-format * Internals: rename variables. No functional change is intended. Co-authored-by: Wilson Snyder <wsnyder@wsnyder.org> Co-authored-by: github action <action@example.com>
2021-02-21 09:11:33 +00:00
}
2020-03-08 13:18:12 +00:00
execute(
);
ok(1);
1;