Merge branch 'devel' of gitlab.lip6.fr:vlsi-eda/coriolis into devel
This commit is contained in:
commit
5b88929d23
|
@ -1 +0,0 @@
|
|||
Subproject commit bd6b78003c0cc6579fbad73593e69f2714f3a770
|
|
@ -32,3 +32,6 @@ go through all the components of a trans-hierarchical net.
|
|||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
For a starter, how to get all the leaf cells...
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -51,16 +51,13 @@ environment is provided by the |CRL| module.
|
|||
|
||||
from Hurricane import *
|
||||
from CRL import *
|
||||
from helpers.overlay import UpdateSession
|
||||
|
||||
af = AllianceFramework.get()
|
||||
UpdateSession.open()
|
||||
|
||||
with UpdateSession():
|
||||
cell = af.createCell( 'my_inv' )
|
||||
|
||||
# Build then save the Cell.
|
||||
|
||||
UpdateSession.close()
|
||||
|
||||
|
||||
This is the simplest call to ``createCell()``, and in that case, the newly
|
||||
created Cell_ will be saved in the *working library* (usually, the current
|
||||
|
@ -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
|
||||
|
@ -182,10 +194,10 @@ of ``METAL1``.
|
|||
|
||||
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.
|
||||
, 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,33 +248,31 @@ 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()
|
||||
|
||||
"""Build step by step an invertor standard cell."""
|
||||
with UpdateSession():
|
||||
cell = AllianceFramework.get().createCell( 'invertor' )
|
||||
cell.setTerminal( True )
|
||||
|
||||
cell.setAbutmentBox( Box( toDbU(0.0), toDbU(0.0), toDbU(15.0), toDbU(50.0) ) )
|
||||
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()
|
||||
|
||||
with UpdateSession():
|
||||
technology = DataBase.getDB().getTechnology()
|
||||
metal1 = technology.getLayer( "METAL1" )
|
||||
poly = technology.getLayer( "POLY" )
|
||||
|
@ -277,60 +287,60 @@ explanation of that part of the code, refer to `5. Make a script runnable throug
|
|||
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) )
|
||||
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, toDbU(47.0), toDbU(6.0), toDbU(0.0), toDbU(15.0) )
|
||||
h = Horizontal.create(vdd, metal1, l(47.0), l(6.0), l(0.0), l(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) )
|
||||
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.' )
|
||||
|
||||
with UpdateSession():
|
||||
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))
|
||||
h = Horizontal.create(vss, metal1, l(3.0), l(6.0), l(0.0), l(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) )
|
||||
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.' )
|
||||
|
||||
with UpdateSession():
|
||||
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) )
|
||||
v = Vertical.create ( i, metal1, l(5.0), l(2.0), l(10.0), l(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) )
|
||||
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.' )
|
||||
|
||||
with UpdateSession():
|
||||
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) )
|
||||
v = Vertical.create( nq, metal1, l(10.0), l(2.0), l(10.0), l(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) )
|
||||
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']:
|
||||
if 'editor' in kw and kw['editor']:
|
||||
editor = kw['editor']
|
||||
|
||||
buildInvertor( editor )
|
||||
return True
|
||||
|
|
|
@ -33,29 +33,25 @@ using the menu:
|
|||
.. code-block:: Python
|
||||
|
||||
def buildInvertor ( editor ):
|
||||
UpdateSession.open()
|
||||
|
||||
"""Build step by step an invertor standard cell."""
|
||||
with UpdateSession():
|
||||
cell = AllianceFramework.get().createCell( 'invertor' )
|
||||
cell.setTerminal( True )
|
||||
|
||||
cell.setAbutmentBox( Box( toDbU(0.0), toDbU(0.0), toDbU(15.0), toDbU(50.0) ) )
|
||||
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()
|
||||
|
||||
# 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']:
|
||||
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()
|
||||
|
|
|
@ -23,12 +23,12 @@ allowing to simply write:
|
|||
.. code-block:: Python
|
||||
|
||||
for net in cell.getNets():
|
||||
print 'Components of', net
|
||||
print( 'Components of', net )
|
||||
for component in net.getComponents():
|
||||
print '|', component
|
||||
print( '|', component )
|
||||
|
||||
|
||||
In C++ we would have written:
|
||||
In C++ we would have been written:
|
||||
|
||||
.. code-block:: C++
|
||||
|
||||
|
@ -59,7 +59,7 @@ loop. For example:
|
|||
# Remove all the anonymous nets.
|
||||
for net in cellNets:
|
||||
if net.getName().endswith('nymous_'):
|
||||
print 'Destroy', net
|
||||
print( 'Destroy', net )
|
||||
net.destroy()
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
------------------------------
|
||||
|
||||
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: ::
|
||||
2.3 The :cb:`settings.py` File
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
<CORIOLIS_INSTALL>/etc/coriolis2/45/freepdk_45/
|
||||
The attributes name and definitions of :cb:`cfg` are detailed
|
||||
in `CGT - The Graphical Interface <../UsersGuide/ViewerTools.html>`_.
|
||||
|
||||
The ``techno.py`` file must contain:
|
||||
**Selecting the Technology**
|
||||
|
||||
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 )
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
||||
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.
|
||||
# ...
|
||||
|
|
|
@ -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 )
|
||||
|
||||
|
||||
|
@ -204,11 +202,11 @@ contacts.
|
|||
, 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,38 +225,36 @@ 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 ):
|
||||
|
||||
"""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()
|
||||
|
||||
with UpdateSession():
|
||||
fulladder = af.createCell( 'fulladder' )
|
||||
fulladder.setAbutmentBox( Box( toDbU(0.0), toDbU(0.0), toDbU(90.0), toDbU(100.0) ) )
|
||||
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()
|
||||
|
||||
with UpdateSession():
|
||||
# Create Instances.
|
||||
a2_1 = Instance.create( fulladder, 'a2_1', a2_x2 )
|
||||
a2_2 = Instance.create( fulladder, 'a2_2', a2_x2 )
|
||||
|
@ -312,49 +308,55 @@ directory (under the the root of the |Coriolis| installation).
|
|||
o2_1.getPlug( o2_x2.getNet('q') ).setNet( cout )
|
||||
|
||||
# Instances placement.
|
||||
a2_1.setTransformation( Transformation( toDbU(0.0)
|
||||
, toDbU(0.0)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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.
|
||||
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( toDbU(50.0)
|
||||
, toDbU( 0.0)
|
||||
filler_1.setTransformation( Transformation( l(50.0)
|
||||
, l( 0.0)
|
||||
, Transformation.Orientation.ID ) )
|
||||
filler_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
|
||||
|
||||
filler_2.setTransformation( Transformation( toDbU(60.0)
|
||||
, toDbU( 0.0)
|
||||
filler_2.setTransformation( Transformation( l(60.0)
|
||||
, l( 0.0)
|
||||
, Transformation.Orientation.ID ) )
|
||||
filler_2.setPlacementStatus( Instance.PlacementStatus.PLACED )
|
||||
doBreak( 1, 'Filler cell placeds' )
|
||||
|
@ -366,6 +368,7 @@ directory (under the the root of the |Coriolis| installation).
|
|||
via12 = technology.getLayer( "VIA12" )
|
||||
via23 = technology.getLayer( "VIA23" )
|
||||
|
||||
with UpdateSession():
|
||||
# Build wiring for a.
|
||||
# Create RoutingPads first.
|
||||
rp1 = RoutingPad.create( a
|
||||
|
@ -376,22 +379,19 @@ directory (under the the root of the |Coriolis| installation).
|
|||
, 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()
|
||||
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']:
|
||||
if 'editor' in kw and kw['editor']:
|
||||
editor = kw['editor']
|
||||
|
||||
buildFulladder( editor )
|
||||
return True
|
||||
|
|
|
@ -35,15 +35,15 @@ You can configure the placer in two ways:
|
|||
|
||||
.. code-block:: Python
|
||||
|
||||
parametersTable = \
|
||||
( ("etesian.effort" , TypeEnumerate , 2 )
|
||||
, ('etesian.uniformDensity' , TypeBool , True )
|
||||
, ('etesian.spaceMargin' , TypePercentage, 3.0 )
|
||||
, ('etesian.aspectRatio' , TypePercentage, 100.0 )
|
||||
)
|
||||
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
|
||||
|
||||
|
||||
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,19 +105,13 @@ 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.
|
||||
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()
|
||||
|
||||
with UpdateSession():
|
||||
fulladder = af.createCell( 'fulladder' )
|
||||
|
||||
# Create Instances.
|
||||
|
@ -172,8 +166,6 @@ previously. The call to the ToolEngines_ is made inside the new function
|
|||
cout.setExternal( True )
|
||||
o2_1.getPlug( o2_x2.getNet('q') ).setNet( cout )
|
||||
|
||||
UpdateSession.close()
|
||||
|
||||
af.saveCell( fulladder, Catalog.State.Views )
|
||||
return fulladder
|
||||
|
||||
|
@ -182,7 +174,6 @@ previously. The call to the ToolEngines_ is made inside the new function
|
|||
# Run the placer.
|
||||
etesian = Etesian.EtesianEngine.create(cell)
|
||||
etesian.place()
|
||||
|
||||
if editor:
|
||||
editor.setCell( cell )
|
||||
editor.fit()
|
||||
|
@ -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']:
|
||||
if 'editor' in kw and kw['editor']:
|
||||
editor = kw['editor']
|
||||
|
||||
fulladder = buildFulladder( editor )
|
||||
placeAndRoute( editor, fulladder )
|
||||
return True
|
||||
|
|
|
@ -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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -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 )
|
||||
)
|
|
@ -1 +0,0 @@
|
|||
technology = 'symbolic/cmos'
|
|
@ -4,6 +4,9 @@
|
|||
install ( FILES invertor.py
|
||||
fulladder.py
|
||||
polygons.py
|
||||
diagonals.py
|
||||
rectilinear.py
|
||||
coriolisLogo.py
|
||||
toolengines.py DESTINATION ${examplesInstallDir}/scripts )
|
||||
install ( DIRECTORY .coriolis2 DESTINATION ${examplesInstallDir}/scripts )
|
||||
install ( DIRECTORY coriolis2 DESTINATION ${examplesInstallDir}/scripts )
|
||||
|
||||
|
|
|
@ -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 )
|
|
@ -1,33 +1,24 @@
|
|||
#!/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()
|
||||
|
||||
"""Draw a small logo of Coriolis in GDS."""
|
||||
with UpdateSession():
|
||||
cell = AllianceFramework.get().createCell( 'coriolis_logo' )
|
||||
cell.setTerminal( True )
|
||||
|
||||
cell.setAbutmentBox( Box( toDbU(-16.0), toDbU(-16.0), toDbU(76.0), toDbU(76.0) ) )
|
||||
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()
|
||||
|
||||
with UpdateSession():
|
||||
technology = DataBase.getDB().getTechnology()
|
||||
metal1 = technology.getLayer( "metal1" )
|
||||
metal2 = technology.getLayer( "metal2" )
|
||||
|
@ -46,28 +37,25 @@ def drawLogo ( editor ):
|
|||
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, 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, 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) )
|
||||
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, toDbU(30.0), toDbU(92.0), toDbU(-16.0), toDbU(76.0) )
|
||||
|
||||
UpdateSession.close()
|
||||
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']:
|
||||
if 'editor' in kw and kw['editor']:
|
||||
editor = kw['editor']
|
||||
|
||||
drawLogo( editor )
|
||||
return True
|
||||
|
|
|
@ -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) )
|
||||
|
||||
UpdateSession.open()
|
||||
"""Check the Diagonal segments of Hurricane."""
|
||||
DbU.setPolygonStep( l(1.0) )
|
||||
|
||||
with UpdateSession():
|
||||
cell = AllianceFramework.get().createCell( 'diagonal' )
|
||||
cell.setTerminal( True )
|
||||
cell.setTerminalNetlist( 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()
|
||||
|
||||
technology = DataBase.getDB().getTechnology()
|
||||
metal1 = technology.getLayer( "metal1" )
|
||||
|
@ -45,45 +36,42 @@ def buildDiagonals ( editor ):
|
|||
contpoly = technology.getLayer( "CONT_POLY" )
|
||||
ntie = technology.getLayer( "NTIE" )
|
||||
|
||||
|
||||
with UpdateSession():
|
||||
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)
|
||||
, Point( l(20.0), l(10.0) )
|
||||
, Point( l(10.0), l(20.0) )
|
||||
, l(4.0)
|
||||
)
|
||||
Vertical.create( net, metal2, toDbU(10.0), toDbU(4.0), toDbU(20.0), toDbU(30.0) )
|
||||
Vertical.create( net, metal2, l(10.0), l(4.0), l(20.0), l(30.0) )
|
||||
Diagonal.create( net, metal2
|
||||
, Point( toDbU(10.0), toDbU(30.0) )
|
||||
, Point( toDbU(20.0), toDbU(40.0) )
|
||||
, toDbU(4.0)
|
||||
, Point( l(10.0), l(30.0) )
|
||||
, Point( l(20.0), l(40.0) )
|
||||
, l(4.0)
|
||||
)
|
||||
Horizontal.create( net, metal2, toDbU(40.0), toDbU(4.0), toDbU(20.0), toDbU(30.0) )
|
||||
Horizontal.create( net, metal2, l(40.0), l(4.0), l(20.0), l(30.0) )
|
||||
Diagonal.create( net, metal2
|
||||
, Point( toDbU(30.0), toDbU(40.0) )
|
||||
, Point( toDbU(40.0), toDbU(30.0) )
|
||||
, toDbU(4.0)
|
||||
, Point( l(30.0), l(40.0) )
|
||||
, Point( l(40.0), l(30.0) )
|
||||
, l(4.0)
|
||||
)
|
||||
Vertical.create( net, metal2, toDbU(40.0), toDbU(4.0), toDbU(30.0), toDbU(20.0) )
|
||||
Vertical.create( net, metal2, l(40.0), l(4.0), l(30.0), l(20.0) )
|
||||
Diagonal.create( net, metal2
|
||||
, Point( toDbU(40.0), toDbU(20.0) )
|
||||
, Point( toDbU(30.0), toDbU(10.0) )
|
||||
, toDbU(4.0)
|
||||
, Point( l(40.0), l(20.0) )
|
||||
, Point( l(30.0), l(10.0) )
|
||||
, l(4.0)
|
||||
)
|
||||
Horizontal.create( net, metal2, toDbU(10.0), toDbU(4.0), toDbU(30.0), toDbU(20.0) )
|
||||
|
||||
UpdateSession.close()
|
||||
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']:
|
||||
if 'editor' in kw and kw['editor']:
|
||||
editor = kw['editor']
|
||||
|
||||
buildDiagonals( editor )
|
||||
return True
|
||||
|
|
|
@ -1,38 +1,37 @@
|
|||
#!/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 ):
|
||||
|
||||
"""
|
||||
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()
|
||||
|
||||
with UpdateSession():
|
||||
fulladder = af.createCell( 'fulladder' )
|
||||
fulladder.setAbutmentBox( Box( toDbU(0.0), toDbU(0.0), toDbU(90.0), toDbU(100.0) ) )
|
||||
|
||||
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()
|
||||
|
||||
with UpdateSession():
|
||||
# Create Instances.
|
||||
a2_1 = Instance.create( fulladder, 'a2_1', a2_x2 )
|
||||
a2_2 = Instance.create( fulladder, 'a2_2', a2_x2 )
|
||||
|
@ -85,54 +84,60 @@ def buildFulladder ( editor ):
|
|||
cout.setExternal( True )
|
||||
o2_1.getPlug( o2_x2.getNet('q') ).setNet( cout )
|
||||
|
||||
with UpdateSession():
|
||||
# Instances placement.
|
||||
a2_1.setTransformation( Transformation( toDbU(0.0)
|
||||
, toDbU(0.0)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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' )
|
||||
|
||||
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( toDbU(50.0)
|
||||
, toDbU( 0.0)
|
||||
filler_1.setTransformation( Transformation( l(50.0)
|
||||
, l( 0.0)
|
||||
, Transformation.Orientation.ID ) )
|
||||
filler_1.setPlacementStatus( Instance.PlacementStatus.PLACED )
|
||||
|
||||
filler_2.setTransformation( Transformation( toDbU(60.0)
|
||||
, toDbU( 0.0)
|
||||
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" )
|
||||
|
@ -140,6 +145,7 @@ def buildFulladder ( editor ):
|
|||
via12 = technology.getLayer( "VIA12" )
|
||||
via23 = technology.getLayer( "VIA23" )
|
||||
|
||||
with UpdateSession():
|
||||
# Build wiring for a.
|
||||
# Create RoutingPads first.
|
||||
rp1 = RoutingPad.create( a
|
||||
|
@ -150,23 +156,20 @@ def buildFulladder ( editor ):
|
|||
, 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()
|
||||
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']:
|
||||
if 'editor' in kw and kw['editor']:
|
||||
editor = kw['editor']
|
||||
|
||||
buildFulladder( editor )
|
||||
return True
|
||||
|
|
|
@ -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()
|
||||
|
||||
"""Build step by step an invertor standard cell."""
|
||||
with UpdateSession():
|
||||
cell = AllianceFramework.get().createCell( 'invertor' )
|
||||
cell.setTerminal( True )
|
||||
|
||||
cell.setAbutmentBox( Box( toDbU(0.0), toDbU(0.0), toDbU(15.0), toDbU(50.0) ) )
|
||||
|
||||
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" )
|
||||
|
@ -41,61 +37,62 @@ def buildInvertor ( editor ):
|
|||
contpoly = technology.getLayer( "CONT_POLY" )
|
||||
ntie = technology.getLayer( "NTIE" )
|
||||
|
||||
with UpdateSession():
|
||||
net = Net.create( cell, "nwell" )
|
||||
Vertical.create( net, nwell, toDbU(7.5), toDbU(15.0), toDbU(27.0), toDbU(51.0) )
|
||||
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, toDbU(47.0), toDbU(6.0), toDbU(0.0), toDbU(15.0) )
|
||||
h = Horizontal.create(vdd, metal1, l(47.0), l(6.0), l(0.0), l(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) )
|
||||
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.' )
|
||||
|
||||
with UpdateSession():
|
||||
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))
|
||||
h = Horizontal.create(vss, metal1, l(3.0), l(6.0), l(0.0), l(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) )
|
||||
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.' )
|
||||
|
||||
with UpdateSession():
|
||||
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) )
|
||||
v = Vertical.create ( i, metal1, l(5.0), l(2.0), l(10.0), l(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) )
|
||||
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.' )
|
||||
|
||||
with UpdateSession():
|
||||
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) )
|
||||
v = Vertical.create( nq, metal1, l(10.0), l(2.0), l(10.0), l(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) )
|
||||
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']:
|
||||
if 'editor' in kw and kw['editor']:
|
||||
editor = kw['editor']
|
||||
|
||||
buildInvertor( editor )
|
||||
return True
|
||||
|
|
|
@ -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()
|
||||
|
||||
"""Draw a set of Polygons checking all possible combination."""
|
||||
#DbU.setPolygonStep( l(0.1) )
|
||||
with UpdateSession():
|
||||
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) ) )
|
||||
|
||||
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()
|
||||
|
||||
technology = DataBase.getDB().getTechnology()
|
||||
metal1 = technology.getLayer( "METAL1" )
|
||||
|
@ -48,124 +36,117 @@ def buildPolygons ( editor ):
|
|||
contpoly = technology.getLayer( "CONT_POLY" )
|
||||
ntie = technology.getLayer( "NTIE" )
|
||||
|
||||
|
||||
with UpdateSession():
|
||||
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) ) ]
|
||||
#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 )
|
||||
|
||||
# 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) ) ]
|
||||
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( toDbU(40.0), toDbU(0.0) )
|
||||
#p.translate( l(40.0), l(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) ) ]
|
||||
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( toDbU(0.0), toDbU(40.0) )
|
||||
p.translate( l(0.0), l(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) ) ]
|
||||
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( toDbU(30.0), toDbU(0.0) )
|
||||
p.translate( l(30.0), l(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) ) ]
|
||||
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( toDbU(30.0), toDbU(40.0) )
|
||||
p.translate( l(30.0), l(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) ) ]
|
||||
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( toDbU(70.0), toDbU(0.0) )
|
||||
p.translate( l(70.0), l(0.0) )
|
||||
|
||||
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) ) ]
|
||||
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( toDbU(140.0), toDbU(0.0) )
|
||||
p.translate( l(140.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) ) ]
|
||||
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( toDbU(70.0), toDbU(40.0) )
|
||||
p.translate( l(70.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) ) ]
|
||||
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( toDbU(140.0), toDbU(40.0) )
|
||||
p.translate( l(140.0), l(40.0) )
|
||||
|
||||
|
||||
print 'Normalized and manhattanized contour:'
|
||||
print( 'Normalized and manhattanized contour:' )
|
||||
i = 0
|
||||
for point in p.getMContour():
|
||||
print '| %d '%i, point \
|
||||
, '[%fum %fum]' % ( toMicron(point.getX()) \
|
||||
, toMicron(point.getY()) )
|
||||
print( '| %d '%i, point, '[%fum %fum]' % ( u(point.getX()), u(point.getY()) ))
|
||||
i += 1
|
||||
|
||||
print 'Sub-polygons (for GDSII generation)'
|
||||
print( 'Sub-polygons (for GDSII generation)' )
|
||||
subpolygons = p.getSubPolygons()
|
||||
for i in range(len(subpolygons)):
|
||||
print '+ Sub-Polygon %d:' % i
|
||||
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()
|
||||
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']:
|
||||
if 'editor' in kw and kw['editor']:
|
||||
editor = kw['editor']
|
||||
|
||||
buildPolygons( editor )
|
||||
return True
|
||||
|
|
|
@ -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()
|
||||
|
||||
"""Check Hurricane.Rectilinear class."""
|
||||
with UpdateSession():
|
||||
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) ) )
|
||||
|
||||
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()
|
||||
|
||||
technology = DataBase.getDB().getTechnology()
|
||||
metal1 = technology.getLayer( "METAL1" )
|
||||
|
@ -46,37 +35,32 @@ def buildRectilinear ( editor ):
|
|||
contpoly = technology.getLayer( "CONT_POLY" )
|
||||
ntie = technology.getLayer( "NTIE" )
|
||||
|
||||
|
||||
with UpdateSession():
|
||||
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) ) ]
|
||||
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:'
|
||||
#print( 'Normalized and manhattanized contour:' )
|
||||
#i = 0
|
||||
#for point in p.getMContour():
|
||||
# print '| %d '%i, point \
|
||||
# , '[%fum %fum]' % ( toMicron(point.getX()) \
|
||||
# , toMicron(point.getY()) )
|
||||
# print( '| %d '%i, point, '[%fum %fum]' % ( u(point.getX()), u(point.getY()) ))
|
||||
# i += 1
|
||||
|
||||
UpdateSession.close()
|
||||
|
||||
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']:
|
||||
if 'editor' in kw and kw['editor']:
|
||||
editor = kw['editor']
|
||||
|
||||
buildRectilinear( editor )
|
||||
return True
|
||||
|
|
|
@ -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,24 +15,19 @@ 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.
|
||||
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()
|
||||
|
||||
with UpdateSession():
|
||||
fulladder = af.createCell( 'fulladder' )
|
||||
|
||||
# Create Instances.
|
||||
|
@ -83,40 +82,42 @@ def buildFulladder ( editor ):
|
|||
cout.setExternal( True )
|
||||
o2_1.getPlug( o2_x2.getNet('q') ).setNet( cout )
|
||||
|
||||
UpdateSession.close()
|
||||
|
||||
af.saveCell( fulladder, Catalog.State.Views )
|
||||
return fulladder
|
||||
|
||||
|
||||
def placeAndRoute ( editor, cell ):
|
||||
# Run the placer.
|
||||
etesian = Etesian.EtesianEngine.create(cell)
|
||||
etesian.place()
|
||||
"""
|
||||
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()
|
||||
|
||||
Breakpoint.stop( 1, 'After placement' )
|
||||
|
||||
# Run the router.
|
||||
katana = Katana.KatanaEngine.create(cell)
|
||||
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']:
|
||||
if 'editor' in kw and kw['editor']:
|
||||
editor = kw['editor']
|
||||
|
||||
fulladder = buildFulladder( editor )
|
||||
placeAndRoute( editor, fulladder )
|
||||
return True
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 & 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 & 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> git clone https://gitlab.lip6.fr/jpc/alliance.git
|
|||
</li>
|
||||
<li><p class="first">Compilation & 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
|
||||
|
|
|
@ -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> & <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
|
||||
|
|
|
@ -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 & install Alliance alongside Coriolis Alliance Check Toolkit Regression tests & examples Coriolis Documentation Coriolis User's Guide ...">
|
||||
<meta name="description" content="Alliance Documentation Alliance Installation How to get, build & install Alliance alongside Coriolis Alliance Check Toolkit Regression tests & examples Coriolis Documentation Coriolis User's Guide...">
|
||||
<meta name="keywords" content="">
|
||||
<link rel="icon" href="../favicon.ico">
|
||||
|
||||
|
|
|
@ -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">
|
||||
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
|
|
@ -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"><</span><span class="k">typename</span> <span class="n">CppT</span><span class="o">></span>
|
||||
<span class="k">template</span><span class="o"><</span><span class="k">typename</span> <span class="nc">CppT</span><span class="o">></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"><</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"><</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_pointer</span><span class="o"><</span><span class="n">T</span><span class="o">>::</span><span class="n">value</span><span class="p">,</span> <span class="kt">bool</span> <span class="o">>::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">></span>
|
||||
<span class="k">template</span><span class="o"><</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"><</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_pointer</span><span class="o"><</span><span class="n">T</span><span class="o">>::</span><span class="n">value</span><span class="p">,</span> <span class="kt">bool</span> <span class="o">>::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">></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"><</span><span class="n">T</span><span class="o">>::</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"><</span><span class="n">T</span><span class="o">>::</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"><</span><span class="n">T</span><span class="o">></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"><<</span> <span class="s">"Isobar3::pyToC<>(const T*): Unsupported type."</span> <span class="o"><<</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"><</span><span class="k">typename</span> <span class="n">T</span><span class="o">></span>
|
||||
<span class="k">template</span><span class="o"><</span><span class="k">typename</span> <span class="nc">T</span><span class="o">></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"><</span><span class="n">T</span><span class="o">></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<CppT>::_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<CppT>::_link()</span></tt> method is the reason
|
||||
<strong>why</strong> we need the intermediate <tt class="docutils literal">PyTypeManagerVTrunk<CppT></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"><</span> <span class="k">typename</span> <span class="n">CppT</span> <span class="o">></span>
|
||||
<span class="k">template</span><span class="o"><</span> <span class="k">typename</span> <span class="nc">CppT</span> <span class="o">></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"><</span><span class="n">CppT</span><span class="o">></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 & STL types, pointer flavor.</span>
|
||||
<span class="k">template</span><span class="o"><</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"><</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o"><</span><span class="n">CppT</span><span class="p">,</span><span class="kt">bool</span><span class="o">>::</span><span class="n">value</span>
|
||||
<span class="k">template</span><span class="o"><</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"><</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o"><</span><span class="n">CppT</span><span class="p">,</span><span class="kt">bool</span><span class="o">>::</span><span class="n">value</span>
|
||||
<span class="o">&&</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o"><</span><span class="n">CppT</span><span class="p">,</span><span class="kt">int</span> <span class="o">>::</span><span class="n">value</span>
|
||||
<span class="o">&&</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o"><</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">>::</span><span class="n">value</span>
|
||||
<span class="o">&&</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o"><</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">>::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">>::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">></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"><</span><span class="n">CppT</span><span class="o">></span><span class="p">(</span> <span class="n">object</span> <span class="p">);</span> <span class="p">}</span>
|
||||
|
||||
<span class="c1">// Disabled for POD & STL types, const pointer flavor.</span>
|
||||
<span class="k">template</span><span class="o"><</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"><</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o"><</span><span class="n">CppT</span><span class="p">,</span><span class="kt">bool</span><span class="o">>::</span><span class="n">value</span>
|
||||
<span class="k">template</span><span class="o"><</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"><</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o"><</span><span class="n">CppT</span><span class="p">,</span><span class="kt">bool</span><span class="o">>::</span><span class="n">value</span>
|
||||
<span class="o">&&</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o"><</span><span class="n">CppT</span><span class="p">,</span><span class="kt">int</span> <span class="o">>::</span><span class="n">value</span>
|
||||
<span class="o">&&</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o"><</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">>::</span><span class="n">value</span>
|
||||
<span class="o">&&</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_same</span><span class="o"><</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">>::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">>::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">></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"><></span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o"><</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">></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"><></span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o"><</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="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"><></span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o"><</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="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">-></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"><></span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o"><</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">></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"><></span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o"><</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="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"><></span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o"><</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="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">-></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"><></span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o"><</span> <span class="kt">int</span> <span class="o">></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"><></span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o"><</span><span class="k">const</span> <span class="kt">int</span> <span class="o">></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"><></span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o"><</span><span class="k">const</span> <span class="kt">int</span><span class="o">*></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"><></span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o"><</span> <span class="kt">int</span> <span class="o">></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"><></span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o"><</span><span class="k">const</span> <span class="kt">int</span> <span class="o">></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"><></span> <span class="kr">inline</span> <span class="n">PyObject</span><span class="o">*</span> <span class="n">cToPy</span><span class="o"><</span><span class="k">const</span> <span class="kt">int</span><span class="o">*></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<></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<></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 "return by value" (seems to match std::is_object<>)</span>
|
||||
<span class="k">template</span><span class="o"><</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"><</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_reference</span><span class="o"><</span><span class="n">TR</span><span class="o">>::</span><span class="n">value</span>
|
||||
<span class="k">template</span><span class="o"><</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"><</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_reference</span><span class="o"><</span><span class="n">TR</span><span class="o">>::</span><span class="n">value</span>
|
||||
<span class="o">&&</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_pointer</span> <span class="o"><</span><span class="n">TR</span><span class="o">>::</span><span class="n">value</span>
|
||||
<span class="o">&&</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_void</span> <span class="o"><</span><span class="n">TR</span><span class="o">>::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">>::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">></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 "return by reference"</span>
|
||||
<span class="k">template</span><span class="o"><</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"><</span> <span class="n">std</span><span class="o">::</span><span class="n">is_reference</span><span class="o"><</span><span class="n">TR</span><span class="o">>::</span><span class="n">value</span>
|
||||
<span class="k">template</span><span class="o"><</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"><</span> <span class="n">std</span><span class="o">::</span><span class="n">is_reference</span><span class="o"><</span><span class="n">TR</span><span class="o">>::</span><span class="n">value</span>
|
||||
<span class="o">&&</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_pointer</span> <span class="o"><</span><span class="n">TR</span><span class="o">>::</span><span class="n">value</span>
|
||||
<span class="o">&&</span> <span class="o">!</span><span class="n">std</span><span class="o">::</span><span class="n">is_void</span> <span class="o"><</span><span class="n">TR</span><span class="o">>::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">>::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">></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 "return by pointer".</span>
|
||||
<span class="k">template</span><span class="o"><</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"><</span><span class="n">std</span><span class="o">::</span><span class="n">is_pointer</span><span class="o"><</span><span class="n">TR</span><span class="o">>::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">>::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">></span>
|
||||
<span class="k">template</span><span class="o"><</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"><</span><span class="n">std</span><span class="o">::</span><span class="n">is_pointer</span><span class="o"><</span><span class="n">TR</span><span class="o">>::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">>::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">></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">->*</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 "return void".</span>
|
||||
<span class="k">template</span><span class="o"><</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"><</span><span class="n">std</span><span class="o">::</span><span class="n">is_void</span><span class="o"><</span><span class="n">TR</span><span class="o">>::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">>::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">></span>
|
||||
<span class="k">template</span><span class="o"><</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"><</span><span class="n">std</span><span class="o">::</span><span class="n">is_void</span><span class="o"><</span><span class="n">TR</span><span class="o">>::</span><span class="n">value</span><span class="p">,</span><span class="kt">bool</span><span class="o">>::</span><span class="n">type</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">></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">->*</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"><</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">></span>
|
||||
<span class="k">template</span><span class="o"><</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">></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"><>&</span> <span class="p">)</span>
|
||||
<span class="p">{</span> <span class="k">return</span> <span class="n">_callMethodReturn</span><span class="o"><</span><span class="n">TC</span><span class="p">,</span><span class="n">TR</span><span class="o">></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"><</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">></span>
|
||||
<span class="k">template</span><span class="o"><</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">></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"><</span><span class="n">TA0</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">_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"><</span><span class="n">TA0</span><span class="o">></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"><</span><span class="n">TA0</span><span class="o">></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"><</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">></span>
|
||||
<span class="k">template</span><span class="o"><</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">></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"><</span><span class="n">TA0</span><span class="p">,</span><span class="n">TA1</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">_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"><</span><span class="n">TA0</span><span class="o">></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"><</span><span class="n">TA1</span><span class="o">></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"><</span><span class="n">TA0</span><span class="o">></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"><</span><span class="n">TA1</span><span class="o">></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<></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<></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">"Parameter.addValue"</span><span class="p">,</span><span class="o">&</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">"Parameter.addValue"</span><span class="p">,</span><span class="o">&</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">"isFile"</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">-></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">-></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">-></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">"Parameter.setString"</span><span class="p">,</span><span class="o">&</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">"Parameter.setString"</span><span class="p">,</span><span class="o">&</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<>()</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">"hasParameter"</span><span class="p">,</span><span class="o">&</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">"hasParameter"</span><span class="p">,</span><span class="o">&</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">"hasParameter"</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>
|
||||
|
|
|
@ -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">"O!"</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)->ob_type == &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 "C"</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">"Library.getCell()"</span> <span class="p">)</span>
|
||||
<span class="nf">METHOD_HEAD</span><span class="p">(</span> <span class="s">"Library.getCell()" )</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">"s:Library.getCell"</span><span class="p">,</span> <span class="o">&</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">-></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">"library"</span><span class="p">,</span> <span class="o">&</span><span class="n">PyTypeLibrary</span><span class="p">,</span> <span class="s">"<Library>"</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">"Hurricane"</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">"Hurricane"</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"><<</span> <span class="s">"[ERROR]</span><span class="se">\n</span><span class="s">"</span>
|
||||
<span class="o"><<</span> <span class="s">" Failed to initialize Hurricane module."</span> <span class="o"><<</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">&</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">"Library"</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">&</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">"Library"</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">&</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">"Entity.getCell()" )</span>
|
||||
<span class="n">cell</span> <span class="o">=</span> <span class="n">entity</span><span class="o">-></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)->ob_type == &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">"Component.getNet()" )</span>
|
||||
<span class="n">net</span> <span class="o">=</span> <span class="n">component</span><span class="o">-></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)->ob_type == &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">"comp"</span> <span class="p">,</span> <span class="o">&</span><span class="n">PyTypeComponent</span><span class="p">,</span> <span class="s">"<Component>"</span><span class="p">,</span> <span class="nb">false</span><span class="p">,</span> <span class="s">"ent"</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">"contact"</span><span class="p">,</span> <span class="o">&</span><span class="n">PyTypeContact</span> <span class="p">,</span> <span class="s">"<Contact>"</span> <span class="p">,</span> <span class="nb">false</span><span class="p">,</span> <span class="s">"comp"</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">"Hurricane"</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">"Hurricane"</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"><<</span> <span class="s">"[ERROR]</span><span class="se">\n</span><span class="s">"</span>
|
||||
<span class="o"><<</span> <span class="s">" Failed to initialize Hurricane module."</span> <span class="o"><<</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">&</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">"Contact"</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">&</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">"Contact"</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">&</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)->ob_type == &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> 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"><</span><span class="n">Point</span><span class="o">*></span><span class="p">(</span> <span class="n">self</span><span class="o">-></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> 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"><</span><span class="n">Point</span><span class="o">*></span><span class="p">(</span> <span class="n">self</span><span class="o">-></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
|
@ -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 & 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 & 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.
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
|
|
@ -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's Guide. Contents Printable Version of this Document Abstract Credits & License Complete Design Flow & Examples Installation Fixed Directory Tree ...">
|
||||
<meta name="description" content="Printable Version of this Document Coriolis User's Guide. Contents Printable Version of this Document Abstract Credits & License Complete Design Flow & 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> ./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:~> 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:~> <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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -100,7 +100,8 @@ div#contents ul > li > a {
|
|||
*/
|
||||
|
||||
span.cb {
|
||||
background: yellow;
|
||||
font-family: "courrier";
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.note {
|
||||
|
|
|
@ -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('▶');
|
||||
a.html('►');
|
||||
$(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('▶');
|
||||
currentRowSpans.filter(".arrow").html('►');
|
||||
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('▶');
|
||||
childRowsSpans.filter(".arrow").html('►');
|
||||
childRows.show(); //show all children
|
||||
}
|
||||
updateStripes();
|
||||
|
|
|
@ -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<class T> 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<int></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><<span class="keyword">class</span> T> <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<int></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>
|
||||
|
|
|
@ -1 +1 @@
|
|||
387ff8eb65306fa251338d3c9bd7bfff
|
||||
f51bf6e9a10430aafef59831b08dcbfe
|
Binary file not shown.
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 22 KiB |
|
@ -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>
|
||||
|
|
|
@ -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->getInstance( cell->getName() );</div></div><!-- fragment --><p><b>Method 2:</b> Slave instance.</p>
|
||||
<div class="fragment"><div class="line">Instance* instance = parentCell->getInstance( cell->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->getSlaveInstances().getFirst();</div></div><!-- fragment --><h2><a class="anchor" id="ssecWhyMetaTrans"></a>
|
||||
<div class="fragment"><div class="line">Instance* instance = cell->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
|
@ -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();
|
||||
|
|
|
@ -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"}]}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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.
|
|
@ -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
|
||||
|
|
|
@ -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
Loading…
Reference in New Issue