mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-03 21:09:12 +00:00 
			
		
		
		
	Docs: work on selections.rst
Highlighting the difference between `select prod %ci` and `select prod %ci2` by introducing `sumproud.out` using the `dump` command. Playing around with advanced cone example code.
This commit is contained in:
		
							parent
							
								
									e2e7065590
								
							
						
					
					
						commit
						22808e0e3f
					
				
					 4 changed files with 93 additions and 36 deletions
				
			
		| 
						 | 
				
			
			@ -4,6 +4,7 @@ prep -top memdemo; memory; opt
 | 
			
		|||
cd memdemo
 | 
			
		||||
show -format dot -prefix memdemo_00
 | 
			
		||||
show -format dot -prefix memdemo_01 y %ci2
 | 
			
		||||
show -format dot -prefix memdemo_02 y %ci2:+$dff[Q,D]
 | 
			
		||||
show -format dot -prefix memdemo_03 y %ci2:-[CLK] %ci2
 | 
			
		||||
show -format dot -prefix memdemo_04 y %ci2:+$dff[Q,D] %ci*:-$mux[S]:-$dff
 | 
			
		||||
show -format dot -prefix memdemo_02 y %ci5
 | 
			
		||||
show -format dot -prefix memdemo_03 y %ci5:-$mux[S]
 | 
			
		||||
show -format dot -prefix memdemo_04 y %ci*:-[CLK,S]:+$dff,$mux
 | 
			
		||||
show -format dot -prefix memdemo_05 y %ci2:+$dff[Q,D] %ci*:-$mux[S]:-$dff
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										38
									
								
								docs/source/code_examples/selections/sumprod.out
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								docs/source/code_examples/selections/sumprod.out
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,38 @@
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
  attribute \src "sumprod.v:4.21-4.25"
 | 
			
		||||
  wire width 8 output 5 \prod
 | 
			
		||||
 | 
			
		||||
  attribute \src "sumprod.v:10.17-10.26"
 | 
			
		||||
  cell $mul $mul$sumprod.v:10$4
 | 
			
		||||
    parameter \A_SIGNED 0
 | 
			
		||||
    parameter \A_WIDTH 8
 | 
			
		||||
    parameter \B_SIGNED 0
 | 
			
		||||
    parameter \B_WIDTH 8
 | 
			
		||||
    parameter \Y_WIDTH 8
 | 
			
		||||
    connect \A $mul$sumprod.v:10$3_Y
 | 
			
		||||
    connect \B \c
 | 
			
		||||
    connect \Y \prod
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  attribute \src "sumprod.v:10.17-10.22"
 | 
			
		||||
  wire width 8 $mul$sumprod.v:10$3_Y
 | 
			
		||||
 | 
			
		||||
  attribute \src "sumprod.v:3.21-3.22"
 | 
			
		||||
  wire width 8 input 3 \c
 | 
			
		||||
 | 
			
		||||
  attribute \src "sumprod.v:4.21-4.25"
 | 
			
		||||
  wire width 8 output 5 \prod
 | 
			
		||||
 | 
			
		||||
  attribute \src "sumprod.v:10.17-10.26"
 | 
			
		||||
  cell $mul $mul$sumprod.v:10$4
 | 
			
		||||
    parameter \A_SIGNED 0
 | 
			
		||||
    parameter \A_WIDTH 8
 | 
			
		||||
    parameter \B_SIGNED 0
 | 
			
		||||
    parameter \B_WIDTH 8
 | 
			
		||||
    parameter \Y_WIDTH 8
 | 
			
		||||
    connect \A $mul$sumprod.v:10$3_Y
 | 
			
		||||
    connect \B \c
 | 
			
		||||
    connect \Y \prod
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			@ -8,3 +8,6 @@ show -format dot -prefix sumprod_02 prod
 | 
			
		|||
show -format dot -prefix sumprod_03 prod %ci
 | 
			
		||||
show -format dot -prefix sumprod_04 prod %ci2
 | 
			
		||||
show -format dot -prefix sumprod_05 prod %ci3
 | 
			
		||||
 | 
			
		||||
dump -o sumprod.out prod %ci
 | 
			
		||||
dump -a sumprod.out prod %ci2
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -197,22 +197,39 @@ The following sequence of diagrams demonstrates this step-wise expansion:
 | 
			
		|||
.. figure:: /_images/code_examples/selections/sumprod_02.*
 | 
			
		||||
   :class: width-helper
 | 
			
		||||
 | 
			
		||||
   Output of ``show prod`` on :numref:`sumprod`
 | 
			
		||||
   Output of :yoscrypt:`show prod` on :numref:`sumprod`
 | 
			
		||||
 | 
			
		||||
