Docs: working on opt page

Replace leftover `opt` example source/images with examples specific to the `opt_*` pass.
Currently has images for `opt_expr`, `opt_merge`, `opt_muxtree`, and `opt_share`.
Also includes some other TODO updates.
This commit is contained in:
Krystine Sherwin 2024-01-17 11:00:42 +13:00
parent 63a0f80996
commit 27ae093dba
No known key found for this signature in database
18 changed files with 140 additions and 105 deletions

View File

@ -0,0 +1,19 @@
PROGRAM_PREFIX :=
YOSYS ?= ../../../../$(PROGRAM_PREFIX)yosys
DOT_NAMES = opt_share opt_muxtree opt_merge opt_expr
DOTS := $(addsuffix .dot,$(DOT_NAMES))
dots: $(DOTS)
%_full.dot: %.ys
$(YOSYS) $<
%.dot: %_full.dot
gvpack -u $*_full.dot -o $@
.PHONY: clean
clean:
rm -f *.dot

View File

@ -0,0 +1,17 @@
read_verilog <<EOT
module uut(
input a,
output y, z
);
assign y = a == a;
assign z = a != a;
endmodule
EOT
copy uut after
opt_expr after
clean
show -format dot -prefix opt_expr_full -notitle -color cornflowerblue uut

View File

@ -0,0 +1,18 @@
read_verilog <<EOT
module uut(
input [3:0] a, b,
output [3:0] y, z
);
assign y = a + b;
assign z = b + a;
endmodule
EOT
copy uut after
opt_merge after
clean
show -format dot -prefix opt_merge_full -notitle -color cornflowerblue uut

View File

@ -0,0 +1,17 @@
read_verilog <<EOT
module uut(
input a, b, c, d,
output y
);
assign y = a ? (a ? b : c) : d;
endmodule
EOT
copy uut after
opt_muxtree after
clean
show -format dot -prefix opt_muxtree_full -notitle -color cornflowerblue uut

View File

@ -0,0 +1,17 @@
read_verilog <<EOT
module uut(
input [15:0] a, b,
input sel,
output [15:0] res,
);
assign res = {sel ? a + b : a - b};
endmodule
EOT
copy uut after
opt_share after
clean
show -format dot -prefix opt_share_full -notitle -color cornflowerblue uut

View File

@ -1,6 +1,5 @@
TARGETS += proc_01 proc_02 proc_03 TARGETS += proc_01 proc_02 proc_03
TARGETS += opt_01 opt_02 opt_03 opt_04
TARGETS += memory_01 memory_02 TARGETS += memory_01 memory_02
TARGETS += techmap_01 TARGETS += techmap_01

View File

@ -1,3 +0,0 @@
module test(input A, B, output Y);
assign Y = A ? A ? B : 1'b1 : B;
endmodule

View File

@ -1,3 +0,0 @@
read_verilog opt_01.v
hierarchy -check -top test
opt

View File

@ -1,3 +0,0 @@
module test(input A, output Y, Z);
assign Y = A == A, Z = A != A;
endmodule

View File

@ -1,3 +0,0 @@
read_verilog opt_02.v
hierarchy -check -top test
opt

View File

@ -1,4 +0,0 @@
module test(input [3:0] A, B,
output [3:0] Y, Z);
assign Y = A + B, Z = B + A;
endmodule

View File

@ -1,3 +0,0 @@
read_verilog opt_03.v
hierarchy -check -top test
opt

View File

@ -1,19 +0,0 @@
module test(input CLK, ARST,
output [7:0] Q1, Q2, Q3);
wire NO_CLK = 0;
always @(posedge CLK, posedge ARST)
if (ARST)
Q1 <= 42;
always @(posedge NO_CLK, posedge ARST)
if (ARST)
Q2 <= 42;
else
Q2 <= 23;
always @(posedge CLK)
Q3 <= 42;
endmodule

View File

@ -1,3 +0,0 @@
read_verilog opt_04.v
hierarchy -check -top test
proc; opt

