Added management of Python attributes on DBo.

* New: Isobar::PyAttributesHolder, a PyObject with only a dictionary
    to hold the attributes associated to a DBo.
* New: Isobar::PyHolderProperty, the Property that encapsulate
    PyAttributesholder.
* New: Isobar::PythonAttributes, the extension to simplify the
    management of the PyAttributesholder.
* Change: In PyEntity, now use a dedicated tp_getattro and tp_setattro
    to delegate the Python attribute access towars the PyAttributesholder.
* New: In hurricane/doc & documentation, update docs regarding Python
    attributes managment.
This commit is contained in:
Jean-Paul Chaput 2022-08-13 17:46:47 +02:00
parent fefa47b2dc
commit 56aa978a9b
1201 changed files with 170667 additions and 14148 deletions

View File

@ -32,3 +32,83 @@ go through all the components of a trans-hierarchical net.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
For a starter, how to get all the leaf cells... For a starter, how to get all the leaf cells...
9.5 Dynamically decorating data-base objects
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When writing algorithms directly in Python, it may come in handy to be
able to add attributes over the Hurricane data-base objects. As C++
objects exposed to the Python realm cannot natively do so (it would
means to be able to modify a C++ aobject attributes *at runtime*),
we add a special Property tasked with handling the extra Python
attributes. The syntax has been made as simple as possible.
.. code-block:: python
from Hurricane import PythonAttributes
class MyAttribute ( object ):
count = 0
def __init__ ( self ):
self.value = MyAttribute.count
print( '{} has been created'.format(self) )
MyAttribute.count += 1
def __del__ ( self ):
print( '{} has been deleted'.format(self) )
def __str__ ( self ):
return '<MyAttribute {}>'.format(self.value)
def demoAttributes ( cell ):
PythonAttributes.enable( cell )
cell.myAttribute0 = MyAttribute()
cell.myAttribute1 = MyAttribute()
print( 'cell.myAttribute0 =', cell.myAttribute0 )
del cell.myAttribute0
PythonAttributes.disable( cell )
Detailing the life cycle of Python attributes on a DBo_:
1. Enabling the addition of Python attribute on a DBo_:
.. code-block:: python
PythonAttributes.enable( cell )
2. Adding/removing properties on the DBo_:
.. code-block:: python
cell.myAttribute0 = MyAttribute()
cell.myAttribute1 = MyAttribute()
print( 'cell.myAttribute0 =', cell.myAttribute0 )
del cell.myAttribute0
3. And finally disabling the use of Python attributes on the DBo.
Any still attached Python attributes will be released.
.. code-block:: python
PythonAttributes.disable( cell )
.. note::
When the attributes of a DBo_ are released it does not automatically
imply that they are removed. Their reference count is decreased, and
if they are only referenced here, they will be deleted. But if other
variables still holds reference onto them, they will stay allocateds.
4. There is no need to keep track of all the DBo_ that have Python
attributes to disable them. One can directly call:
.. code-block:: python
PythonAttributes.disableAll()

View File

@ -12,6 +12,7 @@
.. _Point: ../../hurricane/classHurricane_1_1Point.html .. _Point: ../../hurricane/classHurricane_1_1Point.html
.. _Points: ../../hurricane/classHurricane_1_1Point.html .. _Points: ../../hurricane/classHurricane_1_1Point.html
.. _Box: ../../hurricane/classHurricane_1_1Box.html .. _Box: ../../hurricane/classHurricane_1_1Box.html
.. _DBo: ../../hurricane/classHurricane_1_1DBo.html
.. _Cell: ../../hurricane/classHurricane_1_1Cell.html .. _Cell: ../../hurricane/classHurricane_1_1Cell.html
.. _Net: ../../hurricane/classHurricane_1_1Net.html .. _Net: ../../hurricane/classHurricane_1_1Net.html
.. _Nets: ../../hurricane/classHurricane_1_1Net.html .. _Nets: ../../hurricane/classHurricane_1_1Net.html
@ -34,6 +35,7 @@
.. _Transformation: ../../hurricane/classHurricane_1_1Transformation.html .. _Transformation: ../../hurricane/classHurricane_1_1Transformation.html
.. _Orientation: ../../hurricane/classHurricane_1_1Orientation.html .. _Orientation: ../../hurricane/classHurricane_1_1Orientation.html
.. _Occurrence: ../../hurricane/classHurricane_1_1Occurrence.html .. _Occurrence: ../../hurricane/classHurricane_1_1Occurrence.html
.. _PythonAttributes: ../../hurricane/classIsobar_1_1PythonAttributes.html
.. Hurricane Viewer doxygen doc links. .. Hurricane Viewer doxygen doc links.
.. _CellViewer: ../../viewer/classHurricane_1_1CellViewer.html .. _CellViewer: ../../viewer/classHurricane_1_1CellViewer.html

Binary file not shown.

View File

@ -123,7 +123,7 @@
<!-- Alliance & MBK Concepts --> <!-- Alliance & MBK Concepts -->
<!-- Hurricane Concepts. --> <!-- Hurricane Concepts. -->
<div class="contents topic" id="contents"> <div class="contents topic" id="contents">
<p class="topic-title first">Contents</p> <p class="topic-title">Contents</p>
<ul class="simple"> <ul class="simple">
<li><a class="reference internal" href="#abstract" id="id2">Abstract</a><ul> <li><a class="reference internal" href="#abstract" id="id2">Abstract</a><ul>
<li><a class="reference internal" href="#design-flow" id="id3">Design Flow</a></li> <li><a class="reference internal" href="#design-flow" id="id3">Design Flow</a></li>

View File

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Contents About Alliance Circuit Designed with Alliance Useful Links Installing Alliance from a Distribution Fedora Ubuntu LTS 18.04 Rebuild From Source (Git) Debian 9 &amp; Ubuntu 18 RHEL, CentOS, Fedora ..."> <meta name="description" content="Contents About Alliance Circuit Designed with Alliance Useful Links Installing Alliance from a Distribution Fedora Ubuntu LTS 18.04 Rebuild From Source (Git) Debian 9 &amp; Ubuntu 18 RHEL, CentOS,...">
<meta name="keywords" content=""> <meta name="keywords" content="">
<link rel="icon" href="../favicon.ico"> <link rel="icon" href="../favicon.ico">
@ -115,7 +115,7 @@
<!-- URLs that changes between the various backends. --> <!-- URLs that changes between the various backends. -->
<!-- For HTML backend --> <!-- For HTML backend -->
<div class="contents topic" id="contents"> <div class="contents topic" id="contents">
<p class="topic-title first">Contents</p> <p class="topic-title">Contents</p>
<ul class="simple"> <ul class="simple">
<li><a class="reference internal" href="#about-alliance" id="id2">About Alliance</a><ul> <li><a class="reference internal" href="#about-alliance" id="id2">About Alliance</a><ul>
<li><a class="reference internal" href="#circuit-designed-with-alliance" id="id3">Circuit Designed with Alliance</a></li> <li><a class="reference internal" href="#circuit-designed-with-alliance" id="id3">Circuit Designed with Alliance</a></li>
@ -186,7 +186,7 @@ from <a class="reference external" href="http://www.udb.edu.sv/">Don Bosco Unive
<p>That's all folks. <span class="sc">Alliance</span> is ready to use.</p> <p>That's all folks. <span class="sc">Alliance</span> is ready to use.</p>
</li> </li>
</ol> </ol>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p>With the packaged version of <span class="sc">Alliance</span>, files and directories are not at <p>With the packaged version of <span class="sc">Alliance</span>, files and directories are not at
the same places as in the default install. They have been made compliant the same places as in the default install. They have been made compliant
@ -297,25 +297,25 @@ your system. The main ones are listed below.</p>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">Before running the <span class="cb">autotools</span>, you have to run the <span class="cb">autostuff</span> <p class="last">Before running the <span class="cb">autotools</span>, you have to run the <span class="cb">autostuff</span>
script in <tt class="docutils literal">./alliance/src</tt> which generate the top-level automake files.</p> script in <tt class="docutils literal">./alliance/src</tt> which generate the top-level automake files.</p>
</div> </div>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">If you happen to have forgotten one of the dependency and have to <p class="last">If you happen to have forgotten one of the dependency and have to
install it after running <cite>configure</cite>, please remove the <em>whole</em> install it after running <cite>configure</cite>, please remove the <em>whole</em>
build directory tree and re-run <cite>configure</cite>. The same rule applies build directory tree and re-run <cite>configure</cite>. The same rule applies
if you switch from static libraries to dynamic ones.</p> if you switch from static libraries to dynamic ones.</p>
</div> </div>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last"><strong>Do not build in parallel</strong>, always uses <tt class="docutils literal"><span class="pre">-j1</span></tt>, the build process <p class="last"><strong>Do not build in parallel</strong>, always uses <tt class="docutils literal"><span class="pre">-j1</span></tt>, the build process
fail in strange ways when run in parallel (this is a known problem fail in strange ways when run in parallel (this is a known problem
due to the way Alliance was developped).</p> due to the way Alliance was developped).</p>
</div> </div>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last"><strong>Bison/Flex</strong> versions. Alliance is very sensitive to the versions <p class="last"><strong>Bison/Flex</strong> versions. Alliance is very sensitive to the versions
of thoses programs. The reference OSes for the build are <span class="sc">Scientific Linux</span> of thoses programs. The reference OSes for the build are <span class="sc">Scientific Linux</span>
@ -342,7 +342,7 @@ ego@home:src&gt; git clone https://gitlab.lip6.fr/jpc/alliance.git
</li> </li>
<li><p class="first">Compilation &amp; installation. For that step, you can use the following shell <li><p class="first">Compilation &amp; installation. For that step, you can use the following shell
script.</p> script.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last"><strong>The commonRoot variable</strong>, the <tt class="docutils literal">/Linux.x86_64/</tt> component of <p class="last"><strong>The commonRoot variable</strong>, the <tt class="docutils literal">/Linux.x86_64/</tt> component of
the path is dependent on the <span class="sc">os</span> you are using. It is determined the path is dependent on the <span class="sc">os</span> you are using. It is determined