.. figure:: /_images/code_examples/selections/sumprod_03.*
 | 
			
		||||
   :class: width-helper
 | 
			
		||||
 | 
			
		||||
   Output of ``show prod %ci`` on :numref:`sumprod`
 | 
			
		||||
   Output of :yoscrypt:`show prod %ci` on :numref:`sumprod`
 | 
			
		||||
 | 
			
		||||
.. figure:: /_images/code_examples/selections/sumprod_04.*
 | 
			
		||||
   :class: width-helper
 | 
			
		||||
 | 
			
		||||
   Output of ``show prod %ci %ci`` on :numref:`sumprod`
 | 
			
		||||
   Output of :yoscrypt:`show prod %ci %ci` on :numref:`sumprod`
 | 
			
		||||
 | 
			
		||||
.. figure:: /_images/code_examples/selections/sumprod_05.*
 | 
			
		||||
   :class: width-helper
 | 
			
		||||
 | 
			
		||||
   Output of ``show prod %ci %ci %ci`` on :numref:`sumprod`
 | 
			
		||||
   Output of :yoscrypt:`show prod %ci %ci %ci` on :numref:`sumprod`
 | 
			
		||||
 | 
			
		||||
Notice the subtle difference between :yoscrypt:`show prod %ci` and
 | 
			
		||||
:yoscrypt:`show prod %ci %ci`.  Both images show the ``$mul`` cell driven by
 | 
			
		||||
some inputs ``$3_Y`` and ``c``.  However it is not until the second image,
 | 
			
		||||
having called ``%ci`` the second time, that :cmd:ref:`show` is able to
 | 
			
		||||
distinguish between ``$3_Y`` being a wire and ``c`` being an input.  We can see
 | 
			
		||||
this better with the :cmd:ref:`dump` command instead:
 | 
			
		||||
 | 
			
		||||
.. literalinclude:: /code_examples/selections/sumprod.out
 | 
			
		||||
   :language: RTLIL
 | 
			
		||||
   :end-at: end
 | 
			
		||||
   :caption: Output of :yoscrypt:`dump prod %ci`
 | 
			
		||||
 | 
			
		||||
.. literalinclude:: /code_examples/selections/sumprod.out
 | 
			
		||||
   :language: RTLIL
 | 
			
		||||
   :start-after: end
 | 
			
		||||
   :caption: Output of :yoscrypt:`dump prod %ci %ci`
 | 
			
		||||
 | 
			
		||||
When selecting many levels of logic, repeating ``%ci`` over and over again can
 | 
			
		||||
be a bit dull. So there is a shortcut for that: the number of iterations can be
 | 
			
		||||
| 
						 | 
				
			
			@ -263,9 +280,6 @@ diagram in :numref:`memdemo_00`.
 | 
			
		|||
   
 | 
			
		||||
   Complete circuit diagram for the design shown in :numref:`memdemo_src`
 | 
			
		||||
 | 
			
		||||
.. TODO:: :ref:`memdemo_01` and :ref:`memdemo_02` are the same, probably change
 | 
			
		||||
          the example so they aren't.
 | 
			
		||||
 | 
			
		||||
There's a lot going on there, but maybe we are only interested in the tree of
 | 
			
		||||
multiplexers that select the output value. Let's start by just showing the
 | 
			
		||||
output signal, ``y``, and its immediate predecessors. Remember `Selecting logic
 | 
			
		||||
| 
						 | 
				
			
			@ -279,51 +293,52 @@ cones`_ from above, we can use :yoscrypt:`show y %ci2`:
 | 
			
		|||
 | 
			
		||||
From this we would learn that ``y`` is driven by a ``$dff cell``, that ``y`` is
 | 
			
		||||
connected to the output port ``Q``, that the ``clk`` signal goes into the
 | 
			
		||||
``CLK`` input port of the cell, and that the data comes from a auto-generated
 | 
			
		||||
wire into the input ``D`` of the flip-flop cell.
 | 
			
		||||
 | 
			
		||||
As we are not interested in the clock signal we add an additional pattern to the
 | 
			
		||||
``%ci`` action :yoscrypt:`show y %ci2:+$dff[Q,D]`, that tells it to only follow
 | 
			
		||||
ports ``Q`` and ``D`` of ``$dff`` cells:
 | 
			
		||||
``CLK`` input port of the cell, and that the data comes from an auto-generated
 | 
			
		||||
wire into the input ``D`` of the flip-flop cell (indicated by the ``$`` at the
 | 
			
		||||
start of the name).  Let's go a bit further now and try :yoscrypt:`show y %ci5`:
 | 
			
		||||
 | 
			
		||||
.. figure:: /_images/code_examples/selections/memdemo_02.*
 | 
			
		||||
   :class: width-helper
 | 
			
		||||
   :name: memdemo_02
 | 
			
		||||
   
 | 
			
		||||
   Output of :yoscrypt:`show y %ci2:+$dff[Q,D]`
 | 
			
		||||
   Output of :yoscrypt:`show y %ci5`
 | 
			
		||||
 | 
			
		||||
