mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +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