View File

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Printable Version of this Document Alliance Check Toolkit. Contents Printable Version of this Document Toolkit Purpose Release Notes Toolkit Contents Toolkit Layout Benchmark Makefiles Setting Up the ..."> <meta name="description" content="Printable Version of this Document Alliance Check Toolkit. Contents Printable Version of this Document Toolkit Purpose Release Notes Toolkit Contents Toolkit Layout Benchmark Makefiles Setting Up...">
<meta name="keywords" content=""> <meta name="keywords" content="">
<link rel="icon" href="../favicon.ico"> <link rel="icon" href="../favicon.ico">
@ -117,7 +117,7 @@
<h2><a class="toc-backref" href="#id3">Printable Version of this Document</a></h2> <h2><a class="toc-backref" href="#id3">Printable Version of this Document</a></h2>
<p><a class="reference external" href="../pdfs/CheckToolkit.pdf">Alliance Check Toolkit</a>.</p> <p><a class="reference external" href="../pdfs/CheckToolkit.pdf">Alliance Check Toolkit</a>.</p>
<div class="contents topic" id="contents"> <div class="contents topic" id="contents">
<p class="topic-title first">Contents</p> <p class="topic-title">Contents</p>
<ul class="simple"> <ul class="simple">
<li><a class="reference internal" href="#printable-version-of-this-document" id="id3">Printable Version of this Document</a></li> <li><a class="reference internal" href="#printable-version-of-this-document" id="id3">Printable Version of this Document</a></li>
<li><a class="reference internal" href="#toolkit-purpose" id="id4">Toolkit Purpose</a></li> <li><a class="reference internal" href="#toolkit-purpose" id="id4">Toolkit Purpose</a></li>
@ -634,7 +634,7 @@ technology.</li>
<h3><span class="sc">Coriolis</span> and Clock Tree Generation</h3> <h3><span class="sc">Coriolis</span> and Clock Tree Generation</h3>
<p>When <span class="sc">Coriolis</span> is used, it create a clock tree which modificate the original <p>When <span class="sc">Coriolis</span> is used, it create a clock tree which modificate the original
netlist. The new netlist, with a clock tree, has a postfix of <tt class="docutils literal">_clocked</tt>.</p> netlist. The new netlist, with a clock tree, has a postfix of <tt class="docutils literal">_clocked</tt>.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last"><strong>Trans-hierarchical Clock-Tree.</strong> As <span class="sc">Coriolis</span> do not flatten the <p class="last"><strong>Trans-hierarchical Clock-Tree.</strong> As <span class="sc">Coriolis</span> do not flatten the
designs it creates, not only the top-level netlist is modificated. All the designs it creates, not only the top-level netlist is modificated. All the
@ -706,7 +706,7 @@ check the router. All runs are saved in a <tt class="docutils literal">./runs</t
</div> </div>
<div class="section" id="libraries-makefiles"> <div class="section" id="libraries-makefiles">
<h2><a class="toc-backref" href="#id11">Libraries Makefiles</a></h2> <h2><a class="toc-backref" href="#id11">Libraries Makefiles</a></h2>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p>For those part to work, you need to get <tt class="docutils literal">hitas</tt> &amp; <tt class="docutils literal">yagle</tt>:</p> <p>For those part to work, you need to get <tt class="docutils literal">hitas</tt> &amp; <tt class="docutils literal">yagle</tt>:</p>
<blockquote class="last"> <blockquote class="last">
@ -815,7 +815,7 @@ cell (sff2_x4) {
</pre> </pre>
</li> </li>
</ol> </ol>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">The tristate cells <strong>ts_</strong> and <strong>nts_</strong> are not included in the <tt class="docutils literal">.lib</tt>.</p> <p class="last">The tristate cells <strong>ts_</strong> and <strong>nts_</strong> are not included in the <tt class="docutils literal">.lib</tt>.</p>
</div> </div>
@ -857,7 +857,7 @@ file generator, <tt class="docutils literal">Makefile.block_rf2</tt>:</p>
./<span class="n">check</span>/<span class="n">block_rf</span>2<span class="n">_p_b_</span>16<span class="n">_p_w_</span>32.<span class="n">ok</span> \ ./<span class="n">check</span>/<span class="n">block_rf</span>2<span class="n">_p_b_</span>16<span class="n">_p_w_</span>32.<span class="n">ok</span> \
./<span class="n">check</span>/<span class="n">block_rf</span>2<span class="n">_p_b_</span>32<span class="n">_p_w_</span>32.<span class="n">ok</span> ./<span class="n">check</span>/<span class="n">block_rf</span>2<span class="n">_p_b_</span>32<span class="n">_p_w_</span>32.<span class="n">ok</span>
</pre></div> </pre></div>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">In the <tt class="docutils literal"><span class="pre">check-gen</span></tt> rule, the name of the block <strong>must</strong> match the <em>dot</em> <p class="last">In the <tt class="docutils literal"><span class="pre">check-gen</span></tt> rule, the name of the block <strong>must</strong> match the <em>dot</em>
extension of the <span class="cb">Makefile</span>, here: <tt class="docutils literal">block_rf2</tt>.</p> extension of the <span class="cb">Makefile</span>, here: <tt class="docutils literal">block_rf2</tt>.</p>
@ -902,7 +902,7 @@ in standalone mode. This script is quite straigthforward, what changes between
generators is the command line options and the <tt class="docutils literal">stratus.buildModel()</tt> call.</p> generators is the command line options and the <tt class="docutils literal">stratus.buildModel()</tt> call.</p>
<p>After the generator call, we get a netlist and placement, but it is not finished <p>After the generator call, we get a netlist and placement, but it is not finished
until it is routed with the <span class="sc">Coriolis</span> router.</p> until it is routed with the <span class="sc">Coriolis</span> router.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">Currently all macro-block generators are part of the <span class="sc">Stratus</span> netlist capture <p class="last">Currently all macro-block generators are part of the <span class="sc">Stratus</span> netlist capture
language tool from <span class="sc">Coriolis</span>.</p> language tool from <span class="sc">Coriolis</span>.</p>
@ -930,7 +930,7 @@ scaling (i.e. multiply by two) and do whatever adjustments we need.
So when we have an adjustment to do on a specific segment, say slihgtly shift So when we have an adjustment to do on a specific segment, say slihgtly shift
a <tt class="docutils literal">NDIF</tt>, the coordinates must be expressed as in <tt class="docutils literal">SxLib</tt> (once more: <em>before</em> a <tt class="docutils literal">NDIF</tt>, the coordinates must be expressed as in <tt class="docutils literal">SxLib</tt> (once more: <em>before</em>
scaling).</p> scaling).</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">There is a safety in <tt class="docutils literal">./check/scaleCell.py</tt>, it will not run until the <p class="last">There is a safety in <tt class="docutils literal">./check/scaleCell.py</tt>, it will not run until the
target library has not been emptied of it's cells.</p> target library has not been emptied of it's cells.</p>
@ -987,7 +987,7 @@ see the proper layout.</li>
<li>When you are satisfied with the new layout of the pads, you can copy <li>When you are satisfied with the new layout of the pads, you can copy
them back in the official pad cell library.</li> them back in the official pad cell library.</li>
</ol> </ol>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p><strong>How Coriolis Load Cells.</strong> <p><strong>How Coriolis Load Cells.</strong>
Unlike in <span class="sc">Alliance</span>, <span class="sc">Coriolis</span> maintain a much tighter relationship Unlike in <span class="sc">Alliance</span>, <span class="sc">Coriolis</span> maintain a much tighter relationship
@ -1042,7 +1042,7 @@ cells.</td>
<p>The LEF/DEF file exported or imported by Coriolis are <em>not</em> true physical <p>The LEF/DEF file exported or imported by Coriolis are <em>not</em> true physical
files. They are pseudo-real, in the sense that all the dimensions are files. They are pseudo-real, in the sense that all the dimensions are
directly taken from the symbolic with the simple rule <tt class="docutils literal">1 lambda = 1 micron</tt>.</p> directly taken from the symbolic with the simple rule <tt class="docutils literal">1 lambda = 1 micron</tt>.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last"><strong>LEF/DEF files:</strong> Coriolis is able to import/export in those <p class="last"><strong>LEF/DEF files:</strong> Coriolis is able to import/export in those
formats only if it has been compiled against the <span class="sc">Si2</span> relevant libraries formats only if it has been compiled against the <span class="sc">Si2</span> relevant libraries

View File

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Alliance Documentation Alliance Installation How to get, build &amp; install Alliance alongside Coriolis Alliance Check Toolkit Regression tests &amp; examples Coriolis Documentation Coriolis User&#39;s Guide ..."> <meta name="description" content="Alliance Documentation Alliance Installation How to get, build &amp; install Alliance alongside Coriolis Alliance Check Toolkit Regression tests &amp; examples Coriolis Documentation Coriolis User&#39;s Guide...">
<meta name="keywords" content=""> <meta name="keywords" content="">
<link rel="icon" href="../favicon.ico"> <link rel="icon" href="../favicon.ico">

View File

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="The git repositories of all the components of the project: Component Repository Alliance https://gitlab.lip6.fr/vlsi-eda/alliance.git Coriolis https://gitlab.lip6.fr/vlsi-eda/coriolis.git Alliance ..."> <meta name="description" content="The git repositories of all the components of the project: Component Repository Alliance https://gitlab.lip6.fr/vlsi-eda/alliance.git Coriolis https://gitlab.lip6.fr/vlsi-eda/coriolis.git Alliance...">
<meta name="keywords" content=""> <meta name="keywords" content="">
<link rel="icon" href="../favicon.ico"> <link rel="icon" href="../favicon.ico">

View File

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Contents Abstract Design Flow Design &amp; Features of Coriolis Disclaimer Abstract Alliance is a complete toolchain for vlsi design. It provides a vhdl compiler and simulator, logic synthetiser, ..."> <meta name="description" content="Contents Abstract Design Flow Design &amp; Features of Coriolis Disclaimer Abstract Alliance is a complete toolchain for vlsi design. It provides a vhdl compiler and simulator, logic synthetiser,...">
<meta name="keywords" content=""> <meta name="keywords" content="">
<link rel="icon" href="../favicon.ico"> <link rel="icon" href="../favicon.ico">
@ -120,7 +120,7 @@
<!-- Alliance & MBK Concepts --> <!-- Alliance & MBK Concepts -->
<!-- Hurricane Concepts. --> <!-- Hurricane Concepts. -->
<div class="contents topic" id="contents"> <div class="contents topic" id="contents">
<p class="topic-title first">Contents</p> <p class="topic-title">Contents</p>
<ul class="simple"> <ul class="simple">
<li><a class="reference internal" href="#abstract" id="id2">Abstract</a><ul> <li><a class="reference internal" href="#abstract" id="id2">Abstract</a><ul>
<li><a class="reference internal" href="#design-flow" id="id3">Design Flow</a></li> <li><a class="reference internal" href="#design-flow" id="id3">Design Flow</a></li>

View File

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Printable version of this Document Contents Printable version of this Document 1. Introduction 1.1 About Technical Choices 2. Implementation 2.1 PyTypeManager 2.2 Highjacking the tp methods 2.3 Going ..."> <meta name="description" content="Printable version of this Document Contents Printable version of this Document 1. Introduction 1.1 About Technical Choices 2. Implementation 2.1 PyTypeManager 2.2 Highjacking the tp methods 2.3...">
<meta name="keywords" content=""> <meta name="keywords" content="">
<link rel="icon" href="../favicon.ico"> <link rel="icon" href="../favicon.ico">
@ -122,7 +122,7 @@
<div class="section" id="printable-version-of-this-document"> <div class="section" id="printable-version-of-this-document">
<h2><a class="toc-backref" href="#id2">Printable version of this Document</a></h2> <h2><a class="toc-backref" href="#id2">Printable version of this Document</a></h2>
<div class="contents topic" id="contents"> <div class="contents topic" id="contents">
<p class="topic-title first">Contents</p> <p class="topic-title">Contents</p>
<ul class="simple"> <ul class="simple">
<li><a class="reference internal" href="#printable-version-of-this-document" id="id2">Printable version of this Document</a></li> <li><a class="reference internal" href="#printable-version-of-this-document" id="id2">Printable version of this Document</a></li>
<li><a class="reference internal" href="#introduction" id="id3">1. Introduction</a><ul> <li><a class="reference internal" href="#introduction" id="id3">1. Introduction</a><ul>
@ -280,7 +280,7 @@ object (an iterator) and one another to the <tt class="docutils literal">PyObjec
</pre></div> </pre></div>
</li> </li>
</ul> </ul>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">A <tt class="docutils literal">PyTwoVoid</tt> can be casted/accessed as a <tt class="docutils literal">PyOneVoid</tt>.</p> <p class="last">A <tt class="docutils literal">PyTwoVoid</tt> can be casted/accessed as a <tt class="docutils literal">PyOneVoid</tt>.</p>
</div> </div>
@ -349,7 +349,7 @@ a map lookup. Hope it is fast.</p>
<span class="kt">void</span> <span class="n">PyTypeManager</span><span class="o">::</span><span class="n">_setupPyType</span> <span class="p">()</span> <span class="kt">void</span> <span class="n">PyTypeManager</span><span class="o">::</span><span class="n">_setupPyType</span> <span class="p">()</span>
<span class="c1">// Derived classes must implement it as they see fit.</span> <span class="c1">// Derived classes must implement it as they see fit.</span>
<span class="k">virtual</span> <span class="kt">long</span> <span class="n">_getTpHash</span> <span class="p">(</span> <span class="n">PyObject</span><span class="o">*</span> <span class="p">)</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">virtual</span> <span class="kt">long</span> <span class="n">_getTpHash</span> <span class="p">(</span> <span class="n">PyObject</span><span class="o">*</span> <span class="p">)</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">CppT</span><span class="o">&gt;</span> <span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="nc">CppT</span><span class="o">&gt;</span>
<span class="k">static</span> <span class="n">PyTypeManager</span><span class="o">*</span> <span class="n">_get</span><span class="p">();</span> <span class="k">static</span> <span class="n">PyTypeManager</span><span class="o">*</span> <span class="n">_get</span><span class="p">();</span>
<span class="k">private</span><span class="o">:</span> <span class="k">private</span><span class="o">:</span>
<span class="n">PyTypeObject</span> <span class="n">_typeObject</span><span class="p">;</span> <span class="n">PyTypeObject</span> <span class="n">_typeObject</span><span class="p">;</span>
@ -396,17 +396,17 @@ Python types must be provideds (<tt class="docutils literal">bool</tt>, <tt clas
<tt class="docutils literal"><span class="pre">std::string</span></tt>, ...).</p> <tt class="docutils literal"><span class="pre">std::string</span></tt>, ...).</p>
<p>Those templates/functions are the ones the <tt class="docutils literal"><span class="pre">Isobar::parse_objects()</span></tt> recursive <p>Those templates/functions are the ones the <tt class="docutils literal"><span class="pre">Isobar::parse_objects()</span></tt> recursive
template function call in turn for each <tt class="docutils literal">PyObject*</tt> argument.</p> template function call in turn for each <tt class="docutils literal">PyObject*</tt> argument.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last"><tt class="docutils literal"><span class="pre">Hurricane::Name</span></tt> are <em>not</em> exposed to the Python interface, they <p class="last"><tt class="docutils literal"><span class="pre">Hurricane::Name</span></tt> are <em>not</em> exposed to the Python interface, they
must be treated as <tt class="docutils literal"><span class="pre">std::string</span></tt>.</p> must be treated as <tt class="docutils literal"><span class="pre">std::string</span></tt>.</p>
</div> </div>
<div class="highlight"><pre><span></span><span class="c1">// Template/Pointer to a value flavor.</span> <div class="highlight"><pre><span></span><span class="c1">// Template/Pointer to a value flavor.</span>
<span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="n">T</span> <span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="nc">T</span>
<span class="p">,</span> <span class="k">typename</span> <span class="n">std</span><span class="o">::</span><span class="n">enable_if</span><span class="o">&lt;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_pointer</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;::</span><span class="n">value</span><span class="p">,</span> <span class="kt">bool</span> <span class="o">&gt;::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">&gt;</span> <span class="p">,</span> <span class="k">typename</span> <span class="nc">std</span><span class="o">::</span><span class="n">enable_if</span><span class="o">&lt;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_pointer</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;::</span><span class="n">value</span><span class="p">,</span> <span class="kt">bool</span> <span class="o">&gt;::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">&gt;</span>
<span class="kr">inline</span> <span class="kt">bool</span> <span class="n">pyToC</span> <span class="p">(</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">pyArg</span><span class="p">,</span> <span class="n">T</span><span class="o">*</span> <span class="n">arg</span> <span class="p">)</span> <span class="kr">inline</span> <span class="kt">bool</span> <span class="n">pyToC</span> <span class="p">(</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">pyArg</span><span class="p">,</span> <span class="n">T</span><span class="o">*</span> <span class="n">arg</span> <span class="p">)</span>
<span class="p">{</span> <span class="p">{</span>
<span class="k">typedef</span> <span class="k">typename</span> <span class="n">std</span><span class="o">::</span><span class="n">remove_cv</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;::</span><span class="n">type</span> <span class="n">NonConstT</span><span class="p">;</span> <span class="k">typedef</span> <span class="k">typename</span> <span class="nc">std</span><span class="o">::</span><span class="n">remove_cv</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;::</span><span class="n">type</span> <span class="n">NonConstT</span><span class="p">;</span>
<span class="n">Isobar3</span><span class="o">::</span><span class="n">PyTypeManager</span><span class="o">*</span> <span class="n">manager</span> <span class="o">=</span> <span class="n">Isobar3</span><span class="o">::</span><span class="n">PyTypeManager</span><span class="o">::</span><span class="n">_get</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">();</span> <span class="n">Isobar3</span><span class="o">::</span><span class="n">PyTypeManager</span><span class="o">*</span> <span class="n">manager</span> <span class="o">=</span> <span class="n">Isobar3</span><span class="o">::</span><span class="n">PyTypeManager</span><span class="o">::</span><span class="n">_get</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">();</span>
<span class="k">if</span> <span class="p">(</span><span class="n">not</span> <span class="n">manager</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">not</span> <span class="n">manager</span><span class="p">)</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Isobar3::pyToC&lt;&gt;(const T*): Unsupported type.&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span> <span class="n">std</span><span class="o">::</span><span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Isobar3::pyToC&lt;&gt;(const T*): Unsupported type.&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
@ -418,7 +418,7 @@ must be treated as <tt class="docutils literal"><span class="pre">std::string</s
<span class="p">}</span> <span class="p">}</span>
<span class="c1">// Template/Pointer to a pointer flavor.</span> <span class="c1">// Template/Pointer to a pointer flavor.</span>
<span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">T</span><span class="o">&gt;</span> <span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="o">&gt;</span>
<span class="kr">inline</span> <span class="kt">bool</span> <span class="n">pyToC</span> <span class="p">(</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">pyArg</span><span class="p">,</span> <span class="n">T</span><span class="o">**</span> <span class="n">arg</span> <span class="p">)</span> <span class="kr">inline</span> <span class="kt">bool</span> <span class="n">pyToC</span> <span class="p">(</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">pyArg</span><span class="p">,</span> <span class="n">T</span><span class="o">**</span> <span class="n">arg</span> <span class="p">)</span>
<span class="p">{</span> <span class="p">{</span>
<span class="n">Isobar3</span><span class="o">::</span><span class="n">PyTypeManager</span><span class="o">*</span> <span class="n">manager</span> <span class="o">=</span> <span class="n">Isobar3</span><span class="o">::</span><span class="n">PyTypeManager</span><span class="o">::</span><span class="n">_get</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">();</span> <span class="n">Isobar3</span><span class="o">::</span><span class="n">PyTypeManager</span><span class="o">*</span> <span class="n">manager</span> <span class="o">=</span> <span class="n">Isobar3</span><span class="o">::</span><span class="n">PyTypeManager</span><span class="o">::</span><span class="n">_get</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">();</span>
@ -469,13 +469,13 @@ misunderstood the template resolution mechanism).</p>
the <tt class="docutils literal">PyObject</tt> creation to the <tt class="docutils literal"><span class="pre">PyTypeManager::link()</span></tt> template the <tt class="docutils literal">PyObject</tt> creation to the <tt class="docutils literal"><span class="pre">PyTypeManager::link()</span></tt> template
function, which in turn, can call the right <tt class="docutils literal"><span class="pre">PyTypeManagerVTrunk&lt;CppT&gt;::_link()</span></tt> function, which in turn, can call the right <tt class="docutils literal"><span class="pre">PyTypeManagerVTrunk&lt;CppT&gt;::_link()</span></tt>
method.</p> method.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">The <tt class="docutils literal"><span class="pre">PyTypeManagerVTrunk&lt;CppT&gt;::_link()</span></tt> method is the reason <p class="last">The <tt class="docutils literal"><span class="pre">PyTypeManagerVTrunk&lt;CppT&gt;::_link()</span></tt> method is the reason
<strong>why</strong> we need the intermediate <tt class="docutils literal">PyTypeManagerVTrunk&lt;CppT&gt;</tt> <strong>why</strong> we need the intermediate <tt class="docutils literal">PyTypeManagerVTrunk&lt;CppT&gt;</tt>
template class.</p> template class.</p>
</div> </div>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p><strong>Different C++ templates.</strong> You may notice that the two following templates <p><strong>Different C++ templates.</strong> You may notice that the two following templates
may look like specializations of the same one:</p> may look like specializations of the same one:</p>
@ -489,7 +489,7 @@ specialization), but they are <em>not</em>. The two pairs
<tt class="docutils literal">(CppT,CppT*)</tt> cannot be made to be a specialization of each other.</p> <tt class="docutils literal">(CppT,CppT*)</tt> cannot be made to be a specialization of each other.</p>
</div> </div>
<div class="highlight"><pre><span></span><span class="c1">// Generic template for values.</span> <div class="highlight"><pre><span></span><span class="c1">// Generic template for values.</span>
<span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="n">CppT</span> <span class="o">&gt;</span> <span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="nc">CppT</span> <span class="o">&gt;</span>
<span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span> <span class="p">(</span> <span class="n">CppT</span> <span class="n">object</span> <span class="p">)</span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span> <span class="p">(</span> <span class="n">CppT</span> <span class="n">object</span> <span class="p">)</span>
<span class="p">{</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">not</span> <span class="n">Isobar3</span><span class="o">::</span><span class="n">PyTypeManager</span><span class="o">::</span><span class="n">hasType</span><span class="o">&lt;</span><span class="n">CppT</span><span class="o">&gt;</span><span class="p">())</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">not</span> <span class="n">Isobar3</span><span class="o">::</span><span class="n">PyTypeManager</span><span class="o">::</span><span class="n">hasType</span><span class="o">&lt;</span><span class="n">CppT</span><span class="o">&gt;</span><span class="p">())</span> <span class="p">{</span>
@ -502,8 +502,8 @@ specialization), but they are <em>not</em>. The two pairs
<span class="p">}</span> <span class="p">}</span>
<span class="c1">// Disabled for POD &amp; STL types, pointer flavor.</span> <span class="c1">// Disabled for POD &amp; STL types, pointer flavor.</span>
<span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="n">CppT</span> <span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="nc">CppT</span>
<span class="p">,</span> <span class="k">typename</span> <span class="n">std</span><span class="o">::</span><span class="n">enable_if</span><span class="o">&lt;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o">&lt;</span><span class="n">CppT</span><span class="p">,</span><span class="kt">bool</span><span class="o">&gt;::</span><span class="n">value</span> <span class="p">,</span> <span class="k">typename</span> <span class="nc">std</span><span class="o">::</span><span class="n">enable_if</span><span class="o">&lt;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o">&lt;</span><span class="n">CppT</span><span class="p">,</span><span class="kt">bool</span><span class="o">&gt;::</span><span class="n">value</span>
<span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o">&lt;</span><span class="n">CppT</span><span class="p">,</span><span class="kt">int</span> <span class="o">&gt;::</span><span class="n">value</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o">&lt;</span><span class="n">CppT</span><span class="p">,</span><span class="kt">int</span> <span class="o">&gt;::</span><span class="n">value</span>
<span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o">&lt;</span><span class="n">CppT</span><span class="p">,</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;::</span><span class="n">value</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o">&lt;</span><span class="n">CppT</span><span class="p">,</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;::</span><span class="n">value</span>
<span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o">&lt;</span><span class="n">CppT</span><span class="p">,</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">&gt;::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">&gt;</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o">&lt;</span><span class="n">CppT</span><span class="p">,</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">&gt;::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">&gt;</span>
@ -511,8 +511,8 @@ specialization), but they are <em>not</em>. The two pairs
<span class="p">{</span> <span class="k">return</span> <span class="n">Isobar3</span><span class="o">::</span><span class="n">PyTypeManager</span><span class="o">::</span><span class="n">link</span><span class="o">&lt;</span><span class="n">CppT</span><span class="o">&gt;</span><span class="p">(</span> <span class="n">object</span> <span class="p">);</span> <span class="p">}</span> <span class="p">{</span> <span class="k">return</span> <span class="n">Isobar3</span><span class="o">::</span><span class="n">PyTypeManager</span><span class="o">::</span><span class="n">link</span><span class="o">&lt;</span><span class="n">CppT</span><span class="o">&gt;</span><span class="p">(</span> <span class="n">object</span> <span class="p">);</span> <span class="p">}</span>
<span class="c1">// Disabled for POD &amp; STL types, const pointer flavor.</span> <span class="c1">// Disabled for POD &amp; STL types, const pointer flavor.</span>
<span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="n">CppT</span> <span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="nc">CppT</span>
<span class="p">,</span> <span class="k">typename</span> <span class="n">std</span><span class="o">::</span><span class="n">enable_if</span><span class="o">&lt;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o">&lt;</span><span class="n">CppT</span><span class="p">,</span><span class="kt">bool</span><span class="o">&gt;::</span><span class="n">value</span> <span class="p">,</span> <span class="k">typename</span> <span class="nc">std</span><span class="o">::</span><span class="n">enable_if</span><span class="o">&lt;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o">&lt;</span><span class="n">CppT</span><span class="p">,</span><span class="kt">bool</span><span class="o">&gt;::</span><span class="n">value</span>
<span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o">&lt;</span><span class="n">CppT</span><span class="p">,</span><span class="kt">int</span> <span class="o">&gt;::</span><span class="n">value</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o">&lt;</span><span class="n">CppT</span><span class="p">,</span><span class="kt">int</span> <span class="o">&gt;::</span><span class="n">value</span>
<span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o">&lt;</span><span class="n">CppT</span><span class="p">,</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;::</span><span class="n">value</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o">&lt;</span><span class="n">CppT</span><span class="p">,</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;::</span><span class="n">value</span>
<span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o">&lt;</span><span class="n">CppT</span><span class="p">,</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">&gt;::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">&gt;</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o">&lt;</span><span class="n">CppT</span><span class="p">,</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">&gt;::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">&gt;</span>
@ -525,14 +525,14 @@ specialization), but they are <em>not</em>. The two pairs
<span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="n">Py_RETURN_TRUE</span><span class="p">;</span> <span class="n">Py_RETURN_FALSE</span><span class="p">;</span> <span class="p">}</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="n">Py_RETURN_TRUE</span><span class="p">;</span> <span class="n">Py_RETURN_FALSE</span><span class="p">;</span> <span class="p">}</span>
<span class="c1">// Specialization for STL std::string.</span> <span class="c1">// Specialization for STL std::string.</span>
<span class="k">template</span><span class="o">&lt;&gt;</span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o">&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="p">(</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">s</span> <span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">PyUnicode_FromString</span><span class="p">(</span> <span class="n">s</span><span class="p">.</span><span class="n">c_str</span><span class="p">()</span> <span class="p">);</span> <span class="p">}</span> <span class="k">template</span><span class="o">&lt;&gt;</span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o">&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="p">(</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">s</span> <span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nf">PyUnicode_FromString</span><span class="p">(</span> <span class="n">s</span><span class="p">.</span><span class="n">c_str</span><span class="p">()</span> <span class="p">);</span> <span class="p">}</span>
<span class="k">template</span><span class="o">&lt;&gt;</span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o">&lt;</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="o">&gt;</span> <span class="p">(</span> <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">s</span> <span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">PyUnicode_FromString</span><span class="p">(</span> <span class="n">s</span><span class="p">.</span><span class="n">c_str</span><span class="p">()</span> <span class="p">);</span> <span class="p">}</span> <span class="k">template</span><span class="o">&lt;&gt;</span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o">&lt;</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="o">&gt;</span> <span class="p">(</span> <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">s</span> <span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nf">PyUnicode_FromString</span><span class="p">(</span> <span class="n">s</span><span class="p">.</span><span class="n">c_str</span><span class="p">()</span> <span class="p">);</span> <span class="p">}</span>
<span class="k">template</span><span class="o">&lt;&gt;</span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o">&lt;</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">*&gt;</span> <span class="p">(</span> <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">*</span> <span class="n">s</span> <span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">PyUnicode_FromString</span><span class="p">(</span> <span class="n">s</span><span class="o">-&gt;</span><span class="n">c_str</span><span class="p">()</span> <span class="p">);</span> <span class="p">}</span> <span class="k">template</span><span class="o">&lt;&gt;</span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o">&lt;</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">*&gt;</span> <span class="p">(</span> <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">*</span> <span class="n">s</span> <span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nf">PyUnicode_FromString</span><span class="p">(</span> <span class="n">s</span><span class="o">-&gt;</span><span class="n">c_str</span><span class="p">()</span> <span class="p">);</span> <span class="p">}</span>
<span class="c1">// Specialization for POD int.</span> <span class="c1">// Specialization for POD int.</span>
<span class="k">template</span><span class="o">&lt;&gt;</span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o">&lt;</span> <span class="kt">int</span> <span class="o">&gt;</span> <span class="p">(</span> <span class="kt">int</span> <span class="n">i</span> <span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">PyLong_FromLong</span><span class="p">(</span> <span class="n">i</span> <span class="p">);</span> <span class="p">}</span> <span class="k">template</span><span class="o">&lt;&gt;</span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o">&lt;</span> <span class="kt">int</span> <span class="o">&gt;</span> <span class="p">(</span> <span class="kt">int</span> <span class="n">i</span> <span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nf">PyLong_FromLong</span><span class="p">(</span> <span class="n">i</span> <span class="p">);</span> <span class="p">}</span>
<span class="k">template</span><span class="o">&lt;&gt;</span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o">&lt;</span><span class="k">const</span> <span class="kt">int</span> <span class="o">&gt;</span> <span class="p">(</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">i</span> <span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">PyLong_FromLong</span><span class="p">(</span> <span class="n">i</span> <span class="p">);</span> <span class="p">}</span> <span class="k">template</span><span class="o">&lt;&gt;</span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o">&lt;</span><span class="k">const</span> <span class="kt">int</span> <span class="o">&gt;</span> <span class="p">(</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">i</span> <span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nf">PyLong_FromLong</span><span class="p">(</span> <span class="n">i</span> <span class="p">);</span> <span class="p">}</span>
<span class="k">template</span><span class="o">&lt;&gt;</span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o">&lt;</span><span class="k">const</span> <span class="kt">int</span><span class="o">*&gt;</span> <span class="p">(</span> <span class="k">const</span> <span class="kt">int</span><span class="o">*</span> <span class="n">i</span> <span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">PyLong_FromLong</span><span class="p">(</span> <span class="o">*</span><span class="n">i</span> <span class="p">);</span> <span class="p">}</span> <span class="k">template</span><span class="o">&lt;&gt;</span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o">&lt;</span><span class="k">const</span> <span class="kt">int</span><span class="o">*&gt;</span> <span class="p">(</span> <span class="k">const</span> <span class="kt">int</span><span class="o">*</span> <span class="n">i</span> <span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nf">PyLong_FromLong</span><span class="p">(</span> <span class="o">*</span><span class="n">i</span> <span class="p">);</span> <span class="p">}</span>
</pre></div> </pre></div>
</div> </div>
<div class="section" id="object-methods-wrappers"> <div class="section" id="object-methods-wrappers">
@ -604,7 +604,7 @@ will match. But as functions template do not allow partial specialization,
only one must be defined for that method (the one <em>matching</em> it's only one must be defined for that method (the one <em>matching</em> it's
return type), so we make the template mutually exclusives based on return type), so we make the template mutually exclusives based on
the <tt class="docutils literal">TR</tt> type (with the <tt class="docutils literal"><span class="pre">std::enable_if&lt;&gt;</span></tt> clause).</p> the <tt class="docutils literal">TR</tt> type (with the <tt class="docutils literal"><span class="pre">std::enable_if&lt;&gt;</span></tt> clause).</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">In the various <tt class="docutils literal">_callMethodReturn&lt;&gt;</tt> we have <em>two</em> sets for the <p class="last">In the various <tt class="docutils literal">_callMethodReturn&lt;&gt;</tt> we have <em>two</em> sets for the
method parameters types : <tt class="docutils literal"><span class="pre">TArgsF...</span></tt> and <tt class="docutils literal"><span class="pre">TArgsW...</span></tt>. This is to method parameters types : <tt class="docutils literal"><span class="pre">TArgsF...</span></tt> and <tt class="docutils literal"><span class="pre">TArgsW...</span></tt>. This is to
@ -615,8 +615,8 @@ a <tt class="docutils literal">const</tt> parameter which is non-<tt class="docu
</div> </div>
<p>Here is an excerpt of the code:</p> <p>Here is an excerpt of the code:</p>
<div class="highlight"><pre><span></span><span class="c1">// Flavor for &quot;return by value&quot; (seems to match std::is_object&lt;&gt;)</span> <div class="highlight"><pre><span></span><span class="c1">// Flavor for &quot;return by value&quot; (seems to match std::is_object&lt;&gt;)</span>
<span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="n">TC</span><span class="p">,</span> <span class="k">typename</span> <span class="n">TR</span><span class="p">,</span> <span class="k">typename</span><span class="p">...</span> <span class="n">TArgsF</span><span class="p">,</span> <span class="k">typename</span><span class="p">...</span> <span class="n">TArgsW</span> <span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="nc">TC</span><span class="p">,</span> <span class="k">typename</span> <span class="nc">TR</span><span class="p">,</span> <span class="k">typename</span><span class="p">...</span> <span class="n">TArgsF</span><span class="p">,</span> <span class="k">typename</span><span class="p">...</span> <span class="n">TArgsW</span>
<span class="p">,</span> <span class="k">typename</span> <span class="n">std</span><span class="o">::</span><span class="n">enable_if</span><span class="o">&lt;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_reference</span><span class="o">&lt;</span><span class="n">TR</span><span class="o">&gt;::</span><span class="n">value</span> <span class="p">,</span> <span class="k">typename</span> <span class="nc">std</span><span class="o">::</span><span class="n">enable_if</span><span class="o">&lt;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_reference</span><span class="o">&lt;</span><span class="n">TR</span><span class="o">&gt;::</span><span class="n">value</span>
<span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_pointer</span> <span class="o">&lt;</span><span class="n">TR</span><span class="o">&gt;::</span><span class="n">value</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_pointer</span> <span class="o">&lt;</span><span class="n">TR</span><span class="o">&gt;::</span><span class="n">value</span>
<span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_void</span> <span class="o">&lt;</span><span class="n">TR</span><span class="o">&gt;::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">&gt;::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">&gt;</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_void</span> <span class="o">&lt;</span><span class="n">TR</span><span class="o">&gt;::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">&gt;::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">&gt;</span>
<span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">_callMethodReturn</span> <span class="p">(</span> <span class="n">TR</span><span class="p">(</span><span class="n">TC</span><span class="o">::*</span> <span class="n">method</span><span class="p">)(</span><span class="n">TArgsF</span><span class="p">...),</span> <span class="n">TC</span><span class="o">*</span> <span class="n">cppObject</span><span class="p">,</span> <span class="n">TArgsW</span><span class="p">...</span> <span class="n">args</span> <span class="p">)</span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">_callMethodReturn</span> <span class="p">(</span> <span class="n">TR</span><span class="p">(</span><span class="n">TC</span><span class="o">::*</span> <span class="n">method</span><span class="p">)(</span><span class="n">TArgsF</span><span class="p">...),</span> <span class="n">TC</span><span class="o">*</span> <span class="n">cppObject</span><span class="p">,</span> <span class="n">TArgsW</span><span class="p">...</span> <span class="n">args</span> <span class="p">)</span>
@ -626,8 +626,8 @@ a <tt class="docutils literal">const</tt> parameter which is non-<tt class="docu
<span class="p">}</span> <span class="p">}</span>
<span class="c1">// Flavor for &quot;return by reference&quot;</span> <span class="c1">// Flavor for &quot;return by reference&quot;</span>
<span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="n">TC</span><span class="p">,</span> <span class="k">typename</span> <span class="n">TR</span><span class="p">,</span> <span class="k">typename</span><span class="p">...</span> <span class="n">TArgsF</span><span class="p">,</span> <span class="k">typename</span><span class="p">...</span> <span class="n">TArgsW</span> <span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="nc">TC</span><span class="p">,</span> <span class="k">typename</span> <span class="nc">TR</span><span class="p">,</span> <span class="k">typename</span><span class="p">...</span> <span class="n">TArgsF</span><span class="p">,</span> <span class="k">typename</span><span class="p">...</span> <span class="n">TArgsW</span>
<span class="p">,</span> <span class="k">typename</span> <span class="n">std</span><span class="o">::</span><span class="n">enable_if</span><span class="o">&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">is_reference</span><span class="o">&lt;</span><span class="n">TR</span><span class="o">&gt;::</span><span class="n">value</span> <span class="p">,</span> <span class="k">typename</span> <span class="nc">std</span><span class="o">::</span><span class="n">enable_if</span><span class="o">&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">is_reference</span><span class="o">&lt;</span><span class="n">TR</span><span class="o">&gt;::</span><span class="n">value</span>
<span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_pointer</span> <span class="o">&lt;</span><span class="n">TR</span><span class="o">&gt;::</span><span class="n">value</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_pointer</span> <span class="o">&lt;</span><span class="n">TR</span><span class="o">&gt;::</span><span class="n">value</span>
<span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_void</span> <span class="o">&lt;</span><span class="n">TR</span><span class="o">&gt;::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">&gt;::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">&gt;</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_void</span> <span class="o">&lt;</span><span class="n">TR</span><span class="o">&gt;::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">&gt;::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">&gt;</span>
<span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">_callMethodReturn</span> <span class="p">(</span> <span class="n">TR</span><span class="p">(</span><span class="n">TC</span><span class="o">::*</span> <span class="n">method</span><span class="p">)(</span><span class="n">TArgsF</span><span class="p">...),</span> <span class="n">TC</span><span class="o">*</span> <span class="n">cppObject</span><span class="p">,</span> <span class="n">TArgsW</span><span class="p">...</span> <span class="n">args</span> <span class="p">)</span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">_callMethodReturn</span> <span class="p">(</span> <span class="n">TR</span><span class="p">(</span><span class="n">TC</span><span class="o">::*</span> <span class="n">method</span><span class="p">)(</span><span class="n">TArgsF</span><span class="p">...),</span> <span class="n">TC</span><span class="o">*</span> <span class="n">cppObject</span><span class="p">,</span> <span class="n">TArgsW</span><span class="p">...</span> <span class="n">args</span> <span class="p">)</span>
@ -637,8 +637,8 @@ a <tt class="docutils literal">const</tt> parameter which is non-<tt class="docu
<span class="p">}</span> <span class="p">}</span>
<span class="c1">// Flavor for &quot;return by pointer&quot;.</span> <span class="c1">// Flavor for &quot;return by pointer&quot;.</span>
<span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="n">TC</span><span class="p">,</span> <span class="k">typename</span> <span class="n">TR</span><span class="p">,</span> <span class="k">typename</span><span class="p">...</span> <span class="n">TArgsF</span><span class="p">,</span> <span class="k">typename</span><span class="p">...</span> <span class="n">TArgsW</span> <span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="nc">TC</span><span class="p">,</span> <span class="k">typename</span> <span class="nc">TR</span><span class="p">,</span> <span class="k">typename</span><span class="p">...</span> <span class="n">TArgsF</span><span class="p">,</span> <span class="k">typename</span><span class="p">...</span> <span class="n">TArgsW</span>
<span class="p">,</span> <span class="k">typename</span> <span class="n">std</span><span class="o">::</span><span class="n">enable_if</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">is_pointer</span><span class="o">&lt;</span><span class="n">TR</span><span class="o">&gt;::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">&gt;::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">&gt;</span> <span class="p">,</span> <span class="k">typename</span> <span class="nc">std</span><span class="o">::</span><span class="n">enable_if</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">is_pointer</span><span class="o">&lt;</span><span class="n">TR</span><span class="o">&gt;::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">&gt;::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">&gt;</span>
<span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">_callMethodReturn</span> <span class="p">(</span> <span class="n">TR</span><span class="p">(</span><span class="n">TC</span><span class="o">::*</span> <span class="n">method</span><span class="p">)(</span><span class="n">TArgsF</span><span class="p">...),</span> <span class="n">TC</span><span class="o">*</span> <span class="n">cppObject</span><span class="p">,</span> <span class="n">TArgsW</span><span class="p">...</span> <span class="n">args</span> <span class="p">)</span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">_callMethodReturn</span> <span class="p">(</span> <span class="n">TR</span><span class="p">(</span><span class="n">TC</span><span class="o">::*</span> <span class="n">method</span><span class="p">)(</span><span class="n">TArgsF</span><span class="p">...),</span> <span class="n">TC</span><span class="o">*</span> <span class="n">cppObject</span><span class="p">,</span> <span class="n">TArgsW</span><span class="p">...</span> <span class="n">args</span> <span class="p">)</span>
<span class="p">{</span> <span class="p">{</span>
<span class="n">TR</span> <span class="n">pvalue</span> <span class="o">=</span> <span class="p">(</span><span class="n">cppObject</span><span class="o">-&gt;*</span><span class="n">method</span><span class="p">)(</span> <span class="n">args</span><span class="p">...</span> <span class="p">);</span> <span class="n">TR</span> <span class="n">pvalue</span> <span class="o">=</span> <span class="p">(</span><span class="n">cppObject</span><span class="o">-&gt;*</span><span class="n">method</span><span class="p">)(</span> <span class="n">args</span><span class="p">...</span> <span class="p">);</span>
@ -646,8 +646,8 @@ a <tt class="docutils literal">const</tt> parameter which is non-<tt class="docu
<span class="p">}</span> <span class="p">}</span>
<span class="c1">// Flavor for &quot;return void&quot;.</span> <span class="c1">// Flavor for &quot;return void&quot;.</span>
<span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="n">TC</span><span class="p">,</span> <span class="k">typename</span> <span class="n">TR</span><span class="p">,</span> <span class="k">typename</span><span class="p">...</span> <span class="n">TArgsF</span><span class="p">,</span> <span class="k">typename</span><span class="p">...</span> <span class="n">TArgsW</span> <span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="nc">TC</span><span class="p">,</span> <span class="k">typename</span> <span class="nc">TR</span><span class="p">,</span> <span class="k">typename</span><span class="p">...</span> <span class="n">TArgsF</span><span class="p">,</span> <span class="k">typename</span><span class="p">...</span> <span class="n">TArgsW</span>
<span class="p">,</span> <span class="k">typename</span> <span class="n">std</span><span class="o">::</span><span class="n">enable_if</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">is_void</span><span class="o">&lt;</span><span class="n">TR</span><span class="o">&gt;::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">&gt;::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">&gt;</span> <span class="p">,</span> <span class="k">typename</span> <span class="nc">std</span><span class="o">::</span><span class="n">enable_if</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">is_void</span><span class="o">&lt;</span><span class="n">TR</span><span class="o">&gt;::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">&gt;::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">&gt;</span>
<span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">_callMethodReturn</span> <span class="p">(</span> <span class="n">TR</span><span class="p">(</span><span class="n">TC</span><span class="o">::*</span> <span class="n">method</span><span class="p">)(</span><span class="n">TArgsF</span><span class="p">...),</span> <span class="n">TC</span><span class="o">*</span> <span class="n">cppObject</span><span class="p">,</span> <span class="n">TArgsW</span><span class="p">...</span> <span class="n">args</span> <span class="p">)</span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">_callMethodReturn</span> <span class="p">(</span> <span class="n">TR</span><span class="p">(</span><span class="n">TC</span><span class="o">::*</span> <span class="n">method</span><span class="p">)(</span><span class="n">TArgsF</span><span class="p">...),</span> <span class="n">TC</span><span class="o">*</span> <span class="n">cppObject</span><span class="p">,</span> <span class="n">TArgsW</span><span class="p">...</span> <span class="n">args</span> <span class="p">)</span>
<span class="p">{</span> <span class="p">{</span>
<span class="p">(</span><span class="n">cppObject</span><span class="o">-&gt;*</span><span class="n">method</span><span class="p">)(</span> <span class="n">args</span><span class="p">...</span> <span class="p">);</span> <span class="p">(</span><span class="n">cppObject</span><span class="o">-&gt;*</span><span class="n">method</span><span class="p">)(</span> <span class="n">args</span><span class="p">...</span> <span class="p">);</span>
@ -655,19 +655,19 @@ a <tt class="docutils literal">const</tt> parameter which is non-<tt class="docu
<span class="p">}</span> <span class="p">}</span>
<span class="c1">// Make the translation call for a method without arguments.</span> <span class="c1">// Make the translation call for a method without arguments.</span>
<span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="n">TC</span><span class="p">,</span> <span class="k">typename</span> <span class="n">TR</span> <span class="o">&gt;</span> <span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="nc">TC</span><span class="p">,</span> <span class="k">typename</span> <span class="nc">TR</span> <span class="o">&gt;</span>
<span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">_callMethod</span> <span class="p">(</span> <span class="n">TR</span><span class="p">(</span><span class="n">TC</span><span class="o">::*</span> <span class="n">method</span><span class="p">)(),</span> <span class="n">TC</span><span class="o">*</span> <span class="n">cppObject</span><span class="p">,</span> <span class="n">Args</span><span class="o">&lt;&gt;&amp;</span> <span class="p">)</span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">_callMethod</span> <span class="p">(</span> <span class="n">TR</span><span class="p">(</span><span class="n">TC</span><span class="o">::*</span> <span class="n">method</span><span class="p">)(),</span> <span class="n">TC</span><span class="o">*</span> <span class="n">cppObject</span><span class="p">,</span> <span class="n">Args</span><span class="o">&lt;&gt;&amp;</span> <span class="p">)</span>
<span class="p">{</span> <span class="k">return</span> <span class="n">_callMethodReturn</span><span class="o">&lt;</span><span class="n">TC</span><span class="p">,</span><span class="n">TR</span><span class="o">&gt;</span><span class="p">(</span> <span class="n">method</span><span class="p">,</span> <span class="n">cppObject</span> <span class="p">);</span> <span class="p">}</span> <span class="p">{</span> <span class="k">return</span> <span class="n">_callMethodReturn</span><span class="o">&lt;</span><span class="n">TC</span><span class="p">,</span><span class="n">TR</span><span class="o">&gt;</span><span class="p">(</span> <span class="n">method</span><span class="p">,</span> <span class="n">cppObject</span> <span class="p">);</span> <span class="p">}</span>
<span class="c1">// Make the translation call for a method one argument.</span> <span class="c1">// Make the translation call for a method one argument.</span>
<span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="n">TC</span><span class="p">,</span> <span class="k">typename</span> <span class="n">TR</span><span class="p">,</span> <span class="k">typename</span> <span class="n">TA0</span> <span class="o">&gt;</span> <span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="nc">TC</span><span class="p">,</span> <span class="k">typename</span> <span class="nc">TR</span><span class="p">,</span> <span class="k">typename</span> <span class="nc">TA0</span> <span class="o">&gt;</span>
<span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">_callMethod</span> <span class="p">(</span> <span class="n">TR</span><span class="p">(</span><span class="n">TC</span><span class="o">::*</span> <span class="n">method</span><span class="p">)(</span><span class="n">TA0</span><span class="p">),</span> <span class="n">TC</span><span class="o">*</span> <span class="n">cppObject</span><span class="p">,</span> <span class="n">Args</span><span class="o">&lt;</span><span class="n">TA0</span><span class="o">&gt;&amp;</span> <span class="n">args</span> <span class="p">)</span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">_callMethod</span> <span class="p">(</span> <span class="n">TR</span><span class="p">(</span><span class="n">TC</span><span class="o">::*</span> <span class="n">method</span><span class="p">)(</span><span class="n">TA0</span><span class="p">),</span> <span class="n">TC</span><span class="o">*</span> <span class="n">cppObject</span><span class="p">,</span> <span class="n">Args</span><span class="o">&lt;</span><span class="n">TA0</span><span class="o">&gt;&amp;</span> <span class="n">args</span> <span class="p">)</span>
<span class="p">{</span> <span class="k">return</span> <span class="n">_callMethodReturn</span><span class="p">(</span> <span class="n">method</span><span class="p">,</span> <span class="n">cppObject</span><span class="p">,</span> <span class="n">as</span><span class="o">&lt;</span><span class="n">TA0</span><span class="o">&gt;</span><span class="p">(</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">)</span> <span class="p">);</span> <span class="p">}</span> <span class="p">{</span> <span class="k">return</span> <span class="nf">_callMethodReturn</span><span class="p">(</span> <span class="n">method</span><span class="p">,</span> <span class="n">cppObject</span><span class="p">,</span> <span class="n">as</span><span class="o">&lt;</span><span class="n">TA0</span><span class="o">&gt;</span><span class="p">(</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">)</span> <span class="p">);</span> <span class="p">}</span>
<span class="c1">// Make the translation call for a method two argument.</span> <span class="c1">// Make the translation call for a method two argument.</span>
<span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="n">TC</span><span class="p">,</span> <span class="k">typename</span> <span class="n">TR</span><span class="p">,</span> <span class="k">typename</span> <span class="n">TA0</span><span class="p">,</span> <span class="k">typename</span> <span class="n">TA1</span> <span class="o">&gt;</span> <span class="k">template</span><span class="o">&lt;</span> <span class="k">typename</span> <span class="nc">TC</span><span class="p">,</span> <span class="k">typename</span> <span class="nc">TR</span><span class="p">,</span> <span class="k">typename</span> <span class="nc">TA0</span><span class="p">,</span> <span class="k">typename</span> <span class="nc">TA1</span> <span class="o">&gt;</span>
<span class="n">PyObject</span><span class="o">*</span> <span class="n">_callMethod</span> <span class="p">(</span> <span class="n">TR</span><span class="p">(</span><span class="n">TC</span><span class="o">::*</span> <span class="n">method</span><span class="p">)(</span><span class="n">TA0</span><span class="p">,</span><span class="n">TA1</span><span class="p">),</span> <span class="n">TC</span><span class="o">*</span> <span class="n">cppObject</span><span class="p">,</span> <span class="n">Args</span><span class="o">&lt;</span><span class="n">TA0</span><span class="p">,</span><span class="n">TA1</span><span class="o">&gt;&amp;</span> <span class="n">args</span> <span class="p">)</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">_callMethod</span> <span class="p">(</span> <span class="n">TR</span><span class="p">(</span><span class="n">TC</span><span class="o">::*</span> <span class="n">method</span><span class="p">)(</span><span class="n">TA0</span><span class="p">,</span><span class="n">TA1</span><span class="p">),</span> <span class="n">TC</span><span class="o">*</span> <span class="n">cppObject</span><span class="p">,</span> <span class="n">Args</span><span class="o">&lt;</span><span class="n">TA0</span><span class="p">,</span><span class="n">TA1</span><span class="o">&gt;&amp;</span> <span class="n">args</span> <span class="p">)</span>
<span class="p">{</span> <span class="k">return</span> <span class="n">_callMethodReturn</span><span class="p">(</span> <span class="n">method</span><span class="p">,</span> <span class="n">cppObject</span><span class="p">,</span> <span class="n">as</span><span class="o">&lt;</span><span class="n">TA0</span><span class="o">&gt;</span><span class="p">(</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">),</span> <span class="n">as</span><span class="o">&lt;</span><span class="n">TA1</span><span class="o">&gt;</span><span class="p">(</span> <span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">)</span> <span class="p">);</span> <span class="p">}</span> <span class="p">{</span> <span class="k">return</span> <span class="nf">_callMethodReturn</span><span class="p">(</span> <span class="n">method</span><span class="p">,</span> <span class="n">cppObject</span><span class="p">,</span> <span class="n">as</span><span class="o">&lt;</span><span class="n">TA0</span><span class="o">&gt;</span><span class="p">(</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">),</span> <span class="n">as</span><span class="o">&lt;</span><span class="n">TA1</span><span class="o">&gt;</span><span class="p">(</span> <span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">)</span> <span class="p">);</span> <span class="p">}</span>
</pre></div> </pre></div>
<p>The complete work of translating the Python tuple into a <tt class="docutils literal">Args&lt;&gt;</tt> is done inside <p>The complete work of translating the Python tuple into a <tt class="docutils literal">Args&lt;&gt;</tt> is done inside
a dedicated template class <tt class="docutils literal">PyWrapper</tt> and it's <tt class="docutils literal">call()</tt> method. a dedicated template class <tt class="docutils literal">PyWrapper</tt> and it's <tt class="docutils literal">call()</tt> method.
@ -686,8 +686,8 @@ per overload.</li>
<p>As a class template cannot guess the template parameters, we wrap them into a <p>As a class template cannot guess the template parameters, we wrap them into a
function template which can perform the guess. The <tt class="docutils literal">callMethod&lt;&gt;</tt> template function.</p> function template which can perform the guess. The <tt class="docutils literal">callMethod&lt;&gt;</tt> template function.</p>
<p>In the end, what the user can write is simply:</p> <p>In the end, what the user can write is simply:</p>
<div class="highlight"><pre><span></span><span class="k">static</span> <span class="n">PyObject</span><span class="o">*</span> <span class="nf">PyParameter_addValue</span> <span class="p">(</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">self</span><span class="p">,</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">args</span> <span class="p">)</span> <div class="highlight"><pre><span></span><span class="k">static</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">PyParameter_addValue</span> <span class="p">(</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">self</span><span class="p">,</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">args</span> <span class="p">)</span>
<span class="p">{</span> <span class="k">return</span> <span class="n">callMethod</span><span class="p">(</span><span class="s">&quot;Parameter.addValue&quot;</span><span class="p">,</span><span class="o">&amp;</span><span class="n">Parameter</span><span class="o">::</span><span class="n">addValue</span><span class="p">,</span><span class="n">self</span><span class="p">,</span><span class="n">args</span><span class="p">);</span> <span class="p">}</span> <span class="p">{</span> <span class="k">return</span> <span class="nf">callMethod</span><span class="p">(</span><span class="s">&quot;Parameter.addValue&quot;</span><span class="p">,</span><span class="o">&amp;</span><span class="n">Parameter</span><span class="o">::</span><span class="n">addValue</span><span class="p">,</span><span class="n">self</span><span class="p">,</span><span class="n">args</span><span class="p">);</span> <span class="p">}</span>
<span class="n">PyMethodDef</span> <span class="n">PyParameter_Methods</span><span class="p">[]</span> <span class="o">=</span> <span class="n">PyMethodDef</span> <span class="n">PyParameter_Methods</span><span class="p">[]</span> <span class="o">=</span>
<span class="p">{</span> <span class="p">{</span> <span class="s">&quot;isFile&quot;</span> <span class="p">,</span> <span class="p">(</span><span class="n">PyCFunction</span><span class="p">)</span><span class="n">PyParameter_isFile</span> <span class="p">,</span> <span class="n">METH_NOARGS</span> <span class="p">{</span> <span class="p">{</span> <span class="s">&quot;isFile&quot;</span> <span class="p">,</span> <span class="p">(</span><span class="n">PyCFunction</span><span class="p">)</span><span class="n">PyParameter_isFile</span> <span class="p">,</span> <span class="n">METH_NOARGS</span>
@ -706,7 +706,7 @@ function template which can perform the guess. The <tt class="docutils literal">
with differents arguments to expose all the various signature of the function. with differents arguments to expose all the various signature of the function.
We then create a function wrapper that calls them in decreasing number of We then create a function wrapper that calls them in decreasing number of
parameters order.</p> parameters order.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">If something goes wrong in a <tt class="docutils literal">callMethod()</tt>, it returns <tt class="docutils literal">NULL</tt> and <p class="last">If something goes wrong in a <tt class="docutils literal">callMethod()</tt>, it returns <tt class="docutils literal">NULL</tt> and
sets an error exception. If, say, the <tt class="docutils literal">setString3()</tt> variant fails, sets an error exception. If, say, the <tt class="docutils literal">setString3()</tt> variant fails,
@ -717,19 +717,19 @@ to something non-<tt class="docutils literal">NULL</tt>.</p>
of a normal function, not a class method, with the object (aka C++ <tt class="docutils literal">this</tt> of a normal function, not a class method, with the object (aka C++ <tt class="docutils literal">this</tt>
passed as the first argument). So <tt class="docutils literal">callMethod()</tt> and <tt class="docutils literal">PyMethodWrapper</tt> passed as the first argument). So <tt class="docutils literal">callMethod()</tt> and <tt class="docutils literal">PyMethodWrapper</tt>
support both case (through different constructors).</p> support both case (through different constructors).</p>
<div class="highlight"><pre><span></span><span class="k">static</span> <span class="kt">bool</span> <span class="nf">setString1</span> <span class="p">(</span> <span class="n">Parameter</span><span class="o">*</span> <span class="n">self</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">value</span> <span class="p">)</span> <div class="highlight"><pre><span></span><span class="k">static</span> <span class="kt">bool</span> <span class="n">setString1</span> <span class="p">(</span> <span class="n">Parameter</span><span class="o">*</span> <span class="n">self</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">value</span> <span class="p">)</span>
<span class="p">{</span> <span class="k">return</span> <span class="n">self</span><span class="o">-&gt;</span><span class="n">setString</span><span class="p">(</span><span class="n">value</span><span class="p">);</span> <span class="p">}</span> <span class="p">{</span> <span class="k">return</span> <span class="n">self</span><span class="o">-&gt;</span><span class="n">setString</span><span class="p">(</span><span class="n">value</span><span class="p">);</span> <span class="p">}</span>
<span class="k">static</span> <span class="kt">bool</span> <span class="nf">setString2</span> <span class="p">(</span> <span class="n">Parameter</span><span class="o">*</span> <span class="n">self</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">value</span><span class="p">,</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">flags</span> <span class="p">)</span> <span class="k">static</span> <span class="kt">bool</span> <span class="n">setString2</span> <span class="p">(</span> <span class="n">Parameter</span><span class="o">*</span> <span class="n">self</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">value</span><span class="p">,</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">flags</span> <span class="p">)</span>
<span class="p">{</span> <span class="k">return</span> <span class="n">self</span><span class="o">-&gt;</span><span class="n">setString</span><span class="p">(</span><span class="n">value</span><span class="p">,</span><span class="n">Configuration</span><span class="o">::</span><span class="n">getDefaultPriority</span><span class="p">(),</span><span class="n">flags</span><span class="p">);</span> <span class="p">}</span> <span class="p">{</span> <span class="k">return</span> <span class="n">self</span><span class="o">-&gt;</span><span class="n">setString</span><span class="p">(</span><span class="n">value</span><span class="p">,</span><span class="n">Configuration</span><span class="o">::</span><span class="n">getDefaultPriority</span><span class="p">(),</span><span class="n">flags</span><span class="p">);</span> <span class="p">}</span>
<span class="k">static</span> <span class="kt">bool</span> <span class="nf">setString3</span> <span class="p">(</span> <span class="n">Parameter</span><span class="o">*</span> <span class="n">self</span> <span class="k">static</span> <span class="kt">bool</span> <span class="n">setString3</span> <span class="p">(</span> <span class="n">Parameter</span><span class="o">*</span> <span class="n">self</span>
<span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">value</span> <span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">value</span>
<span class="p">,</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">flags</span> <span class="p">,</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">flags</span>
<span class="p">,</span> <span class="n">Parameter</span><span class="o">::</span><span class="n">Priority</span> <span class="n">pri</span> <span class="p">)</span> <span class="p">,</span> <span class="n">Parameter</span><span class="o">::</span><span class="n">Priority</span> <span class="n">pri</span> <span class="p">)</span>
<span class="p">{</span> <span class="k">return</span> <span class="n">self</span><span class="o">-&gt;</span><span class="n">setString</span><span class="p">(</span><span class="n">value</span><span class="p">,</span><span class="n">pri</span><span class="p">,</span><span class="n">flags</span><span class="p">);</span> <span class="p">}</span> <span class="p">{</span> <span class="k">return</span> <span class="n">self</span><span class="o">-&gt;</span><span class="n">setString</span><span class="p">(</span><span class="n">value</span><span class="p">,</span><span class="n">pri</span><span class="p">,</span><span class="n">flags</span><span class="p">);</span> <span class="p">}</span>
<span class="k">static</span> <span class="n">PyObject</span><span class="o">*</span> <span class="nf">PyParameter_setString</span> <span class="p">(</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">self</span><span class="p">,</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">args</span> <span class="p">)</span> <span class="k">static</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">PyParameter_setString</span> <span class="p">(</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">self</span><span class="p">,</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">args</span> <span class="p">)</span>
<span class="p">{</span> <span class="p">{</span>
<span class="n">PyObject</span><span class="o">*</span> <span class="n">rvalue</span> <span class="o">=</span> <span class="n">callMethod</span><span class="p">(</span><span class="s">&quot;Parameter.setString&quot;</span><span class="p">,</span><span class="o">&amp;</span><span class="n">setString3</span><span class="p">,</span><span class="n">self</span><span class="p">,</span><span class="n">args</span><span class="p">);</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">rvalue</span> <span class="o">=</span> <span class="n">callMethod</span><span class="p">(</span><span class="s">&quot;Parameter.setString&quot;</span><span class="p">,</span><span class="o">&amp;</span><span class="n">setString3</span><span class="p">,</span><span class="n">self</span><span class="p">,</span><span class="n">args</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">not</span> <span class="n">rvalue</span><span class="p">)</span> <span class="n">rvalue</span> <span class="o">=</span> <span class="n">callMethod</span><span class="p">(</span><span class="s">&quot;Parameter.setString&quot;</span><span class="p">,</span><span class="o">&amp;</span><span class="n">setString2</span><span class="p">,</span><span class="n">self</span><span class="p">,</span><span class="n">args</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="n">not</span> <span class="n">rvalue</span><span class="p">)</span> <span class="n">rvalue</span> <span class="o">=</span> <span class="n">callMethod</span><span class="p">(</span><span class="s">&quot;Parameter.setString&quot;</span><span class="p">,</span><span class="o">&amp;</span><span class="n">setString2</span><span class="p">,</span><span class="n">self</span><span class="p">,</span><span class="n">args</span><span class="p">);</span>
@ -751,8 +751,8 @@ support both case (through different constructors).</p>
<h3><a class="toc-backref" href="#id12">2.7 Wrapper for ordinary functions</a></h3> <h3><a class="toc-backref" href="#id12">2.7 Wrapper for ordinary functions</a></h3>
<p>The same mechanic as for the object methods has been built for ordinary <p>The same mechanic as for the object methods has been built for ordinary
functions. The top level wrapper beeing <tt class="docutils literal"><span class="pre">callFunction&lt;&gt;()</span></tt> ...</p> functions. The top level wrapper beeing <tt class="docutils literal"><span class="pre">callFunction&lt;&gt;()</span></tt> ...</p>
<div class="highlight"><pre><span></span><span class="k">static</span> <span class="n">PyObject</span><span class="o">*</span> <span class="nf">PyCfg_hasParameter</span> <span class="p">(</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">module</span><span class="p">,</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">args</span> <span class="p">)</span> <div class="highlight"><pre><span></span><span class="k">static</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">PyCfg_hasParameter</span> <span class="p">(</span> <span class="n">PyObject</span><span class="o">*</span> <span class="k">module</span><span class="p">,</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">args</span> <span class="p">)</span>
<span class="p">{</span> <span class="k">return</span> <span class="n">callFunction</span><span class="p">(</span><span class="s">&quot;hasParameter&quot;</span><span class="p">,</span><span class="o">&amp;</span><span class="n">hasParameter</span><span class="p">,</span><span class="n">args</span><span class="p">);</span> <span class="p">}</span> <span class="p">{</span> <span class="k">return</span> <span class="nf">callFunction</span><span class="p">(</span><span class="s">&quot;hasParameter&quot;</span><span class="p">,</span><span class="o">&amp;</span><span class="n">hasParameter</span><span class="p">,</span><span class="n">args</span><span class="p">);</span> <span class="p">}</span>
<span class="k">static</span> <span class="n">PyMethodDef</span> <span class="n">PyCfg_Methods</span><span class="p">[]</span> <span class="o">=</span> <span class="k">static</span> <span class="n">PyMethodDef</span> <span class="n">PyCfg_Methods</span><span class="p">[]</span> <span class="o">=</span>
<span class="p">{</span> <span class="p">{</span> <span class="s">&quot;hasParameter&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">PyCFunction</span><span class="p">)</span><span class="n">PyCfg_hasParameter</span><span class="p">,</span> <span class="n">METH_VARARGS</span> <span class="p">{</span> <span class="p">{</span> <span class="s">&quot;hasParameter&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">PyCFunction</span><span class="p">)</span><span class="n">PyCfg_hasParameter</span><span class="p">,</span> <span class="n">METH_VARARGS</span>

View File

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Printable version of this Document PythonCpp.pdf Contents Printable version of this Document 1. Introduction 2. Basic File Structure and CMake configuration 3. Case 1 - DBo Derived, Standalone 4. ..."> <meta name="description" content="Printable version of this Document PythonCpp.pdf Contents Printable version of this Document 1. Introduction 2. Basic File Structure and CMake configuration 3. Case 1 - DBo Derived, Standalone 4....">
<meta name="keywords" content=""> <meta name="keywords" content="">
<link rel="icon" href="../favicon.ico"> <link rel="icon" href="../favicon.ico">
@ -123,7 +123,7 @@
<h2><a class="toc-backref" href="#id7">Printable version of this Document</a></h2> <h2><a class="toc-backref" href="#id7">Printable version of this Document</a></h2>
<p><a class="reference external" href="../pdfs/PythonCpp.pdf">PythonCpp.pdf</a></p> <p><a class="reference external" href="../pdfs/PythonCpp.pdf">PythonCpp.pdf</a></p>
<div class="contents topic" id="contents"> <div class="contents topic" id="contents">
<p class="topic-title first">Contents</p> <p class="topic-title">Contents</p>
<ul class="simple"> <ul class="simple">
<li><a class="reference internal" href="#printable-version-of-this-document" id="id7">Printable version of this Document</a></li> <li><a class="reference internal" href="#printable-version-of-this-document" id="id7">Printable version of this Document</a></li>
<li><a class="reference internal" href="#introduction" id="id8">1. Introduction</a></li> <li><a class="reference internal" href="#introduction" id="id8">1. Introduction</a></li>
@ -262,7 +262,7 @@ At some point I may root it out, but it is used in so many places...</p>
<p>What I should have used the <tt class="docutils literal">&quot;O!&quot;</tt> capablity of <tt class="docutils literal">PyArg_ParseTuple()</tt>, <p>What I should have used the <tt class="docutils literal">&quot;O!&quot;</tt> capablity of <tt class="docutils literal">PyArg_ParseTuple()</tt>,
like in the code below:</p> like in the code below:</p>
<p></p> <p></p>
<div class="highlight"><pre><span></span><span class="k">static</span> <span class="n">PyObject</span><span class="o">*</span> <span class="nf">PyContact_create</span> <span class="p">(</span> <span class="n">PyObject</span><span class="o">*</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">args</span> <span class="p">)</span> <div class="highlight"><pre><span></span><span class="k">static</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">PyContact_create</span> <span class="p">(</span> <span class="n">PyObject</span><span class="o">*</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">args</span> <span class="p">)</span>
<span class="p">{</span> <span class="p">{</span>
<span class="n">Contact</span><span class="o">*</span> <span class="n">contact</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span> <span class="n">Contact</span><span class="o">*</span> <span class="n">contact</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
<span class="n">HTRY</span> <span class="n">HTRY</span>
@ -360,8 +360,8 @@ as a base class.</p>
<span class="k">extern</span> <span class="n">PyTypeObject</span> <span class="n">PyTypeLibrary</span><span class="p">;</span> <span class="k">extern</span> <span class="n">PyTypeObject</span> <span class="n">PyTypeLibrary</span><span class="p">;</span>
<span class="k">extern</span> <span class="n">PyMethodDef</span> <span class="n">PyLibrary_Methods</span><span class="p">[];</span> <span class="k">extern</span> <span class="n">PyMethodDef</span> <span class="n">PyLibrary_Methods</span><span class="p">[];</span>
<span class="k">extern</span> <span class="n">PyObject</span><span class="o">*</span> <span class="nf">PyLibrary_Link</span> <span class="p">(</span> <span class="n">Hurricane</span><span class="o">::</span><span class="n">Library</span><span class="o">*</span> <span class="n">lib</span> <span class="p">);</span> <span class="k">extern</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">PyLibrary_Link</span> <span class="p">(</span> <span class="n">Hurricane</span><span class="o">::</span><span class="n">Library</span><span class="o">*</span> <span class="n">lib</span> <span class="p">);</span>
<span class="k">extern</span> <span class="kt">void</span> <span class="nf">PyLibrary_LinkPyType</span> <span class="p">();</span> <span class="k">extern</span> <span class="kt">void</span> <span class="n">PyLibrary_LinkPyType</span> <span class="p">();</span>
<span class="cp">#define IsPyLibrary(v) ( (v)-&gt;ob_type == &amp;PyTypeLibrary )</span> <span class="cp">#define IsPyLibrary(v) ( (v)-&gt;ob_type == &amp;PyTypeLibrary )</span>
@ -383,7 +383,7 @@ of the C++ class we want to wrap (<tt class="docutils literal">Library.h</tt>).<
an <tt class="docutils literal">extern &quot;C&quot;</tt> namespace.</p> an <tt class="docutils literal">extern &quot;C&quot;</tt> namespace.</p>
</li> </li>
<li><p class="first">Definition of the wrapped <span class="cb">struct</span>, <tt class="docutils literal">PyLibrary</tt>. It is standard Python here.</p> <li><p class="first">Definition of the wrapped <span class="cb">struct</span>, <tt class="docutils literal">PyLibrary</tt>. It is standard Python here.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">For our set of macros to work, the name of the pointer to the <p class="last">For our set of macros to work, the name of the pointer to the
C++ class must always be <strong>_object</strong>, and the various functions and C++ class must always be <strong>_object</strong>, and the various functions and
@ -444,12 +444,12 @@ to the C++ working object.</li>
the class. For common predicates, accessors, and mutators macros the class. For common predicates, accessors, and mutators macros
are supplied.</p> are supplied.</p>
<p>Wrapping of the <tt class="docutils literal"><span class="pre">Library::getCell()</span></tt> method:</p> <p>Wrapping of the <tt class="docutils literal"><span class="pre">Library::getCell()</span></tt> method:</p>
<div class="highlight"><pre><span></span><span class="k">static</span> <span class="n">PyObject</span><span class="o">*</span> <span class="nf">PyLibrary_getCell</span> <span class="p">(</span> <span class="n">PyLibrary</span><span class="o">*</span> <span class="n">self</span><span class="p">,</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">args</span> <span class="p">)</span> <div class="highlight"><pre><span></span><span class="k">static</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">PyLibrary_getCell</span> <span class="p">(</span> <span class="n">PyLibrary</span><span class="o">*</span> <span class="n">self</span><span class="p">,</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">args</span> <span class="p">)</span>
<span class="p">{</span> <span class="p">{</span>
<span class="n">Cell</span><span class="o">*</span> <span class="n">cell</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span> <span class="n">Cell</span><span class="o">*</span> <span class="n">cell</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
<span class="n">HTRY</span> <span class="n">HTRY</span>
<span class="n">METHOD_HEAD</span><span class="p">(</span> <span class="s">&quot;Library.getCell()&quot;</span> <span class="p">)</span> <span class="nf">METHOD_HEAD</span><span class="p">(</span> <span class="s">&quot;Library.getCell()&quot; )</span>
<span class="kt">char</span><span class="o">*</span> <span class="n">name</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span> <span class="kt">char</span><span class="o">*</span> <span class="n">name</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="n">PyArg_ParseTuple</span><span class="p">(</span><span class="n">args</span><span class="p">,</span><span class="s">&quot;s:Library.getCell&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">name</span><span class="p">))</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">PyArg_ParseTuple</span><span class="p">(</span><span class="n">args</span><span class="p">,</span><span class="s">&quot;s:Library.getCell&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">name</span><span class="p">))</span> <span class="p">{</span>
<span class="n">cell</span> <span class="o">=</span> <span class="n">lib</span><span class="o">-&gt;</span><span class="n">getCell</span><span class="p">(</span> <span class="n">Name</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="p">);</span> <span class="n">cell</span> <span class="o">=</span> <span class="n">lib</span><span class="o">-&gt;</span><span class="n">getCell</span><span class="p">(</span> <span class="n">Name</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="p">);</span>
@ -476,7 +476,7 @@ it must be included.</li>
</ol> </ol>
<p></p> <p></p>
<p>Wrapping of the <tt class="docutils literal"><span class="pre">Library::create()</span></tt> method:</p> <p>Wrapping of the <tt class="docutils literal"><span class="pre">Library::create()</span></tt> method:</p>
<div class="highlight"><pre><span></span><span class="k">static</span> <span class="n">PyObject</span><span class="o">*</span> <span class="nf">PyLibrary_create</span><span class="p">(</span> <span class="n">PyObject</span><span class="o">*</span><span class="p">,</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">args</span> <span class="p">)</span> <div class="highlight"><pre><span></span><span class="k">static</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">PyLibrary_create</span><span class="p">(</span> <span class="n">PyObject</span><span class="o">*</span><span class="p">,</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">args</span> <span class="p">)</span>
<span class="p">{</span> <span class="p">{</span>
<span class="n">PyObject</span><span class="o">*</span> <span class="n">arg0</span><span class="p">;</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">arg0</span><span class="p">;</span>
<span class="n">PyObject</span><span class="o">*</span> <span class="n">arg1</span><span class="p">;</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">arg1</span><span class="p">;</span>
@ -563,7 +563,7 @@ named from the class: <tt class="docutils literal">PyLibrary_Methods</tt>.</p>
<p>Defining the <tt class="docutils literal">PyTypeLibrary</tt> class methods and the type linking function.</p> <p>Defining the <tt class="docutils literal">PyTypeLibrary</tt> class methods and the type linking function.</p>
<p>Those are the functions for the Python object itself to work, not the <p>Those are the functions for the Python object itself to work, not the
wrapped method from the C++ class.</p> wrapped method from the C++ class.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">At this point we <strong>do not</strong> define the <tt class="docutils literal">PyTypeLibrary</tt> itself. <p class="last">At this point we <strong>do not</strong> define the <tt class="docutils literal">PyTypeLibrary</tt> itself.
Only it's functions and a function to set them up <em>once</em> the Only it's functions and a function to set them up <em>once</em> the
@ -627,15 +627,15 @@ namespace.</p>
<span class="n">__cs</span><span class="p">.</span><span class="n">addType</span><span class="p">(</span> <span class="s">&quot;library&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">PyTypeLibrary</span><span class="p">,</span> <span class="s">&quot;&lt;Library&gt;&quot;</span><span class="p">,</span> <span class="nb">false</span> <span class="p">);</span> <span class="c1">// step 3.</span> <span class="n">__cs</span><span class="p">.</span><span class="n">addType</span><span class="p">(</span> <span class="s">&quot;library&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">PyTypeLibrary</span><span class="p">,</span> <span class="s">&quot;&lt;Library&gt;&quot;</span><span class="p">,</span> <span class="nb">false</span> <span class="p">);</span> <span class="c1">// step 3.</span>
<span class="n">PyObject</span><span class="o">*</span> <span class="n">module</span> <span class="o">=</span> <span class="n">Py_InitModule</span><span class="p">(</span> <span class="s">&quot;Hurricane&quot;</span><span class="p">,</span> <span class="n">PyHurricane_Methods</span> <span class="p">);</span> <span class="n">PyObject</span><span class="o">*</span> <span class="k">module</span> <span class="o">=</span> <span class="n">Py_InitModule</span><span class="p">(</span> <span class="s">&quot;Hurricane&quot;</span><span class="p">,</span> <span class="n">PyHurricane_Methods</span> <span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">module</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="k">module</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
<span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;[ERROR]</span><span class="se">\n</span><span class="s">&quot;</span> <span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;[ERROR]</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="o">&lt;&lt;</span> <span class="s">&quot; Failed to initialize Hurricane module.&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; Failed to initialize Hurricane module.&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
<span class="k">return</span><span class="p">;</span> <span class="k">return</span><span class="p">;</span>
<span class="p">}</span> <span class="p">}</span>
<span class="n">Py_INCREF</span><span class="p">(</span> <span class="o">&amp;</span><span class="n">PyTypeLibrary</span> <span class="p">);</span> <span class="c1">// step 4.</span> <span class="n">Py_INCREF</span><span class="p">(</span> <span class="o">&amp;</span><span class="n">PyTypeLibrary</span> <span class="p">);</span> <span class="c1">// step 4.</span>
<span class="n">PyModule_AddObject</span><span class="p">(</span> <span class="n">module</span><span class="p">,</span> <span class="s">&quot;Library&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">PyObject</span><span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">PyTypeLibrary</span> <span class="p">);</span> <span class="c1">// step 4.</span> <span class="n">PyModule_AddObject</span><span class="p">(</span> <span class="k">module</span><span class="p">,</span> <span class="s">&quot;Library&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">PyObject</span><span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">PyTypeLibrary</span> <span class="p">);</span> <span class="c1">// step 4.</span>
<span class="p">}</span> <span class="p">}</span>
</pre></div> </pre></div>
<p>The <tt class="docutils literal">initHurricane()</tt> initialisation function shown above has <p>The <tt class="docutils literal">initHurricane()</tt> initialisation function shown above has
@ -756,7 +756,7 @@ macro: <tt class="docutils literal">PyTypeRootObjectDefinitions</tt>, dedicated
<span class="nf">METHOD_HEAD</span><span class="p">(</span> <span class="s">&quot;Entity.getCell()&quot; )</span> <span class="nf">METHOD_HEAD</span><span class="p">(</span> <span class="s">&quot;Entity.getCell()&quot; )</span>
<span class="n">cell</span> <span class="o">=</span> <span class="n">entity</span><span class="o">-&gt;</span><span class="n">getCell</span><span class="p">();</span> <span class="n">cell</span> <span class="o">=</span> <span class="n">entity</span><span class="o">-&gt;</span><span class="n">getCell</span><span class="p">();</span>
<span class="n">HCATCH</span> <span class="n">HCATCH</span>
<span class="k">return</span> <span class="nf">PyCell_Link</span><span class="p">(</span> <span class="n">cell</span> <span class="p">);</span> <span class="k">return</span> <span class="n">PyCell_Link</span><span class="p">(</span> <span class="n">cell</span> <span class="p">);</span>
<span class="p">}</span> <span class="p">}</span>
<span class="n">PyMethodDef</span> <span class="n">PyEntity_Methods</span><span class="p">[]</span> <span class="o">=</span> <span class="n">PyMethodDef</span> <span class="n">PyEntity_Methods</span><span class="p">[]</span> <span class="o">=</span>
@ -841,7 +841,7 @@ this is <em>not</em> a pointer but a whole object).</li>
<span class="k">extern</span> <span class="n">PyTypeObject</span> <span class="n">PyTypeComponent</span><span class="p">;</span> <span class="k">extern</span> <span class="n">PyTypeObject</span> <span class="n">PyTypeComponent</span><span class="p">;</span>
<span class="k">extern</span> <span class="n">PyMethodDef</span> <span class="n">PyComponent_Methods</span><span class="p">[];</span> <span class="k">extern</span> <span class="n">PyMethodDef</span> <span class="n">PyComponent_Methods</span><span class="p">[];</span>
<span class="k">extern</span> <span class="kt">void</span> <span class="nf">PyComponent_LinkPyType</span> <span class="p">();</span> <span class="k">extern</span> <span class="kt">void</span> <span class="n">PyComponent_LinkPyType</span> <span class="p">();</span>
<span class="cp">#define IsPyComponent(v) ((v)-&gt;ob_type == &amp;PyTypeComponent)</span> <span class="cp">#define IsPyComponent(v) ((v)-&gt;ob_type == &amp;PyTypeComponent)</span>
<span class="cp">#define PYCOMPONENT(v) ((PyComponent*)(v))</span> <span class="cp">#define PYCOMPONENT(v) ((PyComponent*)(v))</span>
@ -901,7 +901,7 @@ base class.</li>
<span class="nf">METHOD_HEAD</span><span class="p">(</span> <span class="s">&quot;Component.getNet()&quot; )</span> <span class="nf">METHOD_HEAD</span><span class="p">(</span> <span class="s">&quot;Component.getNet()&quot; )</span>
<span class="n">net</span> <span class="o">=</span> <span class="n">component</span><span class="o">-&gt;</span><span class="n">getNet</span><span class="p">(</span> <span class="p">);</span> <span class="n">net</span> <span class="o">=</span> <span class="n">component</span><span class="o">-&gt;</span><span class="n">getNet</span><span class="p">(</span> <span class="p">);</span>
<span class="n">HCATCH</span> <span class="n">HCATCH</span>
<span class="k">return</span> <span class="nf">PyNet_Link</span><span class="p">(</span> <span class="n">net</span> <span class="p">);</span> <span class="k">return</span> <span class="n">PyNet_Link</span><span class="p">(</span> <span class="n">net</span> <span class="p">);</span>
<span class="p">}</span> <span class="p">}</span>
<span class="n">PyMethodDef</span> <span class="n">PyComponent_Methods</span><span class="p">[]</span> <span class="o">=</span> <span class="n">PyMethodDef</span> <span class="n">PyComponent_Methods</span><span class="p">[]</span> <span class="o">=</span>
@ -949,8 +949,8 @@ at this level because the class is a concrete one and can be instanciated.</p>
<span class="k">extern</span> <span class="n">PyTypeObject</span> <span class="n">PyTypeContact</span><span class="p">;</span> <span class="k">extern</span> <span class="n">PyTypeObject</span> <span class="n">PyTypeContact</span><span class="p">;</span>
<span class="k">extern</span> <span class="n">PyMethodDef</span> <span class="n">PyContact_Methods</span><span class="p">[];</span> <span class="k">extern</span> <span class="n">PyMethodDef</span> <span class="n">PyContact_Methods</span><span class="p">[];</span>
<span class="k">extern</span> <span class="n">PyObject</span><span class="o">*</span> <span class="nf">PyContact_Link</span> <span class="p">(</span> <span class="n">Hurricane</span><span class="o">::</span><span class="n">Contact</span><span class="o">*</span> <span class="n">object</span> <span class="p">);</span> <span class="k">extern</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">PyContact_Link</span> <span class="p">(</span> <span class="n">Hurricane</span><span class="o">::</span><span class="n">Contact</span><span class="o">*</span> <span class="n">object</span> <span class="p">);</span>
<span class="k">extern</span> <span class="kt">void</span> <span class="nf">PyContact_LinkPyType</span> <span class="p">();</span> <span class="k">extern</span> <span class="kt">void</span> <span class="n">PyContact_LinkPyType</span> <span class="p">();</span>
<span class="cp">#define IsPyContact(v) ( (v)-&gt;ob_type == &amp;PyTypeContact )</span> <span class="cp">#define IsPyContact(v) ( (v)-&gt;ob_type == &amp;PyTypeContact )</span>
<span class="cp">#define PYCONTACT(v) ( (PyContact*)(v) )</span> <span class="cp">#define PYCONTACT(v) ( (PyContact*)(v) )</span>
@ -1049,15 +1049,15 @@ terminal or not.</li>
<span class="n">__cs</span><span class="p">.</span><span class="n">addType</span><span class="p">(</span> <span class="s">&quot;comp&quot;</span> <span class="p">,</span> <span class="o">&amp;</span><span class="n">PyTypeComponent</span><span class="p">,</span> <span class="s">&quot;&lt;Component&gt;&quot;</span><span class="p">,</span> <span class="nb">false</span><span class="p">,</span> <span class="s">&quot;ent&quot;</span> <span class="p">);</span> <span class="n">__cs</span><span class="p">.</span><span class="n">addType</span><span class="p">(</span> <span class="s">&quot;comp&quot;</span> <span class="p">,</span> <span class="o">&amp;</span><span class="n">PyTypeComponent</span><span class="p">,</span> <span class="s">&quot;&lt;Component&gt;&quot;</span><span class="p">,</span> <span class="nb">false</span><span class="p">,</span> <span class="s">&quot;ent&quot;</span> <span class="p">);</span>
<span class="n">__cs</span><span class="p">.</span><span class="n">addType</span><span class="p">(</span> <span class="s">&quot;contact&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">PyTypeContact</span> <span class="p">,</span> <span class="s">&quot;&lt;Contact&gt;&quot;</span> <span class="p">,</span> <span class="nb">false</span><span class="p">,</span> <span class="s">&quot;comp&quot;</span> <span class="p">);</span> <span class="n">__cs</span><span class="p">.</span><span class="n">addType</span><span class="p">(</span> <span class="s">&quot;contact&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">PyTypeContact</span> <span class="p">,</span> <span class="s">&quot;&lt;Contact&gt;&quot;</span> <span class="p">,</span> <span class="nb">false</span><span class="p">,</span> <span class="s">&quot;comp&quot;</span> <span class="p">);</span>
<span class="n">PyObject</span><span class="o">*</span> <span class="n">module</span> <span class="o">=</span> <span class="n">Py_InitModule</span><span class="p">(</span> <span class="s">&quot;Hurricane&quot;</span><span class="p">,</span> <span class="n">PyHurricane_Methods</span> <span class="p">);</span> <span class="n">PyObject</span><span class="o">*</span> <span class="k">module</span> <span class="o">=</span> <span class="n">Py_InitModule</span><span class="p">(</span> <span class="s">&quot;Hurricane&quot;</span><span class="p">,</span> <span class="n">PyHurricane_Methods</span> <span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">module</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="k">module</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
<span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;[ERROR]</span><span class="se">\n</span><span class="s">&quot;</span> <span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;[ERROR]</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="o">&lt;&lt;</span> <span class="s">&quot; Failed to initialize Hurricane module.&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; Failed to initialize Hurricane module.&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
<span class="k">return</span><span class="p">;</span> <span class="k">return</span><span class="p">;</span>
<span class="p">}</span> <span class="p">}</span>
<span class="n">Py_INCREF</span><span class="p">(</span> <span class="o">&amp;</span><span class="n">PyTypeContact</span> <span class="p">);</span> <span class="c1">// step 4.</span> <span class="n">Py_INCREF</span><span class="p">(</span> <span class="o">&amp;</span><span class="n">PyTypeContact</span> <span class="p">);</span> <span class="c1">// step 4.</span>
<span class="n">PyModule_AddObject</span><span class="p">(</span> <span class="n">module</span><span class="p">,</span> <span class="s">&quot;Contact&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">PyObject</span><span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">PyTypeContact</span> <span class="p">);</span> <span class="c1">// step 4.</span> <span class="n">PyModule_AddObject</span><span class="p">(</span> <span class="k">module</span><span class="p">,</span> <span class="s">&quot;Contact&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">PyObject</span><span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">PyTypeContact</span> <span class="p">);</span> <span class="c1">// step 4.</span>
<span class="p">}</span> <span class="p">}</span>
</pre></div> </pre></div>
<!-- -*- Mode: rst -*- --> <!-- -*- Mode: rst -*- -->
@ -1077,7 +1077,7 @@ that the C++ object is <em>copy constructible</em> (which should be the case).</
<li>There is no <tt class="docutils literal">PyPoint_Link()</tt> function, as it's related to the <li>There is no <tt class="docutils literal">PyPoint_Link()</tt> function, as it's related to the
bi-directional communication mechanism.</li> bi-directional communication mechanism.</li>
</ul> </ul>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last"><strong>About the _object attribute</strong> of the PyPoint. As the C++ object life span <p class="last"><strong>About the _object attribute</strong> of the PyPoint. As the C++ object life span
(<tt class="docutils literal">Point</tt>) is linked to the Python (<tt class="docutils literal">PyPoint</tt>) one, we may have used a (<tt class="docutils literal">Point</tt>) is linked to the Python (<tt class="docutils literal">PyPoint</tt>) one, we may have used a
@ -1100,7 +1100,7 @@ written for <tt class="docutils literal">DBo</tt> derived classes will remain us
<span class="k">extern</span> <span class="n">PyTypeObject</span> <span class="n">PyTypePoint</span><span class="p">;</span> <span class="k">extern</span> <span class="n">PyTypeObject</span> <span class="n">PyTypePoint</span><span class="p">;</span>
<span class="k">extern</span> <span class="n">PyMethodDef</span> <span class="n">PyPoint_Methods</span><span class="p">[];</span> <span class="k">extern</span> <span class="n">PyMethodDef</span> <span class="n">PyPoint_Methods</span><span class="p">[];</span>
<span class="k">extern</span> <span class="kt">void</span> <span class="nf">PyPoint_LinkPyType</span><span class="p">();</span> <span class="k">extern</span> <span class="kt">void</span> <span class="n">PyPoint_LinkPyType</span><span class="p">();</span>
<span class="cp">#define IsPyPoint(v) ( (v)-&gt;ob_type == &amp;PyTypePoint )</span> <span class="cp">#define IsPyPoint(v) ( (v)-&gt;ob_type == &amp;PyTypePoint )</span>
<span class="cp">#define PYPOINT(v) ( (PyPoint*)(v) )</span> <span class="cp">#define PYPOINT(v) ( (PyPoint*)(v) )</span>
@ -1140,7 +1140,7 @@ a <tt class="docutils literal">PyPoint_Init()</tt> (field <tt class="docutils li
<span class="cp">#if defined(__PYTHON_MODULE__)</span> <span class="cp">#if defined(__PYTHON_MODULE__)</span>
<span class="k">static</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">PyPoint_NEW</span> <span class="p">(</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">module</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">args</span> <span class="p">)</span> <span class="k">static</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">PyPoint_NEW</span> <span class="p">(</span> <span class="n">PyObject</span><span class="o">*</span> <span class="k">module</span><span class="p">,</span> <span class="n">PyObject</span> <span class="o">*</span><span class="n">args</span> <span class="p">)</span>
<span class="p">{</span> <span class="p">{</span>
<span class="n">Point</span><span class="o">*</span> <span class="n">point</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span> <span class="n">Point</span><span class="o">*</span> <span class="n">point</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
<span class="n">HTRY</span> <span class="n">HTRY</span>
@ -1229,7 +1229,7 @@ the <tt class="docutils literal"><span class="pre">DbU::Unit</span>&nbsp; PyAny_
</pre></div> </pre></div>
<p></p> <p></p>
<p>We would get:</p> <p>We would get:</p>
<div class="highlight"><pre><span></span><span class="k">static</span> <span class="n">PyObject</span><span class="o">*</span> <span class="nf">PyPoint_setX</span> <span class="p">(</span> <span class="n">PyPoint</span> <span class="o">*</span><span class="n">self</span><span class="p">,</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">args</span> <span class="p">)</span> <div class="highlight"><pre><span></span><span class="k">static</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">PyPoint_setX</span> <span class="p">(</span> <span class="n">PyPoint</span> <span class="o">*</span><span class="n">self</span><span class="p">,</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">args</span> <span class="p">)</span>
<span class="p">{</span> <span class="p">{</span>
<span class="n">Point</span><span class="o">*</span> <span class="n">cobject</span> <span class="o">=</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="n">Point</span><span class="o">*&gt;</span><span class="p">(</span> <span class="n">self</span><span class="o">-&gt;</span><span class="n">_object</span> <span class="p">);</span> <span class="n">Point</span><span class="o">*</span> <span class="n">cobject</span> <span class="o">=</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="n">Point</span><span class="o">*&gt;</span><span class="p">(</span> <span class="n">self</span><span class="o">-&gt;</span><span class="n">_object</span> <span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">cobject</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">cobject</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
@ -1251,7 +1251,7 @@ the <tt class="docutils literal"><span class="pre">DbU::Unit</span>&nbsp; PyAny_
<div class="highlight"><pre><span></span><span class="n">DirectGetLongAttribute</span><span class="p">(</span><span class="n">PyPoint_GetX</span><span class="p">,</span><span class="n">getX</span><span class="p">,</span><span class="n">PyPoint</span><span class="p">,</span><span class="n">Point</span><span class="p">)</span> <div class="highlight"><pre><span></span><span class="n">DirectGetLongAttribute</span><span class="p">(</span><span class="n">PyPoint_GetX</span><span class="p">,</span><span class="n">getX</span><span class="p">,</span><span class="n">PyPoint</span><span class="p">,</span><span class="n">Point</span><span class="p">)</span>
</pre></div> </pre></div>
<p>We would get:</p> <p>We would get:</p>
<div class="highlight"><pre><span></span><span class="k">static</span> <span class="n">PyObject</span><span class="o">*</span> <span class="nf">PyPoint_GetX</span> <span class="p">(</span> <span class="n">PyPoint</span> <span class="o">*</span><span class="n">self</span><span class="p">,</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">args</span> <span class="p">)</span> <div class="highlight"><pre><span></span><span class="k">static</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">PyPoint_GetX</span> <span class="p">(</span> <span class="n">PyPoint</span> <span class="o">*</span><span class="n">self</span><span class="p">,</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">args</span> <span class="p">)</span>
<span class="p">{</span> <span class="p">{</span>
<span class="n">Point</span><span class="o">*</span> <span class="n">cobject</span> <span class="o">=</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="n">Point</span><span class="o">*&gt;</span><span class="p">(</span> <span class="n">self</span><span class="o">-&gt;</span><span class="n">_object</span> <span class="p">);</span> <span class="n">Point</span><span class="o">*</span> <span class="n">cobject</span> <span class="o">=</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="n">Point</span><span class="o">*&gt;</span><span class="p">(</span> <span class="n">self</span><span class="o">-&gt;</span><span class="n">_object</span> <span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">cobject</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">cobject</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>

View File

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Printable version of this Document PythonTutorial.pdf Contents Printable version of this Document 1. Introduction 2. Setting up the Environment 3. Making a Standard Cell -- Layout 4. Manipulating ..."> <meta name="description" content="Printable version of this Document PythonTutorial.pdf Contents Printable version of this Document 1. Introduction 2. Setting up the Environment 3. Making a Standard Cell -- Layout 4. Manipulating...">
<meta name="keywords" content=""> <meta name="keywords" content="">
<link rel="icon" href="../favicon.ico"> <link rel="icon" href="../favicon.ico">
@ -123,7 +123,7 @@
<h2><a class="toc-backref" href="#id9">Printable version of this Document</a></h2> <h2><a class="toc-backref" href="#id9">Printable version of this Document</a></h2>
<p><a class="reference external" href="../pdfs/PythonTutorial.pdf">PythonTutorial.pdf</a></p> <p><a class="reference external" href="../pdfs/PythonTutorial.pdf">PythonTutorial.pdf</a></p>
<div class="contents topic" id="contents"> <div class="contents topic" id="contents">
<p class="topic-title first">Contents</p> <p class="topic-title">Contents</p>
<ul class="simple"> <ul class="simple">
<li><a class="reference internal" href="#printable-version-of-this-document" id="id9">Printable version of this Document</a></li> <li><a class="reference internal" href="#printable-version-of-this-document" id="id9">Printable version of this Document</a></li>
<li><a class="reference internal" href="#introduction" id="id10">1. Introduction</a></li> <li><a class="reference internal" href="#introduction" id="id10">1. Introduction</a></li>
@ -223,7 +223,7 @@ semantic (see ??).</li>
<span class="k">class</span> <span class="nc">UpdateSession</span> <span class="p">{</span> <span class="k">class</span> <span class="nc">UpdateSession</span> <span class="p">{</span>
<span class="k">public</span><span class="o">:</span> <span class="k">public</span><span class="o">:</span>
<span class="k">static</span> <span class="kt">void</span> <span class="n">open</span> <span class="p">();</span> <span class="k">static</span> <span class="kt">void</span> <span class="n">open</span> <span class="p">();</span>
<span class="k">static</span> <span class="kt">void</span> <span class="nf">close</span> <span class="p">();</span> <span class="k">static</span> <span class="kt">void</span> <span class="n">close</span> <span class="p">();</span>
<span class="p">};</span> <span class="p">};</span>
<span class="p">}</span> <span class="p">}</span>
@ -294,7 +294,7 @@ or <tt class="docutils literal"><span class="pre">C-Shell</span></tt> like).</p>
<p>Use it like this (don't forget the <tt class="docutils literal">eval</tt> <strong>and</strong> the backquotes):</p> <p>Use it like this (don't forget the <tt class="docutils literal">eval</tt> <strong>and</strong> the backquotes):</p>
<div class="highlight"><pre><span></span><span class="go">dummy@lepka:~&gt; eval `&lt;CORIOLIS_INSTALL&gt;/etc/coriolis2/coriolisEnv.py`</span> <div class="highlight"><pre><span></span><span class="go">dummy@lepka:~&gt; eval `&lt;CORIOLIS_INSTALL&gt;/etc/coriolis2/coriolisEnv.py`</span>
</pre></div> </pre></div>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p><strong>Do not call that script in your environment initialisation.</strong> <p><strong>Do not call that script in your environment initialisation.</strong>
When used under <span class="sc">rhel6</span> or clones, it needs to be run in the <span class="cb">devtoolset</span> When used under <span class="sc">rhel6</span> or clones, it needs to be run in the <span class="cb">devtoolset</span>
@ -315,7 +315,7 @@ sub-directory <tt class="docutils literal">.coriolis2/</tt> that can contain two
</ul> </ul>
<p>Those two files are <em>optional</em>, if they do not exist the default settings <p>Those two files are <em>optional</em>, if they do not exist the default settings
will be used and the technology is <tt class="docutils literal">symbolic/cmos</tt> (i.e. purely symbolic).</p> will be used and the technology is <tt class="docutils literal">symbolic/cmos</tt> (i.e. purely symbolic).</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">Those two files will by processed by the <span class="sc">Python</span> interpreter, <p class="last">Those two files will by processed by the <span class="sc">Python</span> interpreter,
so they can contain any code in addition to the mandatory so they can contain any code in addition to the mandatory
@ -342,13 +342,13 @@ in <a class="reference external" href="../UsersGuide/ViewerTools.html">CGT - The
<div class="highlight"><pre><span></span><span class="n">defaultStyle</span> <span class="o">=</span> <span class="s1">&#39;Alliance.Classic [black]&#39;</span> <div class="highlight"><pre><span></span><span class="n">defaultStyle</span> <span class="o">=</span> <span class="s1">&#39;Alliance.Classic [black]&#39;</span>
<span class="n">parametersTable</span> <span class="o">=</span> \ <span class="n">parametersTable</span> <span class="o">=</span> \
<span class="p">(</span> <span class="p">(</span><span class="s1">&#39;misc.catchCore&#39;</span> <span class="p">,</span> <span class="n">TypeBool</span> <span class="p">,</span> <span class="bp">False</span> <span class="p">)</span> <span class="p">(</span> <span class="p">(</span><span class="s1">&#39;misc.catchCore&#39;</span> <span class="p">,</span> <span class="n">TypeBool</span> <span class="p">,</span> <span class="kc">False</span> <span class="p">)</span>
<span class="p">,</span> <span class="p">(</span><span class="s1">&#39;misc.info&#39;</span> <span class="p">,</span> <span class="n">TypeBool</span> <span class="p">,</span> <span class="bp">False</span> <span class="p">)</span> <span class="p">,</span> <span class="p">(</span><span class="s1">&#39;misc.info&#39;</span> <span class="p">,</span> <span class="n">TypeBool</span> <span class="p">,</span> <span class="kc">False</span> <span class="p">)</span>
<span class="p">,</span> <span class="p">(</span><span class="s1">&#39;misc.paranoid&#39;</span> <span class="p">,</span> <span class="n">TypeBool</span> <span class="p">,</span> <span class="bp">False</span> <span class="p">)</span> <span class="p">,</span> <span class="p">(</span><span class="s1">&#39;misc.paranoid&#39;</span> <span class="p">,</span> <span class="n">TypeBool</span> <span class="p">,</span> <span class="kc">False</span> <span class="p">)</span>
<span class="p">,</span> <span class="p">(</span><span class="s1">&#39;misc.bug&#39;</span> <span class="p">,</span> <span class="n">TypeBool</span> <span class="p">,</span> <span class="bp">False</span> <span class="p">)</span> <span class="p">,</span> <span class="p">(</span><span class="s1">&#39;misc.bug&#39;</span> <span class="p">,</span> <span class="n">TypeBool</span> <span class="p">,</span> <span class="kc">False</span> <span class="p">)</span>
<span class="p">,</span> <span class="p">(</span><span class="s1">&#39;misc.logMode&#39;</span> <span class="p">,</span> <span class="n">TypeBool</span> <span class="p">,</span> <span class="bp">False</span> <span class="p">)</span> <span class="p">,</span> <span class="p">(</span><span class="s1">&#39;misc.logMode&#39;</span> <span class="p">,</span> <span class="n">TypeBool</span> <span class="p">,</span> <span class="kc">False</span> <span class="p">)</span>
<span class="p">,</span> <span class="p">(</span><span class="s1">&#39;misc.verboseLevel1&#39;</span> <span class="p">,</span> <span class="n">TypeBool</span> <span class="p">,</span> <span class="bp">False</span> <span class="p">)</span> <span class="p">,</span> <span class="p">(</span><span class="s1">&#39;misc.verboseLevel1&#39;</span> <span class="p">,</span> <span class="n">TypeBool</span> <span class="p">,</span> <span class="kc">False</span> <span class="p">)</span>
<span class="p">,</span> <span class="p">(</span><span class="s1">&#39;misc.verboseLevel2&#39;</span> <span class="p">,</span> <span class="n">TypeBool</span> <span class="p">,</span> <span class="bp">True</span> <span class="p">)</span> <span class="p">,</span> <span class="p">(</span><span class="s1">&#39;misc.verboseLevel2&#39;</span> <span class="p">,</span> <span class="n">TypeBool</span> <span class="p">,</span> <span class="kc">True</span> <span class="p">)</span>
<span class="p">)</span> <span class="p">)</span>
</pre></div> </pre></div>
<!-- -*- Mode: rst -*- --> <!-- -*- Mode: rst -*- -->
@ -369,7 +369,7 @@ and its derived classes.</p>
something from the outside, we need to use a <em>framework</em>. As of today, only something from the outside, we need to use a <em>framework</em>. As of today, only
one is available : the Alliance framework. It allows <span class="sc">Coriolis</span> to handle one is available : the Alliance framework. It allows <span class="sc">Coriolis</span> to handle
<span class="sc">Alliance</span> libraries and cells in the exact same way.</p> <span class="sc">Alliance</span> libraries and cells in the exact same way.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">To see how the <a class="reference external" href="../../crlcore/classCRL_1_1AllianceFramework.html">AllianceFramework</a> is configured for your <p class="last">To see how the <a class="reference external" href="../../crlcore/classCRL_1_1AllianceFramework.html">AllianceFramework</a> is configured for your
installation, please have a look to <tt class="docutils literal">alliance.conf</tt> in the installation, please have a look to <tt class="docutils literal">alliance.conf</tt> in the
@ -384,7 +384,7 @@ an <a class="reference external" href="../../hurricane/classHurricane_1_1UpdateS
objects are fully inserted in the database. This is especially true for objects are fully inserted in the database. This is especially true for
the visualisation, a created component will be visible <em>only</em> only after the visualisation, a created component will be visible <em>only</em> only after
the session close.</p> the session close.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">See <tt class="docutils literal">QuadTree</tt> and <tt class="docutils literal">Query</tt>.</p> <p class="last">See <tt class="docutils literal">QuadTree</tt> and <tt class="docutils literal">Query</tt>.</p>
</div> </div>
@ -468,7 +468,7 @@ their creation, we must get one from the database. <a class="reference external"
<a class="reference external" href="../../hurricane/classHurricane_1_1Layer.html">Layer</a>:</p> <a class="reference external" href="../../hurricane/classHurricane_1_1Layer.html">Layer</a>:</p>
<div class="highlight"><pre><span></span><span class="n">layer</span> <span class="o">=</span> <span class="n">DataBase</span><span class="o">.</span><span class="n">getDB</span><span class="p">()</span><span class="o">.</span><span class="n">getTechnology</span><span class="p">()</span><span class="o">.</span><span class="n">getLayer</span><span class="p">(</span> <span class="s1">&#39;METAL1&#39;</span> <span class="p">)</span> <div class="highlight"><pre><span></span><span class="n">layer</span> <span class="o">=</span> <span class="n">DataBase</span><span class="o">.</span><span class="n">getDB</span><span class="p">()</span><span class="o">.</span><span class="n">getTechnology</span><span class="p">()</span><span class="o">.</span><span class="n">getLayer</span><span class="p">(</span> <span class="s1">&#39;METAL1&#39;</span> <span class="p">)</span>
</pre></div> </pre></div>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p><strong>Convention for layer names.</strong> As the database can manage both real layers <p><strong>Convention for layer names.</strong> As the database can manage both real layers
and symbolic ones we adopt the following convention:</p> and symbolic ones we adopt the following convention:</p>
@ -487,9 +487,9 @@ argument <span class="cb">'i'</span> and the name of the <em>variable</em> <span
For the sake of clarity we try to give the variable a close name, but this is For the sake of clarity we try to give the variable a close name, but this is
not mandatory.</p> not mandatory.</p>
<div class="highlight"><pre><span></span><span class="n">i</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s1">&#39;i&#39;</span> <span class="p">)</span> <div class="highlight"><pre><span></span><span class="n">i</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s1">&#39;i&#39;</span> <span class="p">)</span>
<span class="n">i</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">i</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
</pre></div> </pre></div>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">Unlike some other database models, in <span class="sc">Hurricane</span>, <p class="last">Unlike some other database models, in <span class="sc">Hurricane</span>,
<strong>there is no explicit terminal object</strong>, you only need to make the <strong>there is no explicit terminal object</strong>, you only need to make the
@ -576,7 +576,7 @@ explanation of that part of the code, refer to <a class="reference external" hre
<span class="n">UpdateSession</span><span class="o">.</span><span class="n">open</span><span class="p">()</span> <span class="n">UpdateSession</span><span class="o">.</span><span class="n">open</span><span class="p">()</span>
<span class="n">cell</span> <span class="o">=</span> <span class="n">AllianceFramework</span><span class="o">.</span><span class="n">get</span><span class="p">()</span><span class="o">.</span><span class="n">createCell</span><span class="p">(</span> <span class="s1">&#39;invertor&#39;</span> <span class="p">)</span> <span class="n">cell</span> <span class="o">=</span> <span class="n">AllianceFramework</span><span class="o">.</span><span class="n">get</span><span class="p">()</span><span class="o">.</span><span class="n">createCell</span><span class="p">(</span> <span class="s1">&#39;invertor&#39;</span> <span class="p">)</span>
<span class="n">cell</span><span class="o">.</span><span class="n">setTerminal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">cell</span><span class="o">.</span><span class="n">setTerminal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">cell</span><span class="o">.</span><span class="n">setAbutmentBox</span><span class="p">(</span> <span class="n">Box</span><span class="p">(</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">15.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">50.0</span><span class="p">)</span> <span class="p">)</span> <span class="p">)</span> <span class="n">cell</span><span class="o">.</span><span class="n">setAbutmentBox</span><span class="p">(</span> <span class="n">Box</span><span class="p">(</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">15.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">50.0</span><span class="p">)</span> <span class="p">)</span> <span class="p">)</span>
@ -603,8 +603,8 @@ explanation of that part of the code, refer to <a class="reference external" hre
<span class="n">Vertical</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">net</span><span class="p">,</span> <span class="n">nwell</span><span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">7.5</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">15.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">27.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">51.0</span><span class="p">)</span> <span class="p">)</span> <span class="n">Vertical</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">net</span><span class="p">,</span> <span class="n">nwell</span><span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">7.5</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">15.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">27.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">51.0</span><span class="p">)</span> <span class="p">)</span>
<span class="n">vdd</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s2">&quot;vdd&quot;</span> <span class="p">)</span> <span class="n">vdd</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s2">&quot;vdd&quot;</span> <span class="p">)</span>
<span class="n">vdd</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">vdd</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">vdd</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">vdd</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">h</span> <span class="o">=</span> <span class="n">Horizontal</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">vdd</span><span class="p">,</span> <span class="n">metal1</span><span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">47.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">6.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">15.0</span><span class="p">)</span> <span class="p">)</span> <span class="n">h</span> <span class="o">=</span> <span class="n">Horizontal</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">vdd</span><span class="p">,</span> <span class="n">metal1</span><span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">47.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">6.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">15.0</span><span class="p">)</span> <span class="p">)</span>
<span class="n">NetExternalComponents</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="n">h</span> <span class="p">)</span> <span class="n">NetExternalComponents</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="n">h</span> <span class="p">)</span>
<span class="n">Contact</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">vdd</span><span class="p">,</span> <span class="n">contdifn</span><span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">47.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">)</span> <span class="p">)</span> <span class="n">Contact</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">vdd</span><span class="p">,</span> <span class="n">contdifn</span><span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">47.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">)</span> <span class="p">)</span>
@ -614,8 +614,8 @@ explanation of that part of the code, refer to <a class="reference external" hre
<span class="n">doBreak</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;Done building vdd.&#39;</span> <span class="p">)</span> <span class="n">doBreak</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;Done building vdd.&#39;</span> <span class="p">)</span>
<span class="n">vss</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s2">&quot;vss&quot;</span> <span class="p">)</span> <span class="n">vss</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s2">&quot;vss&quot;</span> <span class="p">)</span>
<span class="n">vss</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">vss</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">vss</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">vss</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">h</span> <span class="o">=</span> <span class="n">Horizontal</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">vss</span><span class="p">,</span> <span class="n">metal1</span><span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">3.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">6.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">15.0</span><span class="p">))</span> <span class="n">h</span> <span class="o">=</span> <span class="n">Horizontal</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">vss</span><span class="p">,</span> <span class="n">metal1</span><span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">3.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">6.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">15.0</span><span class="p">))</span>
<span class="n">NetExternalComponents</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="n">h</span> <span class="p">)</span> <span class="n">NetExternalComponents</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="n">h</span> <span class="p">)</span>
<span class="n">Vertical</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">vss</span><span class="p">,</span> <span class="n">ndif</span> <span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">3.5</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">4.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">4.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">12.0</span><span class="p">)</span> <span class="p">)</span> <span class="n">Vertical</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">vss</span><span class="p">,</span> <span class="n">ndif</span> <span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">3.5</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">4.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">4.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">12.0</span><span class="p">)</span> <span class="p">)</span>
@ -623,7 +623,7 @@ explanation of that part of the code, refer to <a class="reference external" hre
<span class="n">doBreak</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;Done building vss.&#39;</span> <span class="p">)</span> <span class="n">doBreak</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;Done building vss.&#39;</span> <span class="p">)</span>
<span class="n">i</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s2">&quot;i&quot;</span> <span class="p">)</span> <span class="n">i</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s2">&quot;i&quot;</span> <span class="p">)</span>
<span class="n">i</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">i</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">v</span> <span class="o">=</span> <span class="n">Vertical</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">i</span><span class="p">,</span> <span class="n">metal1</span><span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">5.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">2.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">40.0</span><span class="p">)</span> <span class="p">)</span> <span class="n">v</span> <span class="o">=</span> <span class="n">Vertical</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">i</span><span class="p">,</span> <span class="n">metal1</span><span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">5.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">2.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">40.0</span><span class="p">)</span> <span class="p">)</span>
<span class="n">NetExternalComponents</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="n">v</span> <span class="p">)</span> <span class="n">NetExternalComponents</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="n">v</span> <span class="p">)</span>
<span class="n">Vertical</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">i</span><span class="p">,</span> <span class="n">ptrans</span> <span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span> <span class="mf">7.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">26.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">39.0</span><span class="p">)</span> <span class="p">)</span> <span class="n">Vertical</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">i</span><span class="p">,</span> <span class="n">ptrans</span> <span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span> <span class="mf">7.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">26.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">39.0</span><span class="p">)</span> <span class="p">)</span>
@ -634,7 +634,7 @@ explanation of that part of the code, refer to <a class="reference external" hre
<span class="n">doBreak</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;Done building i.&#39;</span> <span class="p">)</span> <span class="n">doBreak</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;Done building i.&#39;</span> <span class="p">)</span>
<span class="n">nq</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s2">&quot;nq&quot;</span> <span class="p">)</span> <span class="n">nq</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s2">&quot;nq&quot;</span> <span class="p">)</span>
<span class="n">nq</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">nq</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">v</span> <span class="o">=</span> <span class="n">Vertical</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">nq</span><span class="p">,</span> <span class="n">metal1</span><span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">2.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">40.0</span><span class="p">)</span> <span class="p">)</span> <span class="n">v</span> <span class="o">=</span> <span class="n">Vertical</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">nq</span><span class="p">,</span> <span class="n">metal1</span><span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">2.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">40.0</span><span class="p">)</span> <span class="p">)</span>
<span class="n">NetExternalComponents</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="n">v</span> <span class="p">)</span> <span class="n">NetExternalComponents</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="n">v</span> <span class="p">)</span>
<span class="n">Vertical</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">nq</span><span class="p">,</span> <span class="n">pdif</span> <span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span> <span class="mf">3.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">28.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">37.0</span><span class="p">)</span> <span class="p">)</span> <span class="n">Vertical</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">nq</span><span class="p">,</span> <span class="n">pdif</span> <span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span> <span class="mf">3.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">28.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">37.0</span><span class="p">)</span> <span class="p">)</span>
@ -651,12 +651,12 @@ explanation of that part of the code, refer to <a class="reference external" hre
<span class="k">def</span> <span class="nf">scriptMain</span> <span class="p">(</span> <span class="o">**</span><span class="n">kw</span> <span class="p">):</span> <span class="k">def</span> <span class="nf">scriptMain</span> <span class="p">(</span> <span class="o">**</span><span class="n">kw</span> <span class="p">):</span>
<span class="n">editor</span> <span class="o">=</span> <span class="bp">None</span> <span class="n">editor</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">kw</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s1">&#39;editor&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">kw</span><span class="p">[</span><span class="s1">&#39;editor&#39;</span><span class="p">]:</span> <span class="k">if</span> <span class="n">kw</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s1">&#39;editor&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">kw</span><span class="p">[</span><span class="s1">&#39;editor&#39;</span><span class="p">]:</span>
<span class="n">editor</span> <span class="o">=</span> <span class="n">kw</span><span class="p">[</span><span class="s1">&#39;editor&#39;</span><span class="p">]</span> <span class="n">editor</span> <span class="o">=</span> <span class="n">kw</span><span class="p">[</span><span class="s1">&#39;editor&#39;</span><span class="p">]</span>
<span class="n">buildInvertor</span><span class="p">(</span> <span class="n">editor</span> <span class="p">)</span> <span class="n">buildInvertor</span><span class="p">(</span> <span class="n">editor</span> <span class="p">)</span>
<span class="k">return</span> <span class="bp">True</span> <span class="k">return</span> <span class="kc">True</span>
</pre></div> </pre></div>
<!-- -*- Mode: rst -*- --> <!-- -*- Mode: rst -*- -->
</div> </div>
@ -672,9 +672,9 @@ an algorithmic walkthrough of the database can be accessed through a <a class="r
<p>C++ Collections objects are exposed in <span class="sc">Python</span> through the <em>iterable</em> protocol, <p>C++ Collections objects are exposed in <span class="sc">Python</span> through the <em>iterable</em> protocol,
allowing to simply write:</p> allowing to simply write:</p>
<div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">net</span> <span class="ow">in</span> <span class="n">cell</span><span class="o">.</span><span class="n">getNets</span><span class="p">():</span> <div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">net</span> <span class="ow">in</span> <span class="n">cell</span><span class="o">.</span><span class="n">getNets</span><span class="p">():</span>
<span class="k">print</span> <span class="s1">&#39;Components of&#39;</span><span class="p">,</span> <span class="n">net</span> <span class="nb">print</span> <span class="s1">&#39;Components of&#39;</span><span class="p">,</span> <span class="n">net</span>
<span class="k">for</span> <span class="n">component</span> <span class="ow">in</span> <span class="n">net</span><span class="o">.</span><span class="n">getComponents</span><span class="p">():</span> <span class="k">for</span> <span class="n">component</span> <span class="ow">in</span> <span class="n">net</span><span class="o">.</span><span class="n">getComponents</span><span class="p">():</span>
<span class="k">print</span> <span class="s1">&#39;|&#39;</span><span class="p">,</span> <span class="n">component</span> <span class="nb">print</span> <span class="s1">&#39;|&#39;</span><span class="p">,</span> <span class="n">component</span>
</pre></div> </pre></div>
<p>In C++ we would have written:</p> <p>In C++ we would have written:</p>
<div class="highlight"><pre><span></span><span class="k">for</span> <span class="p">(</span> <span class="n">Net</span><span class="o">*</span> <span class="nl">net</span> <span class="p">:</span> <span class="n">cell</span><span class="o">-&gt;</span><span class="n">getNets</span><span class="p">()</span> <span class="p">)</span> <span class="p">{</span> <div class="highlight"><pre><span></span><span class="k">for</span> <span class="p">(</span> <span class="n">Net</span><span class="o">*</span> <span class="nl">net</span> <span class="p">:</span> <span class="n">cell</span><span class="o">-&gt;</span><span class="n">getNets</span><span class="p">()</span> <span class="p">)</span> <span class="p">{</span>
@ -698,7 +698,7 @@ loop. For example:</p>
<span class="c1"># Remove all the anonymous nets.</span> <span class="c1"># Remove all the anonymous nets.</span>
<span class="k">for</span> <span class="n">net</span> <span class="ow">in</span> <span class="n">cellNets</span><span class="p">:</span> <span class="k">for</span> <span class="n">net</span> <span class="ow">in</span> <span class="n">cellNets</span><span class="p">:</span>
<span class="k">if</span> <span class="n">net</span><span class="o">.</span><span class="n">getName</span><span class="p">()</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;nymous_&#39;</span><span class="p">):</span> <span class="k">if</span> <span class="n">net</span><span class="o">.</span><span class="n">getName</span><span class="p">()</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;nymous_&#39;</span><span class="p">):</span>
<span class="k">print</span> <span class="s1">&#39;Destroy&#39;</span><span class="p">,</span> <span class="n">net</span> <span class="nb">print</span> <span class="s1">&#39;Destroy&#39;</span><span class="p">,</span> <span class="n">net</span>
<span class="n">net</span><span class="o">.</span><span class="n">destroy</span><span class="p">()</span> <span class="n">net</span><span class="o">.</span><span class="n">destroy</span><span class="p">()</span>
</pre></div> </pre></div>
</div> </div>
@ -709,7 +709,7 @@ loop. For example:</p>
the <tt class="docutils literal">getCell()</tt> call wil be:</p> the <tt class="docutils literal">getCell()</tt> call wil be:</p>
<ol class="arabic"> <ol class="arabic">
<li><p class="first">If a <a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a> of that name is already loaded into memory, it will be returned.</p> <li><p class="first">If a <a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a> of that name is already loaded into memory, it will be returned.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">It means that it shadows any modifications that could have been on <p class="last">It means that it shadows any modifications that could have been on
disk since it was first loaded. Conversely, if the <a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a> has been disk since it was first loaded. Conversely, if the <a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a> has been
@ -718,7 +718,7 @@ modified in memory, you will get those modifications.</p>
</li> </li>
<li><p class="first">Search, in the ordered list of libraries, the first <a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a> that matches the <li><p class="first">Search, in the ordered list of libraries, the first <a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a> that matches the
requested name.</p> requested name.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">It means that if cells with the same name exist in different <p class="last">It means that if cells with the same name exist in different
libraries, only the one in the first library will be ever used. libraries, only the one in the first library will be ever used.
@ -744,11 +744,10 @@ particular, the <a class="reference external" href="../../viewer/classHurricane_
keyword <tt class="docutils literal">editor</tt>. You can then load your cell into the viewer keyword <tt class="docutils literal">editor</tt>. You can then load your cell into the viewer
using the menu:</p> using the menu:</p>
<ul class="simple"> <ul class="simple">
<li><span class="fboxtt">Tools</span> <span class="formula"> → </span> <li><span class="fboxtt">Tools</span> <span class="formula"> → </span> <span class="fboxtt">Python Script</span>. The script
<span class="fboxtt">Python Script</span>. The script
file name must be given without the <tt class="docutils literal">.py</tt> extension.</li> file name must be given without the <tt class="docutils literal">.py</tt> extension.</li>
</ul> </ul>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p>If you use breakpoints and want to see the progress of your <p>If you use breakpoints and want to see the progress of your
script in the viewer, do not use the <tt class="docutils literal"><span class="pre">--script</span></tt> option of script in the viewer, do not use the <tt class="docutils literal"><span class="pre">--script</span></tt> option of
@ -762,7 +761,7 @@ you will only see the end result of your script.</p>
<span class="n">UpdateSession</span><span class="o">.</span><span class="n">open</span><span class="p">()</span> <span class="n">UpdateSession</span><span class="o">.</span><span class="n">open</span><span class="p">()</span>
<span class="n">cell</span> <span class="o">=</span> <span class="n">AllianceFramework</span><span class="o">.</span><span class="n">get</span><span class="p">()</span><span class="o">.</span><span class="n">createCell</span><span class="p">(</span> <span class="s1">&#39;invertor&#39;</span> <span class="p">)</span> <span class="n">cell</span> <span class="o">=</span> <span class="n">AllianceFramework</span><span class="o">.</span><span class="n">get</span><span class="p">()</span><span class="o">.</span><span class="n">createCell</span><span class="p">(</span> <span class="s1">&#39;invertor&#39;</span> <span class="p">)</span>
<span class="n">cell</span><span class="o">.</span><span class="n">setTerminal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">cell</span><span class="o">.</span><span class="n">setTerminal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">cell</span><span class="o">.</span><span class="n">setAbutmentBox</span><span class="p">(</span> <span class="n">Box</span><span class="p">(</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">15.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">50.0</span><span class="p">)</span> <span class="p">)</span> <span class="p">)</span> <span class="n">cell</span><span class="o">.</span><span class="n">setAbutmentBox</span><span class="p">(</span> <span class="n">Box</span><span class="p">(</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">15.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">50.0</span><span class="p">)</span> <span class="p">)</span> <span class="p">)</span>
@ -778,12 +777,12 @@ you will only see the end result of your script.</p>
<span class="k">def</span> <span class="nf">scriptMain</span> <span class="p">(</span> <span class="o">**</span><span class="n">kw</span> <span class="p">):</span> <span class="k">def</span> <span class="nf">scriptMain</span> <span class="p">(</span> <span class="o">**</span><span class="n">kw</span> <span class="p">):</span>
<span class="n">editor</span> <span class="o">=</span> <span class="bp">None</span> <span class="n">editor</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">kw</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s1">&#39;editor&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">kw</span><span class="p">[</span><span class="s1">&#39;editor&#39;</span><span class="p">]:</span> <span class="k">if</span> <span class="n">kw</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s1">&#39;editor&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">kw</span><span class="p">[</span><span class="s1">&#39;editor&#39;</span><span class="p">]:</span>
<span class="n">editor</span> <span class="o">=</span> <span class="n">kw</span><span class="p">[</span><span class="s1">&#39;editor&#39;</span><span class="p">]</span> <span class="n">editor</span> <span class="o">=</span> <span class="n">kw</span><span class="p">[</span><span class="s1">&#39;editor&#39;</span><span class="p">]</span>
<span class="n">buildInvertor</span><span class="p">(</span> <span class="n">editor</span> <span class="p">)</span> <span class="n">buildInvertor</span><span class="p">(</span> <span class="n">editor</span> <span class="p">)</span>
<span class="k">return</span> <span class="bp">True</span> <span class="k">return</span> <span class="kc">True</span>
</pre></div> </pre></div>
<div class="section" id="using-breakpoints"> <div class="section" id="using-breakpoints">
<h3>5.1 Using Breakpoints</h3> <h3>5.1 Using Breakpoints</h3>
@ -820,7 +819,7 @@ parameters:</p>
will be part of the hierarchical level just below the <tt class="docutils literal">fulladder</tt> will be part of the hierarchical level just below the <tt class="docutils literal">fulladder</tt>
cell.</li> cell.</li>
</ol> </ol>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">Do not confuse the cell the instance is create into (<tt class="docutils literal">fulladder</tt>) <p class="last">Do not confuse the cell the instance is create into (<tt class="docutils literal">fulladder</tt>)
and the cells it refers to (the <em>master cell</em> <tt class="docutils literal">xr2_x2</tt>).</p> and the cells it refers to (the <em>master cell</em> <tt class="docutils literal">xr2_x2</tt>).</p>
@ -855,11 +854,11 @@ The <tt class="docutils literal">masterNet</tt> argument being an object of clas
its name).</p> its name).</p>
<p>Building the <span class="cb">a</span> net of <tt class="docutils literal">fulladder</tt>:</p> <p>Building the <span class="cb">a</span> net of <tt class="docutils literal">fulladder</tt>:</p>
<div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">&quot;a&quot;</span> <span class="p">)</span> <div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">&quot;a&quot;</span> <span class="p">)</span>
<span class="n">a</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">a</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s2">&quot;i0&quot;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">a</span> <span class="p">)</span> <span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s2">&quot;i0&quot;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">a</span> <span class="p">)</span>
<span class="n">a2_1</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s2">&quot;i0&quot;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">a</span> <span class="p">)</span> <span class="n">a2_1</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s2">&quot;i0&quot;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">a</span> <span class="p">)</span>
</pre></div> </pre></div>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p><strong>Limitation of Hurricane Netlists.</strong> There is no explicit <p><strong>Limitation of Hurricane Netlists.</strong> There is no explicit
terminal object in the <span class="sc">Hurricane</span> database. Plugs are terminal object in the <span class="sc">Hurricane</span> database. Plugs are
@ -881,8 +880,8 @@ connections</strong>. If a signal in <tt class="docutils literal">fulladder</t
be considered as connected to any signal with the <em>same name</em> and <em>global</em> in be considered as connected to any signal with the <em>same name</em> and <em>global</em> in
the master cell of the instances.</p> the master cell of the instances.</p>
<div class="highlight"><pre><span></span><span class="n">vdd</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">&quot;vdd&quot;</span> <span class="p">)</span> <div class="highlight"><pre><span></span><span class="n">vdd</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">&quot;vdd&quot;</span> <span class="p">)</span>
<span class="n">vdd</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">vdd</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">vdd</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="c1"># Will be connected to all the instances.</span> <span class="n">vdd</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="kc">True</span> <span class="p">)</span> <span class="c1"># Will be connected to all the instances.</span>
</pre></div> </pre></div>
</div> </div>
<div class="section" id="creating-the-physical-view-of-a-cell-netlist"> <div class="section" id="creating-the-physical-view-of-a-cell-netlist">
@ -942,7 +941,7 @@ physical connection.</p>
<p>The <a class="reference external" href="../../hurricane/classHurricane_1_1RoutingPad.html">RoutingPad</a> <tt class="docutils literal">rp</tt> will be a component of the <tt class="docutils literal">a</tt> net.</p> <p>The <a class="reference external" href="../../hurricane/classHurricane_1_1RoutingPad.html">RoutingPad</a> <tt class="docutils literal">rp</tt> will be a component of the <tt class="docutils literal">a</tt> net.</p>
<p>The third argument ask the constructor of the <a class="reference external" href="../../hurricane/classHurricane_1_1RoutingPad.html">RoutingPad</a> to select in the <p>The third argument ask the constructor of the <a class="reference external" href="../../hurricane/classHurricane_1_1RoutingPad.html">RoutingPad</a> to select in the
master net, the component which has the biggest area.</p> master net, the component which has the biggest area.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p><strong>Component selection.</strong> Not all the components of a net can be <p><strong>Component selection.</strong> Not all the components of a net can be
selected for connection through a <a class="reference external" href="../../hurricane/classHurricane_1_1RoutingPad.html">RoutingPad</a>. The candidates must selected for connection through a <a class="reference external" href="../../hurricane/classHurricane_1_1RoutingPad.html">RoutingPad</a>. The candidates must
@ -973,7 +972,7 @@ contacts.</p>
<span class="n">Horizontal</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">contact2</span><span class="p">,</span> <span class="n">turn</span> <span class="p">,</span> <span class="n">metal2</span><span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">35.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">2.0</span><span class="p">)</span> <span class="p">)</span> <span class="n">Horizontal</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">contact2</span><span class="p">,</span> <span class="n">turn</span> <span class="p">,</span> <span class="n">metal2</span><span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">35.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">2.0</span><span class="p">)</span> <span class="p">)</span>
<span class="n">Vertical</span> <span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">turn</span> <span class="p">,</span> <span class="n">contact1</span> <span class="p">,</span> <span class="n">metal3</span><span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">2.0</span><span class="p">)</span> <span class="p">)</span> <span class="n">Vertical</span> <span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">turn</span> <span class="p">,</span> <span class="n">contact1</span> <span class="p">,</span> <span class="n">metal3</span><span class="p">,</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">toDbU</span><span class="p">(</span><span class="mf">2.0</span><span class="p">)</span> <span class="p">)</span>
</pre></div> </pre></div>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">In order to better see the layout of the wiring only, open the <p class="last">In order to better see the layout of the wiring only, open the
<tt class="docutils literal">Controller</tt> and in the <span class="fboxtt">Filter</span> tab, uncheck <tt class="docutils literal">Controller</tt> and in the <span class="fboxtt">Filter</span> tab, uncheck
@ -1029,25 +1028,25 @@ directory (under the the root of the <span class="sc">Coriolis</span> installati
<span class="c1"># Create Nets.</span> <span class="c1"># Create Nets.</span>
<span class="n">vss</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">&quot;vss&quot;</span> <span class="p">)</span> <span class="n">vss</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">&quot;vss&quot;</span> <span class="p">)</span>
<span class="n">vss</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">vss</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">vss</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">vss</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">vdd</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">&quot;vdd&quot;</span> <span class="p">)</span> <span class="n">vdd</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">&quot;vdd&quot;</span> <span class="p">)</span>
<span class="n">vdd</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">vdd</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">vdd</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">vdd</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">cin</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">&quot;cin&quot;</span> <span class="p">)</span> <span class="n">cin</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">&quot;cin&quot;</span> <span class="p">)</span>
<span class="n">cin</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">cin</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">xr2_2</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">cin</span> <span class="p">)</span> <span class="n">xr2_2</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">cin</span> <span class="p">)</span>
<span class="n">a2_2</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">cin</span> <span class="p">)</span> <span class="n">a2_2</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">cin</span> <span class="p">)</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">&#39;a&#39;</span> <span class="p">)</span> <span class="n">a</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">&#39;a&#39;</span> <span class="p">)</span>
<span class="n">a</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">a</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">a</span> <span class="p">)</span> <span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">a</span> <span class="p">)</span>
<span class="n">a2_1</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">a</span> <span class="p">)</span> <span class="n">a2_1</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">a</span> <span class="p">)</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">&#39;b&#39;</span> <span class="p">)</span> <span class="n">b</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">&#39;b&#39;</span> <span class="p">)</span>
<span class="n">b</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">b</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i1&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">b</span> <span class="p">)</span> <span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i1&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">b</span> <span class="p">)</span>
<span class="n">a2_1</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i1&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">b</span> <span class="p">)</span> <span class="n">a2_1</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i1&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">b</span> <span class="p">)</span>
@ -1065,11 +1064,11 @@ directory (under the the root of the <span class="sc">Coriolis</span> installati
<span class="n">o2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">o2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">carry_2</span> <span class="p">)</span> <span class="n">o2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">o2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">carry_2</span> <span class="p">)</span>
<span class="n">sout</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">&#39;sout&#39;</span> <span class="p">)</span> <span class="n">sout</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">&#39;sout&#39;</span> <span class="p">)</span>
<span class="n">sout</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">sout</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">xr2_2</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;q&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">sout</span> <span class="p">)</span> <span class="n">xr2_2</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;q&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">sout</span> <span class="p">)</span>
<span class="n">cout</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">&#39;cout&#39;</span> <span class="p">)</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">&#39;cout&#39;</span> <span class="p">)</span>
<span class="n">cout</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">cout</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">o2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">o2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;q&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">cout</span> <span class="p">)</span> <span class="n">o2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">o2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;q&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">cout</span> <span class="p">)</span>
<span class="c1"># Instances placement.</span> <span class="c1"># Instances placement.</span>
@ -1150,12 +1149,12 @@ directory (under the the root of the <span class="sc">Coriolis</span> installati
<span class="k">def</span> <span class="nf">scriptMain</span> <span class="p">(</span> <span class="o">**</span><span class="n">kw</span> <span class="p">):</span> <span class="k">def</span> <span class="nf">scriptMain</span> <span class="p">(</span> <span class="o">**</span><span class="n">kw</span> <span class="p">):</span>
<span class="n">editor</span> <span class="o">=</span> <span class="bp">None</span> <span class="n">editor</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">kw</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s1">&#39;editor&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">kw</span><span class="p">[</span><span class="s1">&#39;editor&#39;</span><span class="p">]:</span> <span class="k">if</span> <span class="n">kw</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s1">&#39;editor&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">kw</span><span class="p">[</span><span class="s1">&#39;editor&#39;</span><span class="p">]:</span>
<span class="n">editor</span> <span class="o">=</span> <span class="n">kw</span><span class="p">[</span><span class="s1">&#39;editor&#39;</span><span class="p">]</span> <span class="n">editor</span> <span class="o">=</span> <span class="n">kw</span><span class="p">[</span><span class="s1">&#39;editor&#39;</span><span class="p">]</span>
<span class="n">buildFulladder</span><span class="p">(</span> <span class="n">editor</span> <span class="p">)</span> <span class="n">buildFulladder</span><span class="p">(</span> <span class="n">editor</span> <span class="p">)</span>
<span class="k">return</span> <span class="bp">True</span> <span class="k">return</span> <span class="kc">True</span>
</pre></div> </pre></div>
<!-- -*- Mode: rst -*- --> <!-- -*- Mode: rst -*- -->
</div> </div>
@ -1180,7 +1179,7 @@ another.</p>
<span class="n">library</span> <span class="o">=</span> <span class="n">LefImport</span><span class="o">.</span><span class="n">load</span><span class="p">(</span> <span class="n">DKsdir</span> <span class="o">+</span> <span class="s1">&#39;/FreePDK45/osu_soc/lib/files/gscl45nm.lef&#39;</span> <span class="p">)</span> <span class="n">library</span> <span class="o">=</span> <span class="n">LefImport</span><span class="o">.</span><span class="n">load</span><span class="p">(</span> <span class="n">DKsdir</span> <span class="o">+</span> <span class="s1">&#39;/FreePDK45/osu_soc/lib/files/gscl45nm.lef&#39;</span> <span class="p">)</span>
</pre></div> </pre></div>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last"><strong>Technology checking.</strong> The first imported <span class="sc">lef</span> file must contain the <p class="last"><strong>Technology checking.</strong> The first imported <span class="sc">lef</span> file must contain the
technology. The technology described in the <span class="sc">lef</span> file will be checked technology. The technology described in the <span class="sc">lef</span> file will be checked
@ -1225,7 +1224,7 @@ small, it will issue an error.</p>
file. For example:</p> file. For example:</p>
<div class="highlight"><pre><span></span><span class="n">parametersTable</span> <span class="o">=</span> \ <div class="highlight"><pre><span></span><span class="n">parametersTable</span> <span class="o">=</span> \
<span class="p">(</span> <span class="p">(</span><span class="s2">&quot;etesian.effort&quot;</span> <span class="p">,</span> <span class="n">TypeEnumerate</span> <span class="p">,</span> <span class="mi">2</span> <span class="p">)</span> <span class="p">(</span> <span class="p">(</span><span class="s2">&quot;etesian.effort&quot;</span> <span class="p">,</span> <span class="n">TypeEnumerate</span> <span class="p">,</span> <span class="mi">2</span> <span class="p">)</span>
<span class="p">,</span> <span class="p">(</span><span class="s1">&#39;etesian.uniformDensity&#39;</span> <span class="p">,</span> <span class="n">TypeBool</span> <span class="p">,</span> <span class="bp">True</span> <span class="p">)</span> <span class="p">,</span> <span class="p">(</span><span class="s1">&#39;etesian.uniformDensity&#39;</span> <span class="p">,</span> <span class="n">TypeBool</span> <span class="p">,</span> <span class="kc">True</span> <span class="p">)</span>
<span class="p">,</span> <span class="p">(</span><span class="s1">&#39;etesian.spaceMargin&#39;</span> <span class="p">,</span> <span class="n">TypePercentage</span><span class="p">,</span> <span class="mf">3.0</span> <span class="p">)</span> <span class="p">,</span> <span class="p">(</span><span class="s1">&#39;etesian.spaceMargin&#39;</span> <span class="p">,</span> <span class="n">TypePercentage</span><span class="p">,</span> <span class="mf">3.0</span> <span class="p">)</span>
<span class="p">,</span> <span class="p">(</span><span class="s1">&#39;etesian.aspectRatio&#39;</span> <span class="p">,</span> <span class="n">TypePercentage</span><span class="p">,</span> <span class="mf">100.0</span> <span class="p">)</span> <span class="p">,</span> <span class="p">(</span><span class="s1">&#39;etesian.aspectRatio&#39;</span> <span class="p">,</span> <span class="n">TypePercentage</span><span class="p">,</span> <span class="mf">100.0</span> <span class="p">)</span>
<span class="p">)</span> <span class="p">)</span>
@ -1240,7 +1239,7 @@ added and an aspect ratio of <tt class="docutils literal">100%</tt> (square shap
<h3>8.1 Router -- Katana</h3> <h3>8.1 Router -- Katana</h3>
<p>Like for <span class="sc">Etesian</span>, you have to create the engine on the cell then call <p>Like for <span class="sc">Etesian</span>, you have to create the engine on the cell then call
the sequence of functions detailed below.</p> the sequence of functions detailed below.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last"><strong>Kite vs. Katana.</strong> There are currently two routers in <span class="sc">Coriolis</span>, <p class="last"><strong>Kite vs. Katana.</strong> There are currently two routers in <span class="sc">Coriolis</span>,
<span class="sc">Kite</span> is the old one and digital only. <span class="sc">Katana</span> is a re-implementation <span class="sc">Kite</span> is the old one and digital only. <span class="sc">Katana</span> is a re-implementation
@ -1267,13 +1266,13 @@ directory (under the the root of the <span class="sc">Coriolis</span> installati
<p>This script automatically places and routes the <tt class="docutils literal">fulladder</tt> netlist as seen <p>This script automatically places and routes the <tt class="docutils literal">fulladder</tt> netlist as seen
previously. The call to the <a class="reference external" href="../../crlcore/classCRL_1_1ToolEngine.html">ToolEngines</a> is made inside the new function previously. The call to the <a class="reference external" href="../../crlcore/classCRL_1_1ToolEngine.html">ToolEngines</a> is made inside the new function
<tt class="docutils literal">placeAndRoute()</tt>.</p> <tt class="docutils literal">placeAndRoute()</tt>.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">As the <tt class="docutils literal">ToolEngine</tt> take care of opening and closing <a class="reference external" href="../../hurricane/classHurricane_1_1UpdateSession.html">UpdateSession</a>, we <p class="last">As the <tt class="docutils literal">ToolEngine</tt> take care of opening and closing <a class="reference external" href="../../hurricane/classHurricane_1_1UpdateSession.html">UpdateSession</a>, we
do not need the wrapper function <tt class="docutils literal">doBreak()</tt> around the breakpoints. do not need the wrapper function <tt class="docutils literal">doBreak()</tt> around the breakpoints.
We directly call <a class="reference external" href="../../hurricane/classHurricane_1_1Breakpoint.html">Breakpoint</a>.</p> We directly call <a class="reference external" href="../../hurricane/classHurricane_1_1Breakpoint.html">Breakpoint</a>.</p>
</div> </div>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">The space margin for this example is very high (<tt class="docutils literal">30%</tt>), it's only <p class="last">The space margin for this example is very high (<tt class="docutils literal">30%</tt>), it's only
because it's too small for the placer to run correctly. For normal because it's too small for the placer to run correctly. For normal
@ -1315,25 +1314,25 @@ case it is around <tt class="docutils literal">3%</tt>.</p>
<span class="c1"># Create Nets.</span> <span class="c1"># Create Nets.</span>
<span class="n">vss</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">&quot;vss&quot;</span> <span class="p">)</span> <span class="n">vss</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">&quot;vss&quot;</span> <span class="p">)</span>
<span class="n">vss</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">vss</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">vss</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">vss</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">vdd</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">&quot;vdd&quot;</span> <span class="p">)</span> <span class="n">vdd</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">&quot;vdd&quot;</span> <span class="p">)</span>
<span class="n">vdd</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">vdd</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">vdd</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">vdd</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">cin</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">&quot;cin&quot;</span> <span class="p">)</span> <span class="n">cin</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">&quot;cin&quot;</span> <span class="p">)</span>
<span class="n">cin</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">cin</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">xr2_2</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">cin</span> <span class="p">)</span> <span class="n">xr2_2</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">cin</span> <span class="p">)</span>
<span class="n">a2_2</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">cin</span> <span class="p">)</span> <span class="n">a2_2</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">cin</span> <span class="p">)</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">&#39;a&#39;</span> <span class="p">)</span> <span class="n">a</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">&#39;a&#39;</span> <span class="p">)</span>
<span class="n">a</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">a</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">a</span> <span class="p">)</span> <span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">a</span> <span class="p">)</span>
<span class="n">a2_1</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">a</span> <span class="p">)</span> <span class="n">a2_1</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">a</span> <span class="p">)</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">&#39;b&#39;</span> <span class="p">)</span> <span class="n">b</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">&#39;b&#39;</span> <span class="p">)</span>
<span class="n">b</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">b</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i1&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">b</span> <span class="p">)</span> <span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i1&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">b</span> <span class="p">)</span>
<span class="n">a2_1</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i1&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">b</span> <span class="p">)</span> <span class="n">a2_1</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i1&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">b</span> <span class="p">)</span>
@ -1351,11 +1350,11 @@ case it is around <tt class="docutils literal">3%</tt>.</p>
<span class="n">o2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">o2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">carry_2</span> <span class="p">)</span> <span class="n">o2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">o2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;i0&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">carry_2</span> <span class="p">)</span>
<span class="n">sout</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">&#39;sout&#39;</span> <span class="p">)</span> <span class="n">sout</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">&#39;sout&#39;</span> <span class="p">)</span>
<span class="n">sout</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">sout</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">xr2_2</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;q&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">sout</span> <span class="p">)</span> <span class="n">xr2_2</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;q&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">sout</span> <span class="p">)</span>
<span class="n">cout</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">&#39;cout&#39;</span> <span class="p">)</span> <span class="n">cout</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">&#39;cout&#39;</span> <span class="p">)</span>
<span class="n">cout</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">cout</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
<span class="n">o2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">o2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;q&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">cout</span> <span class="p">)</span> <span class="n">o2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">o2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">&#39;q&#39;</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">cout</span> <span class="p">)</span>
<span class="n">UpdateSession</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="n">UpdateSession</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
@ -1388,13 +1387,13 @@ case it is around <tt class="docutils literal">3%</tt>.</p>
<span class="k">def</span> <span class="nf">scriptMain</span> <span class="p">(</span> <span class="o">**</span><span class="n">kw</span> <span class="p">):</span> <span class="k">def</span> <span class="nf">scriptMain</span> <span class="p">(</span> <span class="o">**</span><span class="n">kw</span> <span class="p">):</span>
<span class="n">editor</span> <span class="o">=</span> <span class="bp">None</span> <span class="n">editor</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">kw</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s1">&#39;editor&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">kw</span><span class="p">[</span><span class="s1">&#39;editor&#39;</span><span class="p">]:</span> <span class="k">if</span> <span class="n">kw</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s1">&#39;editor&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">kw</span><span class="p">[</span><span class="s1">&#39;editor&#39;</span><span class="p">]:</span>
<span class="n">editor</span> <span class="o">=</span> <span class="n">kw</span><span class="p">[</span><span class="s1">&#39;editor&#39;</span><span class="p">]</span> <span class="n">editor</span> <span class="o">=</span> <span class="n">kw</span><span class="p">[</span><span class="s1">&#39;editor&#39;</span><span class="p">]</span>
<span class="n">fulladder</span> <span class="o">=</span> <span class="n">buildFulladder</span><span class="p">(</span> <span class="n">editor</span> <span class="p">)</span> <span class="n">fulladder</span> <span class="o">=</span> <span class="n">buildFulladder</span><span class="p">(</span> <span class="n">editor</span> <span class="p">)</span>
<span class="n">placeAndRoute</span><span class="p">(</span> <span class="n">editor</span><span class="p">,</span> <span class="n">fulladder</span> <span class="p">)</span> <span class="n">placeAndRoute</span><span class="p">(</span> <span class="n">editor</span><span class="p">,</span> <span class="n">fulladder</span> <span class="p">)</span>
<span class="k">return</span> <span class="bp">True</span> <span class="k">return</span> <span class="kc">True</span>
</pre></div> </pre></div>
<!-- -*- Mode: rst -*- --> <!-- -*- Mode: rst -*- -->
</div> </div>
@ -1421,6 +1420,71 @@ go through all the components of a trans-hierarchical net.</p>
<h3>9.4 Miscellaeous trans-hierarchical functions</h3> <h3>9.4 Miscellaeous trans-hierarchical functions</h3>
<p>For a starter, how to get all the leaf cells...</p> <p>For a starter, how to get all the leaf cells...</p>
</div> </div>
<div class="section" id="dynamically-decorating-data-base-objects">
<h3>9.5 Dynamically decorating data-base objects</h3>
<p>When writing algorithms directly in Python, it may come in handy to be
able to add attributes over the Hurricane data-base objects. As C++
objects exposed to the Python realm cannot natively do so (it would
means to be able to modify a C++ aobject attributes <em>at runtime</em>),
we add a special Property tasked with handling the extra Python
attributes. The syntax has been made as simple as possible.</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">Hurricane</span> <span class="kn">import</span> <span class="n">PythonAttributes</span>
<span class="k">class</span> <span class="nc">MyAttribute</span> <span class="p">(</span> <span class="nb">object</span> <span class="p">):</span>
<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="fm">__init__</span> <span class="p">(</span> <span class="bp">self</span> <span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">MyAttribute</span><span class="o">.</span><span class="n">count</span>
<span class="nb">print</span><span class="p">(</span> <span class="s1">&#39;</span><span class="si">{}</span><span class="s1"> has been created&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="p">)</span>
<span class="n">MyAttribute</span><span class="o">.</span><span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">def</span> <span class="fm">__del__</span> <span class="p">(</span> <span class="bp">self</span> <span class="p">):</span>
<span class="nb">print</span><span class="p">(</span> <span class="s1">&#39;</span><span class="si">{}</span><span class="s1"> has been deleted&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="p">)</span>
<span class="k">def</span> <span class="fm">__str__</span> <span class="p">(</span> <span class="bp">self</span> <span class="p">):</span>
<span class="k">return</span> <span class="s1">&#39;&lt;MyAttribute </span><span class="si">{}</span><span class="s1">&gt;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">demoAttributes</span> <span class="p">(</span> <span class="n">cell</span> <span class="p">):</span>
<span class="n">PythonAttributes</span><span class="o">.</span><span class="n">enable</span><span class="p">(</span> <span class="n">cell</span> <span class="p">)</span>
<span class="n">cell</span><span class="o">.</span><span class="n">myAttribute0</span> <span class="o">=</span> <span class="n">MyAttribute</span><span class="p">()</span>
<span class="n">cell</span><span class="o">.</span><span class="n">myAttribute1</span> <span class="o">=</span> <span class="n">MyAttribute</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span> <span class="s1">&#39;cell.myAttribute0 =&#39;</span><span class="p">,</span> <span class="n">cell</span><span class="o">.</span><span class="n">myAttribute0</span> <span class="p">)</span>
<span class="k">del</span> <span class="n">cell</span><span class="o">.</span><span class="n">myAttribute0</span>
<span class="n">PythonAttributes</span><span class="o">.</span><span class="n">disable</span><span class="p">(</span> <span class="n">cell</span> <span class="p">)</span>
</pre></div>
<p>Detailing the life cycle of Python attributes on a <a class="reference external" href="../../hurricane/classHurricane_1_1DBo.html">DBo</a>:</p>
<ol class="arabic">
<li><p class="first">Enabling the addition of Python attribute on a <a class="reference external" href="../../hurricane/classHurricane_1_1DBo.html">DBo</a>:</p>
<div class="highlight"><pre><span></span><span class="n">PythonAttributes</span><span class="o">.</span><span class="n">enable</span><span class="p">(</span> <span class="n">cell</span> <span class="p">)</span>
</pre></div>
</li>
<li><p class="first">Adding/removing properties on the <a class="reference external" href="../../hurricane/classHurricane_1_1DBo.html">DBo</a>:</p>
<div class="highlight"><pre><span></span><span class="n">cell</span><span class="o">.</span><span class="n">myAttribute0</span> <span class="o">=</span> <span class="n">MyAttribute</span><span class="p">()</span>
<span class="n">cell</span><span class="o">.</span><span class="n">myAttribute1</span> <span class="o">=</span> <span class="n">MyAttribute</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span> <span class="s1">&#39;cell.myAttribute0 =&#39;</span><span class="p">,</span> <span class="n">cell</span><span class="o">.</span><span class="n">myAttribute0</span> <span class="p">)</span>
<span class="k">del</span> <span class="n">cell</span><span class="o">.</span><span class="n">myAttribute0</span>
</pre></div>
</li>
<li><p class="first">And finally disabling the use of Python attributes on the DBo.
Any still attached Python attributes will be released.</p>
<div class="highlight"><pre><span></span><span class="n">PythonAttributes</span><span class="o">.</span><span class="n">disable</span><span class="p">(</span> <span class="n">cell</span> <span class="p">)</span>
</pre></div>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">When the attributes of a <a class="reference external" href="../../hurricane/classHurricane_1_1DBo.html">DBo</a> are released it does not automatically
imply that they are removed. Their reference count is decreased, and
if they are only referenced here, they will be deleted. But if other
variables still holds reference onto them, they will stay allocateds.</p>
</div>
</li>
<li><p class="first">There is no need to keep track of all the <a class="reference external" href="../../hurricane/classHurricane_1_1DBo.html">DBo</a> that have Python
attributes to disable them. One can directly call:</p>
<div class="highlight"><pre><span></span><span class="n">PythonAttributes</span><span class="o">.</span><span class="n">disableAll</span><span class="p">()</span>
</pre></div>
</li>
</ol>
</div>
</div> </div>
</div> </div>

View File

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Printable version of this Document RDS.pdf Contents Printable version of this Document Symbolic Layout Symbolic Components Symbolic Segments The RDS File Physical Grid &amp; Lambda Value The ..."> <meta name="description" content="Printable version of this Document RDS.pdf Contents Printable version of this Document Symbolic Layout Symbolic Components Symbolic Segments The RDS File Physical Grid &amp; Lambda Value The...">
<meta name="keywords" content=""> <meta name="keywords" content="">
<link rel="icon" href="../favicon.ico"> <link rel="icon" href="../favicon.ico">
@ -123,7 +123,7 @@
<h2><a class="toc-backref" href="#id2">Printable version of this Document</a></h2> <h2><a class="toc-backref" href="#id2">Printable version of this Document</a></h2>
<p><a class="reference external" href="../pdfs/RDS.pdf">RDS.pdf</a></p> <p><a class="reference external" href="../pdfs/RDS.pdf">RDS.pdf</a></p>
<div class="contents topic" id="contents"> <div class="contents topic" id="contents">
<p class="topic-title first">Contents</p> <p class="topic-title">Contents</p>
<ul class="simple"> <ul class="simple">
<li><a class="reference internal" href="#printable-version-of-this-document" id="id2">Printable version of this Document</a></li> <li><a class="reference internal" href="#printable-version-of-this-document" id="id2">Printable version of this Document</a></li>
<li><a class="reference internal" href="#symbolic-layout" id="id3">Symbolic Layout</a><ul> <li><a class="reference internal" href="#symbolic-layout" id="id3">Symbolic Layout</a><ul>
@ -297,12 +297,12 @@ bend. Not used anymore in recent technos</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">Not all association of object and symbolic layers are meaningful. <p class="last">Not all association of object and symbolic layers are meaningful.
For instance you cannot associate a contact to a <tt class="docutils literal">NTRANS</tt> layer.</p> For instance you cannot associate a contact to a <tt class="docutils literal">NTRANS</tt> layer.</p>
</div> </div>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">The symbolic layer associated with blockages is prefixed by a <tt class="docutils literal">T</tt>, <p class="last">The symbolic layer associated with blockages is prefixed by a <tt class="docutils literal">T</tt>,
for <em>transparency</em>, which may seems silly. It is for historical reasons, for <em>transparency</em>, which may seems silly. It is for historical reasons,
@ -324,7 +324,7 @@ It allows to generate, if needed, asymetric object in the real layout file.</p>
<h2><a class="toc-backref" href="#id6">The RDS File</a></h2> <h2><a class="toc-backref" href="#id6">The RDS File</a></h2>
<p>The RDS file control how a symbolic layout is transformed into it's real <p>The RDS file control how a symbolic layout is transformed into it's real
conterpart.</p> conterpart.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last"><strong>Unit used inside the RDS file:</strong> all units are expressed in micrometers.</p> <p class="last"><strong>Unit used inside the RDS file:</strong> all units are expressed in micrometers.</p>
</div> </div>
@ -500,7 +500,7 @@ TABLE MBK_TO_RDS_VIA
END END
</pre> </pre>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last"><strong>In CONT_DIF_P</strong> you may see that only three layers will be shown under <p class="last"><strong>In CONT_DIF_P</strong> you may see that only three layers will be shown under
<tt class="docutils literal">graal</tt>, but five will be generated in the <tt class="docutils literal">gds</tt> layout.</p> <tt class="docutils literal">graal</tt>, but five will be generated in the <tt class="docutils literal">gds</tt> layout.</p>
@ -532,7 +532,7 @@ TABLE MBK_TO_RDS_BIGVIA_HOLE
END END
</pre> </pre>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last"><strong>BIGVIA demotion.</strong> If the size of the bigvia is too small, there is <p class="last"><strong>BIGVIA demotion.</strong> If the size of the bigvia is too small, there is
a possibility that no hole from the global matrix will be under it. a possibility that no hole from the global matrix will be under it.

View File

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Printable version of this Document Stratus.pdf Contents Printable version of this Document Class Model Nets Instances Class Model Synopsys class myClass ( Model ) : ... exemple = myClass ( name, ..."> <meta name="description" content="Printable version of this Document Stratus.pdf Contents Printable version of this Document Class Model Nets Instances Class Model Synopsys class myClass ( Model ) : ... exemple = myClass ( name,...">
<meta name="keywords" content=""> <meta name="keywords" content="">
<link rel="icon" href="../favicon.ico"> <link rel="icon" href="../favicon.ico">
@ -123,7 +123,7 @@
<h2><a class="toc-backref" href="#id12">Printable version of this Document</a></h2> <h2><a class="toc-backref" href="#id12">Printable version of this Document</a></h2>
<p><a class="reference external" href="../pdfs/Stratus.pdf">Stratus.pdf</a></p> <p><a class="reference external" href="../pdfs/Stratus.pdf">Stratus.pdf</a></p>
<div class="contents topic" id="contents"> <div class="contents topic" id="contents">
<p class="topic-title first">Contents</p> <p class="topic-title">Contents</p>
<ul class="simple"> <ul class="simple">
<li><a class="reference internal" href="#printable-version-of-this-document" id="id12">Printable version of this Document</a></li> <li><a class="reference internal" href="#printable-version-of-this-document" id="id12">Printable version of this Document</a></li>
<li><a class="reference internal" href="#class-model" id="id13">Class Model</a></li> <li><a class="reference internal" href="#class-model" id="id13">Class Model</a></li>

View File

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Printable version of this Document Stratus.pdf Contents Printable version of this Document DpgenInv DpgenBuff DpgenNand2 DpgenNand3 Dpgennand4 DpgenAnd2 DpgenAnd3 DpgenAnd4 DpgenNor2 DpgenNor3 ..."> <meta name="description" content="Printable version of this Document Stratus.pdf Contents Printable version of this Document DpgenInv DpgenBuff DpgenNand2 DpgenNand3 Dpgennand4 DpgenAnd2 DpgenAnd3 DpgenAnd4 DpgenNor2 DpgenNor3...">
<meta name="keywords" content=""> <meta name="keywords" content="">
<link rel="icon" href="../favicon.ico"> <link rel="icon" href="../favicon.ico">
@ -123,7 +123,7 @@
<h2><a class="toc-backref" href="#id2">Printable version of this Document</a></h2> <h2><a class="toc-backref" href="#id2">Printable version of this Document</a></h2>
<p><a class="reference external" href="${filename}/pdfs/Stratus.pdf">Stratus.pdf</a></p> <p><a class="reference external" href="${filename}/pdfs/Stratus.pdf">Stratus.pdf</a></p>
<div class="contents topic" id="contents"> <div class="contents topic" id="contents">
<p class="topic-title first">Contents</p> <p class="topic-title">Contents</p>
<ul class="simple"> <ul class="simple">
<li><a class="reference internal" href="#printable-version-of-this-document" id="id2">Printable version of this Document</a></li> <li><a class="reference internal" href="#printable-version-of-this-document" id="id2">Printable version of this Document</a></li>
<li><a class="reference internal" href="#dpgeninv" id="id3">DpgenInv</a></li> <li><a class="reference internal" href="#dpgeninv" id="id3">DpgenInv</a></li>

View File

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Printable version of this Document Stratus.pdf Contents Printable version of this Document Introduction Description of a netlist Description of a layout Patterns generation extension Place and Route ..."> <meta name="description" content="Printable version of this Document Stratus.pdf Contents Printable version of this Document Introduction Description of a netlist Description of a layout Patterns generation extension Place and...">
<meta name="keywords" content=""> <meta name="keywords" content="">
<link rel="icon" href="../favicon.ico"> <link rel="icon" href="../favicon.ico">
@ -123,7 +123,7 @@
<h2><a class="toc-backref" href="#id185">Printable version of this Document</a></h2> <h2><a class="toc-backref" href="#id185">Printable version of this Document</a></h2>
<p><a class="reference external" href="../pdfs/Stratus.pdf">Stratus.pdf</a></p> <p><a class="reference external" href="../pdfs/Stratus.pdf">Stratus.pdf</a></p>
<div class="contents topic" id="contents"> <div class="contents topic" id="contents">
<p class="topic-title first">Contents</p> <p class="topic-title">Contents</p>
<ul class="simple"> <ul class="simple">
<li><a class="reference internal" href="#printable-version-of-this-document" id="id185">Printable version of this Document</a></li> <li><a class="reference internal" href="#printable-version-of-this-document" id="id185">Printable version of this Document</a></li>
<li><a class="reference internal" href="#introduction" id="id186">Introduction</a></li> <li><a class="reference internal" href="#introduction" id="id186">Introduction</a></li>

View File

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Printable version of this Document Stratus.pdf Contents Printable version of this Document Description Syntax Methods Example Description The patterns module of Stratus is a set of Python classes and ..."> <meta name="description" content="Printable version of this Document Stratus.pdf Contents Printable version of this Document Description Syntax Methods Example Description The patterns module of Stratus is a set of Python classes...">
<meta name="keywords" content=""> <meta name="keywords" content="">
<link rel="icon" href="../favicon.ico"> <link rel="icon" href="../favicon.ico">
@ -123,7 +123,7 @@
<h2><a class="toc-backref" href="#id8">Printable version of this Document</a></h2> <h2><a class="toc-backref" href="#id8">Printable version of this Document</a></h2>
<p><a class="reference external" href="../pdfs/Stratus.pdf">Stratus.pdf</a></p> <p><a class="reference external" href="../pdfs/Stratus.pdf">Stratus.pdf</a></p>
<div class="contents topic" id="contents"> <div class="contents topic" id="contents">
<p class="topic-title first">Contents</p> <p class="topic-title">Contents</p>
<ul class="simple"> <ul class="simple">
<li><a class="reference internal" href="#printable-version-of-this-document" id="id8">Printable version of this Document</a></li> <li><a class="reference internal" href="#printable-version-of-this-document" id="id8">Printable version of this Document</a></li>
<li><a class="reference internal" href="#description" id="id9">Description</a></li> <li><a class="reference internal" href="#description" id="id9">Description</a></li>

View File

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Contents Making an asic Symbolic Layout Symbolic To Real Translation Pros &amp; Cons of Symbolic Layout A Note About Analog Designs Making an asic This section is a short introduction to the terminology ..."> <meta name="description" content="Contents Making an asic Symbolic Layout Symbolic To Real Translation Pros &amp; Cons of Symbolic Layout A Note About Analog Designs Making an asic This section is a short introduction to the...">
<meta name="keywords" content=""> <meta name="keywords" content="">
<link rel="icon" href="../favicon.ico"> <link rel="icon" href="../favicon.ico">
@ -120,7 +120,7 @@
<!-- Alliance & MBK Concepts --> <!-- Alliance & MBK Concepts -->
<!-- Hurricane Concepts. --> <!-- Hurricane Concepts. -->
<div class="contents topic" id="contents"> <div class="contents topic" id="contents">
<p class="topic-title first">Contents</p> <p class="topic-title">Contents</p>
<ul class="simple"> <ul class="simple">
<li><a class="reference internal" href="#making-an-asic" id="id4">Making an <span class="sc">asic</span></a></li> <li><a class="reference internal" href="#making-an-asic" id="id4">Making an <span class="sc">asic</span></a></li>
<li><a class="reference internal" href="#id2" id="id5">Symbolic Layout</a></li> <li><a class="reference internal" href="#id2" id="id5">Symbolic Layout</a></li>

View File

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Printable Version of this Document Coriolis User&#39;s Guide. Contents Printable Version of this Document Abstract Credits &amp; License Complete Design Flow &amp; Examples Installation Fixed Directory Tree ..."> <meta name="description" content="Printable Version of this Document Coriolis User&#39;s Guide. Contents Printable Version of this Document Abstract Credits &amp; License Complete Design Flow &amp; Examples Installation Fixed Directory Tree...">
<meta name="keywords" content=""> <meta name="keywords" content="">
<link rel="icon" href="../favicon.ico"> <link rel="icon" href="../favicon.ico">
@ -118,7 +118,7 @@
<h2><a class="toc-backref" href="#id13">Printable Version of this Document</a></h2> <h2><a class="toc-backref" href="#id13">Printable Version of this Document</a></h2>
<p><a class="reference external" href="../pdfs/UsersGuide.pdf">Coriolis User's Guide</a>.</p> <p><a class="reference external" href="../pdfs/UsersGuide.pdf">Coriolis User's Guide</a>.</p>
<div class="contents topic" id="contents"> <div class="contents topic" id="contents">
<p class="topic-title first">Contents</p> <p class="topic-title">Contents</p>
<ul class="simple"> <ul class="simple">
<li><a class="reference internal" href="#printable-version-of-this-document" id="id13">Printable Version of this Document</a></li> <li><a class="reference internal" href="#printable-version-of-this-document" id="id13">Printable Version of this Document</a></li>
<li><a class="reference internal" href="#abstract" id="id14">Abstract</a></li> <li><a class="reference internal" href="#abstract" id="id14">Abstract</a></li>
@ -220,14 +220,14 @@ examples are supplied in the repository <tt class="docutils literal"><span class
</div> </div>
<div class="section" id="installation"> <div class="section" id="installation">
<h2><a class="toc-backref" href="#id17">Installation</a></h2> <h2><a class="toc-backref" href="#id17">Installation</a></h2>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">As the sources are being released, the binary packaging is dropped. <p class="last">As the sources are being released, the binary packaging is dropped.
You may still find (very) old versions here: <a class="reference external" href="http://asim.lip6.fr/pub/coriolis/2.0">http://asim.lip6.fr/pub/coriolis/2.0</a> .</p> You may still find (very) old versions here: <a class="reference external" href="http://asim.lip6.fr/pub/coriolis/2.0">http://asim.lip6.fr/pub/coriolis/2.0</a> .</p>
</div> </div>
<p>In a nutshell, building source consists in pulling the <span class="cb">git</span> repository then <p>In a nutshell, building source consists in pulling the <span class="cb">git</span> repository then
running the <span class="cb">ccb</span> installer.</p> running the <span class="cb">ccb</span> installer.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">The documentation is already generated and commited in the <span class="cb">git</span> tree. <p class="last">The documentation is already generated and commited in the <span class="cb">git</span> tree.
You may not install the additional prerequisites for the documentation. You may not install the additional prerequisites for the documentation.
@ -346,7 +346,7 @@ automatically created either by <span class="cb">ccb</span> or the build system.
</tr> </tr>
</tbody> </tbody>
</table> </table>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p><em>Alternate build types:</em> the <tt class="docutils literal">Release.Shared</tt> means an optimized build <p><em>Alternate build types:</em> the <tt class="docutils literal">Release.Shared</tt> means an optimized build
with shared libraries. But there are also available <tt class="docutils literal">Static</tt> instead of <tt class="docutils literal">Shared</tt> with shared libraries. But there are also available <tt class="docutils literal">Static</tt> instead of <tt class="docutils literal">Shared</tt>
@ -362,19 +362,19 @@ and Python modules (which must be dynamic).</p>
<p>The <strong>devel_anabatic</strong> branch is now closed and we go back to a more classical <p>The <strong>devel_anabatic</strong> branch is now closed and we go back to a more classical
scheme where <strong>master</strong> is the stable version and <strong>devel</strong> the development one.</p> scheme where <strong>master</strong> is the stable version and <strong>devel</strong> the development one.</p>
<p>The <span class="sc">Coriolis</span> <span class="cb">git</span> repository is <a class="reference external" href="https://gitlab.lip6.fr/vlsi-cad/coriolis.git">https://gitlab.lip6.fr/vlsi-cad/coriolis.git</a></p> <p>The <span class="sc">Coriolis</span> <span class="cb">git</span> repository is <a class="reference external" href="https://gitlab.lip6.fr/vlsi-cad/coriolis.git">https://gitlab.lip6.fr/vlsi-cad/coriolis.git</a></p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">Again, the <strong>devel_anabatic</strong> branch is now closed. Please revert to <strong>devel</strong> <p class="last">Again, the <strong>devel_anabatic</strong> branch is now closed. Please revert to <strong>devel</strong>
or <strong>master</strong>.</p> or <strong>master</strong>.</p>
</div> </div>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">As it is now possible to mix <span class="sc">PyQt</span> widget with <span class="sc">Coriolis</span> ones, it is simpler <p class="last">As it is now possible to mix <span class="sc">PyQt</span> widget with <span class="sc">Coriolis</span> ones, it is simpler
for us to revert to <span class="sc">qt</span> 4 only. Our reference <span class="sc">os</span> being <span class="sc">rhel</span> 7, there is no for us to revert to <span class="sc">qt</span> 4 only. Our reference <span class="sc">os</span> being <span class="sc">rhel</span> 7, there is no
compatible <span class="sc">PyQt5</span> build compatible with their <span class="sc">qt</span> 5 version (we fall short of compatible <span class="sc">PyQt5</span> build compatible with their <span class="sc">qt</span> 5 version (we fall short of
one minor, they provides <span class="sc">qt</span> 5.9 were we need at least <span class="sc">qt</span> 5.10).</p> one minor, they provides <span class="sc">qt</span> 5.9 were we need at least <span class="sc">qt</span> 5.10).</p>
</div> </div>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last">Under <span class="sc">rhel</span> 7 or clones, they upgraded their version of <span class="sc">qt</span> 4 (from 4.6 to 4.8) <p class="last">Under <span class="sc">rhel</span> 7 or clones, they upgraded their version of <span class="sc">qt</span> 4 (from 4.6 to 4.8)
so the <em>diagonal line</em> bug no longer occurs. So we can safely use the default so the <em>diagonal line</em> bug no longer occurs. So we can safely use the default
@ -429,7 +429,7 @@ dummy@lepka:coriolis&gt; ./bootstrap/ccb.py --project<span class="o">=</span>sup
</pre></div> </pre></div>
</li> </li>
</ol> </ol>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p>Pre-generated documentation will get installed by the previous command. <p>Pre-generated documentation will get installed by the previous command.
Only if you did made modifications to it you need to regenerate it with:</p> Only if you did made modifications to it you need to regenerate it with:</p>
@ -519,7 +519,7 @@ a debug one which allows forensic examination by <span class="cb">gdb</span> (or
<div class="highlight"><pre><span></span>dummy@lepka:~&gt; sudo apt-get install -y qtbase5-dev libqt5svg5-dev libqwt-qt5-dev <span class="se">\</span> <div class="highlight"><pre><span></span>dummy@lepka:~&gt; sudo apt-get install -y qtbase5-dev libqt5svg5-dev libqwt-qt5-dev <span class="se">\</span>
python-pyqt5 python-pyqt5
</pre></div> </pre></div>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last"><strong>Do not install both versions of Qwt</strong> (for Qt 4 and Qt 5), <p class="last"><strong>Do not install both versions of Qwt</strong> (for Qt 4 and Qt 5),
this will confuse the installer and end up with a non functional software this will confuse the installer and end up with a non functional software
@ -595,7 +595,7 @@ in the <tt class="docutils literal">bootstrap</tt> source directory (also instal
<p>Use it like this:</p> <p>Use it like this:</p>
<div class="highlight"><pre><span></span>dummy@lepka:~&gt; <span class="nb">eval</span> <span class="sb">`</span>~/coriolis-2.x/src/coriolis/bootstrap/coriolisEnv.py<span class="sb">`</span> <div class="highlight"><pre><span></span>dummy@lepka:~&gt; <span class="nb">eval</span> <span class="sb">`</span>~/coriolis-2.x/src/coriolis/bootstrap/coriolisEnv.py<span class="sb">`</span>
</pre></div> </pre></div>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p><strong>Do not call that script in your environement initialisation.</strong> <p><strong>Do not call that script in your environement initialisation.</strong>
When used under <span class="sc">rhel6</span> or clones, it needs to be run in the <span class="cb">devtoolset</span> When used under <span class="sc">rhel6</span> or clones, it needs to be run in the <span class="cb">devtoolset</span>
@ -701,7 +701,7 @@ and write Alliance designs and libraries directly.</p>
<p>The <span class="sc">Etesian</span> placer is a state of the art (as of 2015) analytical placer. It is <p>The <span class="sc">Etesian</span> placer is a state of the art (as of 2015) analytical placer. It is
within <tt class="docutils literal">5%</tt> of other placers' solutions, but is normally a bit worse than ePlace. within <tt class="docutils literal">5%</tt> of other placers' solutions, but is normally a bit worse than ePlace.
This <span class="sc">Coriolis</span> tool is actually an encapsulation of <span class="sc">Coloquinte</span> which <em>is</em> the placer.</p> This <span class="sc">Coriolis</span> tool is actually an encapsulation of <span class="sc">Coloquinte</span> which <em>is</em> the placer.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last"><em>Instance Uniquification:</em> a same logical instance cannot have <p class="last"><em>Instance Uniquification:</em> a same logical instance cannot have
two different placements. So, if you don't supply a placement for it, it will be two different placements. So, if you don't supply a placement for it, it will be
@ -820,7 +820,7 @@ of <span class="sc">Katana</span>, the algorithms remains essentially the same).
as its runtime and memory footprint is almost linear (with respect to the number as its runtime and memory footprint is almost linear (with respect to the number
of gates). It has successfully routed design of more than <cite>150K</cite> gates. of gates). It has successfully routed design of more than <cite>150K</cite> gates.
<span class="raw-html"><br class="medskip"/></span></p> <span class="raw-html"><br class="medskip"/></span></p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last"><strong>Slow Layer Assignment.</strong> Most of the time, the layer assignment stage is <p class="last"><strong>Slow Layer Assignment.</strong> Most of the time, the layer assignment stage is
fast (less than a dozen seconds), but in some instances it can take more fast (less than a dozen seconds), but in some instances it can take more
@ -845,14 +845,10 @@ more and more difficult as the capacity of the edges decreases, and at some poin
it will fail too. So this is a balance.</p> it will fail too. So this is a balance.</p>
<p>Routing a design is done in four ordered steps:</p> <p>Routing a design is done in four ordered steps:</p>
<ol class="arabic simple"> <ol class="arabic simple">
<li>Detailed pre-route <span class="formula"><b>P&R</b> → <b>Step by Step</b> → <b>Detailed PreRoute</b></span> <li>Detailed pre-route <span class="formula"><b>P&R</b> → <b>Step by Step</b> → <b>Detailed PreRoute</b></span></li>
</li> <li>Global routing <span class="formula"><b>P&R</b> → <b>Step by Step</b> → <b>Global Route</b></span></li>
<li>Global routing <span class="formula"><b>P&R</b> → <b>Step by Step</b> → <b>Global Route</b></span> <li>Detailed routing <span class="formula"><b>P&R</b> → <b>Step by Step</b> → <b>Detailed Route</b></span></li>
</li> <li>Finalize routing <span class="formula"><b>P&R</b> → <b>Step by Step</b> → <b>Finalize Route</b></span></li>
<li>Detailed routing <span class="formula"><b>P&R</b> → <b>Step by Step</b> → <b>Detailed Route</b></span>
</li>
<li>Finalize routing <span class="formula"><b>P&R</b> → <b>Step by Step</b> → <b>Finalize Route</b></span>
</li>
</ol> </ol>
<p>It is possible to supply to the router a complete wiring for some nets that the user <p>It is possible to supply to the router a complete wiring for some nets that the user
wants to be routed according to a specific topology. The supplied topology must respect wants to be routed according to a specific topology. The supplied topology must respect
@ -991,7 +987,7 @@ topological modification</td>
<div class="section" id="executing-python-scripts-in-cgt"> <div class="section" id="executing-python-scripts-in-cgt">
<span id="python-scripts-in-cgt"></span><h4>Executing Python Scripts in Cgt</h4> <span id="python-scripts-in-cgt"></span><h4>Executing Python Scripts in Cgt</h4>
<p>Python/Stratus scripts can be executed either in text or graphical mode.</p> <p>Python/Stratus scripts can be executed either in text or graphical mode.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last"><strong>How Cgt Locates Python Scripts:</strong> <p class="last"><strong>How Cgt Locates Python Scripts:</strong>
<span class="cb">cgt</span> uses the Python <tt class="docutils literal">import</tt> mechanism to load Python scripts. <span class="cb">cgt</span> uses the Python <tt class="docutils literal">import</tt> mechanism to load Python scripts.
@ -1041,7 +1037,7 @@ outlines).</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last"><em>The pdf file size</em> <p class="last"><em>The pdf file size</em>
Be aware that the generated <span class="sc">pdf</span> files are indeed only pixmaps. Be aware that the generated <span class="sc">pdf</span> files are indeed only pixmaps.
@ -1365,7 +1361,7 @@ cells) is disabled by default when you load a hierarchical design and enabled
when you load a single Cell.</p> when you load a single Cell.</p>
<p>You can choose what kind of form to give to the rubbers and the type of <p>You can choose what kind of form to give to the rubbers and the type of
unit used to display coordinates.</p> unit used to display coordinates.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p><em>What are Rubbers:</em> <span class="sc">Hurricane</span> uses <em>Rubbers</em> to materialize <p><em>What are Rubbers:</em> <span class="sc">Hurricane</span> uses <em>Rubbers</em> to materialize
physical gaps in net topology. That is, if some wires are missing to physical gaps in net topology. That is, if some wires are missing to
@ -1432,13 +1428,13 @@ to browse through the live DataBase. The <em>Inspector</em> provides three entry
</ul> </ul>
<p>Once an entry point has been activated, you may recursively expore all <p>Once an entry point has been activated, you may recursively expore all
its fields using the right/left arrows.</p> its fields using the right/left arrows.</p>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last"><em>Do not put your fingers in the socket:</em> when inspecting <p class="last"><em>Do not put your fingers in the socket:</em> when inspecting
anything, do not modify the DataBase. If any object under inspection anything, do not modify the DataBase. If any object under inspection
is deleted, you will crash the application...</p> is deleted, you will crash the application...</p>
</div> </div>
<div class="note"> <div class="admonition note">
<p class="first admonition-title">Note</p> <p class="first admonition-title">Note</p>
<p class="last"><em>Implementation Detail:</em> the inspector support is done with <p class="last"><em>Implementation Detail:</em> the inspector support is done with
<tt class="docutils literal">Slot</tt>, <tt class="docutils literal">Record</tt> and <tt class="docutils literal">getString()</tt>.</p> <tt class="docutils literal">Slot</tt>, <tt class="docutils literal">Record</tt> and <tt class="docutils literal">getString()</tt>.</p>

Binary file not shown.

View File

@ -50,11 +50,6 @@ p.credit span.right {
font-size: 120%; font-size: 120%;
} }
.cb {
font-weight: bold;
font-family: "courrier", "andale mono", monospace;
}
div#contents { div#contents {
background-color: white; background-color: white;
border-left: 3px solid rgba(235,35,68,1); border-left: 3px solid rgba(235,35,68,1);
@ -104,6 +99,10 @@ div#contents ul > li > a {
} }
*/ */
span.cb {
background: yellow;
}
div.note { div.note {
/* /*
margin: 8px 2% 0px 2%; margin: 8px 2% 0px 2%;
@ -114,7 +113,7 @@ div.note {
background: #ffdd66 url('../_static/images/clipboard.png') no-repeat 0% 50%;; background: #ffdd66 url('../_static/images/clipboard.png') no-repeat 0% 50%;;
font-size: 90% font-size: 90%
*/ */
margin: 8px 10% 8px 2%; margin: 8px 10% 0px 2%;
/*padding: 10px 5pt 1px 35px;*/ /*padding: 10px 5pt 1px 35px;*/
padding: 1px 10px 5px 35px; padding: 1px 10px 5px 35px;
border-left: 4px solid #f6b73c; border-left: 4px solid #f6b73c;

View File

@ -106,7 +106,7 @@ code { padding: 3px 6px; }
padding-left:20px; padding-left:20px;
padding-right:0px; padding-right:0px;
background:#333; background:#333;
font-size:12px; font-size:14px;
font-weight:400; font-weight:400;
font-family:Consolas,monaco,monospace; font-family:Consolas,monaco,monospace;
color:#fff color:#fff
@ -121,7 +121,7 @@ code { padding: 3px 6px; }
padding-left: 5px; padding-left: 5px;
padding-right: 5px; padding-right: 5px;
background:#fcfce1; background:#fcfce1;
font-size: 12px; font-size: 14px;
font-weight: 400; font-weight: 400;
font-family: Consolas, monaco, monospace; font-family: Consolas, monaco, monospace;
color: #000; color: #000;

View File

@ -1,25 +1,26 @@
/* /*
@licstart The following is the entire license notice for the @licstart The following is the entire license notice for the JavaScript code in this file.
JavaScript code in this file.
Copyright (C) 1997-2017 by Dimitri van Heesch The MIT License (MIT)
This program is free software; you can redistribute it and/or modify Copyright (C) 1997-2020 by Dimitri van Heesch
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, Permission is hereby granted, free of charge, to any person obtaining a copy of this software
but WITHOUT ANY WARRANTY; without even the implied warranty of and associated documentation files (the "Software"), to deal in the Software without restriction,
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the including without limitation the rights to use, copy, modify, merge, publish, distribute,
GNU General Public License for more details. sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
You should have received a copy of the GNU General Public License along The above copyright notice and this permission notice shall be included in all copies or
with this program; if not, write to the Free Software Foundation, Inc., substantial portions of the Software.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
@licend The above is the entire license notice THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
for the JavaScript code in this file BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@licend The above is the entire license notice for the JavaScript code in this file
*/ */
function toggleVisibility(linkObj) function toggleVisibility(linkObj)
{ {
@ -60,7 +61,7 @@ function toggleLevel(level)
$(this).show(); $(this).show();
} else if (l==level+1) { } else if (l==level+1) {
i.removeClass('iconfclosed iconfopen').addClass('iconfclosed'); i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
a.html('&#9654;'); a.html('&#9658;');
$(this).show(); $(this).show();
} else { } else {
$(this).hide(); $(this).hide();
@ -87,7 +88,7 @@ function toggleFolder(id)
// replace down arrow by right arrow for current row // replace down arrow by right arrow for current row
var currentRowSpans = currentRow.find("span"); var currentRowSpans = currentRow.find("span");
currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed"); currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
currentRowSpans.filter(".arrow").html('&#9654;'); currentRowSpans.filter(".arrow").html('&#9658;');
rows.filter("[id^=row_"+id+"]").hide(); // hide all children rows.filter("[id^=row_"+id+"]").hide(); // hide all children
} else { // we are SHOWING } else { // we are SHOWING
// replace right arrow by down arrow for current row // replace right arrow by down arrow for current row
@ -97,7 +98,7 @@ function toggleFolder(id)
// replace down arrows by right arrows for child rows // replace down arrows by right arrows for child rows
var childRowsSpans = childRows.find("span"); var childRowsSpans = childRows.find("span");
childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed"); childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
childRowsSpans.filter(".arrow").html('&#9654;'); childRowsSpans.filter(".arrow").html('&#9658;');
childRows.show(); //show all children childRows.show(); //show all children
} }
updateStripes(); updateStripes();

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.8.14 --> <!-- Generated by Doxygen 1.9.1 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -41,11 +41,42 @@ $(function() {
</div><!--header--> </div><!--header-->
<div class="contents"> <div class="contents">
<p>This page explains how to interpret the graphs that are generated by doxygen.</p> <p>This page explains how to interpret the graphs that are generated by doxygen.</p>
<p>Consider the following example: </p><div class="fragment"><div class="line">/*! Invisible class because of truncation */</div><div class="line">class Invisible { };</div><div class="line"></div><div class="line">/*! Truncated class, inheritance relation is hidden */</div><div class="line">class Truncated : public Invisible { };</div><div class="line"></div><div class="line">/* Class not documented with doxygen comments */</div><div class="line">class Undocumented { };</div><div class="line"></div><div class="line">/*! Class that is inherited using public inheritance */</div><div class="line">class PublicBase : public Truncated { };</div><div class="line"></div><div class="line">/*! A template class */</div><div class="line">template&lt;class T&gt; class Templ { };</div><div class="line"></div><div class="line">/*! Class that is inherited using protected inheritance */</div><div class="line">class ProtectedBase { };</div><div class="line"></div><div class="line">/*! Class that is inherited using private inheritance */</div><div class="line">class PrivateBase { };</div><div class="line"></div><div class="line">/*! Class that is used by the Inherited class */</div><div class="line">class Used { };</div><div class="line"></div><div class="line">/*! Super class that inherits a number of other classes */</div><div class="line">class Inherited : public PublicBase,</div><div class="line"> protected ProtectedBase,</div><div class="line"> private PrivateBase,</div><div class="line"> public Undocumented,</div><div class="line"> public Templ&lt;int&gt;</div><div class="line">{</div><div class="line"> private:</div><div class="line"> Used *m_usedClass;</div><div class="line">};</div></div><!-- fragment --><p> This will result in the following graph:</p> <p>Consider the following example: </p><div class="fragment"><div class="line"><span class="comment">/*! Invisible class because of truncation */</span></div>
<center><div class="image"> <div class="line"><span class="keyword">class </span>Invisible { };</div>
<img src="graph_legend.png"/> <div class="line"><span class="comment"></span> </div>
</div> <div class="line"><span class="comment">/*! Truncated class, inheritance relation is hidden */</span></div>
</center><p>The boxes in the above graph have the following meaning: </p> <div class="line"><span class="keyword">class </span>Truncated : <span class="keyword">public</span> Invisible { };</div>
<div class="line"> </div>
<div class="line"><span class="comment">/* Class not documented with doxygen comments */</span></div>
<div class="line"><span class="keyword">class </span>Undocumented { };</div>
<div class="line"><span class="comment"></span> </div>
<div class="line"><span class="comment">/*! Class that is inherited using public inheritance */</span></div>
<div class="line"><span class="keyword">class </span>PublicBase : <span class="keyword">public</span> Truncated { };</div>
<div class="line"><span class="comment"></span> </div>
<div class="line"><span class="comment">/*! A template class */</span></div>
<div class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">class </span>Templ { };</div>
<div class="line"><span class="comment"></span> </div>
<div class="line"><span class="comment">/*! Class that is inherited using protected inheritance */</span></div>
<div class="line"><span class="keyword">class </span>ProtectedBase { };</div>
<div class="line"><span class="comment"></span> </div>
<div class="line"><span class="comment">/*! Class that is inherited using private inheritance */</span></div>
<div class="line"><span class="keyword">class </span>PrivateBase { };</div>
<div class="line"><span class="comment"></span> </div>
<div class="line"><span class="comment">/*! Class that is used by the Inherited class */</span></div>
<div class="line"><span class="keyword">class </span>Used { };</div>
<div class="line"><span class="comment"></span> </div>
<div class="line"><span class="comment">/*! Super class that inherits a number of other classes */</span></div>
<div class="line"><span class="keyword">class </span>Inherited : <span class="keyword">public</span> PublicBase,</div>
<div class="line"> <span class="keyword">protected</span> ProtectedBase,</div>
<div class="line"> <span class="keyword">private</span> PrivateBase,</div>
<div class="line"> <span class="keyword">public</span> Undocumented,</div>
<div class="line"> <span class="keyword">public</span> Templ&lt;int&gt;</div>
<div class="line">{</div>
<div class="line"> <span class="keyword">private</span>:</div>
<div class="line"> Used *m_usedClass;</div>
<div class="line">};</div>
</div><!-- fragment --><p> This will result in the following graph:</p>
<center><img src="graph_legend.png" alt="" class="inline"/></center><p>The boxes in the above graph have the following meaning: </p>
<ul> <ul>
<li> <li>
A filled gray box represents the struct or class for which the graph is generated. </li> A filled gray box represents the struct or class for which the graph is generated. </li>
@ -74,7 +105,7 @@ A yellow dashed arrow denotes a relation between a template instance and the tem
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td> <td class="LFooter"><small>Generated by doxygen 1.9.1 on Thu Aug 11 2022</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -1 +1 @@
387ff8eb65306fa251338d3c9bd7bfff f51bf6e9a10430aafef59831b08dcbfe

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -1,13 +1,13 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?> <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<tagfile> <tagfile doxygen_version="1.9.1">
<compound kind="page"> <compound kind="page">
<name>index</name> <name>index</name>
<title></title> <title></title>
<filename>index</filename> <filename>index.html</filename>
<docanchor file="index" title="Software Architecture">secMainDoc</docanchor> <docanchor file="index.html" title="Software Architecture">secMainDoc</docanchor>
<docanchor file="index" title="Unique Instance-Cell Relationship">ssecUniqueInstance</docanchor> <docanchor file="index.html" title="Unique Instance-Cell Relationship">ssecUniqueInstance</docanchor>
<docanchor file="index" title="Why Meta-Transistor">ssecWhyMetaTrans</docanchor> <docanchor file="index.html" title="Why Meta-Transistor">ssecWhyMetaTrans</docanchor>
<docanchor file="index" title="Class Organization">ssecClassOrg</docanchor> <docanchor file="index.html" title="Class Organization">ssecClassOrg</docanchor>
<docanchor file="index" title="Open questions">ssecOpenQuestions</docanchor> <docanchor file="index.html" title="Open questions">ssecOpenQuestions</docanchor>
</compound> </compound>
</tagfile> </tagfile>

View File

@ -24,7 +24,7 @@
--> -->
<br> <br>
<body onload="javascript:toggleLevel(1)"> <body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.8.14 --> <!-- Generated by Doxygen 1.9.1 -->
<script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script> <script type="text/javascript" src="menu.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -35,7 +35,7 @@ $(function() {
/* @license-end */</script> /* @license-end */</script>
<div id="main-nav"></div> <div id="main-nav"></div>
</div><!-- top --> </div><!-- top -->
<div class="header"> <div class="PageDoc"><div class="header">
<div class="headertitle"> <div class="headertitle">
<div class="title">Hurricane Analog Documentation</div> </div> <div class="title">Hurricane Analog Documentation</div> </div>
</div><!--header--> </div><!--header-->
@ -53,9 +53,11 @@ Unique Instance-Cell Relationship</h2>
<p>In Analog designs, Devices and MetaTransistors are all parametriseds in such a way that each one become effectively unique. So any Device or MetaTransistor is only instanciated once with it's specific set of parameter's values, thus there is a <b>unique</b> relationship between a Device and it's instance. We can keep tab of only one of the two. As the Cell contains more information, this is the one we choose. But we still need the Instance to perform (store) the placement informations. So, how to get the Instance from one Device.</p> <p>In Analog designs, Devices and MetaTransistors are all parametriseds in such a way that each one become effectively unique. So any Device or MetaTransistor is only instanciated once with it's specific set of parameter's values, thus there is a <b>unique</b> relationship between a Device and it's instance. We can keep tab of only one of the two. As the Cell contains more information, this is the one we choose. But we still need the Instance to perform (store) the placement informations. So, how to get the Instance from one Device.</p>
<p><b>Method 1:</b> name matching.</p> <p><b>Method 1:</b> name matching.</p>
<p>For the sake of clarity, we impose that the Device name must be identical to the instance name. This way we can lookup for an Instance in the top device with the same name as the current model. We assume that we indeed have the containing Cell in handy:</p> <p>For the sake of clarity, we impose that the Device name must be identical to the instance name. This way we can lookup for an Instance in the top device with the same name as the current model. We assume that we indeed have the containing Cell in handy:</p>
<div class="fragment"><div class="line">Instance* instance = parentCell-&gt;getInstance( cell-&gt;getName() );</div></div><!-- fragment --><p><b>Method 2:</b> Slave instance.</p> <div class="fragment"><div class="line">Instance* instance = parentCell-&gt;getInstance( cell-&gt;getName() );</div>
</div><!-- fragment --><p><b>Method 2:</b> Slave instance.</p>
<p>In the Hurricane data structure, every Device (Cell) keep track of the Instances pointing to it. Since there should be only one in analogic, we can do the following:</p> <p>In the Hurricane data structure, every Device (Cell) keep track of the Instances pointing to it. Since there should be only one in analogic, we can do the following:</p>
<div class="fragment"><div class="line">Instance* instance = cell-&gt;getSlaveInstances().getFirst();</div></div><!-- fragment --><h2><a class="anchor" id="ssecWhyMetaTrans"></a> <div class="fragment"><div class="line">Instance* instance = cell-&gt;getSlaveInstances().getFirst();</div>
</div><!-- fragment --><h2><a class="anchor" id="ssecWhyMetaTrans"></a>
Why Meta-Transistor</h2> Why Meta-Transistor</h2>
<p>The Hurricane database does not have true support for transistor as Cell(s), only a dedicated layer for Segment. Hence the implementation of the MetaTransistor in Hurricane/Analog. It provides a Cell derived class with four connectors (<code>G</code> , <code>S</code> , <code>D</code> , <code>B</code> ) and a comprenhensive set of electrical parameters.</p> <p>The Hurricane database does not have true support for transistor as Cell(s), only a dedicated layer for Segment. Hence the implementation of the MetaTransistor in Hurricane/Analog. It provides a Cell derived class with four connectors (<code>G</code> , <code>S</code> , <code>D</code> , <code>B</code> ) and a comprenhensive set of electrical parameters.</p>
<p>It is meant to represent a complete transistor, not a finger of a larger one, it <b>is</b> the larger one...</p> <p>It is meant to represent a complete transistor, not a finger of a larger one, it <b>is</b> the larger one...</p>
@ -63,7 +65,7 @@ Why Meta-Transistor</h2>
Class Organization</h2> Class Organization</h2>
<p>Almost UML schema of the Device related classes.</p> <p>Almost UML schema of the Device related classes.</p>
<div class="image"> <div class="image">
<img src="device_schema_1_uml.png" alt="device_schema_1_uml.png"/> <img src="device_schema_1_uml.png" alt=""/>
</div> </div>
<p>For the Transistor device:</p> <p>For the Transistor device:</p>
<ol type="1"> <ol type="1">
@ -87,12 +89,13 @@ Open questions</h2>
<li>In Bora::channelRouting, what is implemented is in fact an interval tree (or segment tree). We should try to use their <code>Boost</code> implementation.</li> <li>In Bora::channelRouting, what is implemented is in fact an interval tree (or segment tree). We should try to use their <code>Boost</code> implementation.</li>
<li>In Bora::SlicingTree, whe should merge the list of user nodes (devices and hierarchical) with the routing nodes (channels and struts) to unify the underlying management. This sould enable us to move lots method implementation <em>upward</em> in the class hierarchy. </li> <li>In Bora::SlicingTree, whe should merge the list of user nodes (devices and hierarchical) with the routing nodes (channels and struts) to unify the underlying management. This sould enable us to move lots method implementation <em>upward</em> in the class hierarchy. </li>
</ol> </ol>
</div></div><!-- contents --> </div></div><!-- PageDoc -->
</div><!-- contents -->
<br> <br>
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Nov 21 2021</small></td> <td class="LFooter"><small>Generated by doxygen 1.9.1 on Thu Aug 11 2022</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

File diff suppressed because one or more lines are too long

View File

@ -1,25 +1,26 @@
/* /*
@licstart The following is the entire license notice for the @licstart The following is the entire license notice for the JavaScript code in this file.
JavaScript code in this file.
Copyright (C) 1997-2017 by Dimitri van Heesch The MIT License (MIT)
This program is free software; you can redistribute it and/or modify Copyright (C) 1997-2020 by Dimitri van Heesch
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, Permission is hereby granted, free of charge, to any person obtaining a copy of this software
but WITHOUT ANY WARRANTY; without even the implied warranty of and associated documentation files (the "Software"), to deal in the Software without restriction,
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the including without limitation the rights to use, copy, modify, merge, publish, distribute,
GNU General Public License for more details. sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
You should have received a copy of the GNU General Public License along The above copyright notice and this permission notice shall be included in all copies or
with this program; if not, write to the Free Software Foundation, Inc., substantial portions of the Software.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
@licend The above is the entire license notice THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
for the JavaScript code in this file BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@licend The above is the entire license notice for the JavaScript code in this file
*/ */
function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
function makeTree(data,relPath) { function makeTree(data,relPath) {
@ -40,9 +41,9 @@ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
$('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
if (searchEnabled) { if (searchEnabled) {
if (serverSide) { if (serverSide) {
$('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><div class="left"><form id="FSearchBox" action="'+searchPage+'" method="get"><img id="MSearchSelect" src="'+relPath+'search/mag.png" alt=""/><input type="text" id="MSearchField" name="query" value="'+search+'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"></form></div><div class="right"></div></div></li>'); $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><div class="left"><form id="FSearchBox" action="'+relPath+searchPage+'" method="get"><img id="MSearchSelect" src="'+relPath+'search/mag.svg" alt=""/><input type="text" id="MSearchField" name="query" value="'+search+'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"></form></div><div class="right"></div></div></li>');
} else { } else {
$('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><span class="left"><img id="MSearchSelect" src="'+relPath+'search/mag_sel.png" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/><input type="text" id="MSearchField" value="'+search+'" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/></span><span class="right"><a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="'+relPath+'search/close.png" alt=""/></a></span></div></li>'); $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><span class="left"><img id="MSearchSelect" src="'+relPath+'search/mag_sel.svg" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/><input type="text" id="MSearchField" value="'+search+'" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/></span><span class="right"><a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="'+relPath+'search/close.svg" alt=""/></a></span></div></li>');
} }
} }
$('#main-menu').smartmenus(); $('#main-menu').smartmenus();

View File

@ -1,25 +1,26 @@
/* /*
@ @licstart The following is the entire license notice for the @licstart The following is the entire license notice for the JavaScript code in this file.
JavaScript code in this file.
Copyright (C) 1997-2017 by Dimitri van Heesch The MIT License (MIT)
This program is free software; you can redistribute it and/or modify Copyright (C) 1997-2020 by Dimitri van Heesch
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, Permission is hereby granted, free of charge, to any person obtaining a copy of this software
but WITHOUT ANY WARRANTY; without even the implied warranty of and associated documentation files (the "Software"), to deal in the Software without restriction,
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the including without limitation the rights to use, copy, modify, merge, publish, distribute,
GNU General Public License for more details. sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
You should have received a copy of the GNU General Public License along The above copyright notice and this permission notice shall be included in all copies or
with this program; if not, write to the Free Software Foundation, Inc., substantial portions of the Software.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
@licend The above is the entire license notice THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
for the JavaScript code in this file BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@licend The above is the entire license notice for the JavaScript code in this file
*/ */
var menudata={children:[ var menudata={children:[
{text:"Main Page",url:"index.html"}]} {text:"Main Page",url:"index.html"}]}

View File

@ -1,20 +1,22 @@
LATEX_CMD=pdflatex
all: refman.pdf all: refman.pdf
pdf: refman.pdf pdf: refman.pdf
refman.pdf: clean refman.tex refman.pdf: clean refman.tex
pdflatex refman $(LATEX_CMD) refman
makeindex refman.idx makeindex refman.idx
pdflatex refman $(LATEX_CMD) refman
latex_count=8 ; \ latex_count=8 ; \
while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\ while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\
do \ do \
echo "Rerunning latex...." ;\ echo "Rerunning latex...." ;\
pdflatex refman ;\ $(LATEX_CMD) refman ;\
latex_count=`expr $$latex_count - 1` ;\ latex_count=`expr $$latex_count - 1` ;\
done done
makeindex refman.idx makeindex refman.idx
pdflatex refman $(LATEX_CMD) refman
clean: clean:

View File

@ -3,16 +3,24 @@
% Packages used by this style file % Packages used by this style file
\RequirePackage{alltt} \RequirePackage{alltt}
\RequirePackage{array} %%\RequirePackage{array} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package
\RequirePackage{calc} \RequirePackage{calc}
\RequirePackage{float} \RequirePackage{float}
\RequirePackage{ifthen} %%\RequirePackage{ifthen} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package
\RequirePackage{verbatim} \RequirePackage{verbatim}
\RequirePackage[table]{xcolor} \RequirePackage[table]{xcolor}
\RequirePackage{longtable} \RequirePackage{longtable_doxygen}
\RequirePackage{tabu} \RequirePackage{tabu_doxygen}
\RequirePackage{fancyvrb}
\RequirePackage{tabularx} \RequirePackage{tabularx}
\RequirePackage{multicol}
\RequirePackage{multirow} \RequirePackage{multirow}
\RequirePackage{hanging}
\RequirePackage{ifpdf}
\RequirePackage{adjustbox}
\RequirePackage{amssymb}
\RequirePackage{stackengine}
\RequirePackage[normalem]{ulem} % for strikeout, but don't modify emphasis
%---------- Internal commands used in this style file ---------------- %---------- Internal commands used in this style file ----------------
@ -28,6 +36,16 @@
\endgroup% \endgroup%
} }
\newcommand{\DoxyHorRuler}[1]{%
\setlength{\parskip}{0ex plus 0ex minus 0ex}%
\ifthenelse{#1=0}%
{%
\hrule%
}%
{%
\hrulefilll%
}%
}
\newcommand{\DoxyLabelFont}{} \newcommand{\DoxyLabelFont}{}
\newcommand{\entrylabel}[1]{% \newcommand{\entrylabel}[1]{%
{% {%
@ -42,7 +60,7 @@
\ensurespace{4\baselineskip}% \ensurespace{4\baselineskip}%
\begin{list}{}{% \begin{list}{}{%
\settowidth{\labelwidth}{20pt}% \settowidth{\labelwidth}{20pt}%
\setlength{\parsep}{0pt}% %\setlength{\parsep}{0pt}%
\setlength{\itemsep}{0pt}% \setlength{\itemsep}{0pt}%
\setlength{\leftmargin}{\labelwidth+\labelsep}% \setlength{\leftmargin}{\labelwidth+\labelsep}%
\renewcommand{\makelabel}{\entrylabel}% \renewcommand{\makelabel}{\entrylabel}%
@ -77,20 +95,53 @@
\end{alltt}% \end{alltt}%
\normalsize% \normalsize%
} }
% Necessary for redefining not defined characters, i.e. "Replacement Character" in tex output.
\newlength{\CodeWidthChar}
\newlength{\CodeHeightChar}
\settowidth{\CodeWidthChar}{?}
\settoheight{\CodeHeightChar}{?}
% Necessary for hanging indent
\newlength{\DoxyCodeWidth}
% Used by @code ... @endcode \newcommand\DoxyCodeLine[1]{\hangpara{\DoxyCodeWidth}{1}{#1}\par}
\newenvironment{DoxyCode}{%
\par% \newcommand\NiceSpace{%
\scriptsize% \discretionary{}{\kern\fontdimen2\font}{\kern\fontdimen2\font}%
\begin{alltt}%
}{%
\end{alltt}%
\normalsize%
} }
% Used by @code ... @endcode
\newenvironment{DoxyCode}[1]{%
\par%
\scriptsize%
\normalfont\ttfamily%
\rightskip0pt plus 1fil%
\settowidth{\DoxyCodeWidth}{000000}%
\settowidth{\CodeWidthChar}{?}%
\settoheight{\CodeHeightChar}{?}%
\setlength{\parskip}{0ex plus 0ex minus 0ex}%
\ifthenelse{\equal{#1}{0}}
{
{\lccode`~32 \lowercase{\global\let~}\NiceSpace}\obeyspaces%
}
{
{\lccode`~32 \lowercase{\global\let~}}\obeyspaces%
}
}{%
\normalfont%
\normalsize%
\settowidth{\CodeWidthChar}{?}%
\settoheight{\CodeHeightChar}{?}%
}
% Redefining not defined characters, i.e. "Replacement Character" in tex output.
\def\ucr{\adjustbox{width=\CodeWidthChar,height=\CodeHeightChar}{\stackinset{c}{}{c}{-.2pt}{%
\textcolor{white}{\sffamily\bfseries\small ?}}{%
\rotatebox{45}{$\blacksquare$}}}}
% Used by @example, @include, @includelineno and @dontinclude % Used by @example, @include, @includelineno and @dontinclude
\newenvironment{DoxyCodeInclude}{% \newenvironment{DoxyCodeInclude}[1]{%
\DoxyCode% \DoxyCode{#1}%
}{% }{%
\endDoxyCode% \endDoxyCode%
} }
@ -136,9 +187,8 @@
% (only if caption is specified) % (only if caption is specified)
\newenvironment{DoxyImage}{% \newenvironment{DoxyImage}{%
\begin{figure}[H]% \begin{figure}[H]%
\begin{center}% \centering%
}{% }{%
\end{center}%
\end{figure}% \end{figure}%
} }
@ -150,6 +200,12 @@
\end{center}% \end{center}%
} }
% Used by @image
% (only if inline is specified)
\newenvironment{DoxyInlineImage}{%
}{%
}
% Used by @attention % Used by @attention
\newenvironment{DoxyAttention}[1]{% \newenvironment{DoxyAttention}[1]{%
\begin{DoxyDesc}{#1}% \begin{DoxyDesc}{#1}%
@ -256,16 +312,9 @@
% Used by @par and @paragraph % Used by @par and @paragraph
\newenvironment{DoxyParagraph}[1]{% \newenvironment{DoxyParagraph}[1]{%
\begin{list}{}{% \begin{DoxyDesc}{#1}%
\settowidth{\labelwidth}{40pt}%
\setlength{\leftmargin}{\labelwidth}%
\setlength{\parsep}{0pt}%
\setlength{\itemsep}{-4pt}%
\renewcommand{\makelabel}{\entrylabel}%
}%
\item[#1]%
}{% }{%
\end{list}% \end{DoxyDesc}%
} }
% Used by parameter lists % Used by parameter lists
@ -273,10 +322,10 @@
\tabulinesep=1mm% \tabulinesep=1mm%
\par% \par%
\ifthenelse{\equal{#1}{}}% \ifthenelse{\equal{#1}{}}%
{\begin{longtabu} spread 0pt [l]{|X[-1,l]|X[-1,l]|}}% name + description {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|}}% name + description
{\ifthenelse{\equal{#1}{1}}% {\ifthenelse{\equal{#1}{1}}%
{\begin{longtabu} spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + name + desc {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + name + desc
{\begin{longtabu} spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + type + name + desc {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + type + name + desc
} }
\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]%
\hline% \hline%
@ -285,7 +334,7 @@
\hline% \hline%
\endhead% \endhead%
}{% }{%
\end{longtabu}% \end{longtabu*}%
\vspace{6pt}% \vspace{6pt}%
} }
@ -293,7 +342,7 @@
\newenvironment{DoxyFields}[1]{% \newenvironment{DoxyFields}[1]{%
\tabulinesep=1mm% \tabulinesep=1mm%
\par% \par%
\begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|X[-1,l]|}% \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|X[-1,l]|}%
\multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
\hline% \hline%
\endfirsthead% \endfirsthead%
@ -301,7 +350,7 @@
\hline% \hline%
\endhead% \endhead%
}{% }{%
\end{longtabu}% \end{longtabu*}%
\vspace{6pt}% \vspace{6pt}%
} }
@ -309,7 +358,7 @@
\newenvironment{DoxyEnumFields}[1]{% \newenvironment{DoxyEnumFields}[1]{%
\tabulinesep=1mm% \tabulinesep=1mm%
\par% \par%
\begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}% \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
\hline% \hline%
\endfirsthead% \endfirsthead%
@ -317,7 +366,7 @@
\hline% \hline%
\endhead% \endhead%
}{% }{%
\end{longtabu}% \end{longtabu*}%
\vspace{6pt}% \vspace{6pt}%
} }
@ -331,7 +380,7 @@
\newenvironment{DoxyRetVals}[1]{% \newenvironment{DoxyRetVals}[1]{%
\tabulinesep=1mm% \tabulinesep=1mm%
\par% \par%
\begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}% \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
\hline% \hline%
\endfirsthead% \endfirsthead%
@ -339,7 +388,7 @@
\hline% \hline%
\endhead% \endhead%
}{% }{%
\end{longtabu}% \end{longtabu*}%
\vspace{6pt}% \vspace{6pt}%
} }
@ -347,7 +396,7 @@
\newenvironment{DoxyExceptions}[1]{% \newenvironment{DoxyExceptions}[1]{%
\tabulinesep=1mm% \tabulinesep=1mm%
\par% \par%
\begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}% \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
\hline% \hline%
\endfirsthead% \endfirsthead%
@ -355,7 +404,7 @@
\hline% \hline%
\endhead% \endhead%
}{% }{%
\end{longtabu}% \end{longtabu*}%
\vspace{6pt}% \vspace{6pt}%
} }
@ -363,7 +412,7 @@
\newenvironment{DoxyTemplParams}[1]{% \newenvironment{DoxyTemplParams}[1]{%
\tabulinesep=1mm% \tabulinesep=1mm%
\par% \par%
\begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}% \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
\hline% \hline%
\endfirsthead% \endfirsthead%
@ -371,7 +420,7 @@
\hline% \hline%
\endhead% \endhead%
}{% }{%
\end{longtabu}% \end{longtabu*}%
\vspace{6pt}% \vspace{6pt}%
} }
@ -439,11 +488,11 @@
\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}% \newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}%
\newenvironment{TabularC}[1]% \newenvironment{TabularC}[1]%
{\tabulinesep=1mm {\tabulinesep=1mm
\begin{longtabu} spread 0pt [c]{*#1{|X[-1]}|}}% \begin{longtabu*}spread 0pt [c]{*#1{|X[-1]}|}}%
{\end{longtabu}\par}% {\end{longtabu*}\par}%
\newenvironment{TabularNC}[1]% \newenvironment{TabularNC}[1]%
{\begin{tabu} spread 0pt [l]{*#1{|X[-1]}|}}% {\begin{tabu}spread 0pt [l]{*#1{|X[-1]}|}}%
{\end{tabu}\par}% {\end{tabu}\par}%
% Used for member group headers % Used for member group headers
@ -495,9 +544,33 @@
% Version of hypertarget with correct landing location % Version of hypertarget with correct landing location
\newcommand{\Hypertarget}[1]{\Hy@raisedlink{\hypertarget{#1}{}}} \newcommand{\Hypertarget}[1]{\Hy@raisedlink{\hypertarget{#1}{}}}
% possibility to have sections etc. be within the margins
% unfortunately had to copy part of book.cls and add \raggedright
\makeatletter
\newcommand\doxysection{\@startsection {section}{1}{\z@}%
{-3.5ex \@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
{\raggedright\normalfont\Large\bfseries}}
\newcommand\doxysubsection{\@startsection{subsection}{2}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\raggedright\normalfont\large\bfseries}}
\newcommand\doxysubsubsection{\@startsection{subsubsection}{3}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\raggedright\normalfont\normalsize\bfseries}}
\newcommand\doxyparagraph{\@startsection{paragraph}{4}{\z@}%
{3.25ex \@plus1ex \@minus.2ex}%
{-1em}%
{\raggedright\normalfont\normalsize\bfseries}}
\newcommand\doxysubparagraph{\@startsection{subparagraph}{5}{\parindent}%
{3.25ex \@plus1ex \@minus .2ex}%
{-1em}%
{\raggedright\normalfont\normalsize\bfseries}}
\makeatother
% Define caption that is also suitable in a table % Define caption that is also suitable in a table
\makeatletter \makeatletter
\def\doxyfigcaption{% \def\doxyfigcaption{%
\refstepcounter{figure}% \H@refstepcounter{figure}%
\@dblarg{\@caption{figure}}} \@dblarg{\@caption{figure}}}
\makeatother \makeatother

View File

@ -1,41 +1,43 @@
\hypertarget{index_secMainDoc}{}\section{Software Architecture}\label{index_secMainDoc} \hypertarget{index_secMainDoc}{}\doxysection{Software Architecture}\label{index_secMainDoc}
\hypertarget{index_ssecUniqueInstance}{}\subsection{Unique Instance-\/\+Cell Relationship}\label{index_ssecUniqueInstance} \hypertarget{index_ssecUniqueInstance}{}\doxysubsection{Unique Instance-\/\+Cell Relationship}\label{index_ssecUniqueInstance}
Meta\+Transistor and Device are derived classes of Cell and are the building blocks of all analogic designs. Meta\+Transistor and Device are derived classes of Cell and are the building blocks of all analogic designs.
\begin{DoxyItemize} \begin{DoxyItemize}
\item Meta\+Transistor(s) are used to build the Devices, and {\itshape only} them. \item Meta\+Transistor(s) are used to build the Devices, and {\itshape only} them.
\item Device(s) are then assembled into more complex design. \item Device(s) are then assembled into more complex design.
\end{DoxyItemize} \end{DoxyItemize}
The important point to remember is that Device and Meta\+Transistor {\bfseries are} Cell(s). The important point to remember is that Device and Meta\+Transistor {\bfseries{are}} Cell(s).
\begin{DoxyNote}{Note} \begin{DoxyNote}{Note}
An analogy can be made between the Devices and the Standard Cells in the numeric world. An analogy can be made between the Devices and the Standard Cells in the numeric world.
\end{DoxyNote} \end{DoxyNote}
In Analog designs, Devices and Meta\+Transistors are all parametriseds in such a way that each one become effectively unique. So any Device or Meta\+Transistor is only instanciated once with it\textquotesingle{}s specific set of parameter\textquotesingle{}s values, thus there is a {\bfseries unique} relationship between a Device and it\textquotesingle{}s instance. We can keep tab of only one of the two. As the Cell contains more information, this is the one we choose. But we still need the Instance to perform (store) the placement informations. So, how to get the Instance from one Device. In Analog designs, Devices and Meta\+Transistors are all parametriseds in such a way that each one become effectively unique. So any Device or Meta\+Transistor is only instanciated once with it\textquotesingle{}s specific set of parameter\textquotesingle{}s values, thus there is a {\bfseries{unique}} relationship between a Device and it\textquotesingle{}s instance. We can keep tab of only one of the two. As the Cell contains more information, this is the one we choose. But we still need the Instance to perform (store) the placement informations. So, how to get the Instance from one Device.
{\bfseries Method 1\+:} name matching. {\bfseries{Method 1\+:}} name matching.
For the sake of clarity, we impose that the Device name must be identical to the instance name. This way we can lookup for an Instance in the top device with the same name as the current model. We assume that we indeed have the containing Cell in handy\+: For the sake of clarity, we impose that the Device name must be identical to the instance name. This way we can lookup for an Instance in the top device with the same name as the current model. We assume that we indeed have the containing Cell in handy\+:
\begin{DoxyCode} \begin{DoxyCode}{0}
Instance* instance = parentCell->getInstance( cell->getName() ); \DoxyCodeLine{Instance* instance = parentCell-\/>getInstance( cell-\/>getName() );}
\end{DoxyCode} \end{DoxyCode}
{\bfseries Method 2\+:} Slave instance. {\bfseries{Method 2\+:}} Slave instance.
In the Hurricane data structure, every Device (Cell) keep track of the Instances pointing to it. Since there should be only one in analogic, we can do the following\+: In the Hurricane data structure, every Device (Cell) keep track of the Instances pointing to it. Since there should be only one in analogic, we can do the following\+:
\begin{DoxyCode} \begin{DoxyCode}{0}
Instance* instance = cell->getSlaveInstances().getFirst(); \DoxyCodeLine{Instance* instance = cell-\/>getSlaveInstances().getFirst();}
\end{DoxyCode} \end{DoxyCode}
\hypertarget{index_ssecWhyMetaTrans}{}\subsection{Why Meta-\/\+Transistor}\label{index_ssecWhyMetaTrans} \hypertarget{index_ssecWhyMetaTrans}{}\doxysubsection{Why Meta-\/\+Transistor}\label{index_ssecWhyMetaTrans}
The Hurricane database does not have true support for transistor as Cell(s), only a dedicated layer for Segment. Hence the implementation of the Meta\+Transistor in Hurricane/\+Analog. It provides a Cell derived class with four connectors ({\ttfamily G} , {\ttfamily S} , {\ttfamily D} , {\ttfamily B} ) and a comprenhensive set of electrical parameters. The Hurricane database does not have true support for transistor as Cell(s), only a dedicated layer for Segment. Hence the implementation of the Meta\+Transistor in Hurricane/\+Analog. It provides a Cell derived class with four connectors ({\ttfamily G} , {\ttfamily S} , {\ttfamily D} , {\ttfamily B} ) and a comprenhensive set of electrical parameters.
It is meant to represent a complete transistor, not a finger of a larger one, it {\bfseries is} the larger one...\hypertarget{index_ssecClassOrg}{}\subsection{Class Organization}\label{index_ssecClassOrg} It is meant to represent a complete transistor, not a finger of a larger one, it {\bfseries{is}} the larger one...\hypertarget{index_ssecClassOrg}{}\doxysubsection{Class Organization}\label{index_ssecClassOrg}
Almost U\+ML schema of the Device related classes. Almost UML schema of the Device related classes.
@ -58,8 +60,8 @@ Deprecateds\+:
\begin{DoxyEnumerate} \begin{DoxyEnumerate}
\item {\ttfamily Arguments} where fully redundant with Parameters, so we did remove them. \item {\ttfamily Arguments} where fully redundant with Parameters, so we did remove them.
{\bfseries The Arguments must be removed from the U\+ML schema.} {\bfseries{The Arguments must be removed from the UML schema.}}
\end{DoxyEnumerate}\hypertarget{index_ssecOpenQuestions}{}\subsection{Open questions}\label{index_ssecOpenQuestions} \end{DoxyEnumerate}\hypertarget{index_ssecOpenQuestions}{}\doxysubsection{Open questions}\label{index_ssecOpenQuestions}
\begin{DoxyEnumerate} \begin{DoxyEnumerate}
\item In Bora\+::channel\+Routing, what is implemented is in fact an interval tree (or segment tree). We should try to use their {\ttfamily Boost} implementation. \item In Bora\+::channel\+Routing, what is implemented is in fact an interval tree (or segment tree). We should try to use their {\ttfamily Boost} implementation.

View File

@ -32,9 +32,9 @@
\begin{center} \begin{center}
{\Large Hurricane Analog Reference Manual\\[1ex]\large 3.\+0 }\\ {\Large Hurricane Analog Reference Manual\\[1ex]\large 3.\+0 }\\
\vspace*{1cm} \vspace*{1cm}
{\large Generated by Doxygen 1.8.14}\\ {\large Generated by Doxygen 1.9.1}\\
\vspace*{0.5cm} \vspace*{0.5cm}
{\small Sun Nov 21 2021 22:10:15}\\ {\small Thu Aug 11 2022 19:10:58}\\
\end{center} \end{center}
\end{titlepage} \end{titlepage}
@ -54,7 +54,7 @@
\newpage \newpage
\phantomsection \phantomsection
\clearemptydoublepage \clearemptydoublepage
\addcontentsline{toc}{chapter}{Index} \addcontentsline{toc}{chapter}{\indexname}
\printindex \printindex
\end{document} \end{document}

View File

@ -0,0 +1,103 @@
// -*- C++ -*-
namespace Isobar {
/*! \class PyAttributesHolder
* \brief A simple Python object to store attributes.
*
* \see PythonAttributes
*/
/*! \class PyHolderProperty
* \brief A Property to contain PyAttributesHolder
*
* \see PythonAttributes
*/
/*! \class PythonAttributes
* \brief A Property to store Python objects (\b API).
*
* \section sPythonPropertiesIntro Introduction
*
* The problem to solve here is <em>how to decorate a DBo in Python code</em>.
* In the C++ realm, Hurricane provides the Property mechanism.
* But a Property is a template that needs to be defined at compile
* time, whether a Python object is only known at run time.
*
* So, instead of trying to create one property per Python
* attribute, we create one PyHolderProperty property, which
* has one PyAttributesHolder attribute (a basic derived class
* of PyObject with only a dictionnary). All the Python attributes
* of the DBo are then stored as attributes of PyAttributesHolder.
*
* Finally, to make the Python syntax straigthforward, we modify the
* PyTypeEntity.tp_setatto and PyTypeEntity.tp_getattro so that when
* trying to access an attribute, we get redirected towards the
* PyAttributesHolder (which is another PyObject). So we can write
* the following code:
*
* \code{.py}
class MyAttribute ( object ):
count = 0
def __init__ ( self ):
self.value = MyAttribute.count
print( '{} has been created'.format(self) )
MyAttribute.count += 1
def __del__ ( self ):
print( '{} has been deleted'.format(self) )
def __str__ ( self ):
return '<MyAttribute {}>'.format(self.value)
def demoAttributes ( cell ):
PythonAttributes.enable( cell )
cell.myAttribute0 = MyAttribute()
cell.myAttribute1 = MyAttribute()
print( 'cell.myAttribute0 =', cell.myAttribute0 )
del cell.myAttribute0
PythonAttributes.disableAll()
\endcode
*
* Some interresting references concerning the Python/C API:
* <ul>
* <li><a href="https://stackoverflow.com/questions/64599762/how-does-one-use-both-tp-getattro-tp-setattro-and-tp-getset-in-a-custom-pyt">Stackoverflow, how to implement setattro and getattro</a>
* <li><a href="https://stackoverflow.com/questions/5061251/create-a-python-type-from-c-that-implements-a-dict">Stackoverflow, how to implement a dict</a>
* </ul>
*/
//! \function PyAttributesHolder* PythonAttributes::get ( const DBo* );
//! Retrieve the Python attributes holder of the DBo. If there is none,
//! return NULL.
//!
//! \Remark This is the Python property holder (PyAttributesHolder), not
//! the property itself which is returned.
//! \function int32_t PythonAttributes::delattr ( DBo* dbo, std::string attrName );
//! Remove the attribute named \b attrName from \b dbo.
//! \function void PythonAttributes::enable ( DBo* dbo );
//! Create the PyHolderProperty on \b dbo. This operation is mandatory
//! before one can add attributes on a DBo.
//! \function void PythonAttributes::disable ( DBo* dbo );
//! Remove the PyHolderProperty from \b dbo. The refcount of all the
//! Python attributes will be decremented. So if they are only
//! referenced in the PyHolderProperty, that means they will be
//! deleted.
//! \function void PythonAttributes::disableAll ();
//! Remove the PyHolderProperty from all the DBo.
//! \function void PythonAttributes::disableAll ( std::string attrName );
//! Remove the attribute named \b attrName on all the DBo, if, after
//! deletion, no attributes remains the PyHolderProperty is removed.
} // Isobar namespace.

View File

@ -740,7 +740,9 @@ INPUT = Generalities.dox \
../../src/hurricane/hurricane/Query.h \ ../../src/hurricane/hurricane/Query.h \
Query.dox \ Query.dox \
../../src/hurricane/hurricane/UpdateSession.h \ ../../src/hurricane/hurricane/UpdateSession.h \
UpdateSession.dox UpdateSession.dox \
../../src/isobar/hurricane/isobar/PythonAttributes.h \
PythonAttributes.dox
# This tag can be used to specify the character encoding of the source files # This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is

View File

@ -1,132 +1,133 @@
error: the type 'dirs' is not supported for the entry tag within a navindex! Check your layout file! DoxygenLayout.xml:21: warning: the type 'dirs' is not supported for the entry tag within a navindex! Check your layout file!
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Entity.dox:69: warning: Internal inconsistency: scope for class Entity::CompareById not found!
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Generalities.dox:184: warning: documentation for unknown define trace found. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Generalities.dox:184: warning: documentation for unknown define trace found.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/BasicLayer.dox:143: warning: documentation for unknown define for_each_basic_layer found. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/BasicLayer.dox:143: warning: documentation for unknown define for_each_basic_layer found.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/RegularLayer.dox:86: warning: documentation for unknown define for_each_basic_layer found. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/RegularLayer.dox:86: warning: documentation for unknown define for_each_basic_layer found.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Generalities.dox:160: warning: documented symbol `bool Hurricane::in_trace' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Generalities.dox:160: warning: documented symbol 'bool Hurricane::in_trace' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Generalities.dox:166: warning: documented symbol `void Hurricane::trace_on' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Generalities.dox:166: warning: documented symbol 'void Hurricane::trace_on' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Generalities.dox:170: warning: documented symbol `void Hurricane::trace_off' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Generalities.dox:170: warning: documented symbol 'void Hurricane::trace_off' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Generalities.dox:174: warning: documented symbol `void Hurricane::trace_in' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Generalities.dox:174: warning: documented symbol 'void Hurricane::trace_in' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Generalities.dox:179: warning: documented symbol `void Hurricane::trace_out' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Generalities.dox:179: warning: documented symbol 'void Hurricane::trace_out' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Error.dox:60: warning: no uniquely matching class member found for /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Error.dox:60: warning: no uniquely matching class member found for
Hurricane::Error::Inherit Hurricane::Error::Inherit
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Error.dox:91: warning: no uniquely matching class member found for /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Error.dox:91: warning: no uniquely matching class member found for
Error & Hurricane::Error::operator=(const Error &error) Error & Hurricane::Error::operator=(const Error &error)
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Interruption.dox:41: warning: documented symbol `const string & Hurricane::Interruption::GetReason' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Interruption.dox:41: warning: documented symbol 'const string & Hurricane::Interruption::GetReason' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Interruption.dox:45: warning: documented symbol `int Hurricane::Interruption::GetCode' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Interruption.dox:45: warning: documented symbol 'int Hurricane::Interruption::GetCode' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Collection.dox:439: warning: documented symbol `typedef list< Element > Hurricane::ElementList' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Collection.dox:439: warning: documented symbol 'typedef list< Element > Hurricane::ElementList' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Technology.dox:183: warning: documented symbol `bool Hurricane::Technology::setWorkingLayer' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Technology.dox:183: warning: documented symbol 'bool Hurricane::Technology::setWorkingLayer' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Technology.dox:188: warning: documented symbol `bool Hurricane::Technology::setWorkingLayer' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Technology.dox:188: warning: documented symbol 'bool Hurricane::Technology::setWorkingLayer' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Layer.dox:128: warning: documented symbol `const DbU::Unit & Hurricane::Layer::getPitch' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Layer.dox:128: warning: documented symbol 'const DbU::Unit & Hurricane::Layer::getPitch' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Layer.dox:181: warning: no uniquely matching class member found for /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Layer.dox:181: warning: no uniquely matching class member found for
DbU::Unit Hurricane::Layer::getEnclosure() const DbU::Unit Hurricane::Layer::getEnclosure() const
Possible candidates: Possible candidates:
virtual DbU::Unit Hurricane::Layer::getEnclosure(uint32_t flags) const' at line 83 of file /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/Layer.h 'virtual DbU::Unit Hurricane::Layer::getEnclosure(uint32_t flags) const' at line 83 of file /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/Layer.h
virtual DbU::Unit Hurricane::Layer::getEnclosure(const BasicLayer *layer, uint32_t flags) const' at line 86 of file /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/Layer.h 'virtual DbU::Unit Hurricane::Layer::getEnclosure(const BasicLayer *layer, uint32_t flags) const' at line 86 of file /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/Layer.h
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Layer.dox:185: warning: documented symbol `DbU::Unit Hurricane::Layer::getExtensionCap' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Layer.dox:185: warning: documented symbol 'DbU::Unit Hurricane::Layer::getExtensionCap' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Layer.dox:189: warning: documented symbol `DbU::Unit Hurricane::Layer::getExtensionWidth' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Layer.dox:189: warning: documented symbol 'DbU::Unit Hurricane::Layer::getExtensionWidth' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Layer.dox:193: warning: no uniquely matching class member found for /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Layer.dox:193: warning: no uniquely matching class member found for
DbU::Unit Hurricane::Layer::getEnclosure(const Hurricane::BasicLayer *layer) const DbU::Unit Hurricane::Layer::getEnclosure(const Hurricane::BasicLayer *layer) const
Possible candidates: Possible candidates:
virtual DbU::Unit Hurricane::Layer::getEnclosure(uint32_t flags) const' at line 83 of file /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/Layer.h 'virtual DbU::Unit Hurricane::Layer::getEnclosure(uint32_t flags) const' at line 83 of file /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/Layer.h
virtual DbU::Unit Hurricane::Layer::getEnclosure(const BasicLayer *layer, uint32_t flags) const' at line 86 of file /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/Layer.h 'virtual DbU::Unit Hurricane::Layer::getEnclosure(const BasicLayer *layer, uint32_t flags) const' at line 86 of file /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/Layer.h
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Layer.dox:197: warning: documented symbol `DbU::Unit Hurricane::Layer::getExtensionCap' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Layer.dox:197: warning: documented symbol 'DbU::Unit Hurricane::Layer::getExtensionCap' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Layer.dox:201: warning: documented symbol `DbU::Unit Hurricane::Layer::getExtensionWidth' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Layer.dox:201: warning: documented symbol 'DbU::Unit Hurricane::Layer::getExtensionWidth' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Layer.dox:227: warning: documented symbol `bool Hurricane::Layer::isWorking' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Layer.dox:227: warning: documented symbol 'bool Hurricane::Layer::isWorking' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/BasicLayer.dox:41: warning: documented symbol `unsigned Hurricane::BasicLayer::getExtractNumber' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/BasicLayer.dox:41: warning: documented symbol 'unsigned Hurricane::BasicLayer::getExtractNumber' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/BasicLayer.dox:117: warning: documented symbol `void Hurricane::BasicLayer::setExtractNumber' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/BasicLayer.dox:117: warning: documented symbol 'void Hurricane::BasicLayer::setExtractNumber' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/BasicLayer.dox:130: warning: documented symbol `Hurricane::BasicLayers' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/BasicLayer.dox:130: warning: documented symbol 'Hurricane::BasicLayers' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/BasicLayer.dox:134: warning: documented symbol `Hurricane::BasicLayerLocator' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/BasicLayer.dox:134: warning: documented symbol 'Hurricane::BasicLayerLocator' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/BasicLayer.dox:138: warning: documented symbol `Hurricane::BasicLayerFilter' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/BasicLayer.dox:138: warning: documented symbol 'Hurricane::BasicLayerFilter' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/RegularLayer.dox:56: warning: no matching class member found for /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/RegularLayer.dox:56: warning: no matching class member found for
void Hurricane::RegularLayer::setBlockageLayer(RegularLayer *layer) void Hurricane::RegularLayer::setBlockageLayer(RegularLayer *layer)
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/RegularLayer.dox:61: warning: documented symbol `void Hurricane::RegularLayer::setExtractNumber' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/RegularLayer.dox:61: warning: documented symbol 'void Hurricane::RegularLayer::setExtractNumber' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/RegularLayer.dox:65: warning: no matching class member found for /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/RegularLayer.dox:65: warning: no matching class member found for
void Hurricane::RegularLayer::setRealName(const char *) void Hurricane::RegularLayer::setRealName(const char *)
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/RegularLayer.dox:73: warning: documented symbol `Hurricane::RegularLayers' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/RegularLayer.dox:73: warning: documented symbol 'Hurricane::RegularLayers' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/RegularLayer.dox:77: warning: documented symbol `Hurricane::RegularLayerLocator' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/RegularLayer.dox:77: warning: documented symbol 'Hurricane::RegularLayerLocator' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/RegularLayer.dox:81: warning: documented symbol `Hurricane::RegularLayerFilter' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/RegularLayer.dox:81: warning: documented symbol 'Hurricane::RegularLayerFilter' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Entity.dox:30: warning: no matching class member found for /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Entity.dox:30: warning: no matching class member found for
unsigned int Hurricane::Entity::getId() const unsigned int Hurricane::Entity::getId() const
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/HyperNet.dox:47: warning: documented symbol `Occurrences Hurricane::HyperNet::getLeafPlugOccurrences' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/HyperNet.dox:47: warning: documented symbol 'Occurrences Hurricane::HyperNet::getLeafPlugOccurrences' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Polygon.dox:39: warning: documented symbol `Hurricane::Polygons' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Polygon.dox:39: warning: documented symbol 'Hurricane::Polygons' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Polygon.dox:43: warning: documented symbol `Hurricane::PolygonLocator' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Polygon.dox:43: warning: documented symbol 'Hurricane::PolygonLocator' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Polygon.dox:47: warning: documented symbol `Hurricane::PolygonFilter' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Polygon.dox:47: warning: documented symbol 'Hurricane::PolygonFilter' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/RoutingPad.dox:102: warning: no uniquely matching class member found for /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/RoutingPad.dox:102: warning: no uniquely matching class member found for
Box Hurricane::RoutingPad::getBoundingBox(Hurricane::BasicLayer *layer) const Box Hurricane::RoutingPad::getBoundingBox(Hurricane::BasicLayer *layer) const
Possible candidates: Possible candidates:
virtual Box Hurricane::RoutingPad::getBoundingBox() const' at line 69 of file /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/RoutingPad.h 'virtual Box Hurricane::RoutingPad::getBoundingBox() const' at line 69 of file /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/RoutingPad.h
virtual Box Hurricane::RoutingPad::getBoundingBox(const BasicLayer *) const' at line 70 of file /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/RoutingPad.h 'virtual Box Hurricane::RoutingPad::getBoundingBox(const BasicLayer *) const' at line 70 of file /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/RoutingPad.h
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/PrivateProperty.dox:49: warning: documented symbol `typedef PrivateProperty::Inherit Hurricane::Property' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/PrivateProperty.dox:49: warning: documented symbol 'typedef PrivateProperty::Inherit Hurricane::Property' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/SharedProperty.dox:50: warning: documented symbol `typedef SharedProperty::Inherit Hurricane::Property' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/SharedProperty.dox:50: warning: documented symbol 'typedef SharedProperty::Inherit Hurricane::Property' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/SharedProperty.dox:71: warning: documented symbol `DBos Hurricane::SharedProperty::GetOwners' was not declared or defined. /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/SharedProperty.dox:71: warning: documented symbol 'DBos Hurricane::SharedProperty::GetOwners' was not declared or defined.
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Collection.dox:244: warning: Illegal command n as part of a title section /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/DebugSession.dox:103: warning: Found unknown command '\Returns'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/DebugSession.dox:103: warning: Found unknown command `\Returns' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/JsonObject.dox:40: warning: Illegal command @typename as part of a \c command
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Go.dox:201: warning: Illegal command n as part of a title section
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/HyperNet.dox:31: warning: Found unknown command `\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/HyperNet.dox:34: warning: Found unknown command `\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Instance.dox:103: warning: Illegal command n as part of a title section
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Instance.dox:163: warning: Illegal command n as part of a title section
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Instance.dox:177: warning: Unsupported xml/html tag <masterCell> found
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Instance.dox:182: warning: Unsupported xml/html tag <this> found
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Instance.dox:182: warning: Unsupported xml/html tag <cloneCell> found
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Instance.dox:184: warning: Unsupported xml/html tag <cloneCell> found
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Instance.dox:186: warning: Illegal command n as part of a title section
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/JsonObject.dox:40: warning: Illegal command \typename as the argument of a \typename command
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/JsonObject.dox:72: warning: argument 'stack' of command @param is not found in the argument list of Hurricane::JsonObject::check(JsonStack &, std::string fname) const /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/JsonObject.dox:72: warning: argument 'stack' of command @param is not found in the argument list of Hurricane::JsonObject::check(JsonStack &, std::string fname) const
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/JsonObject.dox:148: warning: argument 'name' of command @param is not found in the argument list of Hurricane::JsonObject::setName(const std::string &) /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/JsonObject.dox:148: warning: argument 'name' of command @param is not found in the argument list of Hurricane::JsonObject::setName(const std::string &)
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/JsonObject.dox:161: warning: argument 'T' of command @param is not found in the argument list of Hurricane::JsonObject::setObject(T t) /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/JsonObject.dox:161: warning: argument 'T' of command @param is not found in the argument list of Hurricane::JsonObject::setObject(T t)
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/JsonObject.h:102: warning: The following parameters of Hurricane::JsonObject::setObject(T t) are not documented: /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/JsonObject.h:102: warning: The following parameter of Hurricane::JsonObject::setObject(T t) is not documented:
parameter 't' parameter 't'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/JsonObject.dox:178: warning: Found unknown command `\Important' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/JsonObject.dox:178: warning: Found unknown command '\Important'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/JsonObject.dox:181: warning: argument 'The' of command @param is not found in the argument list of Hurricane::JsonObject::toData(JsonStack &stack) /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/JsonObject.dox:181: warning: argument 'The' of command @param is not found in the argument list of Hurricane::JsonObject::toData(JsonStack &stack)
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/JsonObject.dox:183: warning: Found unknown command `\Important' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/JsonObject.dox:183: warning: Found unknown command '\Important'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/JsonObject.h:105: warning: The following parameters of Hurricane::JsonObject::toData(JsonStack &stack) are not documented: /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/JsonObject.h:105: warning: The following parameter of Hurricane::JsonObject::toData(JsonStack &stack) is not documented:
parameter 'stack' parameter 'stack'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/JsonObject.dox:193: warning: Found unknown command `\Remark' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/JsonObject.dox:193: warning: Found unknown command '\Remark'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/JsonObject.dox:204: warning: Found unknown command `\Remark' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/JsonObject.dox:204: warning: Found unknown command '\Remark'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Net.dox:295: warning: Unsupported xml/html tag <this> found /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Collection.dox:244: warning: Illegal command \n as part of a title section
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Net.dox:295: warning: Unsupported xml/html tag <cloneCell> found
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Net.dox:299: warning: Unsupported xml/html tag <cloneCell> found
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/PhysicalRule.dox:70: warning: argument 'hvalue' of command @param is not found in the argument list of Hurricane::PhysicalRule::addValue(Hurricane::DbU::Unit hValue, Hurricane::DbU::Unit vValue, Hurricane::DbU::Unit maxLength) /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/PhysicalRule.dox:70: warning: argument 'hvalue' of command @param is not found in the argument list of Hurricane::PhysicalRule::addValue(Hurricane::DbU::Unit hValue, Hurricane::DbU::Unit vValue, Hurricane::DbU::Unit maxLength)
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/PhysicalRule.dox:70: warning: argument 'vvalue' of command @param is not found in the argument list of Hurricane::PhysicalRule::addValue(Hurricane::DbU::Unit hValue, Hurricane::DbU::Unit vValue, Hurricane::DbU::Unit maxLength) /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/PhysicalRule.dox:70: warning: argument 'vvalue' of command @param is not found in the argument list of Hurricane::PhysicalRule::addValue(Hurricane::DbU::Unit hValue, Hurricane::DbU::Unit vValue, Hurricane::DbU::Unit maxLength)
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/PhysicalRule.h:83: warning: The following parameters of Hurricane::PhysicalRule::addValue(Hurricane::DbU::Unit hValue, Hurricane::DbU::Unit vValue, Hurricane::DbU::Unit maxLength) are not documented: /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/PhysicalRule.h:83: warning: The following parameters of Hurricane::PhysicalRule::addValue(Hurricane::DbU::Unit hValue, Hurricane::DbU::Unit vValue, Hurricane::DbU::Unit maxLength) are not documented:
parameter 'hValue' parameter 'hValue'
parameter 'vValue' parameter 'vValue'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Property.dox:47: warning: Illegal command n as part of a title section /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Net.dox:295: warning: Unsupported xml/html tag <this> found
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Property.dox:182: warning: Illegal command n as part of a title section /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Net.dox:295: warning: Unsupported xml/html tag <cloneCell> found
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Property.dox:202: warning: Illegal command n as part of a title section /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Net.dox:299: warning: Unsupported xml/html tag <cloneCell> found
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Property.dox:367: warning: Illegal command n as part of a title section /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/HyperNet.dox:31: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/QuadTree.dox:13: warning: Illegal command n as part of a title section /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/HyperNet.dox:34: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:78: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Go.dox:201: warning: Illegal command \n as part of a title section
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:81: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Instance.dox:103: warning: Illegal command \n as part of a title section
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:84: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Instance.dox:163: warning: Illegal command \n as part of a title section
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:87: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Instance.dox:177: warning: Unsupported xml/html tag <masterCell> found
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:90: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Instance.dox:182: warning: Unsupported xml/html tag <this> found
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:95: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Instance.dox:182: warning: Unsupported xml/html tag <cloneCell> found
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:98: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Instance.dox:184: warning: Unsupported xml/html tag <cloneCell> found
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:101: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Instance.dox:186: warning: Illegal command \n as part of a title section
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:104: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Property.dox:49: warning: Illegal command \n as part of a title section
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:108: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Property.dox:184: warning: Illegal command \n as part of a title section
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:111: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Property.dox:204: warning: Illegal command \n as part of a title section
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:114: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Property.dox:367: warning: Illegal command \n as part of a title section
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:117: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/QuadTree.dox:15: warning: Illegal command \n as part of a title section
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:120: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:78: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:123: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:81: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:127: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:84: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:131: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:87: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:135: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:90: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:139: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:95: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/Query.h:357: warning: The following parameters of Hurricane::Query::setQuery(Cell *cell, const Box &area, const Transformation &transformation, const BasicLayer *basicLayer, ExtensionSlice::Mask extensionMask, Mask filter, DbU::Unit threshold=0) are not documented: /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:98: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:101: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:104: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:108: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:111: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:114: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:117: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:120: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:123: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:127: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:131: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:135: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:139: warning: Found unknown command '\sreturn'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/Query.h:357: warning: The following parameter of Hurricane::Query::setQuery(Cell *cell, const Box &area, const Transformation &transformation, const BasicLayer *basicLayer, ExtensionSlice::Mask extensionMask, Mask filter, DbU::Unit threshold=0) is not documented:
parameter 'threshold' parameter 'threshold'
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/PythonAttributes.dox:79: warning: Found unknown command '\Remark'

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More