Migration towards Python3, first stage: still based on C-Macros.
* New: Python/C++ API level:
* Write a new C++/template wrapper to get rid of boost::python
* The int & long Python type are now merged. So a C/C++ level,
it became "PyLong_X" (remove "PyInt_X") and at Python code
level, it became "int" (remove "long").
* Change: VLSISAPD finally defunct.
* Configuration is now integrated as a Hurricane component,
makes use of the new C++/template wrapper.
* vlsisapd is now defunct. Keep it in the source for now as
some remaining non essential code may have to be ported in
the future.
* Note: Python code (copy of the migration howto):
* New print function syntax print().
* Changed "dict.has_key(k)" for "k" in dict.
* Changed "except Exception, e" for "except Exception as e".
* The division "/" is now the floating point division, even if
both operand are integers. So 3/2 now gives 1.5 and no longer 1.
The integer division is now "//" : 1 = 3//2. So have to carefully
review the code to update. Most of the time we want to use "//".
We must never change to float for long that, in fact, represents
DbU (exposed as Python int type).
* execfile() must be replaced by exec(open("file").read()).
* iter().__next__() becomes iter(x).__next__().
* __getslice__() has been removed, integrated to __getitem__().
* The formating used for str(type(o)) has changed, so In Stratus,
have to update them ("<class 'MyClass'>" instead of "MyClass").
* the "types" module no longer supply values for default types
like str (types.StringType) or list (types.StringType).
Must use "isinstance()" where they were occuring.
* Remove the 'L' to indicate "long integer" (like "12L"), now
all Python integer are long.
* Change in bootstrap:
* Ported Coriolis builder (ccb) to Python3.
* Ported Coriolis socInstaller.py to Python3.
* Note: In PyQt4+Python3, QVariant no longer exists. Use None or
directly convert using the python syntax: bool(x), int(x), ...
By default, it is a string (str).
* Note: PyQt4 bindings & Python3 under SL7.
* In order to compile user's must upgrade to my own rebuild of
PyQt 4 & 5 bindings 4.19.21-1.el7.soc.
* Bug: In cumulus/plugins.block.htree.HTree.splitNet(), set the root
buffer of the H-Tree to the original signal (mainly: top clock).
Strangely, it was only done when working in full chip mode.
2021-09-19 12:41:24 -05:00
|
|
|
.. -*- Mode: rst -*-
|
|
|
|
|
|
|
|
|
|
|
|
1. Introduction
|
|
|
|
===============
|
|
|
|
|
|
|
|
* This document is written for people already familiar with the
|
|
|
|
`Python/C API Reference Manual`_.
|
|
|
|
|
|
|
|
* The macros provided by the Hurricane Python/C API are written using
|
|
|
|
the standard Python C/API. That is, you may not use them and write
|
|
|
|
directly your functions with the original API or any mix between.
|
|
|
|
You only have to respect some naming convention.
|
|
|
|
|
2021-09-26 10:27:57 -05:00
|
|
|
* Coriolis is build against Python 3.6.
|
Migration towards Python3, first stage: still based on C-Macros.
* New: Python/C++ API level:
* Write a new C++/template wrapper to get rid of boost::python
* The int & long Python type are now merged. So a C/C++ level,
it became "PyLong_X" (remove "PyInt_X") and at Python code
level, it became "int" (remove "long").
* Change: VLSISAPD finally defunct.
* Configuration is now integrated as a Hurricane component,
makes use of the new C++/template wrapper.
* vlsisapd is now defunct. Keep it in the source for now as
some remaining non essential code may have to be ported in
the future.
* Note: Python code (copy of the migration howto):
* New print function syntax print().
* Changed "dict.has_key(k)" for "k" in dict.
* Changed "except Exception, e" for "except Exception as e".
* The division "/" is now the floating point division, even if
both operand are integers. So 3/2 now gives 1.5 and no longer 1.
The integer division is now "//" : 1 = 3//2. So have to carefully
review the code to update. Most of the time we want to use "//".
We must never change to float for long that, in fact, represents
DbU (exposed as Python int type).
* execfile() must be replaced by exec(open("file").read()).
* iter().__next__() becomes iter(x).__next__().
* __getslice__() has been removed, integrated to __getitem__().
* The formating used for str(type(o)) has changed, so In Stratus,
have to update them ("<class 'MyClass'>" instead of "MyClass").
* the "types" module no longer supply values for default types
like str (types.StringType) or list (types.StringType).
Must use "isinstance()" where they were occuring.
* Remove the 'L' to indicate "long integer" (like "12L"), now
all Python integer are long.
* Change in bootstrap:
* Ported Coriolis builder (ccb) to Python3.
* Ported Coriolis socInstaller.py to Python3.
* Note: In PyQt4+Python3, QVariant no longer exists. Use None or
directly convert using the python syntax: bool(x), int(x), ...
By default, it is a string (str).
* Note: PyQt4 bindings & Python3 under SL7.
* In order to compile user's must upgrade to my own rebuild of
PyQt 4 & 5 bindings 4.19.21-1.el7.soc.
* Bug: In cumulus/plugins.block.htree.HTree.splitNet(), set the root
buffer of the H-Tree to the original signal (mainly: top clock).
Strangely, it was only done when working in full chip mode.
2021-09-19 12:41:24 -05:00
|
|
|
|
|
|
|
|
|
|
|
1.1 About Technical Choices
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
Some would say, why not use *off the shelf* wrappers like ``swig``,
|
|
|
|
``boost::python`` or ``pybind11``, here are some clues.
|
|
|
|
|
|
|
|
#. **Partial exposure of the C++ class tree.** We expose at Python level
|
|
|
|
C++ base classes, only if they provides common methods that we want
|
|
|
|
to see. Otherwise, we just show them as base classes under Python.
|
|
|
|
For instance ``Library`` is derived from ``DBo``, but we won't see
|
|
|
|
it under Python.
|
|
|
|
|
|
|
|
#. **Bi-directional communication.** When a Python object is deleted, the
|
|
|
|
wrapper obviously has a pointer toward the underlying C++ object and
|
|
|
|
is able to delete it. But, the reverse case can occurs, meaning that
|
|
|
|
you have a C++ object wrapped in Python and the database delete the
|
|
|
|
underlying object. The wrapped Python object *must* be informed that
|
|
|
|
it no longer refer a valid C++ one. Moreover, as we do not control
|
|
|
|
when Python objects gets deleteds (that is, when their reference count
|
|
|
|
reaches zero), we can have valid Python object with a dangling
|
|
|
|
C++ pointer. So our Python objects can be warned by the C++ objects
|
|
|
|
that they are no longer valid and any other operation than the
|
|
|
|
deletion should result in a severe non-blocking error.
|
|
|
|
|
|
|
|
To be precise, this apply to persistent object in the C++ database,
|
|
|
|
like ``Cell``, ``Net``, ``Instance`` or ``Component``. Short lived
|
|
|
|
objects like ``Box`` or ``Point`` retains the classic Python behavior.
|
|
|
|
|
|
|
|
Another aspect is that, for all derived ``DBo`` objects, one and only
|
|
|
|
one Python object is associated. For one given ``Instance`` object we
|
|
|
|
will always return the *same* ``PyInstance`` object, thanks to the
|
|
|
|
bi-directional link. Obviously, the *reference count* of the
|
|
|
|
``PyInstance`` is managed accordingly. This mechanism is implemented
|
|
|
|
by the ``PyTypeManager::_link()`` method.
|
|
|
|
|
|
|
|
#. **Linking accross modules.** As far as I understand, the wrappers
|
|
|
|
are for monolithic libraries. That is, you wrap the entire library
|
2021-09-26 10:27:57 -05:00
|
|
|
in one go. But Coriolis has a modular design, the core database
|
Migration towards Python3, first stage: still based on C-Macros.
* New: Python/C++ API level:
* Write a new C++/template wrapper to get rid of boost::python
* The int & long Python type are now merged. So a C/C++ level,
it became "PyLong_X" (remove "PyInt_X") and at Python code
level, it became "int" (remove "long").
* Change: VLSISAPD finally defunct.
* Configuration is now integrated as a Hurricane component,
makes use of the new C++/template wrapper.
* vlsisapd is now defunct. Keep it in the source for now as
some remaining non essential code may have to be ported in
the future.
* Note: Python code (copy of the migration howto):
* New print function syntax print().
* Changed "dict.has_key(k)" for "k" in dict.
* Changed "except Exception, e" for "except Exception as e".
* The division "/" is now the floating point division, even if
both operand are integers. So 3/2 now gives 1.5 and no longer 1.
The integer division is now "//" : 1 = 3//2. So have to carefully
review the code to update. Most of the time we want to use "//".
We must never change to float for long that, in fact, represents
DbU (exposed as Python int type).
* execfile() must be replaced by exec(open("file").read()).
* iter().__next__() becomes iter(x).__next__().
* __getslice__() has been removed, integrated to __getitem__().
* The formating used for str(type(o)) has changed, so In Stratus,
have to update them ("<class 'MyClass'>" instead of "MyClass").
* the "types" module no longer supply values for default types
like str (types.StringType) or list (types.StringType).
Must use "isinstance()" where they were occuring.
* Remove the 'L' to indicate "long integer" (like "12L"), now
all Python integer are long.
* Change in bootstrap:
* Ported Coriolis builder (ccb) to Python3.
* Ported Coriolis socInstaller.py to Python3.
* Note: In PyQt4+Python3, QVariant no longer exists. Use None or
directly convert using the python syntax: bool(x), int(x), ...
By default, it is a string (str).
* Note: PyQt4 bindings & Python3 under SL7.
* In order to compile user's must upgrade to my own rebuild of
PyQt 4 & 5 bindings 4.19.21-1.el7.soc.
* Bug: In cumulus/plugins.block.htree.HTree.splitNet(), set the root
buffer of the H-Tree to the original signal (mainly: top clock).
Strangely, it was only done when working in full chip mode.
2021-09-19 12:41:24 -05:00
|
|
|
then various tools. We do not, and cannot, have one gigantic wrapper
|
|
|
|
that would encompass all the libraries in one go. We do one Python
|
2021-09-26 10:27:57 -05:00
|
|
|
module for each C++ library.
|
Migration towards Python3, first stage: still based on C-Macros.
* New: Python/C++ API level:
* Write a new C++/template wrapper to get rid of boost::python
* The int & long Python type are now merged. So a C/C++ level,
it became "PyLong_X" (remove "PyInt_X") and at Python code
level, it became "int" (remove "long").
* Change: VLSISAPD finally defunct.
* Configuration is now integrated as a Hurricane component,
makes use of the new C++/template wrapper.
* vlsisapd is now defunct. Keep it in the source for now as
some remaining non essential code may have to be ported in
the future.
* Note: Python code (copy of the migration howto):
* New print function syntax print().
* Changed "dict.has_key(k)" for "k" in dict.
* Changed "except Exception, e" for "except Exception as e".
* The division "/" is now the floating point division, even if
both operand are integers. So 3/2 now gives 1.5 and no longer 1.
The integer division is now "//" : 1 = 3//2. So have to carefully
review the code to update. Most of the time we want to use "//".
We must never change to float for long that, in fact, represents
DbU (exposed as Python int type).
* execfile() must be replaced by exec(open("file").read()).
* iter().__next__() becomes iter(x).__next__().
* __getslice__() has been removed, integrated to __getitem__().
* The formating used for str(type(o)) has changed, so In Stratus,
have to update them ("<class 'MyClass'>" instead of "MyClass").
* the "types" module no longer supply values for default types
like str (types.StringType) or list (types.StringType).
Must use "isinstance()" where they were occuring.
* Remove the 'L' to indicate "long integer" (like "12L"), now
all Python integer are long.
* Change in bootstrap:
* Ported Coriolis builder (ccb) to Python3.
* Ported Coriolis socInstaller.py to Python3.
* Note: In PyQt4+Python3, QVariant no longer exists. Use None or
directly convert using the python syntax: bool(x), int(x), ...
By default, it is a string (str).
* Note: PyQt4 bindings & Python3 under SL7.
* In order to compile user's must upgrade to my own rebuild of
PyQt 4 & 5 bindings 4.19.21-1.el7.soc.
* Bug: In cumulus/plugins.block.htree.HTree.splitNet(), set the root
buffer of the H-Tree to the original signal (mainly: top clock).
Strangely, it was only done when working in full chip mode.
2021-09-19 12:41:24 -05:00
|
|
|
|
|
|
|
This brings another issue, at Python level this time. The Python
|
|
|
|
modules for the libraries have to share some functions. Python
|
|
|
|
provides a mechanism to pass C function pointers accross modules,
|
|
|
|
(``Capsule``) but I did not fully understand it.
|
|
|
|
|
|
|
|
Instead, we register all the newly defined Python type object
|
|
|
|
in the ``PyTypeManager`` and we link the associated C++ library
|
|
|
|
into all Python modules. So all types and ancillary functions can
|
|
|
|
easily be seen accross modules.
|
|
|
|
|
|
|
|
This way, we do not rely upon a pointer transmission through Python
|
|
|
|
modules, but directly uses linker capabilities.
|
|
|
|
|
|
|
|
**The PyTypeManager** approach also suppress the need to *split* into
|
|
|
|
two libraries the Python modules like in the C-Macros implementation,
|
|
|
|
and the double compilation pass.
|
|
|
|
|