mirror of
https://github.com/YosysHQ/yosys
synced 2025-10-09 17:31:59 +00:00
docs: proofread pyosys.rst
Primarily address feedback from @KrystalDelusion (thanks!)
This commit is contained in:
parent
93fae3c606
commit
440e331ae0
1 changed files with 35 additions and 24 deletions
|
@ -4,17 +4,21 @@ Scripting with Pyosys
|
||||||
Pyosys is a limited subset of the Yosys C++ API (aka "libyosys") made available
|
Pyosys is a limited subset of the Yosys C++ API (aka "libyosys") made available
|
||||||
using the Python programming language.
|
using the Python programming language.
|
||||||
|
|
||||||
It offers access both to writing Yosys scripts like ``.ys`` and ``.tcl`` files
|
Like ``.ys`` and ``.tcl`` scripts, Pyosys provides an interface to write Yosys
|
||||||
with the amenities of the Python programming language (functions, flow control,
|
scripts in the Python programming language, giving you the benefits of
|
||||||
etc), but also allows some access to internal data structures at the same time
|
a type system, control flow, object-oriented programming, and more; especially
|
||||||
unlike those two platforms, allowing you to also implement complex functionality
|
that the other options lack a type system and control flow/OOP in Tcl is
|
||||||
that is would otherwise not possible without writing custom passes using C++.
|
limited.
|
||||||
|
|
||||||
|
Though unlike these two, Pyosys goes a bit further, allowing you to use the
|
||||||
|
Yosys API to implement advanced functionality that would otherwise require
|
||||||
|
custom passes written in C++.
|
||||||
|
|
||||||
|
|
||||||
Getting Pyosys
|
Getting Pyosys
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
Pyosys supports Python 3.8.1 or higher. You can access Pyosys using one of two
|
Pyosys supports CPython 3.8 or higher. You can access Pyosys using one of two
|
||||||
methods:
|
methods:
|
||||||
|
|
||||||
1. Compiling Yosys with the Makefile flag ``ENABLE_PYOSYS=1``
|
1. Compiling Yosys with the Makefile flag ``ENABLE_PYOSYS=1``
|
||||||
|
@ -26,8 +30,8 @@ methods:
|
||||||
|
|
||||||
2. Installing the Pyosys wheels
|
2. Installing the Pyosys wheels
|
||||||
|
|
||||||
On macOS and GNU/Linux (specifically, not musllinux,) you can install
|
On macOS and GNU/Linux you can install pre-built wheels of Yosys using
|
||||||
pre-built wheels of Yosys using ``pip`` as follows:
|
``pip``:
|
||||||
|
|
||||||
``python3 -m pip install pyosys``
|
``python3 -m pip install pyosys``
|
||||||
|
|
||||||
|
@ -56,7 +60,7 @@ this import may be preferable for terseness:
|
||||||
|
|
||||||
Now, scripting is actually quite similar to ``.ys`` and ``.tcl`` script in that
|
Now, scripting is actually quite similar to ``.ys`` and ``.tcl`` script in that
|
||||||
you can provide mostly text commands. Albeit, you can construct your scripts
|
you can provide mostly text commands. Albeit, you can construct your scripts
|
||||||
to use Python's amenities including flow controls, loops, and functions:
|
to use Python's amenities like conditional execution, loops, and functions:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
|
@ -67,9 +71,9 @@ to use Python's amenities including flow controls, loops, and functions:
|
||||||
if do_flatten:
|
if do_flatten:
|
||||||
ys.run_pass("flatten")
|
ys.run_pass("flatten")
|
||||||
|
|
||||||
…but this does not provide anything that Tcl scripts do not provide you with.
|
…but this does not strictly provide anything that Tcl scripts do not provide you
|
||||||
The real power of using Pyosys comes from the fact you can manually instantiate,
|
with. The real power of using Pyosys comes from the fact you can manually
|
||||||
manage, and interact with the design database.
|
instantiate, manage, and interact with the design database.
|
||||||
|
|
||||||
As an example, here is the same script with a manually instantiated design.
|
As an example, here is the same script with a manually instantiated design.
|
||||||
|
|
||||||
|
@ -79,8 +83,8 @@ As an example, here is the same script with a manually instantiated design.
|
||||||
:language: python
|
:language: python
|
||||||
|
|
||||||
What's new here is that you can manually inspect the design's database. This
|
What's new here is that you can manually inspect the design's database. This
|
||||||
gives you access to huge chunk of the design database API as in declared in the
|
gives you access to a huge chunk of the design database API as declared in
|
||||||
``kernel/rtlil.h`` header.
|
the ``kernel/rtlil.h`` header.
|
||||||
|
|
||||||
For example, here's how to list the input and output ports of the top module
|
For example, here's how to list the input and output ports of the top module
|
||||||
of your design:
|
of your design:
|
||||||
|
@ -95,12 +99,18 @@ of your design:
|
||||||
C++ data structures in Yosys are bridged to Python such that they have a
|
C++ data structures in Yosys are bridged to Python such that they have a
|
||||||
pretty similar API to Python objects, for example:
|
pretty similar API to Python objects, for example:
|
||||||
|
|
||||||
- ``std::vector`` supports the same methods as iterables in Python.
|
- ``std::vector`` supports the same methods as
|
||||||
- ``std::set`` and hashlib ``pool`` support the same methods as ``set``\s in
|
`iterables <https://docs.python.org/3/glossary.html#term-iterable>`_ in
|
||||||
Python.
|
Python.
|
||||||
|
- ``std::set`` and hashlib ``pool`` support the same methods as ``set``\s in
|
||||||
|
Python. While ``set`` is ordered, ``pool`` is not and modifications may
|
||||||
|
cause a complete reordering of the set.
|
||||||
- ``dict`` supports the same methods as ``dict``\s in Python, albeit it is
|
- ``dict`` supports the same methods as ``dict``\s in Python, albeit it is
|
||||||
unordered, and modifications may cause a complete reordering of the
|
unordered, and modifications may cause a complete reordering of the
|
||||||
dictionary.
|
dictionary.
|
||||||
|
- ``idict`` uses a custom set of methods because it doesn't map very cleanly
|
||||||
|
to an existing Python data structure. See ``pyosys/hashlib.h`` for more
|
||||||
|
info.
|
||||||
|
|
||||||
For most operations, the Python equivalents are also supported as arguments
|
For most operations, the Python equivalents are also supported as arguments
|
||||||
where they will automatically be cast to the right type, so you do not have
|
where they will automatically be cast to the right type, so you do not have
|
||||||
|
@ -121,8 +131,8 @@ to modify it, and introduce new elements and/or changes to your design.
|
||||||
As a demonstrative example, let's assume we want to add an enable line to all
|
As a demonstrative example, let's assume we want to add an enable line to all
|
||||||
flip-flops in our fiedler-cooley design.
|
flip-flops in our fiedler-cooley design.
|
||||||
|
|
||||||
First of all, we will run :yoscrypt:`synth` to convert all of the logic to Yosys's
|
First of all, we will run :yoscrypt:`synth` to convert all of the logic to
|
||||||
internal cell structure (see :ref:`sec:celllib_gates`):
|
Yosys's internal cell structure (see :ref:`sec:celllib_gates`):
|
||||||
|
|
||||||
.. literalinclude:: /code_examples/pyosys/simple_database.py
|
.. literalinclude:: /code_examples/pyosys/simple_database.py
|
||||||
:start-after: # synth
|
:start-after: # synth
|
||||||
|
@ -163,7 +173,8 @@ Next, we can iterate over all constituent cells, and if they are of the type
|
||||||
:language: python
|
:language: python
|
||||||
|
|
||||||
To verify that you did everything correctly, it is prudent to call ``.check()``
|
To verify that you did everything correctly, it is prudent to call ``.check()``
|
||||||
on the module you're manipulating as follows:
|
on the module you're manipulating as follows after you're done with a set of
|
||||||
|
changes:
|
||||||
|
|
||||||
.. literalinclude:: /code_examples/pyosys/simple_database.py
|
.. literalinclude:: /code_examples/pyosys/simple_database.py
|
||||||
:start-after: run check
|
:start-after: run check
|
||||||
|
@ -177,15 +188,15 @@ file and :yoscrypt:`synth_ice40` to map it to the iCE40 architecture.
|
||||||
:start-after: write output
|
:start-after: write output
|
||||||
:language: python
|
:language: python
|
||||||
|
|
||||||
And voila, you will note that in the intermediate output, all ``always @``
|
And voilà, you will note that in the intermediate output, all ``always @``
|
||||||
statements have an ``if (enable)``\.
|
statements should have an ``if (enable)``\.
|
||||||
|
|
||||||
Encapsulating as Passes
|
Encapsulating as Passes
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
Just like when writing C++, you can encapsulate behavior in terms of "passes",
|
Just like when writing C++, you can encapsulate routines in terms of "passes",
|
||||||
which are the commands you access using ``run_pass``\. This adds it to a global
|
which adds your Pass to a global registry of commands accessible using
|
||||||
registry of commands that you can use using ``run_pass``.
|
``run_pass``\.
|
||||||
|
|
||||||
.. literalinclude:: /code_examples/pyosys/pass.py
|
.. literalinclude:: /code_examples/pyosys/pass.py
|
||||||
:language: python
|
:language: python
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue