coriolis/documentation/PythonTutorial/Collections.rst

94 lines
2.7 KiB
ReStructuredText

.. -*- Mode: rst -*-
.. include:: ../etc/definitions.rst
.. include:: ./definitions.rst
.. _2.1 The Alliance Framework: ./CellNetComponent.html#the-allianceframework-crl-core
4. Manipulating Cells, Nets and Components
==========================================
In this part, we will show how to navigate through the Nets_ and Components_ of a Cell_.
4.1 Hurricane Collections
~~~~~~~~~~~~~~~~~~~~~~~~~
In |Hurricane| all kind of set of objects, whether organized in a real container
like a ``map<>`` (dictionary / ``dict``) or a ``vector<>`` (table / ``list``) or
an algorithmic walkthrough of the database can be accessed through a Collection_.
C++ Collections object are exposed in |Python| through the *iterable* protocol,
allowing to simply write:
.. code-block:: Python
for net in cell.getNets():
print 'Components of', net
for component in net.getComponents():
print '|', component
In C++ we would have written:
.. code-block:: C++
for ( Net* net : cell->getNets() ) {
cout << "Components of " << net << endl;
for ( Component* component : net->getComponents() ) {
cout << "| " << component << endl,
}
}
4.1.1 Restrictions about using Collections
------------------------------------------
**Never delete or create an element while you are iterating over a Collection.**
Results can be unpredictable, you may just end up with a core dump, but more
subtly, some element of the Collection_ may be skipped or processed twice.
If you want to create or delete an element, do it outside the collection
loop. For example:
.. code-block:: Python
cellNets = []
for net in cell.getNets():
cellNets.append( net )
# Remove all the anonymous nets.
for net in cellNets:
if net.getName().endswith('nymous_'):
print 'Destroy', net
net.destroy()
4.2 Loading a Cell with AllianceFramework
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
As presented in `2.1 The Alliance Framework`_, the Cell_ that will be returned by
the ``getCell()`` call wil be:
#. If a Cell_ of that name is already loaded into memory, it will be returned.
.. note:: It means that it shadows any modifications that could have been on
disk since it was first loaded. Conversely, if the Cell_ has been
modified in memory, you will get those modifications.
#. Search, in the ordered list of libraries, the first Cell_ that matches the
requested name.
.. note:: It means that if cells with the same name exist in different
libraries, only the one in the first library will be ever used.
Be also weary of cell files that may remain in the ``WORK_LIB``,
they may unexpectedly shadow cells from the libraries.
.. code-block:: Python
cell = af.getCell( 'inv_x1', Catalog.State.Views )