mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 11:42:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			422 lines
		
	
	
	
		
			16 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			422 lines
		
	
	
	
		
			16 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| Selections
 | |
| ----------
 | |
| 
 | |
| .. role:: yoscrypt(code)
 | |
|    :language: yoscrypt
 | |
| 
 | |
| The selection framework
 | |
| ~~~~~~~~~~~~~~~~~~~~~~~
 | |
| 
 | |
| .. todo:: reduce overlap with :doc:`/getting_started/scripting_intro` select section
 | |
| 
 | |
| The `select` command can be used to create a selection for subsequent commands.
 | |
| For example:
 | |
| 
 | |
| .. code:: yoscrypt
 | |
| 
 | |
|     select foobar         # select the module foobar
 | |
|     delete                # delete selected objects
 | |
| 
 | |
| Normally the `select` command overwrites a previous selection. The commands
 | |
| :yoscrypt:`select -add` and :yoscrypt:`select -del` can be used to add or remove
 | |
| objects from the current selection.
 | |
| 
 | |
| The command :yoscrypt:`select -clear` can be used to reset the selection to the
 | |
| default, which is a complete selection of everything in the current module.
 | |
| 
 | |
| This selection framework can also be used directly in many other commands.
 | |
| Whenever a command has ``[selection]`` as last argument in its usage help, this
 | |
| means that it will use the engine behind the `select` command to evaluate
 | |
| additional arguments and use the resulting selection instead of the selection
 | |
| created by the last `select` command.
 | |
| 
 | |
| For example, the command `delete` will delete everything in the current
 | |
| selection; while :yoscrypt:`delete foobar` will only delete the module foobar.
 | |
| If no `select` command has been made, then the "current selection" will be the
 | |
| whole design.
 | |
| 
 | |
| .. note:: Many of the examples on this page make use of the `show` 
 | |
|    command to visually demonstrate the effect of selections.  For a more 
 | |
|    detailed look at this command, refer to :ref:`interactive_show`.
 | |
| 
 | |
| How to make a selection
 | |
| ~~~~~~~~~~~~~~~~~~~~~~~
 | |
| 
 | |
| Selection by object name
 | |
| ^^^^^^^^^^^^^^^^^^^^^^^^
 | |
| 
 | |
| The easiest way to select objects is by object name. This is usually only done
 | |
| in synthesis scripts that are hand-tailored for a specific design.
 | |
| 
 | |
| .. code:: yoscrypt
 | |
| 
 | |
|     select foobar         # select module foobar
 | |
|     select foo*           # select all modules whose names start with foo
 | |
|     select foo*/bar*      # select all objects matching bar* from modules matching foo*
 | |
|     select */clk          # select objects named clk from all modules
 | |
| 
 | |
| Module and design context
 | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^
 | |
| 
 | |
