3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-04-29 03:45:52 +00:00

bugpoint.rst: Minimizing scripts

part 2: electric boogaloo
This commit is contained in:
Krystine Sherwin 2025-04-28 11:46:44 +12:00
parent e9adc30f9d
commit e52c93598b
No known key found for this signature in database

View file

@ -308,38 +308,60 @@ being needed for the specific problem to be preserved until it causes a crash.
So to find the smallest possible reproducer it can sometimes be helpful to So to find the smallest possible reproducer it can sometimes be helpful to
remove commands prior to the failure point. remove commands prior to the failure point.
The simplest way to do this is by writing out the design, resetting the current
state, and reading back the design:
.. code-block:: yoscrypt
- try ``write_rtlil <design.il>; design -reset; read_rtlil <design.il>;`` before write_rtlil <design.il>; design -reset; read_rtlil <design.il>;
the failure point
+ ideally you now have a single command that is producing an error and can In most cases, this can be inserted immediately before the failing command while
`minimize your RTLIL`_ with the ``<design.il>`` output still producing the error, allowing you to `minimize your RTLIL`_ with the
+ if not, try to move the write/reset/read earlier in the script until you can ``<design.il>`` output. For our previous example with `memory_map`, if
reproduce the error :ref:`map_reset` still gives the same error, then we should now be able to call
+ if you have no idea where exactly you should put the reset, the best way is ``yosys design.il -p 'memory_map'`` to reproduce it.
to use a "binary search" type approach, reducing the possible options by
half after each attempt
* for example, your script has 16 commands in it before failing on the 17th .. code-block:: yoscrypt
* if resetting immediately before the 17th doesn't reproduce the error, try :caption: resetting the design immediately before failure
between the 8th and 9th (8 is half of the total 16) :name: map_reset
* if that produces the error then you can remove everything before the
`read_rtlil` and try reset again in the middle of what's left, making sure synth -top <top> -run :fine
to use a different name for the output file so that you don't overwrite opt -fast -full
what you've already got write_rtlil design.il; design -reset; read_rtlil design.il;
* if the error isn't produced then you need to go earlier still, so in this memory_map
case you would do between the 4th and 5th (4 is half of the previous 8)
* repeat this until you can't reduce the remaining commands any further If that doesn't give the error (or doesn't give the same error), then you should
try to move the write/reset/read earlier in the script until it does. If you
have no idea where exactly you should put the reset, the best way is to use a
"binary search" type approach, reducing the possible options by half after each
attempt.
As an example, your script has 16 commands in it before failing on the 17th.
If resetting immediately before the 17th doesn't reproduce the error, try
between the 8th and 9th (8 is half of the total 16). If that produces the
error then you can remove everything before the `read_rtlil` and try reset
again in the middle of what's left, making sure to use a different name for
the output file so that you don't overwrite what you've already got. If the
error isn't produced then you need to go earlier still, so in this case you
would do between the 4th and 5th (4 is half of the previous 8). Repeat this
until you can't reduce the remaining commands any further.
.. TODO:: is it possible to dump scratchpad? .. TODO:: is it possible to dump scratchpad?
is there anything else in the yosys/design state that doesn't get included in is there anything else in the yosys/design state that doesn't get included in
`write_rtlil`? `write_rtlil`?
- you can also try to remove or comment out commands prior to the failing A more conservative, but more involved, method is to remove or comment out
command; just because the first and last commands are needed doesn't mean that commands prior to the failing command. Each command, or group of commands, can
every command between them is be disabled one at a time while checking if the error still occurs, eventually
giving the smallest subset of commands needed to take the original input through
to the error. The difficulty with this method is that depending on your design,
some commands may be necessary even if they aren't needed to reproduce the
error. For example, if your design includes ``process`` blocks, many commands
will fail unless you run the `proc` command. While this approach can do a
better job of maintaining context, it is often easier to *recover* the context
after the design has been minimized for producing the error. For more on
recovering context, checkout :ref:`using_yosys/bugpoint:Why context matters`.
Minimizing Verilog designs Minimizing Verilog designs