View File

@ -437,7 +437,7 @@ sections: ``outstage``, ``selstage``, and ``scramble``.
:language: yoscrypt :language: yoscrypt
:caption: Using :cmd:ref:`submod` to break up the circuit from ``memdemo.v`` :caption: Using :cmd:ref:`submod` to break up the circuit from ``memdemo.v``
:start-after: cd memdemo :start-after: cd memdemo
:end-at: @selstage :end-before: cd ..
:name: submod :name: submod
The ``-name`` option is used to specify the name of the new module and also the The ``-name`` option is used to specify the name of the new module and also the

View File

@ -1,4 +1,6 @@
Troubleshooting Troubleshooting
~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
.. TODO:: more on troubleshooting
See :doc:`/cmd/bugpoint` See :doc:`/cmd/bugpoint`

View File

@ -81,6 +81,17 @@ The :cmd:ref:`opt_expr` pass is very conservative regarding optimizing ``$mux``
cells, as these cells are often used to model decision-trees and breaking these cells, as these cells are often used to model decision-trees and breaking these
trees can interfere with other optimizations. trees can interfere with other optimizations.
.. literalinclude:: /code_examples/opt/opt_expr.ys
:language: Verilog
:start-after: read_verilog <<EOT
:end-before: EOT
:caption: example verilog for demonstrating :cmd:ref:`opt_expr`
.. figure:: /_images/code_examples/opt/opt_expr.*
:class: width-helper
Before and after :cmd:ref:`opt_expr`
Merging identical cells - :cmd:ref:`opt_merge` Merging identical cells - :cmd:ref:`opt_merge`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -93,23 +104,38 @@ cells (``$mux`` and ``$pmux``.) This can be useful as it prevents multiplexer
trees to be merged, which might prevent :cmd:ref:`opt_muxtree` to identify trees to be merged, which might prevent :cmd:ref:`opt_muxtree` to identify
possible optimizations. possible optimizations.
.. literalinclude:: /code_examples/opt/opt_merge.ys
:language: Verilog
:start-after: read_verilog <<EOT
:end-before: EOT
:caption: example verilog for demonstrating :cmd:ref:`opt_merge`
.. figure:: /_images/code_examples/opt/opt_merge.*
:class: width-helper
Before and after :cmd:ref:`opt_merge`
Removing never-active branches from multiplexer tree - :cmd:ref:`opt_muxtree` Removing never-active branches from multiplexer tree - :cmd:ref:`opt_muxtree`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This pass optimizes trees of multiplexer cells by analyzing the select inputs. This pass optimizes trees of multiplexer cells by analyzing the select inputs.
Consider the following simple example: Consider the following simple example:
.. code:: verilog .. literalinclude:: /code_examples/opt/opt_muxtree.ys
:language: Verilog
:start-after: read_verilog <<EOT
:end-before: EOT
:caption: example verilog for demonstrating :cmd:ref:`opt_muxtree`
module uut(a, y); The output can never be ``c``, as this would require ``a`` to be 1 for the outer
input a;
output [1:0] y = a ? (a ? 1 : 2) : 3;
endmodule
The output can never be 2, as this would require ``a`` to be 1 for the outer
multiplexer and 0 for the inner multiplexer. The :cmd:ref:`opt_muxtree` pass multiplexer and 0 for the inner multiplexer. The :cmd:ref:`opt_muxtree` pass
detects this contradiction and replaces the inner multiplexer with a constant 1, detects this contradiction and replaces the inner multiplexer with a constant 1,
yielding the logic for ``y = a ? 1 : 3``. yielding the logic for ``y = a ? b : d``.
.. figure:: /_images/code_examples/opt/opt_muxtree.*
:class: width-helper
Before and after :cmd:ref:`opt_muxtree`
Simplifying large MUXes and AND/OR gates - :cmd:ref:`opt_reduce` Simplifying large MUXes and AND/OR gates - :cmd:ref:`opt_reduce`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -139,8 +165,19 @@ This pass identifies mutually exclusive cells of the same type that:
allowing the cell to be merged and the multiplexer to be moved from allowing the cell to be merged and the multiplexer to be moved from
multiplexing its output to multiplexing the non-shared input signals. multiplexing its output to multiplexing the non-shared input signals.
.. todo:: more detailed description of :cmd:ref:`opt_share` (esp. why) .. literalinclude:: /code_examples/opt/opt_share.ys
so that it's not just a copy-paste of the help output :language: Verilog
:start-after: read_verilog <<EOT
:end-before: EOT
:caption: example verilog for demonstrating :cmd:ref:`opt_share`
.. figure:: /_images/code_examples/opt/opt_share.*
:class: width-helper
Before and after :cmd:ref:`opt_share`
When running :cmd:ref:`opt` in full, the original ``$mux`` (labeled ``$3``) is
optimized away by :cmd:ref:`opt_expr`.
Performing DFF optimizations - :cmd:ref:`opt_dff` Performing DFF optimizations - :cmd:ref:`opt_dff`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -160,58 +197,6 @@ This pass identifies unused signals and cells and removes them from the design.
It also creates an ``\unused_bits`` attribute on wires with unused bits. This It also creates an ``\unused_bits`` attribute on wires with unused bits. This
attribute can be used for debugging or by other optimization passes. attribute can be used for debugging or by other optimization passes.
Example
~~~~~~~
.. todo:: describe ``opt`` images
and/or replace with an example image showing before/after of each ``opt_*``
command
.. figure:: /_images/code_examples/synth_flow/opt_01.*
:class: width-helper
.. literalinclude:: /code_examples/synth_flow/opt_01.ys
:language: yoscrypt
:caption: ``docs/source/code_examples/synth_flow/opt_01.ys``
.. literalinclude:: /code_examples/synth_flow/opt_01.v
:language: verilog
:caption: ``docs/source/code_examples/synth_flow/opt_01.v``
.. figure:: /_images/code_examples/synth_flow/opt_02.*
:class: width-helper
.. literalinclude:: /code_examples/synth_flow/opt_02.ys
:language: yoscrypt
:caption: ``docs/source/code_examples/synth_flow/opt_02.ys``
.. literalinclude:: /code_examples/synth_flow/opt_02.v
:language: verilog
:caption: ``docs/source/code_examples/synth_flow/opt_02.v``
.. figure:: /_images/code_examples/synth_flow/opt_03.*
:class: width-helper
.. literalinclude:: /code_examples/synth_flow/opt_03.ys
:language: yoscrypt
:caption: ``docs/source/code_examples/synth_flow/opt_03.ys``
.. literalinclude:: /code_examples/synth_flow/opt_03.v
:language: verilog
:caption: ``docs/source/code_examples/synth_flow/opt_03.v``
.. figure:: /_images/code_examples/synth_flow/opt_04.*
:class: width-helper
.. literalinclude:: /code_examples/synth_flow/opt_04.v
:language: verilog
:caption: ``docs/source/code_examples/synth_flow/opt_04.v``
.. literalinclude:: /code_examples/synth_flow/opt_04.ys
:language: yoscrypt
:caption: ``docs/source/code_examples/synth_flow/opt_04.ys``
When to use :cmd:ref:`opt` or :cmd:ref:`clean` When to use :cmd:ref:`opt` or :cmd:ref:`clean`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -18,6 +18,8 @@ The AST Frontend then compiles the AST to Yosys's main internal data format, the
RTL Intermediate Language (RTLIL). A more detailed description of this format is RTL Intermediate Language (RTLIL). A more detailed description of this format is
given in the next section. given in the next section.
.. TODO:: what next section
There is also a text representation of the RTLIL data structure that can be There is also a text representation of the RTLIL data structure that can be
parsed using the RTLIL Frontend. parsed using the RTLIL Frontend.