Merge branch 'devel' of gitlab.lip6.fr:vlsi-eda/coriolis into devel

This commit is contained in:
HoangAnhP 2022-08-23 14:36:25 +02:00
commit 5b88929d23
1222 changed files with 172305 additions and 15538 deletions

@ -1 +0,0 @@
Subproject commit bd6b78003c0cc6579fbad73593e69f2714f3a770

View File

@ -32,3 +32,6 @@ go through all the components of a trans-hierarchical net.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
For a starter, how to get all the leaf cells...

View File

@ -51,15 +51,12 @@ environment is provided by the |CRL| module.
from Hurricane import *
from CRL import *
from helpers.overlay import UpdateSession
af = AllianceFramework.get()
UpdateSession.open()
cell = af.createCell( 'my_inv' )
# Build then save the Cell.
UpdateSession.close()
with UpdateSession():
cell = af.createCell( 'my_inv' )
# Build then save the Cell.
This is the simplest call to ``createCell()``, and in that case, the newly
@ -89,6 +86,24 @@ two conversion functions are provided:
In the weakly typed |Python| world, :cb:`lbd` is *float* while :cb:`unit`
is *integer*.
In order to reduce the number of characters one has to code, the :cb:`helpers`
module provides three very short function to perform conversion *towards*
DbU_ :
.. code-block:: Python
def l ( value ):
"""Convert a lambda into a DbU."""
return DbU.fromLambda( value )
def u ( value ):
"""Convert a length in micrometer into a DbU."""
return DbU.fromPhysical( value, Hurricane.DbU.UnitPowerMicro )
def n ( value ):
"""Convert a length in nanometer into a DbU."""
return DbU.fromPhysical( value, Hurricane.DbU.UnitPowerNano )
3.5 Setting up the Abutment Box
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -99,20 +114,17 @@ corner ``(x2,y2)``.
.. code-block:: Python
b = Box( DbU.fromLambda( 0.0) # x1
, DbU.fromLambda( 0.0) # y1
, DbU.fromLambda(15.0) # x2
, DbU.fromLambda(50.0) ) # y2
b = Box( l( 0.0) # x1
, l( 0.0) # y1
, l(15.0) # x2
, l(50.0) ) # y2
cell.setAbutmentBox( b )
Or more simply:
.. code-block:: Python
cell.setAbutmentBox( Box( DbU.fromLambda( 0.0)
, DbU.fromLambda( 0.0)
, DbU.fromLambda(15.0)
, DbU.fromLambda(50.0) ) )
cell.setAbutmentBox( Box( l( 0.0), l( 0.0), l(15.0), l(50.0) ) )
3.6 Adding Nets and Components
@ -180,12 +192,12 @@ of ``METAL1``.
.. code-block:: Python
segment = Vertical.create( i # The owner Net.
, layer # The layer.
, DbU.fromLambda( 5.0 ) # The X coordinate.
, DbU.fromLambda( 2.0 ) # The width.
, DbU.fromLambda( 10.0 ) # The Y source coordinate.
, DbU.fromLambda( 40.0 ) ) # The Y target coordinate.
segment = Vertical.create( i # The owner Net.
, layer # The layer.
, l( 5.0 ) # The X coordinate.
, l( 2.0 ) # The width.
, l( 10.0 ) # The Y source coordinate.
, l( 40.0 ) ) # The Y target coordinate.
With this overload of the ``Vertical.create()`` function the segment is created at an
absolute position. There is a second overload for creating a relatively placed
@ -236,101 +248,99 @@ explanation of that part of the code, refer to `5. Make a script runnable throug
#!/usr/bin/python
import sys
from Hurricane import *
from CRL import *
def toDbU ( l ): return DbU.fromLambda(l)
from Hurricane import DataBase, NetExternalComponents, Net, \
DbU, Point, Box, Horizontal, Vertical, Contact, RoutingPad, \
Breakpoint
from CRL import AllianceFramework, Catalog
from helpers import l
from helpers.overlay import UpdateSession
def doBreak ( level, message ):
UpdateSession.close()
"""Put a breakpoint into the script."""
Breakpoint.stop( level, message )
UpdateSession.open()
def buildInvertor ( editor ):
UpdateSession.open()
cell = AllianceFramework.get().createCell( 'invertor' )
cell.setTerminal( True )
cell.setAbutmentBox( Box( toDbU(0.0), toDbU(0.0), toDbU(15.0), toDbU(50.0) ) )
"""Build step by step an invertor standard cell."""
with UpdateSession():
cell = AllianceFramework.get().createCell( 'invertor' )
cell.setTerminalNetlist( True )
cell.setAbutmentBox( Box( l(0.0), l(0.0), l(15.0), l(50.0) ) )
if editor:
UpdateSession.close()
editor.setCell( cell )
editor.fit()
UpdateSession.open()
technology = DataBase.getDB().getTechnology()
metal1 = technology.getLayer( "METAL1" )
poly = technology.getLayer( "POLY" )
ptrans = technology.getLayer( "PTRANS" )
ntrans = technology.getLayer( "NTRANS" )
pdif = technology.getLayer( "PDIF" )
ndif = technology.getLayer( "NDIF" )
contdifn = technology.getLayer( "CONT_DIF_N" )
contdifp = technology.getLayer( "CONT_DIF_P" )
nwell = technology.getLayer( "NWELL" )
contpoly = technology.getLayer( "CONT_POLY" )
ntie = technology.getLayer( "NTIE" )
net = Net.create( cell, "nwell" )
Vertical.create( net, nwell, toDbU(7.5), toDbU(15.0), toDbU(27.0), toDbU(51.0) )
vdd = Net.create( cell, "vdd" )
vdd.setExternal( True )
vdd.setGlobal ( True )
h = Horizontal.create(vdd, metal1, toDbU(47.0), toDbU(6.0), toDbU(0.0), toDbU(15.0) )
NetExternalComponents.setExternal( h )
Contact.create ( vdd, contdifn, toDbU(10.0), toDbU(47.0), toDbU( 1.0), toDbU( 1.0) )
Contact.create ( vdd, contdifp, toDbU( 4.0), toDbU(45.0), toDbU( 1.0), toDbU( 1.0) )
Vertical.create( vdd, pdif , toDbU( 3.5), toDbU( 4.0), toDbU(28.0), toDbU(46.0) )
Vertical.create( vdd, ntie , toDbU(10.0), toDbU( 3.0), toDbU(43.0), toDbU(48.0) )
with UpdateSession():
technology = DataBase.getDB().getTechnology()
metal1 = technology.getLayer( "METAL1" )
poly = technology.getLayer( "POLY" )
ptrans = technology.getLayer( "PTRANS" )
ntrans = technology.getLayer( "NTRANS" )
pdif = technology.getLayer( "PDIF" )
ndif = technology.getLayer( "NDIF" )
contdifn = technology.getLayer( "CONT_DIF_N" )
contdifp = technology.getLayer( "CONT_DIF_P" )
nwell = technology.getLayer( "NWELL" )
contpoly = technology.getLayer( "CONT_POLY" )
ntie = technology.getLayer( "NTIE" )
net = Net.create( cell, "nwell" )
Vertical.create( net, nwell, l(7.5), l(15.0), l(27.0), l(51.0) )
vdd = Net.create( cell, "vdd" )
vdd.setExternal( True )
vdd.setGlobal ( True )
h = Horizontal.create(vdd, metal1, l(47.0), l(6.0), l(0.0), l(15.0) )
NetExternalComponents.setExternal( h )
Contact.create ( vdd, contdifn, l(10.0), l(47.0), l( 1.0), l( 1.0) )
Contact.create ( vdd, contdifp, l( 4.0), l(45.0), l( 1.0), l( 1.0) )
Vertical.create( vdd, pdif , l( 3.5), l( 4.0), l(28.0), l(46.0) )
Vertical.create( vdd, ntie , l(10.0), l( 3.0), l(43.0), l(48.0) )
doBreak( 1, 'Done building vdd.' )
vss = Net.create( cell, "vss" )
vss.setExternal( True )
vss.setGlobal ( True )
h = Horizontal.create(vss, metal1, toDbU(3.0), toDbU(6.0), toDbU(0.0), toDbU(15.0))
NetExternalComponents.setExternal( h )
Vertical.create( vss, ndif , toDbU(3.5), toDbU(4.0), toDbU(4.0), toDbU(12.0) )
Contact.create ( vss, contdifn, toDbU(4.0), toDbU(5.0), toDbU(1.0), toDbU( 1.0) )
with UpdateSession():
vss = Net.create( cell, "vss" )
vss.setExternal( True )
vss.setGlobal ( True )
h = Horizontal.create(vss, metal1, l(3.0), l(6.0), l(0.0), l(15.0))
NetExternalComponents.setExternal( h )
Vertical.create( vss, ndif , l(3.5), l(4.0), l(4.0), l(12.0) )
Contact.create ( vss, contdifn, l(4.0), l(5.0), l(1.0), l( 1.0) )
doBreak( 1, 'Done building vss.' )
i = Net.create( cell, "i" )
i.setExternal( True )
v = Vertical.create ( i, metal1, toDbU(5.0), toDbU(2.0), toDbU(10.0), toDbU(40.0) )
NetExternalComponents.setExternal( v )
Vertical.create ( i, ptrans , toDbU( 7.0), toDbU( 1.0), toDbU(26.0), toDbU(39.0) )
Vertical.create ( i, ntrans , toDbU( 7.0), toDbU( 1.0), toDbU( 6.0), toDbU(14.0) )
Vertical.create ( i, poly , toDbU( 7.0), toDbU( 1.0), toDbU(14.0), toDbU(26.0) )
Horizontal.create( i, poly , toDbU(20.0), toDbU( 3.0), toDbU( 4.0), toDbU( 7.0) )
Contact.create ( i, contpoly, toDbU( 5.0), toDbU(20.0), toDbU( 1.0), toDbU( 1.0) )
with UpdateSession():
i = Net.create( cell, "i" )
i.setExternal( True )
v = Vertical.create ( i, metal1, l(5.0), l(2.0), l(10.0), l(40.0) )
NetExternalComponents.setExternal( v )
Vertical.create ( i, ptrans , l( 7.0), l( 1.0), l(26.0), l(39.0) )
Vertical.create ( i, ntrans , l( 7.0), l( 1.0), l( 6.0), l(14.0) )
Vertical.create ( i, poly , l( 7.0), l( 1.0), l(14.0), l(26.0) )
Horizontal.create( i, poly , l(20.0), l( 3.0), l( 4.0), l( 7.0) )
Contact.create ( i, contpoly, l( 5.0), l(20.0), l( 1.0), l( 1.0) )
doBreak( 1, 'Done building i.' )
nq = Net.create ( cell, "nq" )
nq.setExternal( True )
v = Vertical.create( nq, metal1, toDbU(10.0), toDbU(2.0), toDbU(10.0), toDbU(40.0) )
NetExternalComponents.setExternal( v )
Vertical.create( nq, pdif , toDbU(10.0), toDbU( 3.0), toDbU(28.0), toDbU(37.0) )
Vertical.create( nq, ndif , toDbU(10.0), toDbU( 3.0), toDbU( 8.0), toDbU(12.0) )
Contact.create ( nq, contdifp, toDbU(10.0), toDbU(35.0), toDbU( 1.0), toDbU( 1.0) )
Contact.create ( nq, contdifp, toDbU(10.0), toDbU(30.5), toDbU( 1.0), toDbU( 1.0) )
Contact.create ( nq, contdifn, toDbU(10.0), toDbU(10.0), toDbU( 1.0), toDbU( 1.0) )
with UpdateSession():
nq = Net.create ( cell, "nq" )
nq.setExternal( True )
v = Vertical.create( nq, metal1, l(10.0), l(2.0), l(10.0), l(40.0) )
NetExternalComponents.setExternal( v )
Vertical.create( nq, pdif , l(10.0), l( 3.0), l(28.0), l(37.0) )
Vertical.create( nq, ndif , l(10.0), l( 3.0), l( 8.0), l(12.0) )
Contact.create ( nq, contdifp, l(10.0), l(35.0), l( 1.0), l( 1.0) )
Contact.create ( nq, contdifp, l(10.0), l(30.5), l( 1.0), l( 1.0) )
Contact.create ( nq, contdifn, l(10.0), l(10.0), l( 1.0), l( 1.0) )
doBreak( 1, 'Done building q.' )
UpdateSession.close()
AllianceFramework.get().saveCell( cell, Catalog.State.Views )
return
def scriptMain ( **kw ):
"""The Mandatory function to be run by Coriolis interactively."""
editor = None
if kw.has_key('editor') and kw['editor']:
editor = kw['editor']
if 'editor' in kw and kw['editor']:
editor = kw['editor']
buildInvertor( editor )
return True

View File

@ -33,29 +33,25 @@ using the menu:
.. code-block:: Python
def buildInvertor ( editor ):
UpdateSession.open()
cell = AllianceFramework.get().createCell( 'invertor' )
cell.setTerminal( True )
cell.setAbutmentBox( Box( toDbU(0.0), toDbU(0.0), toDbU(15.0), toDbU(50.0) ) )
"""Build step by step an invertor standard cell."""
with UpdateSession():
cell = AllianceFramework.get().createCell( 'invertor' )
cell.setTerminalNetlist( True )
cell.setAbutmentBox( Box( l(0.0), l(0.0), l(15.0), l(50.0) ) )
if editor:
UpdateSession.close()
editor.setCell( cell )
editor.fit()
UpdateSession.open()
editor.setCell( cell )
editor.fit()
# The rest of the script...
return
def scriptMain ( **kw ):
"""The Mandatory function to be run by Coriolis interactively."""
editor = None
if kw.has_key('editor') and kw['editor']:
editor = kw['editor']
if 'editor' in kw and kw['editor']:
editor = kw['editor']
buildInvertor( editor )
return True
@ -64,8 +60,8 @@ using the menu:
~~~~~~~~~~~~~~~~~~~~~
It is possible to add breakpoints inside a script by calling the ``Breakpoint.stop()``
function. To be able to see exactly what has just been mofied, we must close the
UpdateSession_ just before calling the breakpoint and reopen it just after.
function. To be able to see exactly what has just been modified, be sure to have
closed any UpdateSession_ before calling breakpoints.
The ``Breakpoint.stop()`` function takes two arguments:
#. The ``level`` above which it will be active.
@ -76,6 +72,4 @@ We can create a little function to ease the work:
.. code-block:: Python
def doBreak ( level, message ):
UpdateSession.close()
Breakpoint.stop( level, message )
UpdateSession.open()

View File

@ -23,12 +23,12 @@ allowing to simply write:
.. code-block:: Python
for net in cell.getNets():
print 'Components of', net
for component in net.getComponents():
print '|', component
print( 'Components of', net )
for component in net.getComponents():
print( '|', component )
In C++ we would have written:
In C++ we would have been written:
.. code-block:: C++
@ -54,13 +54,13 @@ loop. For example:
cellNets = []
for net in cell.getNets():
cellNets.append( net )
cellNets.append( net )
# Remove all the anonymous nets.
for net in cellNets:
if net.getName().endswith('nymous_'):
print 'Destroy', net
net.destroy()
if net.getName().endswith('nymous_'):
print( 'Destroy', net )
net.destroy()

View File

@ -37,53 +37,68 @@ Use it like this (don't forget the ``eval`` **and** the backquotes):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You may create, in the directory you are lanching |Coriolis| tools, a special
sub-directory ``.coriolis2/`` that can contain two configuration files:
sub-directory ``coriolis2/`` that can contain the configuration files:
* ``techno.py`` tells which technology to use.
* ``__init__.py`` to tell |Python| this directory is a module.
* ``settings.py`` can override almost any default configuration setting.
Those two files are *optional*, if they do not exist the default settings
will be used and the technology is ``symbolic/cmos`` (i.e. purely symbolic).
.. note:: Those two files will by processed by the |Python| interpreter,
so they can contain any code in addition to the mandatory
variables.
2.2.1 The :cb:`techno.py` File
------------------------------
2.3 The :cb:`settings.py` File
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Must provide one variable named :cb:`technology` which values the path towards
the technology file. The available technologies are installed under
``<CORIOLIS_INSTALL>/etc/coriolis2``. For example, to use the 45nm FreeDPK
which is in: ::
The attributes name and definitions of :cb:`cfg` are detailed
in `CGT - The Graphical Interface <../UsersGuide/ViewerTools.html>`_.
<CORIOLIS_INSTALL>/etc/coriolis2/45/freepdk_45/
**Selecting the Technology**
The ``techno.py`` file must contain:
The important line here is:
.. code-block:: Python
technology = '45/freepdk_45'
import symbolic.cmos
2.2.2 The :cb:`settings.py` File
--------------------------------
The entries of the ``parametersTable`` and their definitions are detailed
in `CGT - The Graphical Interface <../UsersGuide/ViewerTools.html>`_.
This import loads and setup the technology used througout this run of
|Coriolis|. One and only one technology can be loaded in a |Coriolis| run.
Example of file:
.. code-block:: Python
defaultStyle = 'Alliance.Classic [black]'
# -*- Mode:Python -*-
parametersTable = \
( ('misc.catchCore' , TypeBool , False )
, ('misc.info' , TypeBool , False )
, ('misc.paranoid' , TypeBool , False )
, ('misc.bug' , TypeBool , False )
, ('misc.logMode' , TypeBool , False )
, ('misc.verboseLevel1' , TypeBool , False )
, ('misc.verboseLevel2' , TypeBool , True )
)
import os
import Cfg
import Viewer
import CRL
import symbolic.cmos
from helpers import overlay
if 'CELLS_TOP' in os.environ:
cellsTop = os.environ['CELLS_TOP']
else:
cellsTop = '../../../cells'
with overlay.CfgCache(priority=Cfg.Parameter.Priority.UserFile) as cfg:
cfg.misc.catchCore = False
cfg.misc.info = False
cfg.misc.paranoid = False
cfg.misc.bug = False
cfg.misc.logMode = True
cfg.misc.verboseLevel1 = True
cfg.misc.verboseLevel2 = True
cfg.misc.minTraceLevel = 1900
cfg.misc.maxTraceLevel = 3000
cfg.katana.eventsLimit = 1000000
cfg.katana.termSatReservedLocal = 6
cfg.katana.termSatThreshold = 9
Viewer.Graphics.setStyle( 'Alliance.Classic [black]' )
af = CRL.AllianceFramework.get()
env = af.getEnvironment()
env.setCLOCK( '^ck$|m_clock|^clk$' )
env.addSYSTEM_LIBRARY( library=cellsTop+'/nsxlib', mode=CRL.Environment.Prepend )
env.addSYSTEM_LIBRARY( library=cellsTop+'/niolib', mode=CRL.Environment.Prepend )

View File

@ -17,8 +17,25 @@ of |Python| objects or use |Python| containers to store them.
The only limitation is that you may not use |Hurricane| classes as base
classes in |Python|.
All |Hurricane| objects implements the |Python| ``__str__()`` function,
they print the result of the C++ method ``::getString()``.
All the example scripts given in this tutorial con be found under: ::
<CORIOLIS_INSTALL>/share/doc/coriolis2/examples/scripts/
Provided scripts:
======================= ==============================================================
**Script** **Feature**
======================= ==============================================================
:cb:`coriolisLogo.py` Draw a layout of the |Coriolis| logo
:cb:`diagonals.py` Test the :cb:`Hurricane::Diagonal` class
:cb:`polygons.py` Test the :cb:`Hurricane::Polygon` class
:cb:`rectilinear.py` Test the :cb:`Hurricane::rectilinear` class
:cb:`invertor.py` Procedural build of the layout of an invertor standard cell
:cb:`fulladder.py` Procedural build of a small netlist along with it's manual
placement and the routing of one net (:cb:`"a"`)
:cb:`toolengines.py` Build the netlist (only) of the full adder then call the
place and route engines
======================= ==============================================================
1.1 Terminology
@ -61,17 +78,45 @@ Mostly:
to use ``string``.
* Coordinates are expressed in ``DbU`` which are ``long`` with a special
semantic (see ??).
* All |Hurricane| objects implements the |Python| ``__str__()`` function,
they print the result of the C++ method ``::getString()``.
In ``hurricane/Session.h`` header we have:
In ``hurricane/Net.h`` header we have:
.. code-block:: c++
namespace Hurricane {
class UpdateSession {
class Net : public Entity {
public:
static void open ();
static void close ();
class Direction {
public: enum Code { DirIn = 0x0001
, DirOut = 0x0002
, DirUndefined = 0x0000
, ConnTristate = 0x0100
, ConnWiredOr = 0x0200
, UNDEFINED = DirUndefined
, IN = DirIn
, OUT = DirOut
, INOUT = DirIn | DirOut
, TRISTATE = DirOut | ConnTristate
, TRANSCV = DirIn | DirOut | ConnTristate
, WOR_OUT = DirOut | ConnWiredOr
, WOR_INOUT = DirIn | DirOut | ConnWiredOr
, DirMask = DirIn | DirOut | DirUndefined
};
// [The rest of Class Direction]
};
public:
static Net* create ( Cell* , const Name& );
bool isGlobal ();
bool isExternal ();
const Direction& getDirection ();
void setName ( Name );
void setGlobal ( bool );
void setExternal ( bool );
void setDirection ( const Direction& );
// [The rest of Class Net]
};
}
@ -81,15 +126,18 @@ So we can use it the following way in C++:
.. code-block:: c++
#include "hurricane/Session.h"
#include "hurricane/Net.h"
using namespace Hurricane;
void doSomething ()
void addNetToCell ( Cell* cell )
{
UpdateSession::open();
// Something...
UpdateSession::close();
Net* net = Net::create( cell, "new_net" );
net->setGlobal ( false );
net->setExternal ( true );
net->setDirection( Net.Direction.IN );
cout << "Created " << net << endl;
return net;
}
@ -97,12 +145,15 @@ The equivalent |Python| code will be:
.. code-block:: Python
from Hurricane import *
from Hurricane import Net
def doSomething ():
UpdateSession.open()
# Something...
UpdateSession.close()
def addNetToCell ( cell ):
net = Net.create( cell, "new_net" )
net.setGlobal ( False )
net.setExternal( True )
net.setDirection( Net.Direction.IN )
print( "Created", net )
return net
1.3 Various Kinds of Constructors
@ -130,9 +181,152 @@ Regarding the memory allocation, the |Hurricane| database contains two kind of o
.. code-block:: Python
from Hurricane import DbU, Box
def myfunc():
bb = Box( DbU.fromLambda( 0.0)
, DbU.fromLambda( 0.0)
, DbU.fromLambda(15.0)
, DbU.fromLambda(50.0) )
return # bb will be freed at that point.
bb = Box( DbU.fromLambda( 0.0)
, DbU.fromLambda( 0.0)
, DbU.fromLambda(15.0)
, DbU.fromLambda(50.0) )
return # bb will be freed at that point.
1.4 Collections and Iterators
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Hurricane Collection_ behave like containers under |Python| and provide
support for the :cb:`iterator` protocol.
.. code-block:: Python
from Hurricane import Net, Horizontal
def delAllHorizontals ( net ):
horizontals = []
for component in net.getComponents():
if isinstance(component,Horizontal):
horizontals.append( component )
# Now we can remove the Horizontals.
for horizontal in horizontals:
horizontal.destroy()
.. note:: **Never remove an element from a Collection_ while iterating over it**.
You must save the to be removed elements in an auxiliary container
then remove them, like shown in the example above
1.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()
1.6 Adapting C++ : Overlay
~~~~~~~~~~~~~~~~~~~~~~~~~~
Sometimes, the use of a wrapped C++ feature would be counter intuitive regarding
the |Python| feature. For those cases the :cb:`overlay` module provide an
adaptation of the C++ API for a more *Python-like* code. A typical example is
with the UpdateSession_ mechanism.
Using directly the C++ wrapper, we would write a code like this:
.. code-block:: python
from Hurricane import UpdateSession, Net, Vertical
from helpers import l
def editCell ( cell ):
UpdateSession.open()
net = Net.create( cell, "nwell" )
Vertical.create( net, nwell, l(7.5), l(15.0), l(27.0), l(51.0) )
# Continued cell's layout building.
# ...
UpdateSession.close()
But, using the :cb:`overlay` we got the more *pythonic* code:
.. code-block:: python
from Hurricane import Net, Vertical
from helpers import l
from helpers.overlay import UpdateSession
def editCell ( cell ):
with UpdateSession():
net = Net.create( cell, "nwell" )
Vertical.create( net, nwell, l(7.5), l(15.0), l(27.0), l(51.0) )
# Continued cell's layout building.
# ...

View File

@ -140,9 +140,7 @@ we also must set its *placement status* to ``Instance.PlacementStatus.PLACED``.
.. code-block:: Python
xr2_1.setTransformation( Transformation( DbU.fromLambda( 0.0)
, DbU.fromLambda(100.0)
, Transformation.Orientation.MY ) )
xr2_1.setTransformation( Transformation( l(0.0), l(100.0), Transformation.Orientation.MY ) )
xr2_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
@ -196,19 +194,19 @@ contacts.
# Build wiring for a.
# Create RoutingPads first.
rp1 = RoutingPad.create( a
, Occurrence( xr2_1.getPlug( xr2_x2.getNet("i0")) )
, RoutingPad.BiggestArea )
rp2 = RoutingPad.create( a
, Occurrence( a2_1.getPlug( a2_x2.getNet("i0")) )
, RoutingPad.BiggestArea )
rp1 = RoutingPad.create( a
, Occurrence( xr2_1.getPlug( xr2_x2.getNet("i0")) )
, RoutingPad.BiggestArea )
rp2 = RoutingPad.create( a
, Occurrence( a2_1.getPlug( a2_x2.getNet("i0")) )
, RoutingPad.BiggestArea )
# Then regular wiring.
contact1 = Contact.create( rp1, via12, toDbU( 0.0), toDbU(-15.0) )
contact2 = Contact.create( rp2, via12, toDbU( 0.0), toDbU( 10.0) )
turn = Contact.create( a , via23, toDbU(10.0), toDbU( 35.0) )
Horizontal.create( contact2, turn , metal2, toDbU(35.0), toDbU(2.0) )
Vertical .create( turn , contact1 , metal3, toDbU(10.0), toDbU(2.0) )
contact1 = Contact.create( rp1, via12, l( 0.0), l(-15.0) )
contact2 = Contact.create( rp2, via12, l( 0.0), l( 10.0) )
turn = Contact.create( a , via23, l(10.0), l( 35.0) )
Horizontal.create( contact2, turn , metal2, l(35.0), l(2.0) )
Vertical .create( turn , contact1 , metal3, l(10.0), l(2.0) )
.. note:: In order to better see the layout of the wiring only, open the
@ -227,136 +225,140 @@ directory (under the the root of the |Coriolis| installation).
#!/usr/bin/python
import sys
from Hurricane import *
from CRL import *
def toDbU ( l ): return DbU.fromLambda(l)
from Hurricane import DataBase, Instance, Box, Net, Horizontal, Vertical, Contact, \
RoutingPad, Transformation, Occurrence, \
Breakpoint
from CRL import AllianceFramework, Catalog, Gds
from helpers import l
from helpers.overlay import UpdateSession
def doBreak ( level, message ):
UpdateSession.close()
"""Put a breakpoint into the script."""
Breakpoint.stop( level, message )
UpdateSession.open()
def buildFulladder ( editor ):
# Get the Framework and all the master cells.
"""Build step by step full adder (netlist & placement)."""
# Get the Framework and all the master cells.
af = AllianceFramework.get()
xr2_x2 = af.getCell( 'xr2_x1', Catalog.State.Views )
a2_x2 = af.getCell( 'a2_x2' , Catalog.State.Views )
o2_x2 = af.getCell( 'o2_x2' , Catalog.State.Views )
UpdateSession.open()
fulladder = af.createCell( 'fulladder' )
fulladder.setAbutmentBox( Box( toDbU(0.0), toDbU(0.0), toDbU(90.0), toDbU(100.0) ) )
with UpdateSession():
fulladder = af.createCell( 'fulladder' )
fulladder.setAbutmentBox( Box( l(0.0), l(0.0), l(90.0), l(100.0) ) )
if editor:
UpdateSession.close()
editor.setCell( fulladder )
editor.fit()
UpdateSession.open()
editor.setCell( fulladder )
editor.fit()
# Create Instances.
a2_1 = Instance.create( fulladder, 'a2_1', a2_x2 )
a2_2 = Instance.create( fulladder, 'a2_2', a2_x2 )
xr2_1 = Instance.create( fulladder, 'xr2_1', xr2_x2 )
xr2_2 = Instance.create( fulladder, 'xr2_2', xr2_x2 )
o2_1 = Instance.create( fulladder, 'o2_1', o2_x2 )
# Create Nets.
vss = Net.create( fulladder, "vss" )
vss.setExternal( True )
vss.setGlobal ( True )
with UpdateSession():
# Create Instances.
a2_1 = Instance.create( fulladder, 'a2_1', a2_x2 )
a2_2 = Instance.create( fulladder, 'a2_2', a2_x2 )
xr2_1 = Instance.create( fulladder, 'xr2_1', xr2_x2 )
xr2_2 = Instance.create( fulladder, 'xr2_2', xr2_x2 )
o2_1 = Instance.create( fulladder, 'o2_1', o2_x2 )
# Create Nets.
vss = Net.create( fulladder, "vss" )
vss.setExternal( True )
vss.setGlobal ( True )
vdd = Net.create( fulladder, "vdd" )
vdd.setExternal( True )
vdd.setGlobal ( True )
cin = Net.create( fulladder, "cin" )
cin.setExternal( True )
xr2_2.getPlug( xr2_x2.getNet('i0') ).setNet( cin )
a2_2 .getPlug( a2_x2.getNet('i0') ).setNet( cin )
a = Net.create( fulladder, 'a' )
a.setExternal( True )
xr2_1.getPlug( xr2_x2.getNet('i0') ).setNet( a )
a2_1 .getPlug( a2_x2.getNet('i0') ).setNet( a )
b = Net.create( fulladder, 'b' )
b.setExternal( True )
xr2_1.getPlug( xr2_x2.getNet('i1') ).setNet( b )
a2_1 .getPlug( a2_x2.getNet('i1') ).setNet( b )
sout_1 = Net.create( fulladder, 'sout_1' )
xr2_1.getPlug( xr2_x2.getNet('q' ) ).setNet( sout_1 )
xr2_2.getPlug( xr2_x2.getNet('i1') ).setNet( sout_1 )
a2_2 .getPlug( a2_x2.getNet('i1') ).setNet( sout_1 )
carry_1 = Net.create( fulladder, 'carry_1' )
a2_1.getPlug( a2_x2.getNet('q' ) ).setNet( carry_1 )
o2_1.getPlug( o2_x2.getNet('i1') ).setNet( carry_1 )
vdd = Net.create( fulladder, "vdd" )
vdd.setExternal( True )
vdd.setGlobal ( True )
cin = Net.create( fulladder, "cin" )
cin.setExternal( True )
xr2_2.getPlug( xr2_x2.getNet('i0') ).setNet( cin )
a2_2 .getPlug( a2_x2.getNet('i0') ).setNet( cin )
a = Net.create( fulladder, 'a' )
a.setExternal( True )
xr2_1.getPlug( xr2_x2.getNet('i0') ).setNet( a )
a2_1 .getPlug( a2_x2.getNet('i0') ).setNet( a )
b = Net.create( fulladder, 'b' )
b.setExternal( True )
xr2_1.getPlug( xr2_x2.getNet('i1') ).setNet( b )
a2_1 .getPlug( a2_x2.getNet('i1') ).setNet( b )
sout_1 = Net.create( fulladder, 'sout_1' )
xr2_1.getPlug( xr2_x2.getNet('q' ) ).setNet( sout_1 )
xr2_2.getPlug( xr2_x2.getNet('i1') ).setNet( sout_1 )
a2_2 .getPlug( a2_x2.getNet('i1') ).setNet( sout_1 )
carry_1 = Net.create( fulladder, 'carry_1' )
a2_1.getPlug( a2_x2.getNet('q' ) ).setNet( carry_1 )
o2_1.getPlug( o2_x2.getNet('i1') ).setNet( carry_1 )
carry_2 = Net.create( fulladder, 'carry_2' )
a2_2.getPlug( a2_x2.getNet('q' ) ).setNet( carry_2 )
o2_1.getPlug( o2_x2.getNet('i0') ).setNet( carry_2 )
sout = Net.create( fulladder, 'sout' )
sout.setExternal( True )
xr2_2.getPlug( xr2_x2.getNet('q') ).setNet( sout )
cout = Net.create( fulladder, 'cout' )
cout.setExternal( True )
o2_1.getPlug( o2_x2.getNet('q') ).setNet( cout )
carry_2 = Net.create( fulladder, 'carry_2' )
a2_2.getPlug( a2_x2.getNet('q' ) ).setNet( carry_2 )
o2_1.getPlug( o2_x2.getNet('i0') ).setNet( carry_2 )
sout = Net.create( fulladder, 'sout' )
sout.setExternal( True )
xr2_2.getPlug( xr2_x2.getNet('q') ).setNet( sout )
cout = Net.create( fulladder, 'cout' )
cout.setExternal( True )
o2_1.getPlug( o2_x2.getNet('q') ).setNet( cout )
# Instances placement.
a2_1.setTransformation( Transformation( toDbU(0.0)
, toDbU(0.0)
, Transformation.Orientation.ID ) )
a2_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
# Instances placement.
with UpdateSession():
a2_1.setTransformation( Transformation( l(0.0)
, l(0.0)
, Transformation.Orientation.ID ) )
a2_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
doBreak( 1, 'Placed a2_1' )
xr2_1.setTransformation( Transformation( toDbU( 0.0)
, toDbU(100.0)
, Transformation.Orientation.MY ) )
xr2_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
with UpdateSession():
xr2_1.setTransformation( Transformation( l( 0.0)
, l(100.0)
, Transformation.Orientation.MY ) )
xr2_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
doBreak( 1, 'Placed xr2_1' )
a2_2.setTransformation( Transformation( toDbU(25.0)
, toDbU( 0.0)
, Transformation.Orientation.ID ) )
a2_2.setPlacementStatus( Instance.PlacementStatus.PLACED )
with UpdateSession():
a2_2.setTransformation( Transformation( l(25.0)
, l( 0.0)
, Transformation.Orientation.ID ) )
a2_2.setPlacementStatus( Instance.PlacementStatus.PLACED )
doBreak( 1, 'Placed a2_2' )
xr2_2.setTransformation( Transformation( toDbU( 45.0)
, toDbU(100.0)
, Transformation.Orientation.MY ) )
xr2_2.setPlacementStatus( Instance.PlacementStatus.PLACED )
with UpdateSession():
xr2_2.setTransformation( Transformation( l( 45.0)
, l(100.0)
, Transformation.Orientation.MY ) )
xr2_2.setPlacementStatus( Instance.PlacementStatus.PLACED )
doBreak( 1, 'Placed xr2_2' )
o2_1.setTransformation( Transformation( toDbU(65.0)
, toDbU( 0.0)
, Transformation.Orientation.ID ) )
o2_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
with UpdateSession():
o2_1.setTransformation( Transformation( l(65.0)
, l( 0.0)
, Transformation.Orientation.ID ) )
o2_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
doBreak( 1, 'Placed o2_1' )
# Add filler cells.
tie_x0 = af.getCell( 'tie_x0', Catalog.State.Views )
rowend_x0 = af.getCell( 'rowend_x0', Catalog.State.Views )
filler_1 = Instance.create( fulladder, 'filler_1', tie_x0 )
filler_2 = Instance.create( fulladder, 'filler_2', rowend_x0 )
filler_1.setTransformation( Transformation( toDbU(50.0)
, toDbU( 0.0)
, Transformation.Orientation.ID ) )
filler_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
filler_2.setTransformation( Transformation( toDbU(60.0)
, toDbU( 0.0)
, Transformation.Orientation.ID ) )
filler_2.setPlacementStatus( Instance.PlacementStatus.PLACED )
# Add filler cells.
with UpdateSession():
tie_x0 = af.getCell( 'tie_x0', Catalog.State.Views )
rowend_x0 = af.getCell( 'rowend_x0', Catalog.State.Views )
filler_1 = Instance.create( fulladder, 'filler_1', tie_x0 )
filler_2 = Instance.create( fulladder, 'filler_2', rowend_x0 )
filler_1.setTransformation( Transformation( l(50.0)
, l( 0.0)
, Transformation.Orientation.ID ) )
filler_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
filler_2.setTransformation( Transformation( l(60.0)
, l( 0.0)
, Transformation.Orientation.ID ) )
filler_2.setPlacementStatus( Instance.PlacementStatus.PLACED )
doBreak( 1, 'Filler cell placeds' )
# Getting the layers.
@ -366,32 +368,30 @@ directory (under the the root of the |Coriolis| installation).
via12 = technology.getLayer( "VIA12" )
via23 = technology.getLayer( "VIA23" )
# Build wiring for a.
# Create RoutingPads first.
rp1 = RoutingPad.create( a
, Occurrence( xr2_1.getPlug( xr2_x2.getNet("i0")) )
, RoutingPad.BiggestArea )
rp2 = RoutingPad.create( a
, Occurrence( a2_1.getPlug( a2_x2.getNet("i0")) )
, RoutingPad.BiggestArea )
with UpdateSession():
# Build wiring for a.
# Create RoutingPads first.
rp1 = RoutingPad.create( a
, Occurrence( xr2_1.getPlug( xr2_x2.getNet("i0")) )
, RoutingPad.BiggestArea )
rp2 = RoutingPad.create( a
, Occurrence( a2_1.getPlug( a2_x2.getNet("i0")) )
, RoutingPad.BiggestArea )
# Then regular wiring.
contact1 = Contact.create( rp1, via12, toDbU( 0.0), toDbU(-15.0) )
contact2 = Contact.create( rp2, via12, toDbU( 0.0), toDbU( 10.0) )
turn = Contact.create( a , via23, toDbU(10.0), toDbU( 35.0) )
Horizontal.create( contact2, turn , metal2, toDbU(35.0), toDbU(2.0) )
Vertical .create( turn , contact1 , metal3, toDbU(10.0), toDbU(2.0) )
UpdateSession.close()
# Then regular wiring.
contact1 = Contact.create( rp1, via12, l( 0.0), l(-15.0) )
contact2 = Contact.create( rp2, via12, l( 0.0), l( 10.0) )
turn = Contact.create( a , via23, l(10.0), l( 35.0) )
Horizontal.create( contact2, turn , metal2, l(35.0), l(2.0) )
Vertical .create( turn , contact1 , metal3, l(10.0), l(2.0) )
af.saveCell( fulladder, Catalog.State.Views )
return
def scriptMain ( **kw ):
"""The Mandatory function to be run by Coriolis interactively."""
editor = None
if kw.has_key('editor') and kw['editor']:
editor = kw['editor']
if 'editor' in kw and kw['editor']:
editor = kw['editor']
buildFulladder( editor )
return True

View File

@ -34,16 +34,16 @@ You can configure the placer in two ways:
file. For example:
.. code-block:: Python
with overlay.CfgCache(priority=Cfg.Parameter.Priority.UserFile) as cfg:
cfg.etesian.effort = 2
cfg.etesian.uniformDensity = True
cfg.etesian.spaceMargin = 0.8
cfg.etesian.aspectRatio = 1.0
parametersTable = \
( ("etesian.effort" , TypeEnumerate , 2 )
, ('etesian.uniformDensity' , TypeBool , True )
, ('etesian.spaceMargin' , TypePercentage, 3.0 )
, ('etesian.aspectRatio' , TypePercentage, 100.0 )
)
With this setup, the cells will be spread uniformally over the
area (``etesian.uniformDensity``), with ``3.0%`` of free space
area (``etesian.uniformDensity``), with ``80%`` of free space
added and an aspect ratio of ``100%`` (square shape).
@ -87,7 +87,7 @@ previously. The call to the ToolEngines_ is made inside the new function
do not need the wrapper function ``doBreak()`` around the breakpoints.
We directly call Breakpoint_.
.. note:: The space margin for this example is very high (``30%``), it's only
.. note:: The space margin for this example is very high (``80%``), it's only
because it's too small for the placer to run correctly. For normal
case it is around ``3%``.
@ -105,91 +105,82 @@ previously. The call to the ToolEngines_ is made inside the new function
# Everybody needs it.
af = AllianceFramework.get()
def toDbU ( l ): return DbU.fromLambda(l)
def buildFulladder ( editor ):
# Get the Framework and all the master cells.
# Get the Framework and all the master cells.
xr2_x2 = af.getCell( 'xr2_x1', Catalog.State.Views )
a2_x2 = af.getCell( 'a2_x2' , Catalog.State.Views )
o2_x2 = af.getCell( 'o2_x2' , Catalog.State.Views )
UpdateSession.open()
fulladder = af.createCell( 'fulladder' )
# Create Instances.
a2_1 = Instance.create( fulladder, 'a2_1', a2_x2 )
a2_2 = Instance.create( fulladder, 'a2_2', a2_x2 )
xr2_1 = Instance.create( fulladder, 'xr2_1', xr2_x2 )
xr2_2 = Instance.create( fulladder, 'xr2_2', xr2_x2 )
o2_1 = Instance.create( fulladder, 'o2_1', o2_x2 )
# Create Nets.
vss = Net.create( fulladder, "vss" )
vss.setExternal( True )
vss.setGlobal ( True )
vdd = Net.create( fulladder, "vdd" )
vdd.setExternal( True )
vdd.setGlobal ( True )
cin = Net.create( fulladder, "cin" )
cin.setExternal( True )
xr2_2.getPlug( xr2_x2.getNet('i0') ).setNet( cin )
a2_2 .getPlug( a2_x2.getNet('i0') ).setNet( cin )
a = Net.create( fulladder, 'a' )
a.setExternal( True )
xr2_1.getPlug( xr2_x2.getNet('i0') ).setNet( a )
a2_1 .getPlug( a2_x2.getNet('i0') ).setNet( a )
b = Net.create( fulladder, 'b' )
b.setExternal( True )
xr2_1.getPlug( xr2_x2.getNet('i1') ).setNet( b )
a2_1 .getPlug( a2_x2.getNet('i1') ).setNet( b )
sout_1 = Net.create( fulladder, 'sout_1' )
xr2_1.getPlug( xr2_x2.getNet('q' ) ).setNet( sout_1 )
xr2_2.getPlug( xr2_x2.getNet('i1') ).setNet( sout_1 )
a2_2 .getPlug( a2_x2.getNet('i1') ).setNet( sout_1 )
carry_1 = Net.create( fulladder, 'carry_1' )
a2_1.getPlug( a2_x2.getNet('q' ) ).setNet( carry_1 )
o2_1.getPlug( o2_x2.getNet('i1') ).setNet( carry_1 )
carry_2 = Net.create( fulladder, 'carry_2' )
a2_2.getPlug( a2_x2.getNet('q' ) ).setNet( carry_2 )
o2_1.getPlug( o2_x2.getNet('i0') ).setNet( carry_2 )
sout = Net.create( fulladder, 'sout' )
sout.setExternal( True )
xr2_2.getPlug( xr2_x2.getNet('q') ).setNet( sout )
cout = Net.create( fulladder, 'cout' )
cout.setExternal( True )
o2_1.getPlug( o2_x2.getNet('q') ).setNet( cout )
UpdateSession.close()
with UpdateSession():
fulladder = af.createCell( 'fulladder' )
# Create Instances.
a2_1 = Instance.create( fulladder, 'a2_1', a2_x2 )
a2_2 = Instance.create( fulladder, 'a2_2', a2_x2 )
xr2_1 = Instance.create( fulladder, 'xr2_1', xr2_x2 )
xr2_2 = Instance.create( fulladder, 'xr2_2', xr2_x2 )
o2_1 = Instance.create( fulladder, 'o2_1', o2_x2 )
# Create Nets.
vss = Net.create( fulladder, "vss" )
vss.setExternal( True )
vss.setGlobal ( True )
vdd = Net.create( fulladder, "vdd" )
vdd.setExternal( True )
vdd.setGlobal ( True )
cin = Net.create( fulladder, "cin" )
cin.setExternal( True )
xr2_2.getPlug( xr2_x2.getNet('i0') ).setNet( cin )
a2_2 .getPlug( a2_x2.getNet('i0') ).setNet( cin )
a = Net.create( fulladder, 'a' )
a.setExternal( True )
xr2_1.getPlug( xr2_x2.getNet('i0') ).setNet( a )
a2_1 .getPlug( a2_x2.getNet('i0') ).setNet( a )
b = Net.create( fulladder, 'b' )
b.setExternal( True )
xr2_1.getPlug( xr2_x2.getNet('i1') ).setNet( b )
a2_1 .getPlug( a2_x2.getNet('i1') ).setNet( b )
sout_1 = Net.create( fulladder, 'sout_1' )
xr2_1.getPlug( xr2_x2.getNet('q' ) ).setNet( sout_1 )
xr2_2.getPlug( xr2_x2.getNet('i1') ).setNet( sout_1 )
a2_2 .getPlug( a2_x2.getNet('i1') ).setNet( sout_1 )
carry_1 = Net.create( fulladder, 'carry_1' )
a2_1.getPlug( a2_x2.getNet('q' ) ).setNet( carry_1 )
o2_1.getPlug( o2_x2.getNet('i1') ).setNet( carry_1 )
carry_2 = Net.create( fulladder, 'carry_2' )
a2_2.getPlug( a2_x2.getNet('q' ) ).setNet( carry_2 )
o2_1.getPlug( o2_x2.getNet('i0') ).setNet( carry_2 )
sout = Net.create( fulladder, 'sout' )
sout.setExternal( True )
xr2_2.getPlug( xr2_x2.getNet('q') ).setNet( sout )
cout = Net.create( fulladder, 'cout' )
cout.setExternal( True )
o2_1.getPlug( o2_x2.getNet('q') ).setNet( cout )
af.saveCell( fulladder, Catalog.State.Views )
return fulladder
def placeAndRoute ( editor, cell ):
# Run the placer.
# Run the placer.
etesian = Etesian.EtesianEngine.create(cell)
etesian.place()
if editor:
editor.setCell( cell )
editor.fit()
editor.setCell( cell )
editor.fit()
Breakpoint.stop( 1, 'After placement' )
# Run the router.
# Run the router.
katana = Katana.KatanaEngine.create(cell)
katana.digitalInit ()
katana.runGlobalRouter ()
@ -198,14 +189,12 @@ previously. The call to the ToolEngines_ is made inside the new function
katana.runNegociate ( Katana.Flags.NoFlags )
af.saveCell( cell, Catalog.State.Views )
return
def scriptMain ( **kw ):
editor = None
if kw.has_key('editor') and kw['editor']:
editor = kw['editor']
if 'editor' in kw and kw['editor']:
editor = kw['editor']
fulladder = buildFulladder( editor )
placeAndRoute( editor, fulladder )
return True

View File

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

Binary file not shown.

View File

@ -1,23 +0,0 @@
# -*- Mode:Python -*-
defaultStyle = 'Alliance.Classic [black]'
parametersTable = \
( ('misc.catchCore' , TypeBool , False )
, ('misc.info' , TypeBool , False )
, ('misc.paranoid' , TypeBool , False )
, ('misc.bug' , TypeBool , False )
, ('misc.logMode' , TypeBool , False )
, ('misc.verboseLevel1' , TypeBool , False )
, ('misc.verboseLevel2' , TypeBool , True )
, ('misc.traceLevel' , TypeInt , 1000 )
, ('etesian.spaceMargin' , TypePercentage, 30.0 )
, ('etesian.aspectRatio' , TypePercentage, 100.0 )
# Kite parameters.
, ("kite.eventsLimit" , TypeInt , 1000000 )
, ('katabatic.topRoutingLayer', TypeString , 'METAL5')
, ("kite.hTracksReservedLocal", TypeInt , 4 )
, ("kite.vTracksReservedLocal", TypeInt , 3 )
)

View File

@ -1 +0,0 @@
technology = 'symbolic/cmos'

View File

@ -4,6 +4,9 @@
install ( FILES invertor.py
fulladder.py
polygons.py
toolengines.py DESTINATION ${examplesInstallDir}/scripts )
install ( DIRECTORY .coriolis2 DESTINATION ${examplesInstallDir}/scripts )
diagonals.py
rectilinear.py
coriolisLogo.py
toolengines.py DESTINATION ${examplesInstallDir}/scripts )
install ( DIRECTORY coriolis2 DESTINATION ${examplesInstallDir}/scripts )

View File

@ -0,0 +1,38 @@
# -*- Mode:Python -*-
import os
import Cfg
import Viewer
import CRL
import symbolic.cmos
from helpers import overlay
#if 'CELLS_TOP' in os.environ:
# cellsTop = os.environ['CELLS_TOP']
#else:
# cellsTop = '../../../cells'
with overlay.CfgCache(priority=Cfg.Parameter.Priority.UserFile) as cfg:
cfg.misc.catchCore = False
cfg.misc.info = False
cfg.misc.paranoid = False
cfg.misc.bug = False
cfg.misc.logMode = True
cfg.misc.verboseLevel1 = True
cfg.misc.verboseLevel2 = True
cfg.misc.minTraceLevel = 1900
cfg.misc.maxTraceLevel = 3000
cfg.etesian.effort = 2
cfg.etesian.uniformDensity = True
cfg.etesian.spaceMargin = 0.8
cfg.etesian.aspectRatio = 1.0
cfg.katana.eventsLimit = 1000000
cfg.katana.termSatReservedLocal = 6
cfg.katana.termSatThreshold = 9
Viewer.Graphics.setStyle( 'Alliance.Classic [black]' )
#af = CRL.AllianceFramework.get()
#env = af.getEnvironment()
#env.setCLOCK( '^ck$|m_clock|^clk$' )
#env.addSYSTEM_LIBRARY( library=cellsTop+'/nsxlib', mode=CRL.Environment.Prepend )
#env.addSYSTEM_LIBRARY( library=cellsTop+'/niolib', mode=CRL.Environment.Prepend )

View File

@ -1,73 +1,61 @@
#!/usr/bin/python
import sys
from Hurricane import *
from CRL import *
def toDbU ( l ): return DbU.fromLambda(l)
def doBreak ( level, message ):
UpdateSession.close()
Breakpoint.stop( level, message )
UpdateSession.open()
from Hurricane import DataBase, Box, Net, Vertical, Horizontal
from CRL import AllianceFramework, Catalog
from helpers import l
from helpers.overlay import UpdateSession
def drawLogo ( editor ):
UpdateSession.open()
cell = AllianceFramework.get().createCell( 'coriolis_logo' )
cell.setTerminal( True )
cell.setAbutmentBox( Box( toDbU(-16.0), toDbU(-16.0), toDbU(76.0), toDbU(76.0) ) )
"""Draw a small logo of Coriolis in GDS."""
with UpdateSession():
cell = AllianceFramework.get().createCell( 'coriolis_logo' )
cell.setTerminalNetlist( True )
cell.setAbutmentBox( Box( l(-16.0), l(-16.0), l(76.0), l(76.0) ) )
if editor:
UpdateSession.close()
editor.setCell( cell )
editor.fit()
UpdateSession.open()
technology = DataBase.getDB().getTechnology()
metal1 = technology.getLayer( "metal1" )
metal2 = technology.getLayer( "metal2" )
metal4 = technology.getLayer( "metal4" )
poly = technology.getLayer( "POLY" )
ptrans = technology.getLayer( "PTRANS" )
ntrans = technology.getLayer( "NTRANS" )
pdif = technology.getLayer( "PDIF" )
ndif = technology.getLayer( "NDIF" )
contdifn = technology.getLayer( "CONT_DIF_N" )
contdifp = technology.getLayer( "CONT_DIF_P" )
nwell = technology.getLayer( "NWELL" )
contpoly = technology.getLayer( "CONT_POLY" )
ntie = technology.getLayer( "NTIE" )
net = Net.create( cell, 'logo' )
net.setExternal( True )
Vertical .create( net, metal1, toDbU(10.0), toDbU(12.0), toDbU( 4.0), toDbU(56.0) )
Horizontal.create( net, metal1, toDbU(50.0), toDbU(12.0), toDbU( 4.0), toDbU(56.0) )
Vertical .create( net, metal1, toDbU(50.0), toDbU(12.0), toDbU(56.0), toDbU( 4.0) )
Horizontal.create( net, metal1, toDbU(10.0), toDbU(12.0), toDbU(56.0), toDbU( 4.0) )
Vertical .create( net, metal1, toDbU(-6.0), toDbU(12.0), toDbU(22.0), toDbU(56.0) )
Horizontal.create( net, metal1, toDbU(66.0), toDbU(12.0), toDbU(22.0), toDbU(56.0) )
Vertical .create( net, metal1, toDbU(66.0), toDbU(12.0), toDbU(36.0), toDbU( 4.0) )
Horizontal.create( net, metal1, toDbU(-6.0), toDbU(12.0), toDbU(36.0), toDbU( 4.0) )
Horizontal.create( net, nwell, toDbU(30.0), toDbU(92.0), toDbU(-16.0), toDbU(76.0) )
UpdateSession.close()
editor.setCell( cell )
editor.fit()
with UpdateSession():
technology = DataBase.getDB().getTechnology()
metal1 = technology.getLayer( "metal1" )
metal2 = technology.getLayer( "metal2" )
metal4 = technology.getLayer( "metal4" )
poly = technology.getLayer( "POLY" )
ptrans = technology.getLayer( "PTRANS" )
ntrans = technology.getLayer( "NTRANS" )
pdif = technology.getLayer( "PDIF" )
ndif = technology.getLayer( "NDIF" )
contdifn = technology.getLayer( "CONT_DIF_N" )
contdifp = technology.getLayer( "CONT_DIF_P" )
nwell = technology.getLayer( "NWELL" )
contpoly = technology.getLayer( "CONT_POLY" )
ntie = technology.getLayer( "NTIE" )
net = Net.create( cell, 'logo' )
net.setExternal( True )
Vertical .create( net, metal1, l(10.0), l(12.0), l( 4.0), l(56.0) )
Horizontal.create( net, metal1, l(50.0), l(12.0), l( 4.0), l(56.0) )
Vertical .create( net, metal1, l(50.0), l(12.0), l(56.0), l( 4.0) )
Horizontal.create( net, metal1, l(10.0), l(12.0), l(56.0), l( 4.0) )
Vertical .create( net, metal1, l(-6.0), l(12.0), l(22.0), l(56.0) )
Horizontal.create( net, metal1, l(66.0), l(12.0), l(22.0), l(56.0) )
Vertical .create( net, metal1, l(66.0), l(12.0), l(36.0), l( 4.0) )
Horizontal.create( net, metal1, l(-6.0), l(12.0), l(36.0), l( 4.0) )
Horizontal.create( net, nwell, l(30.0), l(92.0), l(-16.0), l(76.0) )
AllianceFramework.get().saveCell( cell, Catalog.State.Views )
return
def scriptMain ( **kw ):
"""The mandatory function to be called by Coriolis CGT/Unicorn."""
editor = None
if kw.has_key('editor') and kw['editor']:
editor = kw['editor']
if 'editor' in kw and kw['editor']:
editor = kw['editor']
drawLogo( editor )
return True

View File

@ -1,34 +1,25 @@
#!/usr/bin/python
import sys
from Hurricane import *
from CRL import *
def toDbU ( l ): return DbU.fromLambda(l)
def doBreak ( level, message ):
UpdateSession.close()
Breakpoint.stop( level, message )
UpdateSession.open()
from Hurricane import DataBase, DbU, Point, Box, Net, Vertical, Horizontal, Diagonal
from CRL import AllianceFramework, Catalog, Gds
from helpers import l
from helpers.overlay import UpdateSession
def buildDiagonals ( editor ):
DbU.setPolygonStep( toDbU(1.0) )
"""Check the Diagonal segments of Hurricane."""
DbU.setPolygonStep( l(1.0) )
UpdateSession.open()
with UpdateSession():
cell = AllianceFramework.get().createCell( 'diagonal' )
cell.setTerminalNetlist( True )
cell = AllianceFramework.get().createCell( 'diagonal' )
cell.setTerminal( True )
cell.setAbutmentBox( Box( toDbU(-5.0), toDbU(-5.0), toDbU(65.0), toDbU(75.0) ) )
cell.setAbutmentBox( Box( l(-5.0), l(-5.0), l(65.0), l(75.0) ) )
if editor:
UpdateSession.close()
editor.setCell( cell )
editor.fit()
UpdateSession.open()
editor.setCell( cell )
editor.fit()
technology = DataBase.getDB().getTechnology()
metal1 = technology.getLayer( "metal1" )
@ -45,45 +36,42 @@ def buildDiagonals ( editor ):
contpoly = technology.getLayer( "CONT_POLY" )
ntie = technology.getLayer( "NTIE" )
net = Net.create( cell, 'my_net' )
net.setExternal( True )
Diagonal.create( net, metal2
, Point( toDbU(20.0), toDbU(10.0) )
, Point( toDbU(10.0), toDbU(20.0) )
, toDbU(4.0)
)
Vertical.create( net, metal2, toDbU(10.0), toDbU(4.0), toDbU(20.0), toDbU(30.0) )
Diagonal.create( net, metal2
, Point( toDbU(10.0), toDbU(30.0) )
, Point( toDbU(20.0), toDbU(40.0) )
, toDbU(4.0)
)
Horizontal.create( net, metal2, toDbU(40.0), toDbU(4.0), toDbU(20.0), toDbU(30.0) )
Diagonal.create( net, metal2
, Point( toDbU(30.0), toDbU(40.0) )
, Point( toDbU(40.0), toDbU(30.0) )
, toDbU(4.0)
)
Vertical.create( net, metal2, toDbU(40.0), toDbU(4.0), toDbU(30.0), toDbU(20.0) )
Diagonal.create( net, metal2
, Point( toDbU(40.0), toDbU(20.0) )
, Point( toDbU(30.0), toDbU(10.0) )
, toDbU(4.0)
)
Horizontal.create( net, metal2, toDbU(10.0), toDbU(4.0), toDbU(30.0), toDbU(20.0) )
UpdateSession.close()
with UpdateSession():
net = Net.create( cell, 'my_net' )
net.setExternal( True )
Diagonal.create( net, metal2
, Point( l(20.0), l(10.0) )
, Point( l(10.0), l(20.0) )
, l(4.0)
)
Vertical.create( net, metal2, l(10.0), l(4.0), l(20.0), l(30.0) )
Diagonal.create( net, metal2
, Point( l(10.0), l(30.0) )
, Point( l(20.0), l(40.0) )
, l(4.0)
)
Horizontal.create( net, metal2, l(40.0), l(4.0), l(20.0), l(30.0) )
Diagonal.create( net, metal2
, Point( l(30.0), l(40.0) )
, Point( l(40.0), l(30.0) )
, l(4.0)
)
Vertical.create( net, metal2, l(40.0), l(4.0), l(30.0), l(20.0) )
Diagonal.create( net, metal2
, Point( l(40.0), l(20.0) )
, Point( l(30.0), l(10.0) )
, l(4.0)
)
Horizontal.create( net, metal2, l(10.0), l(4.0), l(30.0), l(20.0) )
Gds.save( cell )
return
def scriptMain ( **kw ):
"""The mandatory function to be called by Coriolis CGT/Unicorn."""
editor = None
if kw.has_key('editor') and kw['editor']:
editor = kw['editor']
if 'editor' in kw and kw['editor']:
editor = kw['editor']
buildDiagonals( editor )
return True

View File

@ -1,172 +1,175 @@
#!/usr/bin/python
import sys
from Hurricane import *
from CRL import *
def toDbU ( l ): return DbU.fromLambda(l)
from Hurricane import DataBase, Instance, Box, Net, Horizontal, Vertical, Contact, \
RoutingPad, Transformation, Occurrence, \
Breakpoint
from CRL import AllianceFramework, Catalog, Gds
from helpers import l
from helpers.overlay import UpdateSession
def doBreak ( level, message ):
UpdateSession.close()
Breakpoint.stop( level, message )
UpdateSession.open()
def buildFulladder ( editor ):
# Get the Framework and all the master cells.
"""
Build a full adder, place it, add filler cells and create routing
for the "a" net.
"""
# Get the Framework and all the master cells.
af = AllianceFramework.get()
xr2_x2 = af.getCell( 'xr2_x1', Catalog.State.Views )
a2_x2 = af.getCell( 'a2_x2' , Catalog.State.Views )
o2_x2 = af.getCell( 'o2_x2' , Catalog.State.Views )
UpdateSession.open()
fulladder = af.createCell( 'fulladder' )
fulladder.setAbutmentBox( Box( toDbU(0.0), toDbU(0.0), toDbU(90.0), toDbU(100.0) ) )
with UpdateSession():
fulladder = af.createCell( 'fulladder' )
fulladder.setAbutmentBox( Box( l(0.0), l(0.0), l(90.0), l(100.0) ) )
if editor:
UpdateSession.close()
editor.setCell( fulladder )
editor.fit()
UpdateSession.open()
editor.setCell( fulladder )
editor.fit()
# Create Instances.
a2_1 = Instance.create( fulladder, 'a2_1', a2_x2 )
a2_2 = Instance.create( fulladder, 'a2_2', a2_x2 )
xr2_1 = Instance.create( fulladder, 'xr2_1', xr2_x2 )
xr2_2 = Instance.create( fulladder, 'xr2_2', xr2_x2 )
o2_1 = Instance.create( fulladder, 'o2_1', o2_x2 )
with UpdateSession():
# Create Instances.
a2_1 = Instance.create( fulladder, 'a2_1', a2_x2 )
a2_2 = Instance.create( fulladder, 'a2_2', a2_x2 )
xr2_1 = Instance.create( fulladder, 'xr2_1', xr2_x2 )
xr2_2 = Instance.create( fulladder, 'xr2_2', xr2_x2 )
o2_1 = Instance.create( fulladder, 'o2_1', o2_x2 )
# Create Nets.
vss = Net.create( fulladder, "vss" )
vss.setExternal( True )
vss.setGlobal ( True )
vdd = Net.create( fulladder, "vdd" )
vdd.setExternal( True )
vdd.setGlobal ( True )
cin = Net.create( fulladder, "cin" )
cin.setExternal( True )
xr2_2.getPlug( xr2_x2.getNet('i0') ).setNet( cin )
a2_2 .getPlug( a2_x2.getNet('i0') ).setNet( cin )
a = Net.create( fulladder, 'a' )
a.setExternal( True )
xr2_1.getPlug( xr2_x2.getNet('i0') ).setNet( a )
a2_1 .getPlug( a2_x2.getNet('i0') ).setNet( a )
b = Net.create( fulladder, 'b' )
b.setExternal( True )
xr2_1.getPlug( xr2_x2.getNet('i1') ).setNet( b )
a2_1 .getPlug( a2_x2.getNet('i1') ).setNet( b )
sout_1 = Net.create( fulladder, 'sout_1' )
xr2_1.getPlug( xr2_x2.getNet('q' ) ).setNet( sout_1 )
xr2_2.getPlug( xr2_x2.getNet('i1') ).setNet( sout_1 )
a2_2 .getPlug( a2_x2.getNet('i1') ).setNet( sout_1 )
carry_1 = Net.create( fulladder, 'carry_1' )
a2_1.getPlug( a2_x2.getNet('q' ) ).setNet( carry_1 )
o2_1.getPlug( o2_x2.getNet('i1') ).setNet( carry_1 )
carry_2 = Net.create( fulladder, 'carry_2' )
a2_2.getPlug( a2_x2.getNet('q' ) ).setNet( carry_2 )
o2_1.getPlug( o2_x2.getNet('i0') ).setNet( carry_2 )
sout = Net.create( fulladder, 'sout' )
sout.setExternal( True )
xr2_2.getPlug( xr2_x2.getNet('q') ).setNet( sout )
cout = Net.create( fulladder, 'cout' )
cout.setExternal( True )
o2_1.getPlug( o2_x2.getNet('q') ).setNet( cout )
# Create Nets.
vss = Net.create( fulladder, "vss" )
vss.setExternal( True )
vss.setGlobal ( True )
vdd = Net.create( fulladder, "vdd" )
vdd.setExternal( True )
vdd.setGlobal ( True )
cin = Net.create( fulladder, "cin" )
cin.setExternal( True )
xr2_2.getPlug( xr2_x2.getNet('i0') ).setNet( cin )
a2_2 .getPlug( a2_x2.getNet('i0') ).setNet( cin )
a = Net.create( fulladder, 'a' )
a.setExternal( True )
xr2_1.getPlug( xr2_x2.getNet('i0') ).setNet( a )
a2_1 .getPlug( a2_x2.getNet('i0') ).setNet( a )
b = Net.create( fulladder, 'b' )
b.setExternal( True )
xr2_1.getPlug( xr2_x2.getNet('i1') ).setNet( b )
a2_1 .getPlug( a2_x2.getNet('i1') ).setNet( b )
sout_1 = Net.create( fulladder, 'sout_1' )
xr2_1.getPlug( xr2_x2.getNet('q' ) ).setNet( sout_1 )
xr2_2.getPlug( xr2_x2.getNet('i1') ).setNet( sout_1 )
a2_2 .getPlug( a2_x2.getNet('i1') ).setNet( sout_1 )
carry_1 = Net.create( fulladder, 'carry_1' )
a2_1.getPlug( a2_x2.getNet('q' ) ).setNet( carry_1 )
o2_1.getPlug( o2_x2.getNet('i1') ).setNet( carry_1 )
carry_2 = Net.create( fulladder, 'carry_2' )
a2_2.getPlug( a2_x2.getNet('q' ) ).setNet( carry_2 )
o2_1.getPlug( o2_x2.getNet('i0') ).setNet( carry_2 )
sout = Net.create( fulladder, 'sout' )
sout.setExternal( True )
xr2_2.getPlug( xr2_x2.getNet('q') ).setNet( sout )
cout = Net.create( fulladder, 'cout' )
cout.setExternal( True )
o2_1.getPlug( o2_x2.getNet('q') ).setNet( cout )
# Instances placement.
a2_1.setTransformation( Transformation( toDbU(0.0)
, toDbU(0.0)
, Transformation.Orientation.ID ) )
a2_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
#doBreak( 1, 'Placed a2_1' )
with UpdateSession():
# Instances placement.
a2_1.setTransformation( Transformation( l(0.0)
, l(0.0)
, Transformation.Orientation.ID ) )
a2_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
#doBreak( 1, 'Placed a2_1' )
xr2_1.setTransformation( Transformation( toDbU( 0.0)
, toDbU(100.0)
, Transformation.Orientation.MY ) )
xr2_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
#doBreak( 1, 'Placed xr2_1' )
with UpdateSession():
xr2_1.setTransformation( Transformation( l( 0.0)
, l(100.0)
, Transformation.Orientation.MY ) )
xr2_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
#doBreak( 1, 'Placed xr2_1' )
a2_2.setTransformation( Transformation( toDbU(25.0)
, toDbU( 0.0)
, Transformation.Orientation.ID ) )
a2_2.setPlacementStatus( Instance.PlacementStatus.PLACED )
#doBreak( 1, 'Placed a2_2' )
with UpdateSession():
a2_2.setTransformation( Transformation( l(25.0)
, l( 0.0)
, Transformation.Orientation.ID ) )
a2_2.setPlacementStatus( Instance.PlacementStatus.PLACED )
#doBreak( 1, 'Placed a2_2' )
xr2_2.setTransformation( Transformation( toDbU( 45.0)
, toDbU(100.0)
, Transformation.Orientation.MY ) )
xr2_2.setPlacementStatus( Instance.PlacementStatus.PLACED )
#doBreak( 1, 'Placed xr2_2' )
with UpdateSession():
xr2_2.setTransformation( Transformation( l( 45.0)
, l(100.0)
, Transformation.Orientation.MY ) )
xr2_2.setPlacementStatus( Instance.PlacementStatus.PLACED )
#doBreak( 1, 'Placed xr2_2' )
o2_1.setTransformation( Transformation( toDbU(65.0)
, toDbU( 0.0)
, Transformation.Orientation.ID ) )
o2_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
#doBreak( 1, 'Placed o2_1' )
with UpdateSession():
o2_1.setTransformation( Transformation( l(65.0)
, l( 0.0)
, Transformation.Orientation.ID ) )
o2_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
#doBreak( 1, 'Placed o2_1' )
# Add filler cells.
tie_x0 = af.getCell( 'tie_x0', Catalog.State.Views )
rowend_x0 = af.getCell( 'rowend_x0', Catalog.State.Views )
filler_1 = Instance.create( fulladder, 'filler_1', tie_x0 )
filler_2 = Instance.create( fulladder, 'filler_2', rowend_x0 )
filler_1.setTransformation( Transformation( toDbU(50.0)
, toDbU( 0.0)
, Transformation.Orientation.ID ) )
filler_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
filler_2.setTransformation( Transformation( toDbU(60.0)
, toDbU( 0.0)
, Transformation.Orientation.ID ) )
filler_2.setPlacementStatus( Instance.PlacementStatus.PLACED )
#doBreak( 1, 'Filler cell placeds' )
#
# Getting the layers.
with UpdateSession():
# Add filler cells.
tie_x0 = af.getCell( 'tie_x0', Catalog.State.Views )
rowend_x0 = af.getCell( 'rowend_x0', Catalog.State.Views )
filler_1 = Instance.create( fulladder, 'filler_1', tie_x0 )
filler_2 = Instance.create( fulladder, 'filler_2', rowend_x0 )
filler_1.setTransformation( Transformation( l(50.0)
, l( 0.0)
, Transformation.Orientation.ID ) )
filler_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
filler_2.setTransformation( Transformation( l(60.0)
, l( 0.0)
, Transformation.Orientation.ID ) )
filler_2.setPlacementStatus( Instance.PlacementStatus.PLACED )
#doBreak( 1, 'Filler cell placeds' )
# Getting the layers.
technology = DataBase.getDB().getTechnology()
metal2 = technology.getLayer( "METAL2" )
metal3 = technology.getLayer( "METAL3" )
via12 = technology.getLayer( "VIA12" )
via23 = technology.getLayer( "VIA23" )
# Build wiring for a.
# Create RoutingPads first.
rp1 = RoutingPad.create( a
, Occurrence( xr2_1.getPlug( xr2_x2.getNet("i0")) )
, RoutingPad.BiggestArea )
rp2 = RoutingPad.create( a
, Occurrence( a2_1.getPlug( a2_x2.getNet("i0")) )
, RoutingPad.BiggestArea )
# Then regular wiring.
contact1 = Contact.create( rp1, via12, toDbU( 0.0), toDbU(-15.0) )
contact2 = Contact.create( rp2, via12, toDbU( 0.0), toDbU( 10.0) )
turn = Contact.create( a , via23, toDbU(10.0), toDbU( 35.0) )
Horizontal.create( contact2, turn , metal2, toDbU(35.0), toDbU(2.0) )
Vertical .create( turn , contact1, metal3, toDbU(10.0), toDbU(2.0) )
UpdateSession.close()
with UpdateSession():
# Build wiring for a.
# Create RoutingPads first.
rp1 = RoutingPad.create( a
, Occurrence( xr2_1.getPlug( xr2_x2.getNet("i0")) )
, RoutingPad.BiggestArea )
rp2 = RoutingPad.create( a
, Occurrence( a2_1.getPlug( a2_x2.getNet("i0")) )
, RoutingPad.BiggestArea )
# Then regular wiring.
contact1 = Contact.create( rp1, via12, l( 0.0), l(-15.0) )
contact2 = Contact.create( rp2, via12, l( 0.0), l( 10.0) )
turn = Contact.create( a , via23, l(10.0), l( 35.0) )
Horizontal.create( contact2, turn , metal2, l(35.0), l(2.0) )
Vertical .create( turn , contact1, metal3, l(10.0), l(2.0) )
af.saveCell( fulladder, Catalog.State.Views )
Gds.save( fulladder )
return
def scriptMain ( **kw ):
"""The mandatory function to be called by Coriolis CGT/Unicorn."""
editor = None
if kw.has_key('editor') and kw['editor']:
editor = kw['editor']
if 'editor' in kw and kw['editor']:
editor = kw['editor']
buildFulladder( editor )
return True

View File

@ -1,32 +1,28 @@
#!/usr/bin/python
import sys
from Hurricane import *
from CRL import *
def toDbU ( l ): return DbU.fromLambda(l)
from Hurricane import DataBase, NetExternalComponents, Net, \
DbU, Point, Box, Horizontal, Vertical, Contact, RoutingPad, \
Breakpoint
from CRL import AllianceFramework, Catalog
from helpers import l
from helpers.overlay import UpdateSession
def doBreak ( level, message ):
UpdateSession.close()
"""Put a breakpoint into the script."""
Breakpoint.stop( level, message )
UpdateSession.open()
def buildInvertor ( editor ):
UpdateSession.open()
cell = AllianceFramework.get().createCell( 'invertor' )
cell.setTerminal( True )
cell.setAbutmentBox( Box( toDbU(0.0), toDbU(0.0), toDbU(15.0), toDbU(50.0) ) )
"""Build step by step an invertor standard cell."""
with UpdateSession():
cell = AllianceFramework.get().createCell( 'invertor' )
cell.setTerminalNetlist( True )
cell.setAbutmentBox( Box( l(0.0), l(0.0), l(15.0), l(50.0) ) )
if editor:
UpdateSession.close()
editor.setCell( cell )
editor.fit()
UpdateSession.open()
editor.setCell( cell )
editor.fit()
technology = DataBase.getDB().getTechnology()
metal1 = technology.getLayer( "METAL1" )
@ -41,61 +37,62 @@ def buildInvertor ( editor ):
contpoly = technology.getLayer( "CONT_POLY" )
ntie = technology.getLayer( "NTIE" )
net = Net.create( cell, "nwell" )
Vertical.create( net, nwell, toDbU(7.5), toDbU(15.0), toDbU(27.0), toDbU(51.0) )
vdd = Net.create( cell, "vdd" )
vdd.setExternal( True )
vdd.setGlobal ( True )
h = Horizontal.create(vdd, metal1, toDbU(47.0), toDbU(6.0), toDbU(0.0), toDbU(15.0) )
NetExternalComponents.setExternal( h )
Contact.create ( vdd, contdifn, toDbU(10.0), toDbU(47.0), toDbU( 1.0), toDbU( 1.0) )
Contact.create ( vdd, contdifp, toDbU( 4.0), toDbU(45.0), toDbU( 1.0), toDbU( 1.0) )
Vertical.create( vdd, pdif , toDbU( 3.5), toDbU( 4.0), toDbU(28.0), toDbU(46.0) )
Vertical.create( vdd, ntie , toDbU(10.0), toDbU( 3.0), toDbU(43.0), toDbU(48.0) )
with UpdateSession():
net = Net.create( cell, "nwell" )
Vertical.create( net, nwell, l(7.5), l(15.0), l(27.0), l(51.0) )
vdd = Net.create( cell, "vdd" )
vdd.setExternal( True )
vdd.setGlobal ( True )
h = Horizontal.create(vdd, metal1, l(47.0), l(6.0), l(0.0), l(15.0) )
NetExternalComponents.setExternal( h )
Contact.create ( vdd, contdifn, l(10.0), l(47.0), l( 1.0), l( 1.0) )
Contact.create ( vdd, contdifp, l( 4.0), l(45.0), l( 1.0), l( 1.0) )
Vertical.create( vdd, pdif , l( 3.5), l( 4.0), l(28.0), l(46.0) )
Vertical.create( vdd, ntie , l(10.0), l( 3.0), l(43.0), l(48.0) )
doBreak( 1, 'Done building vdd.' )
vss = Net.create( cell, "vss" )
vss.setExternal( True )
vss.setGlobal ( True )
h = Horizontal.create(vss, metal1, toDbU(3.0), toDbU(6.0), toDbU(0.0), toDbU(15.0))
NetExternalComponents.setExternal( h )
Vertical.create( vss, ndif , toDbU(3.5), toDbU(4.0), toDbU(4.0), toDbU(12.0) )
Contact.create ( vss, contdifn, toDbU(4.0), toDbU(5.0), toDbU(1.0), toDbU( 1.0) )
with UpdateSession():
vss = Net.create( cell, "vss" )
vss.setExternal( True )
vss.setGlobal ( True )
h = Horizontal.create(vss, metal1, l(3.0), l(6.0), l(0.0), l(15.0))
NetExternalComponents.setExternal( h )
Vertical.create( vss, ndif , l(3.5), l(4.0), l(4.0), l(12.0) )
Contact.create ( vss, contdifn, l(4.0), l(5.0), l(1.0), l( 1.0) )
doBreak( 1, 'Done building vss.' )
i = Net.create( cell, "i" )
i.setExternal( True )
v = Vertical.create ( i, metal1, toDbU(5.0), toDbU(2.0), toDbU(10.0), toDbU(40.0) )
NetExternalComponents.setExternal( v )
Vertical.create ( i, ptrans , toDbU( 7.0), toDbU( 1.0), toDbU(26.0), toDbU(39.0) )
Vertical.create ( i, ntrans , toDbU( 7.0), toDbU( 1.0), toDbU( 6.0), toDbU(14.0) )
Vertical.create ( i, poly , toDbU( 7.0), toDbU( 1.0), toDbU(14.0), toDbU(26.0) )
Horizontal.create( i, poly , toDbU(20.0), toDbU( 3.0), toDbU( 4.0), toDbU( 7.0) )
Contact.create ( i, contpoly, toDbU( 5.0), toDbU(20.0), toDbU( 1.0), toDbU( 1.0) )
with UpdateSession():
i = Net.create( cell, "i" )
i.setExternal( True )
v = Vertical.create ( i, metal1, l(5.0), l(2.0), l(10.0), l(40.0) )
NetExternalComponents.setExternal( v )
Vertical.create ( i, ptrans , l( 7.0), l( 1.0), l(26.0), l(39.0) )
Vertical.create ( i, ntrans , l( 7.0), l( 1.0), l( 6.0), l(14.0) )
Vertical.create ( i, poly , l( 7.0), l( 1.0), l(14.0), l(26.0) )
Horizontal.create( i, poly , l(20.0), l( 3.0), l( 4.0), l( 7.0) )
Contact.create ( i, contpoly, l( 5.0), l(20.0), l( 1.0), l( 1.0) )
doBreak( 1, 'Done building i.' )
nq = Net.create ( cell, "nq" )
nq.setExternal( True )
v = Vertical.create( nq, metal1, toDbU(10.0), toDbU(2.0), toDbU(10.0), toDbU(40.0) )
NetExternalComponents.setExternal( v )
Vertical.create( nq, pdif , toDbU(10.0), toDbU( 3.0), toDbU(28.0), toDbU(37.0) )
Vertical.create( nq, ndif , toDbU(10.0), toDbU( 3.0), toDbU( 8.0), toDbU(12.0) )
Contact.create ( nq, contdifp, toDbU(10.0), toDbU(35.0), toDbU( 1.0), toDbU( 1.0) )
Contact.create ( nq, contdifp, toDbU(10.0), toDbU(30.5), toDbU( 1.0), toDbU( 1.0) )
Contact.create ( nq, contdifn, toDbU(10.0), toDbU(10.0), toDbU( 1.0), toDbU( 1.0) )
with UpdateSession():
nq = Net.create ( cell, "nq" )
nq.setExternal( True )
v = Vertical.create( nq, metal1, l(10.0), l(2.0), l(10.0), l(40.0) )
NetExternalComponents.setExternal( v )
Vertical.create( nq, pdif , l(10.0), l( 3.0), l(28.0), l(37.0) )
Vertical.create( nq, ndif , l(10.0), l( 3.0), l( 8.0), l(12.0) )
Contact.create ( nq, contdifp, l(10.0), l(35.0), l( 1.0), l( 1.0) )
Contact.create ( nq, contdifp, l(10.0), l(30.5), l( 1.0), l( 1.0) )
Contact.create ( nq, contdifn, l(10.0), l(10.0), l( 1.0), l( 1.0) )
doBreak( 1, 'Done building q.' )
UpdateSession.close()
AllianceFramework.get().saveCell( cell, Catalog.State.Views )
return
def scriptMain ( **kw ):
"""The mandatory function to be called by Coriolis CGT/Unicorn."""
editor = None
if kw.has_key('editor') and kw['editor']:
editor = kw['editor']
if 'editor' in kw and kw['editor']:
editor = kw['editor']
buildInvertor( editor )
return True

View File

@ -1,36 +1,24 @@
#!/usr/bin/python
import sys
from Hurricane import *
from CRL import *
def toDbU ( l ): return DbU.fromLambda(l)
def toMicron ( u ): return DbU.toPhysical( u, DbU.UnitPowerMicro )
def doBreak ( level, message ):
UpdateSession.close()
Breakpoint.stop( level, message )
UpdateSession.open()
from Hurricane import DataBase, NetExternalComponents, Net, \
DbU, Point, Box, Polygon
from CRL import AllianceFramework, Catalog, Gds
from helpers import l, u
from helpers.overlay import UpdateSession
def buildPolygons ( editor ):
#DbU.setPolygonStep( toDbU(0.1) )
UpdateSession.open()
cell = AllianceFramework.get().createCell( 'polygons' )
cell.setTerminal( True )
cell.setAbutmentBox( Box( toDbU(-5.0), toDbU(-5.0), toDbU(65.0), toDbU(75.0) ) )
#cell.setAbutmentBox( Box( toDbU(-5.0), toDbU(-5.0), toDbU(21.0), toDbU(35.0) ) )
"""Draw a set of Polygons checking all possible combination."""
#DbU.setPolygonStep( l(0.1) )
with UpdateSession():
cell = AllianceFramework.get().createCell( 'polygons' )
cell.setTerminalNetlist( True )
cell.setAbutmentBox( Box( l(-5.0), l(-5.0), l(65.0), l(75.0) ) )
#cell.setAbutmentBox( Box( l(-5.0), l(-5.0), l(21.0), l(35.0) ) )
if editor:
UpdateSession.close()
editor.setCell( cell )
editor.fit()
UpdateSession.open()
editor.setCell( cell )
editor.fit()
technology = DataBase.getDB().getTechnology()
metal1 = technology.getLayer( "METAL1" )
@ -48,124 +36,117 @@ def buildPolygons ( editor ):
contpoly = technology.getLayer( "CONT_POLY" )
ntie = technology.getLayer( "NTIE" )
net = Net.create( cell, 'my_net' )
net.setExternal( True )
#points = [ Point( toDbU( 0.0), toDbU( 0.0) )
# , Point( toDbU( 10.0), toDbU( 0.0) )
# , Point( toDbU( 7.0), toDbU( 8.0) )
# , Point( toDbU( 3.0), toDbU( 8.0) ) ]
#p = Polygon.create( net, metal4, points )
# Counter-clockwise, slope > 1.
points = [ Point( toDbU( 3.0), toDbU( 0.0) )
, Point( toDbU( 13.0), toDbU( 0.0) )
, Point( toDbU( 16.0), toDbU( 10.0) )
, Point( toDbU( 16.0), toDbU( 20.0) )
, Point( toDbU( 13.0), toDbU( 30.0) )
, Point( toDbU( 3.0), toDbU( 30.0) )
, Point( toDbU( 0.0), toDbU( 20.0) )
, Point( toDbU( 0.0), toDbU( 10.0) ) ]
p = Polygon.create( net, metal2, points )
#p.translate( toDbU(40.0), toDbU(0.0) )
# clockwise, slope > 1.
points = [ Point( toDbU( 0.0), toDbU( 10.0) )
, Point( toDbU( 0.0), toDbU( 20.0) )
, Point( toDbU( 3.0), toDbU( 30.0) )
, Point( toDbU( 13.0), toDbU( 30.0) )
, Point( toDbU( 16.0), toDbU( 20.0) )
, Point( toDbU( 16.0), toDbU( 10.0) )
, Point( toDbU( 13.0), toDbU( 0.0) )
, Point( toDbU( 3.0), toDbU( 0.0) ) ]
p = Polygon.create( net, metal2, points )
p.translate( toDbU(0.0), toDbU(40.0) )
# Counter-clockwise, slope < 1.
points = [ Point( toDbU( 10.0), toDbU( 0.0) )
, Point( toDbU( 20.0), toDbU( 0.0) )
, Point( toDbU( 30.0), toDbU( 3.0) )
, Point( toDbU( 30.0), toDbU( 13.0) )
, Point( toDbU( 20.0), toDbU( 16.0) )
, Point( toDbU( 10.0), toDbU( 16.0) )
, Point( toDbU( 0.0), toDbU( 13.0) )
, Point( toDbU( 0.0), toDbU( 3.0) ) ]
p = Polygon.create( net, metal2, points )
p.translate( toDbU(30.0), toDbU(0.0) )
# clockwise.
points = [ Point( toDbU( 0.0), toDbU( 3.0) )
, Point( toDbU( 0.0), toDbU( 13.0) )
, Point( toDbU( 10.0), toDbU( 16.0) )
, Point( toDbU( 20.0), toDbU( 16.0) )
, Point( toDbU( 30.0), toDbU( 13.0) )
, Point( toDbU( 30.0), toDbU( 3.0) )
, Point( toDbU( 20.0), toDbU( 0.0) )
, Point( toDbU( 10.0), toDbU( 0.0) ) ]
p = Polygon.create( net, metal2, points )
p.translate( toDbU(30.0), toDbU(40.0) )
# Big parallelogram.
points = [ Point( toDbU( 0.0), toDbU( 0.0) )
, Point( toDbU( 20.0), toDbU( 20.0) )
, Point( toDbU( 60.0), toDbU( 20.0) )
, Point( toDbU( 40.0), toDbU( 0.0) ) ]
p = Polygon.create( net, metal3, points )
p.translate( toDbU(70.0), toDbU(0.0) )
with UpdateSession():
net = Net.create( cell, 'my_net' )
net.setExternal( True )
#points = [ Point( l( 0.0), l( 0.0) )
# , Point( l( 10.0), l( 0.0) )
# , Point( l( 7.0), l( 8.0) )
# , Point( l( 3.0), l( 8.0) ) ]
#p = Polygon.create( net, metal4, points )
points = [ Point( toDbU( 0.0), toDbU( 20.0) )
, Point( toDbU( 40.0), toDbU( 20.0) )
, Point( toDbU( 60.0), toDbU( 0.0) )
, Point( toDbU( 20.0), toDbU( 0.0) ) ]
p = Polygon.create( net, metal3, points )
p.translate( toDbU(140.0), toDbU(0.0) )
# Counter-clockwise, slope > 1.
points = [ Point( l( 3.0), l( 0.0) )
, Point( l( 13.0), l( 0.0) )
, Point( l( 16.0), l( 10.0) )
, Point( l( 16.0), l( 20.0) )
, Point( l( 13.0), l( 30.0) )
, Point( l( 3.0), l( 30.0) )
, Point( l( 0.0), l( 20.0) )
, Point( l( 0.0), l( 10.0) ) ]
p = Polygon.create( net, metal2, points )
#p.translate( l(40.0), l(0.0) )
points = [ Point( toDbU( 0.0), toDbU( 0.0) )
, Point( toDbU( 0.0), toDbU( 10.0) )
, Point( toDbU( 20.0), toDbU( 30.0) )
, Point( toDbU( 60.0), toDbU( 30.0) )
, Point( toDbU( 60.0), toDbU( 20.0) )
, Point( toDbU( 40.0), toDbU( 0.0) ) ]
p = Polygon.create( net, metal3, points )
p.translate( toDbU(70.0), toDbU(40.0) )
# clockwise, slope > 1.
points = [ Point( l( 0.0), l( 10.0) )
, Point( l( 0.0), l( 20.0) )
, Point( l( 3.0), l( 30.0) )
, Point( l( 13.0), l( 30.0) )
, Point( l( 16.0), l( 20.0) )
, Point( l( 16.0), l( 10.0) )
, Point( l( 13.0), l( 0.0) )
, Point( l( 3.0), l( 0.0) ) ]
p = Polygon.create( net, metal2, points )
p.translate( l(0.0), l(40.0) )
points = [ Point( toDbU( 0.0), toDbU( 20.0) )
, Point( toDbU( 0.0), toDbU( 30.0) )
, Point( toDbU( 40.0), toDbU( 30.0) )
, Point( toDbU( 60.0), toDbU( 10.0) )
, Point( toDbU( 60.0), toDbU( 0.0) )
, Point( toDbU( 20.0), toDbU( 0.0) ) ]
p = Polygon.create( net, metal3, points )
p.translate( toDbU(140.0), toDbU(40.0) )
print 'Normalized and manhattanized contour:'
i = 0
for point in p.getMContour():
print '| %d '%i, point \
, '[%fum %fum]' % ( toMicron(point.getX()) \
, toMicron(point.getY()) )
i += 1
print 'Sub-polygons (for GDSII generation)'
subpolygons = p.getSubPolygons()
for i in range(len(subpolygons)):
print '+ Sub-Polygon %d:' % i
for j in range(len(subpolygons[i])):
print ' [%3d]' % j, subpolygons[i][j] \
, '[%fum %fum]' % ( toMicron(subpolygons[i][j].getX()) \
, toMicron(subpolygons[i][j].getY()) )
UpdateSession.close()
# Counter-clockwise, slope < 1.
points = [ Point( l( 10.0), l( 0.0) )
, Point( l( 20.0), l( 0.0) )
, Point( l( 30.0), l( 3.0) )
, Point( l( 30.0), l( 13.0) )
, Point( l( 20.0), l( 16.0) )
, Point( l( 10.0), l( 16.0) )
, Point( l( 0.0), l( 13.0) )
, Point( l( 0.0), l( 3.0) ) ]
p = Polygon.create( net, metal2, points )
p.translate( l(30.0), l(0.0) )
# clockwise.
points = [ Point( l( 0.0), l( 3.0) )
, Point( l( 0.0), l( 13.0) )
, Point( l( 10.0), l( 16.0) )
, Point( l( 20.0), l( 16.0) )
, Point( l( 30.0), l( 13.0) )
, Point( l( 30.0), l( 3.0) )
, Point( l( 20.0), l( 0.0) )
, Point( l( 10.0), l( 0.0) ) ]
p = Polygon.create( net, metal2, points )
p.translate( l(30.0), l(40.0) )
# Big parallelogram.
points = [ Point( l( 0.0), l( 0.0) )
, Point( l( 20.0), l( 20.0) )
, Point( l( 60.0), l( 20.0) )
, Point( l( 40.0), l( 0.0) ) ]
p = Polygon.create( net, metal3, points )
p.translate( l(70.0), l(0.0) )
points = [ Point( l( 0.0), l( 20.0) )
, Point( l( 40.0), l( 20.0) )
, Point( l( 60.0), l( 0.0) )
, Point( l( 20.0), l( 0.0) ) ]
p = Polygon.create( net, metal3, points )
p.translate( l(140.0), l(0.0) )
points = [ Point( l( 0.0), l( 0.0) )
, Point( l( 0.0), l( 10.0) )
, Point( l( 20.0), l( 30.0) )
, Point( l( 60.0), l( 30.0) )
, Point( l( 60.0), l( 20.0) )
, Point( l( 40.0), l( 0.0) ) ]
p = Polygon.create( net, metal3, points )
p.translate( l(70.0), l(40.0) )
points = [ Point( l( 0.0), l( 20.0) )
, Point( l( 0.0), l( 30.0) )
, Point( l( 40.0), l( 30.0) )
, Point( l( 60.0), l( 10.0) )
, Point( l( 60.0), l( 0.0) )
, Point( l( 20.0), l( 0.0) ) ]
p = Polygon.create( net, metal3, points )
p.translate( l(140.0), l(40.0) )
print( 'Normalized and manhattanized contour:' )
i = 0
for point in p.getMContour():
print( '| %d '%i, point, '[%fum %fum]' % ( u(point.getX()), u(point.getY()) ))
i += 1
print( 'Sub-polygons (for GDSII generation)' )
subpolygons = p.getSubPolygons()
for i in range(len(subpolygons)):
print( '+ Sub-Polygon %d:' % i )
for j in range(len(subpolygons[i])):
print( ' [%3d]' % j, subpolygons[i][j] \
, '[%fum %fum]' % ( u(subpolygons[i][j].getX()), u(subpolygons[i][j].getY()) ))
Gds.save( cell )
return
def scriptMain ( **kw ):
"""The mandatory function to be called by Coriolis CGT/Unicorn."""
editor = None
if kw.has_key('editor') and kw['editor']:
editor = kw['editor']
if 'editor' in kw and kw['editor']:
editor = kw['editor']
buildPolygons( editor )
return True

View File

@ -1,34 +1,23 @@
#!/usr/bin/python
import sys
from Hurricane import *
from CRL import *
def toDbU ( l ): return DbU.fromLambda(l)
def toMicron ( u ): return DbU.toPhysical( u, DbU.UnitPowerMicro )
def doBreak ( level, message ):
UpdateSession.close()
Breakpoint.stop( level, message )
UpdateSession.open()
from Hurricane import DataBase, Net, \
DbU, Point, Box, Rectilinear
from CRL import AllianceFramework, Catalog, Gds
from helpers import l, u
from helpers.overlay import UpdateSession
def buildRectilinear ( editor ):
UpdateSession.open()
cell = AllianceFramework.get().createCell( 'Rectilinear' )
cell.setTerminal( True )
cell.setAbutmentBox( Box( toDbU(-5.0), toDbU(-5.0), toDbU(65.0), toDbU(75.0) ) )
#cell.setAbutmentBox( Box( toDbU(-5.0), toDbU(-5.0), toDbU(21.0), toDbU(35.0) ) )
"""Check Hurricane.Rectilinear class."""
with UpdateSession():
cell = AllianceFramework.get().createCell( 'Rectilinear' )
cell.setTerminalNetlist( True )
cell.setAbutmentBox( Box( l(-5.0), l(-5.0), l(65.0), l(75.0) ) )
#cell.setAbutmentBox( Box( l(-5.0), l(-5.0), l(21.0), l(35.0) ) )
if editor:
UpdateSession.close()
editor.setCell( cell )
editor.fit()
UpdateSession.open()
editor.setCell( cell )
editor.fit()
technology = DataBase.getDB().getTechnology()
metal1 = technology.getLayer( "METAL1" )
@ -46,37 +35,32 @@ def buildRectilinear ( editor ):
contpoly = technology.getLayer( "CONT_POLY" )
ntie = technology.getLayer( "NTIE" )
net = Net.create( cell, 'my_net' )
net.setExternal( True )
points = [ Point( toDbU( 0.0), toDbU( 0.0) )
, Point( toDbU( 0.0), toDbU( 10.0) )
, Point( toDbU( 20.0), toDbU( 30.0) )
, Point( toDbU( 30.0), toDbU( 30.0) )
, Point( toDbU( 30.0), toDbU( 20.0) )
, Point( toDbU( 10.0), toDbU( 0.0) ) ]
r = Rectilinear.create( net, metal2, points )
#print 'Normalized and manhattanized contour:'
#i = 0
#for point in p.getMContour():
# print '| %d '%i, point \
# , '[%fum %fum]' % ( toMicron(point.getX()) \
# , toMicron(point.getY()) )
# i += 1
UpdateSession.close()
with UpdateSession():
net = Net.create( cell, 'my_net' )
net.setExternal( True )
points = [ Point( l( 0.0), l( 0.0) )
, Point( l( 0.0), l( 10.0) )
, Point( l( 20.0), l( 30.0) )
, Point( l( 30.0), l( 30.0) )
, Point( l( 30.0), l( 20.0) )
, Point( l( 10.0), l( 0.0) ) ]
r = Rectilinear.create( net, metal2, points )
#print( 'Normalized and manhattanized contour:' )
#i = 0
#for point in p.getMContour():
# print( '| %d '%i, point, '[%fum %fum]' % ( u(point.getX()), u(point.getY()) ))
# i += 1
Gds.save( cell )
return
def scriptMain ( **kw ):
"""The mandatory function to be called by Coriolis CGT/Unicorn."""
editor = None
if kw.has_key('editor') and kw['editor']:
editor = kw['editor']
if 'editor' in kw and kw['editor']:
editor = kw['editor']
buildRectilinear( editor )
return True

View File

@ -1,8 +1,12 @@
#!/usr/bin/python
import sys
from Hurricane import *
from CRL import *
from Hurricane import Instance, Net, Horizontal, Vertical, Contact, \
RoutingPad, Transformation, \
Breakpoint
from CRL import AllianceFramework, Catalog
from helpers import l
from helpers.overlay import UpdateSession
import Etesian
import Anabatic
import Katana
@ -11,112 +15,109 @@ import Katana
af = AllianceFramework.get()
def toDbU ( l ): return DbU.fromLambda(l)
def doBreak ( level, message ):
UpdateSession.close()
Breakpoint.stop( level, message )
UpdateSession.open()
def buildFulladder ( editor ):
"""Build the netlist of a full adder."""
# Get the Framework and all the master cells.
# Get the Framework and all the master cells.
xr2_x2 = af.getCell( 'xr2_x1', Catalog.State.Views )
a2_x2 = af.getCell( 'a2_x2' , Catalog.State.Views )
o2_x2 = af.getCell( 'o2_x2' , Catalog.State.Views )
UpdateSession.open()
fulladder = af.createCell( 'fulladder' )
# Create Instances.
a2_1 = Instance.create( fulladder, 'a2_1', a2_x2 )
a2_2 = Instance.create( fulladder, 'a2_2', a2_x2 )
xr2_1 = Instance.create( fulladder, 'xr2_1', xr2_x2 )
xr2_2 = Instance.create( fulladder, 'xr2_2', xr2_x2 )
o2_1 = Instance.create( fulladder, 'o2_1', o2_x2 )
# Create Nets.
vss = Net.create( fulladder, "vss" )
vss.setExternal( True )
vss.setGlobal ( True )
vdd = Net.create( fulladder, "vdd" )
vdd.setExternal( True )
vdd.setGlobal ( True )
cin = Net.create( fulladder, "cin" )
cin.setExternal( True )
xr2_2.getPlug( xr2_x2.getNet('i0') ).setNet( cin )
a2_2 .getPlug( a2_x2.getNet('i0') ).setNet( cin )
a = Net.create( fulladder, 'a' )
a.setExternal( True )
xr2_1.getPlug( xr2_x2.getNet('i0') ).setNet( a )
a2_1 .getPlug( a2_x2.getNet('i0') ).setNet( a )
b = Net.create( fulladder, 'b' )
b.setExternal( True )
xr2_1.getPlug( xr2_x2.getNet('i1') ).setNet( b )
a2_1 .getPlug( a2_x2.getNet('i1') ).setNet( b )
sout_1 = Net.create( fulladder, 'sout_1' )
xr2_1.getPlug( xr2_x2.getNet('q' ) ).setNet( sout_1 )
xr2_2.getPlug( xr2_x2.getNet('i1') ).setNet( sout_1 )
a2_2 .getPlug( a2_x2.getNet('i1') ).setNet( sout_1 )
carry_1 = Net.create( fulladder, 'carry_1' )
a2_1.getPlug( a2_x2.getNet('q' ) ).setNet( carry_1 )
o2_1.getPlug( o2_x2.getNet('i1') ).setNet( carry_1 )
carry_2 = Net.create( fulladder, 'carry_2' )
a2_2.getPlug( a2_x2.getNet('q' ) ).setNet( carry_2 )
o2_1.getPlug( o2_x2.getNet('i0') ).setNet( carry_2 )
sout = Net.create( fulladder, 'sout' )
sout.setExternal( True )
xr2_2.getPlug( xr2_x2.getNet('q') ).setNet( sout )
cout = Net.create( fulladder, 'cout' )
cout.setExternal( True )
o2_1.getPlug( o2_x2.getNet('q') ).setNet( cout )
UpdateSession.close()
with UpdateSession():
fulladder = af.createCell( 'fulladder' )
# Create Instances.
a2_1 = Instance.create( fulladder, 'a2_1', a2_x2 )
a2_2 = Instance.create( fulladder, 'a2_2', a2_x2 )
xr2_1 = Instance.create( fulladder, 'xr2_1', xr2_x2 )
xr2_2 = Instance.create( fulladder, 'xr2_2', xr2_x2 )
o2_1 = Instance.create( fulladder, 'o2_1', o2_x2 )
# Create Nets.
vss = Net.create( fulladder, "vss" )
vss.setExternal( True )
vss.setGlobal ( True )
vdd = Net.create( fulladder, "vdd" )
vdd.setExternal( True )
vdd.setGlobal ( True )
cin = Net.create( fulladder, "cin" )
cin.setExternal( True )
xr2_2.getPlug( xr2_x2.getNet('i0') ).setNet( cin )
a2_2 .getPlug( a2_x2.getNet('i0') ).setNet( cin )
a = Net.create( fulladder, 'a' )
a.setExternal( True )
xr2_1.getPlug( xr2_x2.getNet('i0') ).setNet( a )
a2_1 .getPlug( a2_x2.getNet('i0') ).setNet( a )
b = Net.create( fulladder, 'b' )
b.setExternal( True )
xr2_1.getPlug( xr2_x2.getNet('i1') ).setNet( b )
a2_1 .getPlug( a2_x2.getNet('i1') ).setNet( b )
sout_1 = Net.create( fulladder, 'sout_1' )
xr2_1.getPlug( xr2_x2.getNet('q' ) ).setNet( sout_1 )
xr2_2.getPlug( xr2_x2.getNet('i1') ).setNet( sout_1 )
a2_2 .getPlug( a2_x2.getNet('i1') ).setNet( sout_1 )
carry_1 = Net.create( fulladder, 'carry_1' )
a2_1.getPlug( a2_x2.getNet('q' ) ).setNet( carry_1 )
o2_1.getPlug( o2_x2.getNet('i1') ).setNet( carry_1 )
carry_2 = Net.create( fulladder, 'carry_2' )
a2_2.getPlug( a2_x2.getNet('q' ) ).setNet( carry_2 )
o2_1.getPlug( o2_x2.getNet('i0') ).setNet( carry_2 )
sout = Net.create( fulladder, 'sout' )
sout.setExternal( True )
xr2_2.getPlug( xr2_x2.getNet('q') ).setNet( sout )
cout = Net.create( fulladder, 'cout' )
cout.setExternal( True )
o2_1.getPlug( o2_x2.getNet('q') ).setNet( cout )
af.saveCell( fulladder, Catalog.State.Views )
return fulladder
def placeAndRoute ( editor, cell ):
# Run the placer.
etesian = Etesian.EtesianEngine.create(cell)
"""
Direct call of the ToolEngines:
* Etesian: placement.
* Katana: routing.
"""
# Run the placer.
etesian = Etesian.EtesianEngine.create( cell )
etesian.place()
if editor:
editor.setCell( cell )
editor.fit()
editor.setCell( cell )
editor.fit()
Breakpoint.stop( 1, 'After placement' )
# Run the router.
katana = Katana.KatanaEngine.create(cell)
# Run the router.
katana = Katana.KatanaEngine.create( cell )
katana.digitalInit ()
katana.runGlobalRouter ()
katana.runGlobalRouter ( Katana.Flags.NoFlags )
katana.loadGlobalRouting( Anabatic.EngineLoadGrByNet )
katana.layerAssign ( Anabatic.EngineNoNetLayerAssign )
katana.runNegociate ( Katana.Flags.NoFlags )
af.saveCell( cell, Catalog.State.Views )
return
def scriptMain ( **kw ):
"""The mandatory function to be called by Coriolis CGT/Unicorn."""
editor = None
if kw.has_key('editor') and kw['editor']:
editor = kw['editor']
if 'editor' in kw and kw['editor']:
editor = kw['editor']
fulladder = buildFulladder( editor )
placeAndRoute( editor, fulladder )
return True

View File

@ -123,7 +123,7 @@
<!-- Alliance & MBK Concepts -->
<!-- Hurricane Concepts. -->
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<p class="topic-title">Contents</p>
<ul class="simple">
<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>

View File

@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<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="">
<link rel="icon" href="../favicon.ico">
@ -115,7 +115,7 @@
<!-- URLs that changes between the various backends. -->
<!-- For HTML backend -->
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<p class="topic-title">Contents</p>
<ul class="simple">
<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>
@ -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>
</li>
</ol>
<div class="note">
<div class="admonition note">
<p class="first admonition-title">Note</p>
<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
@ -297,25 +297,25 @@ your system. The main ones are listed below.</p>
</tr>
</tbody>
</table>
<div class="note">
<div class="admonition note">
<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>
script in <tt class="docutils literal">./alliance/src</tt> which generate the top-level automake files.</p>
</div>
<div class="note">
<div class="admonition note">
<p class="first admonition-title">Note</p>
<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>
build directory tree and re-run <cite>configure</cite>. The same rule applies
if you switch from static libraries to dynamic ones.</p>
</div>
<div class="note">
<div class="admonition note">
<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
fail in strange ways when run in parallel (this is a known problem
due to the way Alliance was developped).</p>
</div>
<div class="note">
<div class="admonition note">
<p class="first admonition-title">Note</p>
<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>
@ -342,7 +342,7 @@ ego@home:src&gt; git clone https://gitlab.lip6.fr/jpc/alliance.git
</li>
<li><p class="first">Compilation &amp; installation. For that step, you can use the following shell
script.</p>
<div class="note">
<div class="admonition note">
<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
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 http-equiv="X-UA-Compatible" content="IE=edge">
<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="">
<link rel="icon" href="../favicon.ico">
@ -117,7 +117,7 @@
<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>
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<p class="topic-title">Contents</p>
<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="#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>
<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>
<div class="note">
<div class="admonition note">
<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
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 class="section" id="libraries-makefiles">
<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>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">
@ -815,7 +815,7 @@ cell (sff2_x4) {
</pre>
</li>
</ol>
<div class="note">
<div class="admonition note">
<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>
</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>32<span class="n">_p_w_</span>32.<span class="n">ok</span>
</pre></div>
<div class="note">
<div class="admonition note">
<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>
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>
<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>
<div class="note">
<div class="admonition note">
<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
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
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>
<div class="note">
<div class="admonition note">
<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
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
them back in the official pad cell library.</li>
</ol>
<div class="note">
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p><strong>How Coriolis Load Cells.</strong>
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
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>
<div class="note">
<div class="admonition note">
<p class="first admonition-title">Note</p>
<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

View File

@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<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="">
<link rel="icon" href="../favicon.ico">

View File

@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<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="">
<link rel="icon" href="../favicon.ico">

View File

@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<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="">
<link rel="icon" href="../favicon.ico">
@ -120,7 +120,7 @@
<!-- Alliance & MBK Concepts -->
<!-- Hurricane Concepts. -->
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<p class="topic-title">Contents</p>
<ul class="simple">
<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>

View File

@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<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="">
<link rel="icon" href="../favicon.ico">
@ -122,7 +122,7 @@
<div class="section" id="printable-version-of-this-document">
<h2><a class="toc-backref" href="#id2">Printable version of this Document</a></h2>
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<p class="topic-title">Contents</p>
<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="#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>
</li>
</ul>
<div class="note">
<div class="admonition note">
<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>
</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="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">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">private</span><span class="o">:</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>
<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>
<div class="note">
<div class="admonition note">
<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
must be treated as <tt class="docutils literal"><span class="pre">std::string</span></tt>.</p>
</div>
<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="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="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="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="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="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>
@ -418,7 +418,7 @@ must be treated as <tt class="docutils literal"><span class="pre">std::string</s
<span class="p">}</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="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
function, which in turn, can call the right <tt class="docutils literal"><span class="pre">PyTypeManagerVTrunk&lt;CppT&gt;::_link()</span></tt>
method.</p>
<div class="note">
<div class="admonition note">
<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
<strong>why</strong> we need the intermediate <tt class="docutils literal">PyTypeManagerVTrunk&lt;CppT&gt;</tt>
template class.</p>
</div>
<div class="note">
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p><strong>Different C++ templates.</strong> You may notice that the two following templates
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>
</div>
<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="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="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="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="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="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="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>
@ -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="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="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="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="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="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>
@ -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="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="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="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="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="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="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="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="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="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="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="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="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>
</div>
<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
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>
<div class="note">
<div class="admonition note">
<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
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>
<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>
<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="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="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="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_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>
@ -626,8 +626,8 @@ a <tt class="docutils literal">const</tt> parameter which is non-<tt class="docu
<span class="p">}</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="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="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="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_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>
@ -637,8 +637,8 @@ a <tt class="docutils literal">const</tt> parameter which is non-<tt class="docu
<span class="p">}</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="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="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="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="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="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="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="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="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="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="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="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="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="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="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="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>
<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.
@ -686,8 +686,8 @@ per overload.</li>
<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>
<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>
<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>
<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="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="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.
We then create a function wrapper that calls them in decreasing number of
parameters order.</p>
<div class="note">
<div class="admonition note">
<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
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>
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>
<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="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="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="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="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="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>
@ -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>
<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>
<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>
<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>
<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="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="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 http-equiv="X-UA-Compatible" content="IE=edge">
<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="">
<link rel="icon" href="../favicon.ico">
@ -123,7 +123,7 @@
<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>
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<p class="topic-title">Contents</p>
<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="#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>,
like in the code below:</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="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>
@ -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">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="kt">void</span> <span class="nf">PyLibrary_LinkPyType</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="n">PyLibrary_LinkPyType</span> <span class="p">();</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>
</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>
<div class="note">
<div class="admonition note">
<p class="first admonition-title">Note</p>
<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
@ -444,12 +444,12 @@ to the C++ working object.</li>
the class. For common predicates, accessors, and mutators macros
are supplied.</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="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">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="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>
@ -476,7 +476,7 @@ it must be included.</li>
</ol>
<p></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="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>
@ -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>Those are the functions for the Python object itself to work, not the
wrapped method from the C++ class.</p>
<div class="note">
<div class="admonition note">
<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.
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">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="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="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="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="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="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">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>
</pre></div>
<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="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="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="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">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 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="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="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="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">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="kt">void</span> <span class="nf">PyContact_LinkPyType</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="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 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;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="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="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="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="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="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">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>
</pre></div>
<!-- -*- 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
bi-directional communication mechanism.</li>
</ul>
<div class="note">
<div class="admonition note">
<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
(<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">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 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="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="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>
@ -1229,7 +1229,7 @@ the <tt class="docutils literal"><span class="pre">DbU::Unit</span>&nbsp; PyAny_
</pre></div>
<p></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="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>
@ -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>
</pre></div>
<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="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>

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<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="">
<link rel="icon" href="../favicon.ico">
@ -123,7 +123,7 @@
<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>
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<p class="topic-title">Contents</p>
<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="#symbolic-layout" id="id3">Symbolic Layout</a><ul>
@ -297,12 +297,12 @@ bend. Not used anymore in recent technos</td>
</tr>
</tbody>
</table>
<div class="note">
<div class="admonition note">
<p class="first admonition-title">Note</p>
<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>
</div>
<div class="note">
<div class="admonition note">
<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>,
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>
<p>The RDS file control how a symbolic layout is transformed into it's real
conterpart.</p>
<div class="note">
<div class="admonition note">
<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>
</div>
@ -500,7 +500,7 @@ TABLE MBK_TO_RDS_VIA
END
</pre>
<div class="note">
<div class="admonition note">
<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
<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
</pre>
<div class="note">
<div class="admonition note">
<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
a possibility that no hole from the global matrix will be under it.

View File

@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<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="">
<link rel="icon" href="../favicon.ico">
@ -123,7 +123,7 @@
<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>
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<p class="topic-title">Contents</p>
<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="#class-model" id="id13">Class Model</a></li>

View File

@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<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="">
<link rel="icon" href="../favicon.ico">
@ -123,7 +123,7 @@
<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>
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<p class="topic-title">Contents</p>
<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="#dpgeninv" id="id3">DpgenInv</a></li>

View File

@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<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="">
<link rel="icon" href="../favicon.ico">
@ -123,7 +123,7 @@
<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>
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<p class="topic-title">Contents</p>
<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="#introduction" id="id186">Introduction</a></li>

View File

@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<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="">
<link rel="icon" href="../favicon.ico">
@ -123,7 +123,7 @@
<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>
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<p class="topic-title">Contents</p>
<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="#description" id="id9">Description</a></li>

View File

@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<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="">
<link rel="icon" href="../favicon.ico">
@ -120,7 +120,7 @@
<!-- Alliance & MBK Concepts -->
<!-- Hurricane Concepts. -->
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<p class="topic-title">Contents</p>
<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="#id2" id="id5">Symbolic Layout</a></li>

View File

@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<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="">
<link rel="icon" href="../favicon.ico">
@ -118,7 +118,7 @@
<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>
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<p class="topic-title">Contents</p>
<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="#abstract" id="id14">Abstract</a></li>
@ -220,14 +220,14 @@ examples are supplied in the repository <tt class="docutils literal"><span class
</div>
<div class="section" id="installation">
<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="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>
</div>
<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>
<div class="note">
<div class="admonition note">
<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.
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>
</tbody>
</table>
<div class="note">
<div class="admonition note">
<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
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
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>
<div class="note">
<div class="admonition note">
<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>
or <strong>master</strong>.</p>
</div>
<div class="note">
<div class="admonition note">
<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
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
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 class="note">
<div class="admonition note">
<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)
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>
</li>
</ol>
<div class="note">
<div class="admonition note">
<p class="first admonition-title">Note</p>
<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>
@ -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>
python-pyqt5
</pre></div>
<div class="note">
<div class="admonition note">
<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),
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>
<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>
<div class="note">
<div class="admonition note">
<p class="first admonition-title">Note</p>
<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>
@ -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
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>
<div class="note">
<div class="admonition note">
<p class="first admonition-title">Note</p>
<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
@ -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
of gates). It has successfully routed design of more than <cite>150K</cite> gates.
<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="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
@ -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>
<p>Routing a design is done in four ordered steps:</p>
<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>
<li>Global routing <span class="formula"><b>P&R</b> → <b>Step by Step</b> → <b>Global 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>
<li>Detailed pre-route <span class="formula"><b>P&R</b> → <b>Step by Step</b> → <b>Detailed PreRoute</b></span></li>
<li>Global routing <span class="formula"><b>P&R</b> → <b>Step by Step</b> → <b>Global 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>
<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
@ -991,7 +987,7 @@ topological modification</td>
<div class="section" id="executing-python-scripts-in-cgt">
<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>
<div class="note">
<div class="admonition note">
<p class="first admonition-title">Note</p>
<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.
@ -1041,7 +1037,7 @@ outlines).</td>
</tr>
</tbody>
</table>
<div class="note">
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last"><em>The pdf file size</em>
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>
<p>You can choose what kind of form to give to the rubbers and the type of
unit used to display coordinates.</p>
<div class="note">
<div class="admonition note">
<p class="first admonition-title">Note</p>
<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
@ -1432,13 +1428,13 @@ to browse through the live DataBase. The <em>Inspector</em> provides three entry
</ul>
<p>Once an entry point has been activated, you may recursively expore all
its fields using the right/left arrows.</p>
<div class="note">
<div class="admonition note">
<p class="first admonition-title">Note</p>
<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
is deleted, you will crash the application...</p>
</div>
<div class="note">
<div class="admonition note">
<p class="first admonition-title">Note</p>
<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>

Binary file not shown.

View File

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

View File

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

View File

@ -100,7 +100,8 @@ div#contents ul > li > a {
*/
span.cb {
background: yellow;
font-family: "courrier";
font-weight: bold;
}
div.note {

View File

@ -1,25 +1,26 @@
/*
@licstart The following is the entire license notice for the
JavaScript code in this file.
@licstart The following is the entire license notice for the 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
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.
Copyright (C) 1997-2020 by Dimitri van Heesch
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute,
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
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
@licend The above is the entire license notice
for the JavaScript code in this file
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
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)
{
@ -60,7 +61,7 @@ function toggleLevel(level)
$(this).show();
} else if (l==level+1) {
i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
a.html('&#9654;');
a.html('&#9658;');
$(this).show();
} else {
$(this).hide();
@ -87,7 +88,7 @@ function toggleFolder(id)
// replace down arrow by right arrow for current row
var currentRowSpans = currentRow.find("span");
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
} else { // we are SHOWING
// 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
var childRowsSpans = childRows.find("span");
childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
childRowsSpans.filter(".arrow").html('&#9654;');
childRowsSpans.filter(".arrow").html('&#9658;');
childRows.show(); //show all children
}
updateStripes();

View File

@ -24,7 +24,7 @@
-->
<br>
<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="menu.js"></script>
<script type="text/javascript">
@ -41,11 +41,42 @@ $(function() {
</div><!--header-->
<div class="contents">
<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>
<center><div class="image">
<img src="graph_legend.png"/>
</div>
</center><p>The boxes in the above graph have the following meaning: </p>
<p>Consider the following example: </p><div class="fragment"><div class="line"><span class="comment">/*! Invisible class because of truncation */</span></div>
<div class="line"><span class="keyword">class </span>Invisible { };</div>
<div class="line"><span class="comment"></span> </div>
<div class="line"><span class="comment">/*! Truncated class, inheritance relation is hidden */</span></div>
<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>
<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>
<table class="footer1">
<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>
</tr>
</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' ?>
<tagfile>
<tagfile doxygen_version="1.9.1">
<compound kind="page">
<name>index</name>
<title></title>
<filename>index</filename>
<docanchor file="index" title="Software Architecture">secMainDoc</docanchor>
<docanchor file="index" title="Unique Instance-Cell Relationship">ssecUniqueInstance</docanchor>
<docanchor file="index" title="Why Meta-Transistor">ssecWhyMetaTrans</docanchor>
<docanchor file="index" title="Class Organization">ssecClassOrg</docanchor>
<docanchor file="index" title="Open questions">ssecOpenQuestions</docanchor>
<filename>index.html</filename>
<docanchor file="index.html" title="Software Architecture">secMainDoc</docanchor>
<docanchor file="index.html" title="Unique Instance-Cell Relationship">ssecUniqueInstance</docanchor>
<docanchor file="index.html" title="Why Meta-Transistor">ssecWhyMetaTrans</docanchor>
<docanchor file="index.html" title="Class Organization">ssecClassOrg</docanchor>
<docanchor file="index.html" title="Open questions">ssecOpenQuestions</docanchor>
</compound>
</tagfile>

View File

@ -24,7 +24,7 @@
-->
<br>
<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="menu.js"></script>
<script type="text/javascript">
@ -35,7 +35,7 @@ $(function() {
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div class="header">
<div class="PageDoc"><div class="header">
<div class="headertitle">
<div class="title">Hurricane Analog Documentation</div> </div>
</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><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>
<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>
<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>
<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>
@ -63,7 +65,7 @@ Why Meta-Transistor</h2>
Class Organization</h2>
<p>Almost UML schema of the Device related classes.</p>
<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>
<p>For the Transistor device:</p>
<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::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>
</div></div><!-- contents -->
</div></div><!-- PageDoc -->
</div><!-- contents -->
<br>
<hr>
<table class="footer1">
<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>
</tr>
</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
JavaScript code in this file.
@licstart The following is the entire license notice for the 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
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.
Copyright (C) 1997-2020 by Dimitri van Heesch
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute,
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
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
@licend The above is the entire license notice
for the JavaScript code in this file
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
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 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');
if (searchEnabled) {
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 {
$('#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();

View File

@ -1,25 +1,26 @@
/*
@ @licstart The following is the entire license notice for the
JavaScript code in this file.
@licstart The following is the entire license notice for the 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
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.
Copyright (C) 1997-2020 by Dimitri van Heesch
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute,
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
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
@licend The above is the entire license notice
for the JavaScript code in this file
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
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:[
{text:"Main Page",url:"index.html"}]}

View File

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

View File

@ -3,16 +3,24 @@
% Packages used by this style file
\RequirePackage{alltt}
\RequirePackage{array}
%%\RequirePackage{array} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package
\RequirePackage{calc}
\RequirePackage{float}
\RequirePackage{ifthen}
%%\RequirePackage{ifthen} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package
\RequirePackage{verbatim}
\RequirePackage[table]{xcolor}
\RequirePackage{longtable}
\RequirePackage{tabu}
\RequirePackage{longtable_doxygen}
\RequirePackage{tabu_doxygen}
\RequirePackage{fancyvrb}
\RequirePackage{tabularx}
\RequirePackage{multicol}
\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 ----------------
@ -28,6 +36,16 @@
\endgroup%
}
\newcommand{\DoxyHorRuler}[1]{%
\setlength{\parskip}{0ex plus 0ex minus 0ex}%
\ifthenelse{#1=0}%
{%
\hrule%
}%
{%
\hrulefilll%
}%
}
\newcommand{\DoxyLabelFont}{}
\newcommand{\entrylabel}[1]{%
{%
@ -42,7 +60,7 @@
\ensurespace{4\baselineskip}%
\begin{list}{}{%
\settowidth{\labelwidth}{20pt}%
\setlength{\parsep}{0pt}%
%\setlength{\parsep}{0pt}%
\setlength{\itemsep}{0pt}%
\setlength{\leftmargin}{\labelwidth+\labelsep}%
\renewcommand{\makelabel}{\entrylabel}%
@ -77,20 +95,53 @@
\end{alltt}%
\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
\newenvironment{DoxyCode}{%
\par%
\scriptsize%
\begin{alltt}%
}{%
\end{alltt}%
\normalsize%
\newcommand\DoxyCodeLine[1]{\hangpara{\DoxyCodeWidth}{1}{#1}\par}
\newcommand\NiceSpace{%
\discretionary{}{\kern\fontdimen2\font}{\kern\fontdimen2\font}%
}
% 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
\newenvironment{DoxyCodeInclude}{%
\DoxyCode%
\newenvironment{DoxyCodeInclude}[1]{%
\DoxyCode{#1}%
}{%
\endDoxyCode%
}
@ -136,9 +187,8 @@
% (only if caption is specified)
\newenvironment{DoxyImage}{%
\begin{figure}[H]%
\begin{center}%
\centering%
}{%
\end{center}%
\end{figure}%
}
@ -150,6 +200,12 @@
\end{center}%
}
% Used by @image
% (only if inline is specified)
\newenvironment{DoxyInlineImage}{%
}{%
}
% Used by @attention
\newenvironment{DoxyAttention}[1]{%
\begin{DoxyDesc}{#1}%
@ -256,16 +312,9 @@
% Used by @par and @paragraph
\newenvironment{DoxyParagraph}[1]{%
\begin{list}{}{%
\settowidth{\labelwidth}{40pt}%
\setlength{\leftmargin}{\labelwidth}%
\setlength{\parsep}{0pt}%
\setlength{\itemsep}{-4pt}%
\renewcommand{\makelabel}{\entrylabel}%
}%
\item[#1]%
\begin{DoxyDesc}{#1}%
}{%
\end{list}%
\end{DoxyDesc}%
}
% Used by parameter lists
@ -273,10 +322,10 @@
\tabulinesep=1mm%
\par%
\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}}%
{\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]|}}% 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
}
\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]%
\hline%
@ -285,7 +334,7 @@
\hline%
\endhead%
}{%
\end{longtabu}%
\end{longtabu*}%
\vspace{6pt}%
}
@ -293,7 +342,7 @@
\newenvironment{DoxyFields}[1]{%
\tabulinesep=1mm%
\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]%
\hline%
\endfirsthead%
@ -301,7 +350,7 @@
\hline%
\endhead%
}{%
\end{longtabu}%
\end{longtabu*}%
\vspace{6pt}%
}
@ -309,7 +358,7 @@
\newenvironment{DoxyEnumFields}[1]{%
\tabulinesep=1mm%
\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]%
\hline%
\endfirsthead%
@ -317,7 +366,7 @@
\hline%
\endhead%
}{%
\end{longtabu}%
\end{longtabu*}%
\vspace{6pt}%
}
@ -331,7 +380,7 @@
\newenvironment{DoxyRetVals}[1]{%
\tabulinesep=1mm%
\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]%
\hline%
\endfirsthead%
@ -339,7 +388,7 @@
\hline%
\endhead%
}{%
\end{longtabu}%
\end{longtabu*}%
\vspace{6pt}%
}
@ -347,7 +396,7 @@
\newenvironment{DoxyExceptions}[1]{%
\tabulinesep=1mm%
\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]%
\hline%
\endfirsthead%
@ -355,7 +404,7 @@
\hline%
\endhead%
}{%
\end{longtabu}%
\end{longtabu*}%
\vspace{6pt}%
}
@ -363,7 +412,7 @@
\newenvironment{DoxyTemplParams}[1]{%
\tabulinesep=1mm%
\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]%
\hline%
\endfirsthead%
@ -371,7 +420,7 @@
\hline%
\endhead%
}{%
\end{longtabu}%
\end{longtabu*}%
\vspace{6pt}%
}
@ -439,11 +488,11 @@
\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}%
\newenvironment{TabularC}[1]%
{\tabulinesep=1mm
\begin{longtabu} spread 0pt [c]{*#1{|X[-1]}|}}%
{\end{longtabu}\par}%
\begin{longtabu*}spread 0pt [c]{*#1{|X[-1]}|}}%
{\end{longtabu*}\par}%
\newenvironment{TabularNC}[1]%
{\begin{tabu} spread 0pt [l]{*#1{|X[-1]}|}}%
{\begin{tabu}spread 0pt [l]{*#1{|X[-1]}|}}%
{\end{tabu}\par}%
% Used for member group headers
@ -495,9 +544,33 @@
% Version of hypertarget with correct landing location
\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
\makeatletter
\def\doxyfigcaption{%
\refstepcounter{figure}%
\H@refstepcounter{figure}%
\@dblarg{\@caption{figure}}}
\makeatother

View File

@ -1,41 +1,43 @@
\hypertarget{index_secMainDoc}{}\section{Software Architecture}\label{index_secMainDoc}
\hypertarget{index_ssecUniqueInstance}{}\subsection{Unique Instance-\/\+Cell Relationship}\label{index_ssecUniqueInstance}
\hypertarget{index_secMainDoc}{}\doxysection{Software Architecture}\label{index_secMainDoc}
\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.
\begin{DoxyItemize}
\item Meta\+Transistor(s) are used to build the Devices, and {\itshape only} them.
\item Device(s) are then assembled into more complex design.
\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}
An analogy can be made between the Devices and the Standard Cells in the numeric world.
\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\+:
\begin{DoxyCode}
Instance* instance = parentCell->getInstance( cell->getName() );
\begin{DoxyCode}{0}
\DoxyCodeLine{Instance* instance = parentCell-\/>getInstance( cell-\/>getName() );}
\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\+:
\begin{DoxyCode}
Instance* instance = cell->getSlaveInstances().getFirst();
\begin{DoxyCode}{0}
\DoxyCodeLine{Instance* instance = cell-\/>getSlaveInstances().getFirst();}
\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.
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}
Almost U\+ML schema of the Device related classes.
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 UML schema of the Device related classes.
@ -58,8 +60,8 @@ Deprecateds\+:
\begin{DoxyEnumerate}
\item {\ttfamily Arguments} where fully redundant with Parameters, so we did remove them.
{\bfseries The Arguments must be removed from the U\+ML schema.}
\end{DoxyEnumerate}\hypertarget{index_ssecOpenQuestions}{}\subsection{Open questions}\label{index_ssecOpenQuestions}
{\bfseries{The Arguments must be removed from the UML schema.}}
\end{DoxyEnumerate}\hypertarget{index_ssecOpenQuestions}{}\doxysubsection{Open questions}\label{index_ssecOpenQuestions}
\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.

View File

@ -32,9 +32,9 @@
\begin{center}
{\Large Hurricane Analog Reference Manual\\[1ex]\large 3.\+0 }\\
\vspace*{1cm}
{\large Generated by Doxygen 1.8.14}\\
{\large Generated by Doxygen 1.9.1}\\
\vspace*{0.5cm}
{\small Sun Nov 21 2021 22:10:15}\\
{\small Thu Aug 11 2022 19:10:58}\\
\end{center}
\end{titlepage}
@ -54,7 +54,7 @@
\newpage
\phantomsection
\clearemptydoublepage
\addcontentsline{toc}{chapter}{Index}
\addcontentsline{toc}{chapter}{\indexname}
\printindex
\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 \
Query.dox \
../../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
# 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!
/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Entity.dox:69: warning: Internal inconsistency: scope for class Entity::CompareById not found!
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/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/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: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: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: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: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: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
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
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: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/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/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/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/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: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:181: warning: no uniquely matching class member found for
DbU::Unit Hurricane::Layer::getEnclosure() const
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(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(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
/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: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:193: warning: no uniquely matching class member found for
DbU::Unit Hurricane::Layer::getEnclosure(const Hurricane::BasicLayer *layer) const
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(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(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
/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: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: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: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/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: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: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: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/RegularLayer.dox:56: warning: no matching class member found for
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
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: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: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: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
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/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:47: warning: documented symbol `Hurricane::PolygonFilter' 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: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/RoutingPad.dox:102: warning: no uniquely matching class member found for
Box Hurricane::RoutingPad::getBoundingBox(Hurricane::BasicLayer *layer) const
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 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' 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
/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: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/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/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:71: warning: documented symbol 'DBos Hurricane::SharedProperty::GetOwners' was not declared or defined.
/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/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: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'
/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: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/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 parameter of Hurricane::JsonObject::toData(JsonStack &stack) is not documented:
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: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/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/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/Collection.dox:244: warning: Illegal command \n as part of a title section
/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/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 '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/Property.dox:182: warning: Illegal command n as part of a title section
/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/Property.dox:367: warning: Illegal command n as part of a title section
/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/Query.dox:78: 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:84: 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:90: 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/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 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/Net.dox:295: warning: Unsupported xml/html tag <this> found
/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/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/Go.dox:201: warning: Illegal command \n as part of a title section
/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/Property.dox:49: warning: Illegal command \n as part of a title section
/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/Property.dox:204: warning: Illegal command \n as part of a title section
/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/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:78: 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:84: 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:90: 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/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'
/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

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