| Commands can be executed in *module/* or *design/* context. Until now, all
 | |
| commands have been executed in design context. The `cd` command can be used to
 | |
| switch to module context.
 | |
| 
 | |
| In module context, all commands only effect the active module. Objects in the
 | |
| module are selected without the ``<module_name>/`` prefix. For example:
 | |
| 
 | |
| .. code:: yoscrypt
 | |
| 
 | |
|     cd foo                # switch to module foo
 | |
|     delete bar            # delete object foo/bar
 | |
| 
 | |
|     cd mycpu              # switch to module mycpu
 | |
|     dump reg_*            # print details on all objects whose names start with reg_
 | |
| 
 | |
|     cd ..                 # switch back to design
 | |
| 
 | |
| Note: Most synthesis scripts never switch to module context. But it is a very
 | |
| powerful tool which we explore more in
 | |
| :doc:`/using_yosys/more_scripting/interactive_investigation`.
 | |
| 
 | |
| Selecting by object property or type
 | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | |
| 
 | |
| Special patterns can be used to select by object property or type. For example:
 | |
| 
 | |
| - select all wires whose names start with ``reg_``: :yoscrypt:`select w:reg_*`
 | |
| - select all objects with the attribute ``foobar`` set: :yoscrypt:`select
 | |
|   a:foobar`
 | |
| - select all objects with the attribute ``foobar`` set to 42: :yoscrypt:`select
 | |
|   a:foobar=42`
 | |
| - select all modules with the attribute ``blabla`` set: :yoscrypt:`select
 | |
|   A:blabla`
 | |
| - select all `$add` cells from the module foo: :yoscrypt:`select foo/t:$add`
 | |
| 
 | |
| A complete list of pattern expressions can be found in :cmd:title:`select`.
 | |
| 
 | |
| Operations on selections
 | |
| ~~~~~~~~~~~~~~~~~~~~~~~~
 | |
| 
 | |
| Combining selections
 | |
| ^^^^^^^^^^^^^^^^^^^^
 | |
| 
 | |
| The `select` command is actually much more powerful than it might seem at first
 | |
| glance. When it is called with multiple arguments, each argument is evaluated
 | |
| and pushed separately on a stack. After all arguments have been processed it
 | |
| simply creates the union of all elements on the stack. So :yoscrypt:`select
 | |
| t:$add a:foo` will select all `$add` cells and all objects with the ``foo``
 | |
| attribute set:   
 | |
| 
 | |
| .. literalinclude:: /code_examples/selections/foobaraddsub.v
 | |
|    :caption: Test module for operations on selections
 | |
|    :name: foobaraddsub
 | |
|    :language: verilog
 | |
| 
 | |
| .. code-block::
 | |
|    :caption: Output for command ``select t:$add a:foo -list`` on :numref:`foobaraddsub`
 | |
| 
 | |
|    yosys> select t:$add a:foo -list
 | |
|    foobaraddsub/$add$foobaraddsub.v:6$3
 | |
|    foobaraddsub/$sub$foobaraddsub.v:5$2
 | |
|    foobaraddsub/$add$foobaraddsub.v:4$1
 | |
| 
 | |
| In many cases simply adding more and more stuff to the selection is an
 | |
| ineffective way of selecting the interesting part of the design. Special
 | |
| arguments can be used to combine the elements on the stack. For example the
 | |
| ``%i`` arguments pops the last two elements from the stack, intersects them, and
 | |
| pushes the result back on the stack. So :yoscrypt:`select t:$add a:foo %i` will
 | |
| select all `$add` cells that have the ``foo`` attribute set:
 | |
| 
 | |
| .. code-block::
 | |
|    :caption: Output for command ``select t:$add a:foo %i -list`` on :numref:`foobaraddsub`
 | |
|    
 | |
|    yosys> select t:$add a:foo %i -list
 | |
|    foobaraddsub/$add$foobaraddsub.v:4$1
 | |
| 
 | |
| Some of the special ``%``-codes:
 | |
| 
 | |
| - ``%u``: union of top two elements on stack -- pop 2, push 1
 | |
| - ``%d``: difference of top two elements on stack -- pop 2, push 1
 | |
| - ``%i``: intersection of top two elements on stack -- pop 2, push 1
 | |
| - ``%n``: inverse of top element on stack -- pop 1, push 1
 | |
| 
 | |
| See :cmd:title:`select` for the full list.
 | |
| 
 | |
| Expanding selections
 | |
| ^^^^^^^^^^^^^^^^^^^^
 | |
| 
 | |
| :numref:`sumprod` uses the Yosys non-standard ``{... *}`` syntax to set the
 | |
| attribute ``sumstuff`` on all cells generated by the first assign statement.
 | |
| (This works on arbitrary large blocks of Verilog code and can be used to mark
 | |
| portions of code for analysis.)
 | |
| 
 | |
| .. literalinclude:: /code_examples/selections/sumprod.v
 | |
|    :caption: Another test module for operations on selections
 | |
|    :name: sumprod
 | |
|    :language: verilog
 | |
| 
 | |
| Selecting ``a:sumstuff`` in this module will yield the following circuit
 | |
| diagram:
 | |
| 
 | |
| .. figure:: /_images/code_examples/selections/sumprod_00.*
 | |
|    :class: width-helper invert-helper
 | |
|    :name: sumprod_00
 | |
| 
 | |
|    Output of ``show a:sumstuff`` on :numref:`sumprod`
 | |
| 
 | |
| As only the cells themselves are selected, but not the temporary wire ``$1_Y``,
 | |
| the two adders are shown as two disjunct parts. This can be very useful for
 | |
| global signals like clock and reset signals: just unselect them using a command
 | |
| such as :yoscrypt:`select -del clk rst` and each cell using them will get its
 | |
| own net label.
 | |
| 
 | |
| In this case however we would like to see the cells connected properly. This can
 | |
| be achieved using the ``%x`` action, that broadens the selection, i.e. for each
 | |
| selected wire it selects all cells connected to the wire and vice versa. So
 | |
| :yoscrypt:`show a:sumstuff %x` yields the diagram shown in :numref:`sumprod_01`:
 | |
| 
 | |
| .. figure:: /_images/code_examples/selections/sumprod_01.*
 | |
|    :class: width-helper invert-helper
 | |
|    :name: sumprod_01
 | |
| 
 | |
|    Output of ``show a:sumstuff %x`` on :numref:`sumprod`
 | |
| 
 | |
| .. _selecting_logic_cones:
 | |
| 
 | |
| Selecting logic cones
 | |
| ^^^^^^^^^^^^^^^^^^^^^
 | |
| 
 | |
| :numref:`sumprod_01` shows what is called the ``input cone`` of ``sum``, i.e.
 | |
| all cells and signals that are used to generate the signal ``sum``. The ``%ci``
 | |
| action can be used to select the input cones of all object in the top selection
 | |
| in the stack maintained by the `select` command.
 | |
| 
 | |
| As with the ``%x`` action, these commands broaden the selection by one "step".
 | |
| But this time the operation only works against the direction of data flow. That
 | |
| means, wires only select cells via output ports and cells only select wires via
 | |
| input ports.
 | |
| 
 | |
| The following sequence of diagrams demonstrates this step-wise expansion:
 | |
| 
 | |
| .. figure:: /_images/code_examples/selections/sumprod_02.*
 | |
|    :class: width-helper invert-helper
 | |
| 
 | |
|    Output of :yoscrypt:`show prod` on :numref:`sumprod`
 | |
| 
 | |
| .. figure:: /_images/code_examples/selections/sumprod_03.*
 | |
|    :class: width-helper invert-helper
 | |
| 
 | |
|    Output of :yoscrypt:`show prod %ci` on :numref:`sumprod`
 | |
| 
 | |
| .. figure:: /_images/code_examples/selections/sumprod_04.*
 | |
|    :class: width-helper invert-helper
 | |
| 
 | |
|    Output of :yoscrypt:`show prod %ci %ci` on :numref:`sumprod`
 | |
| 
 | |
| .. figure:: /_images/code_examples/selections/sumprod_05.*
 | |
|    :class: width-helper invert-helper
 | |
| 
 | |
|    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 `show` is able to distinguish between
 | |
| ``$3_Y`` being a wire and ``c`` being an input.  We can see this better with the
 | |
| `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
 | |
| appended to the action. So for example the action ``%ci3`` is identical to
 | |
| performing the ``%ci`` action three times.
 | |
| 
 | |
| The action ``%ci*`` performs the ``%ci`` action over and over again until it has
 | |
| no effect anymore.
 | |
| 
 | |
| .. _advanced_logic_cones:
 | |
| 
 | |
| Advanced logic cone selection
 | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | |
| 
 | |
| In most cases there are certain cell types and/or ports that should not be
 | |
| considered for the ``%ci`` action, or we only want to follow certain cell types
 | |
| and/or ports. This can be achieved using additional patterns that can be
 | |
| appended to the ``%ci`` action.
 | |
| 
 | |
| Lets consider :numref:`memdemo_src`. It serves no purpose other than being a
 | |
| non-trivial circuit for demonstrating some of the advanced Yosys features. This
 | |
| code is available in ``docs/source/code_examples/selections`` of the Yosys
 | |
| source repository.
 | |
| 
 | |
| .. literalinclude:: /code_examples/selections/memdemo.v
 | |
|    :caption: :file:`memdemo.v`
 | |
|    :name: memdemo_src
 | |
|    :language: verilog
 | |
| 
 | |
| The script :file:`memdemo.ys` is used to generate the images included here.
 | |
| Let's look at the first section:
 | |
| 
 | |
| .. literalinclude:: /code_examples/selections/memdemo.ys
 | |
|    :caption: Synthesizing :ref:`memdemo_src`
 | |
|    :name: memdemo_ys
 | |
|    :language: yoscrypt
 | |
|    :end-at: opt
 | |
| 
 | |
| This loads :numref:`memdemo_src` and synthesizes the included module. Note that
 | |
| this code can be copied and run directly in a Yosys command line session,
 | |
| provided :file:`memdemo.v` is in the same directory. We can now change to the
 | |
| ``memdemo`` module with ``cd memdemo``, and call `show` to see the diagram in
 | |
| :numref:`memdemo_00`.
 | |
| 
 | |
| .. figure:: /_images/code_examples/selections/memdemo_00.*
 | |
|    :class: width-helper invert-helper
 | |
|    :name: memdemo_00
 | |
|    
 | |
|    Complete circuit diagram for the design shown in :numref:`memdemo_src`
 | |
| 
 | |
| 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
 | |
| cones`_ from above, we can use :yoscrypt:`show y %ci2`:
 | |
| 
 | |
| .. figure:: /_images/code_examples/selections/memdemo_01.*
 | |
|    :class: width-helper invert-helper
 | |
|    :name: memdemo_01
 | |
|    
 | |
|    Output of :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 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 invert-helper
 | |
|    :name: memdemo_02
 | |
|    
 | |
|    Output of :yoscrypt:`show y %ci5`
 | |
| 
 | |
| 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 invert-helper
 | |
|    :name: memdemo_03
 | |
|    
 | |
|    Output of :yoscrypt:`show y %ci5:-$mux[S]`
 | |
| 
 | |
| 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:
 | |
| 
 | |
| .. figure:: /_images/code_examples/selections/memdemo_05.*
 | |
|    :class: width-helper invert-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 invert-helper
 | |
|    :name: memdemo_04
 | |
|    
 | |
|    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
 | |
| previously also accepts this advanced syntax.
 | |
| 
 | |
| These actions for traversing the circuit graph, combined with the actions for
 | |
| boolean operations such as intersection (``%i``) and difference (``%d``) are
 | |
| powerful tools for extracting the relevant portions of the circuit under
 | |
| investigation.
 | |
| 
 | |
| Again, see :cmd:title:`select` for full documentation of these expressions.
 | |
| 
 | |
| Incremental selection
 | |
| ^^^^^^^^^^^^^^^^^^^^^
 | |
| 
 | |
| Sometimes a selection can most easily be described by a series of add/delete
 | |
| operations. As mentioned previously, the commands :yoscrypt:`select -add` and
 | |
| :yoscrypt:`select -del` respectively add or remove objects from the current
 | |
| selection instead of overwriting it.
 | |
| 
 | |
| .. code:: yoscrypt
 | |
| 
 | |
|     select -none            # start with an empty selection
 | |
|     select -add reg_*       # select a bunch of objects
 | |
|     select -del reg_42      # but not this one
 | |
|     select -add state %ci   # and add more stuff
 | |
| 
 | |
| Within a select expression the token ``%`` can be used to push the previous
 | |
| selection on the stack.
 | |
| 
 | |
| .. code:: yoscrypt
 | |
| 
 | |
|     select t:$add t:$sub    # select all $add and $sub cells
 | |
|     select % %ci % %d       # select only the input wires to those cells
 | |
| 
 | |
| Storing and recalling selections
 | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | |
| 
 | |
| .. todo:: reflow for not presentation
 | |
| 
 | |
| The current selection can be stored in memory with the command ``select -set
 | |
| <name>``. It can later be recalled using ``select @<name>``. In fact, the
 | |
| ``@<name>`` expression pushes the stored selection on the stack maintained by
 | |
| the `select` command. So for example :yoscrypt:`select @foo @bar %i` will select
 | |
| the intersection between the stored selections ``foo`` and ``bar``.
 | |
| 
 | |
| In larger investigation efforts it is highly recommended to maintain a script
 | |
| that sets up relevant selections, so they can easily be recalled, for example
 | |
| when Yosys needs to be re-run after a design or source code change.
 | |
| 
 | |
| The `history` command can be used to list all recent interactive commands. This
 | |
| feature can be useful for creating such a script from the commands used in an
 | |
| interactive session.
 | |
| 
 | |
| Remember that select expressions can also be used directly as arguments to most
 | |
| commands. Some commands also accept a single select argument to some options. In
 | |
| those cases selection variables must be used to capture more complex selections.
 | |
| 
 | |
| Example code from |code_examples/selections|_:
 | |
| 
 | |
| .. |code_examples/selections| replace:: :file:`docs/source/code_examples/selections`
 | |
| .. _code_examples/selections: https://github.com/YosysHQ/yosys/tree/main/docs/source/code_examples/selections
 | |
| 
 | |
| .. literalinclude:: /code_examples/selections/select.v
 | |
|    :language: verilog
 | |
|    :caption: :file:`select.v`
 | |
| 
 | |
| .. literalinclude:: /code_examples/selections/select.ys
 | |
|    :language: yoscrypt
 | |
|    :caption: :file:`select.ys`
 | |
|    :name: select_ys
 | |
| 
 | |
| .. figure:: /_images/code_examples/selections/select.*
 | |
|     :class: width-helper invert-helper
 | |
| 
 | |
|     Circuit diagram produced by :numref:`select_ys`
 |