To add a pattern we add a colon followed by the pattern to the ``%ci`` action.
 | 
			
		||||
The pattern itself starts with ``-`` or ``+``, indicating if it is an include or
 | 
			
		||||
exclude pattern, followed by an optional comma separated list of cell types,
 | 
			
		||||
followed by an optional comma separated list of port names in square brackets.
 | 
			
		||||
 | 
			
		||||
Since we know that the only cell considered in this case is a ``$dff`` cell, we
 | 
			
		||||
could as well only specify the port names, :yoscrypt:`show y %ci2:+[Q,D]`. Or we
 | 
			
		||||
could decide to tell the ``%ci`` action to not follow the ``CLK`` input,
 | 
			
		||||
:yoscrypt:`show y %ci2:-[CLK]`.
 | 
			
		||||
 | 
			
		||||
Next we would investigate the next logic level by adding another ``%ci2`` to the
 | 
			
		||||
command, :yoscrypt:`show y %ci2:-[CLK] %ci2`:
 | 
			
		||||
That's starting to get a bit messy, so maybe we want to ignore the mux select
 | 
			
		||||
inputs. To add a pattern we add a colon followed by the pattern to the ``%ci``
 | 
			
		||||
action. The pattern itself starts with ``-`` or ``+``, indicating if it is an
 | 
			
		||||
include or exclude pattern, followed by an optional comma separated list of cell
 | 
			
		||||
types, followed by an optional comma separated list of port names in square
 | 
			
		||||
brackets.  In this case, we want to exclude the ``S`` port of the ``$mux`` cell
 | 
			
		||||
type with :yoscrypt:`show y %ci5:-$mux[S]`:
 | 
			
		||||
 | 
			
		||||
.. figure:: /_images/code_examples/selections/memdemo_03.*
 | 
			
		||||
   :class: width-helper
 | 
			
		||||
   :name: memdemo_03
 | 
			
		||||
   
 | 
			
		||||
   Output of :yoscrypt:`show y %ci2:-[CLK] %ci2`
 | 
			
		||||
   Output of :yoscrypt:`show y %ci5:-$mux[S]`
 | 
			
		||||
 | 
			
		||||
From this we would learn that the next cell is a ``$mux`` cell and we would add
 | 
			
		||||
an additional pattern to narrow the selection on the path we are interested. In
 | 
			
		||||
the end we would end up with a command such as :yoscrypt:`show y %ci2:+$dff[Q,D]
 | 
			
		||||
We could use a command such as :yoscrypt:`show y %ci2:+$dff[Q,D]
 | 
			
		||||
%ci*:-$mux[S]:-$dff` in which the first ``%ci`` jumps over the initial d-type
 | 
			
		||||
flip-flop and the 2nd action selects the entire input cone without going over
 | 
			
		||||
multiplexer select inputs and flip-flop cells. The diagram produced by this
 | 
			
		||||
command is shown in :numref:`memdemo_04`.
 | 
			
		||||
multiplexer select inputs and flip-flop cells:
 | 
			
		||||
 | 
			
		||||
.. figure:: /_images/code_examples/selections/memdemo_05.*
 | 
			
		||||
   :class: width-helper
 | 
			
		||||
   :name: memdemo_05
 | 
			
		||||
   
 | 
			
		||||
   Output of ``show y %ci2:+$dff[Q,D] %ci*:-$mux[S]:-$dff``
 | 
			
		||||
 | 
			
		||||
Or we could use :yoscrypt:`show y %ci*:-[CLK,S]:+$dff:+$mux` instead, following
 | 
			
		||||
the input cone all the way but only following ``$dff`` and ``$mux`` cells, and
 | 
			
		||||
ignoring any ports named ``CLK`` or ``S``:
 | 
			
		||||
 | 
			
		||||
.. TODO:: pending discussion on whether rule ordering is a bug or a feature
 | 
			
		||||
 | 
			
		||||
.. figure:: /_images/code_examples/selections/memdemo_04.*
 | 
			
		||||
   :class: width-helper
 | 
			
		||||
   :name: memdemo_04
 | 
			
		||||
   
 | 
			
		||||
   Output of ``show y %ci2:+$dff[Q,D] %ci*:-$mux[S]:-$dff``
 | 
			
		||||
   Output of :yoscrypt:`show y %ci*:-[CLK,S]:+$dff,$mux`
 | 
			
		||||
 | 
			
		||||
Similar to ``%ci`` exists an action ``%co`` to select output cones that accepts
 | 
			
		||||
the same syntax for pattern and repetition. The ``%x`` action mentioned
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue