2017-07-15 10:35:02 -05:00
<!DOCTYPE html>
<!-- [if IE 8]><html class="no - js lt - ie9" lang="en" > <![endif] -->
<!-- [if gt IE 8]><! --> < html class = "no-js" lang = "en" > <!-- <![endif] -->
< head >
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< title > 4. Case 2 - Hierarchy of DBo Derived Classes — Coriolis 2 documentation< / title >
< link rel = "stylesheet" href = "../_static/SoC.css" type = "text/css" / >
2017-10-30 09:33:37 -05:00
< link rel = "index" title = "Index"
href="../genindex.html"/>
< link rel = "search" title = "Search" href = "../search.html" / >
2017-07-15 10:35:02 -05:00
< link rel = "top" title = "Coriolis 2 documentation" href = "../index.html" / >
< link rel = "up" title = "Hurricane Python/C++ API Tutorial" href = "index.html" / >
< link rel = "next" title = "5. Case 3 - Non-DBo Standalone Classe" href = "NonDBo.html" / >
< link rel = "prev" title = "3. Case 1 - DBo Derived, Standalone" href = "DBoStandalone.html" / >
< script src = "_static/js/modernizr.min.js" > < / script >
< / head >
< body class = "wy-body-for-nav" role = "document" >
< div class = "wy-grid-for-nav" >
< nav data-toggle = "wy-nav-shift" class = "wy-nav-side" >
< div class = "wy-side-nav-search" >
< a href = "../index.html" class = "icon icon-home" > Coriolis
< / a >
< div role = "search" >
< form id = "rtd-search-form" class = "wy-form" action = "../search.html" method = "get" >
< input type = "text" name = "q" placeholder = "Search docs" / >
< input type = "hidden" name = "check_keywords" value = "yes" / >
< input type = "hidden" name = "area" value = "default" / >
< / form >
< / div >
< / div >
< div class = "wy-menu wy-menu-vertical" data-spy = "affix" role = "navigation" aria-label = "main navigation" >
< ul class = "current" >
< li class = "toctree-l1" > < a class = "reference internal" href = "../UsersGuide/index.html" > Coriolis User’ s Guide< / a > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "../UsersGuide/LicenseCredits.html" > Credits & License< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../UsersGuide/Releases.html" > Release Notes< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/Releases.html#release-1-0-1475" > Release 1.0.1475< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/Releases.html#release-1-0-1963" > Release 1.0.1963< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/Releases.html#release-1-0-2049" > Release 1.0.2049< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/Releases.html#release-v2-0-1" > Release v2.0.1< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/Releases.html#release-v2-1" > Release v2.1< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/Releases.html#release-v2-2" > < strong > Release v2.2< / strong > < / a > < / li >
< / ul >
< / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../UsersGuide/Installation.html" > Installation< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/Installation.html#fixed-directory-tree" > Fixed Directory Tree< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/Installation.html#building-coriolis" > Building Coriolis< / a > < ul >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/Installation.html#building-the-devel-branch" > Building the Devel Branch< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/Installation.html#additionnal-requirement-under-macos" > Additionnal Requirement under < span class = "sc" > MacOS< / span > < / a > < / li >
< / ul >
< / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/Installation.html#packaging-coriolis" > Packaging Coriolis< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/Installation.html#hooking-up-into-alliance" > Hooking up into < span class = "sc" > Alliance< / span > < / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/Installation.html#setting-up-the-environment-coriolisenv-py" > Setting up the Environment (coriolisEnv.py)< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../UsersGuide/Configuration.html" > Coriolis Configuration & Initialisation< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/Configuration.html#general-software-architecture" > General Software Architecture< / a > < / li >
2017-11-17 05:04:33 -06:00
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/Configuration.html#first-stage-technology-selection" > First Stage: Technology Selection< / a > < / li >
2017-07-15 10:35:02 -05:00
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/Configuration.html#second-stage-technology-configuration-loading" > Second Stage: Technology Configuration Loading< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/Configuration.html#configuration-helpers" > Configuration Helpers< / a > < ul >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/Configuration.html#alliance-helper" > < span class = "sc" > Alliance< / span > Helper< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/Configuration.html#tools-configuration-helpers" > Tools Configuration Helpers< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/Configuration.html#hacking-the-configuration-files" > Hacking the Configuration Files< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html" > CGT - The Graphical Interface< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#viewer-tools" > Viewer & Tools< / a > < ul >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#stratus-netlist-capture" > < span class = "sc" > Stratus< / span > Netlist Capture< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#the-hurricane-data-base" > The < span class = "sc" > Hurricane< / span > Data-Base< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#synthetizing-and-loading-a-design" > Synthetizing and loading a design< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#etesian-placer" > Etesian – Placer< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#knik-global-router" > Knik – Global Router< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#kite-detailed-router" > Kite – Detailed Router< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#executing-python-scripts-in-cgt" > Executing Python Scripts in Cgt< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#printing-snapshots" > Printing & Snapshots< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#memento-of-shortcuts-in-graphic-mode" > Memento of Shortcuts in Graphic Mode< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#cgt-command-line-options" > Cgt Command Line Options< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#miscellaneous-settings" > Miscellaneous Settings< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#the-controller" > The Controller< / a > < ul >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#the-look-tab" > The Look Tab< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#the-filter-tab" > The Filter Tab< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#the-layers-go-tab" > The Layers& Go Tab< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#the-netlist-tab" > The Netlist Tab< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#the-selection-tab" > The Selection Tab< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#the-inspector-tab" > The Inspector Tab< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ViewerTools.html#the-settings-tab" > The Settings Tab< / a > < / li >
< / ul >
< / li >
< / ul >
< / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../UsersGuide/ScriptsPlugins.html" > Python Interface for < span class = "sc" > Hurricane< / span > / < span class = "sc" > Coriolis< / span > < / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/ScriptsPlugins.html#plugins" > Plugins< / a > < ul >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ScriptsPlugins.html#chip-placement" > Chip Placement< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ScriptsPlugins.html#clock-tree" > Clock Tree< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../UsersGuide/ScriptsPlugins.html#recursive-save-rsave" > Recursive-Save (RSave)< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../UsersGuide/ScriptsPlugins.html#a-simple-example-am2901" > A Simple Example: AM2901< / a > < / li >
< / ul >
< / li >
< / ul >
< / li >
2018-03-18 17:28:49 -05:00
< li class = "toctree-l1" > < a class = "reference internal" href = "../PythonTutorial/index.html" > Hurricane+Python Tutorial< / a > < ul >
Validating channel routing mode (two metals) on SNX.
* New: In Hurricane::Entity, add an id counter limit and a memory size
limit. The two limits are checked only when a new Entity object is
created. This should help avoiding massive memory links.
* New: In CRL Core, add a "crlcore.groundName" and a "crlcore.powerName"
parameter to specify the name of the ground/power signals to be
created if they are missing in a Cell. For Alliance libraries it
would be "vss" & "vdd" (default values), but for real technologies,
it is often "gnd!" & "vdd!".
The Blif parser is modificated to make use of it.
* Bug: In AnabaticEngine::unify(), set the resulting unified segment in
the center of the GCells common side. Gcells under a segment are
found by using the edge that cover the segment axis. When we have
a "bend" GCell stack and the axis is wrong, they could be ommited.
This was causing deleted segments to be not removed from some
Edges, then core dump.
* Change: In Anabatic::AutoSegment::create(), smarter choosing of the
reference contact, select the fixed or terminal one instead of
always the source one.
* New: In Anabatic::Edge::isEnding(), new function to check if a
segment going through an Edge is starting/ending in either source
or target GCell of the edge (active only when running in channel
mode).
* New: In Anabatic::Edge::add(), a segment takes part in the occupancy
only if it is not ending in either source or target (channel mode
only). The occupancy due to terminal is pre-computed in Katana.
* New: In Anabatic::Edge::ripup(), in channel mode, never ripup a
segment which is ending in either source or target (we *have* to
access this edge to connect to the terminal).
* Bug: In Anabatic::GCell::hcut() and vcut(), force the update of
the Edge which is on the side that will get splitted by the cut.
It's capacity will be reduced to it must be updated.
* Change: In Anabatic::GCell::updateGContacts() add a flag to conditionnally
update horizontals or verticals only. We may require only a partial
update when resizing the GCell in only one direction.
This, again, related to the fact that we compute the GCells under
a segment thanks to it's axis position, so we need to be very careful
when modificating axis.
* Change: In Katana::Block::resizeChannels(), only update GContact vertical
position. Do not disturb X positions of segments.
* Bug: In Katana::GlobalRoute::DigitalDistance, in channel mode, some
Edges can have a zero capacity, but still be reachable if the net has
a terminal in either source or target. Look for this case and return
a distance of zero instead of "unreachable". This was causing the
global routing not to complete in channel mode.
For computing the edge distance, makes the vertical edges much more
long (10 times) than the horizontal ones as the vertical capacity is
very limited. Hard coded for now, should make it a parameter in the
future.
* Change: In KatanaEngine::annotateGlobalGraph(), decrease the capacity
of edges with reserveCapacity for each terminal inside a GCell.
Both north and south edges are decreased as we a terminal will
block both north and south edges.
As a counterpart, the Edge capacity is not decreased when the
global router connect to a terminal.
* Change: In Katana::RoutingEvent::revalidate(), when in repair stage,
do not expand the slack for horizontal segments in channel mode.
So they may not overlap the standard cell row.
* Bug: In Stratus documentation, do not use the french option in babel,
the documentation is in english!
* New: In Documentation, added Hurricane/Python tutorial, part for drawing
layout.
2018-03-16 10:20:04 -05:00
< li class = "toctree-l2" > < a class = "reference internal" href = "../PythonTutorial/Introduction.html" > 1. Introduction< / a > < ul >
2018-03-18 17:28:49 -05:00
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/Introduction.html#terminology" > 1.1 Terminology< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/Introduction.html#generalities" > 1.2 Generalities< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/Introduction.html#various-kinds-of-constructors" > 1.3 Various Kinds of Constructors< / a > < / li >
Validating channel routing mode (two metals) on SNX.
* New: In Hurricane::Entity, add an id counter limit and a memory size
limit. The two limits are checked only when a new Entity object is
created. This should help avoiding massive memory links.
* New: In CRL Core, add a "crlcore.groundName" and a "crlcore.powerName"
parameter to specify the name of the ground/power signals to be
created if they are missing in a Cell. For Alliance libraries it
would be "vss" & "vdd" (default values), but for real technologies,
it is often "gnd!" & "vdd!".
The Blif parser is modificated to make use of it.
* Bug: In AnabaticEngine::unify(), set the resulting unified segment in
the center of the GCells common side. Gcells under a segment are
found by using the edge that cover the segment axis. When we have
a "bend" GCell stack and the axis is wrong, they could be ommited.
This was causing deleted segments to be not removed from some
Edges, then core dump.
* Change: In Anabatic::AutoSegment::create(), smarter choosing of the
reference contact, select the fixed or terminal one instead of
always the source one.
* New: In Anabatic::Edge::isEnding(), new function to check if a
segment going through an Edge is starting/ending in either source
or target GCell of the edge (active only when running in channel
mode).
* New: In Anabatic::Edge::add(), a segment takes part in the occupancy
only if it is not ending in either source or target (channel mode
only). The occupancy due to terminal is pre-computed in Katana.
* New: In Anabatic::Edge::ripup(), in channel mode, never ripup a
segment which is ending in either source or target (we *have* to
access this edge to connect to the terminal).
* Bug: In Anabatic::GCell::hcut() and vcut(), force the update of
the Edge which is on the side that will get splitted by the cut.
It's capacity will be reduced to it must be updated.
* Change: In Anabatic::GCell::updateGContacts() add a flag to conditionnally
update horizontals or verticals only. We may require only a partial
update when resizing the GCell in only one direction.
This, again, related to the fact that we compute the GCells under
a segment thanks to it's axis position, so we need to be very careful
when modificating axis.
* Change: In Katana::Block::resizeChannels(), only update GContact vertical
position. Do not disturb X positions of segments.
* Bug: In Katana::GlobalRoute::DigitalDistance, in channel mode, some
Edges can have a zero capacity, but still be reachable if the net has
a terminal in either source or target. Look for this case and return
a distance of zero instead of "unreachable". This was causing the
global routing not to complete in channel mode.
For computing the edge distance, makes the vertical edges much more
long (10 times) than the horizontal ones as the vertical capacity is
very limited. Hard coded for now, should make it a parameter in the
future.
* Change: In KatanaEngine::annotateGlobalGraph(), decrease the capacity
of edges with reserveCapacity for each terminal inside a GCell.
Both north and south edges are decreased as we a terminal will
block both north and south edges.
As a counterpart, the Edge capacity is not decreased when the
global router connect to a terminal.
* Change: In Katana::RoutingEvent::revalidate(), when in repair stage,
do not expand the slack for horizontal segments in channel mode.
So they may not overlap the standard cell row.
* Bug: In Stratus documentation, do not use the french option in babel,
the documentation is in english!
* New: In Documentation, added Hurricane/Python tutorial, part for drawing
layout.
2018-03-16 10:20:04 -05:00
< / ul >
< / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../PythonTutorial/Environment.html" > 2. Setting up the Environment< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/Environment.html#setting-up-the-pathes" > 2.1 Setting up the Pathes< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/Environment.html#user-s-configurations-file" > 2.2 User’ s Configurations File< / a > < ul >
< li class = "toctree-l4" > < a class = "reference internal" href = "../PythonTutorial/Environment.html#the-techno-py-file" > 2.2.1 The < span class = "cb" > techno.py< / span > File< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../PythonTutorial/Environment.html#the-settings-py-file" > 2.2.2 The < span class = "cb" > settings.py< / span > File< / a > < / li >
< / ul >
< / li >
< / ul >
< / li >
2018-03-18 17:28:49 -05:00
< li class = "toctree-l2" > < a class = "reference internal" href = "../PythonTutorial/CellNetComponent.html" > 3. Making a Standard Cell – Layout< / a > < ul >
Validating channel routing mode (two metals) on SNX.
* New: In Hurricane::Entity, add an id counter limit and a memory size
limit. The two limits are checked only when a new Entity object is
created. This should help avoiding massive memory links.
* New: In CRL Core, add a "crlcore.groundName" and a "crlcore.powerName"
parameter to specify the name of the ground/power signals to be
created if they are missing in a Cell. For Alliance libraries it
would be "vss" & "vdd" (default values), but for real technologies,
it is often "gnd!" & "vdd!".
The Blif parser is modificated to make use of it.
* Bug: In AnabaticEngine::unify(), set the resulting unified segment in
the center of the GCells common side. Gcells under a segment are
found by using the edge that cover the segment axis. When we have
a "bend" GCell stack and the axis is wrong, they could be ommited.
This was causing deleted segments to be not removed from some
Edges, then core dump.
* Change: In Anabatic::AutoSegment::create(), smarter choosing of the
reference contact, select the fixed or terminal one instead of
always the source one.
* New: In Anabatic::Edge::isEnding(), new function to check if a
segment going through an Edge is starting/ending in either source
or target GCell of the edge (active only when running in channel
mode).
* New: In Anabatic::Edge::add(), a segment takes part in the occupancy
only if it is not ending in either source or target (channel mode
only). The occupancy due to terminal is pre-computed in Katana.
* New: In Anabatic::Edge::ripup(), in channel mode, never ripup a
segment which is ending in either source or target (we *have* to
access this edge to connect to the terminal).
* Bug: In Anabatic::GCell::hcut() and vcut(), force the update of
the Edge which is on the side that will get splitted by the cut.
It's capacity will be reduced to it must be updated.
* Change: In Anabatic::GCell::updateGContacts() add a flag to conditionnally
update horizontals or verticals only. We may require only a partial
update when resizing the GCell in only one direction.
This, again, related to the fact that we compute the GCells under
a segment thanks to it's axis position, so we need to be very careful
when modificating axis.
* Change: In Katana::Block::resizeChannels(), only update GContact vertical
position. Do not disturb X positions of segments.
* Bug: In Katana::GlobalRoute::DigitalDistance, in channel mode, some
Edges can have a zero capacity, but still be reachable if the net has
a terminal in either source or target. Look for this case and return
a distance of zero instead of "unreachable". This was causing the
global routing not to complete in channel mode.
For computing the edge distance, makes the vertical edges much more
long (10 times) than the horizontal ones as the vertical capacity is
very limited. Hard coded for now, should make it a parameter in the
future.
* Change: In KatanaEngine::annotateGlobalGraph(), decrease the capacity
of edges with reserveCapacity for each terminal inside a GCell.
Both north and south edges are decreased as we a terminal will
block both north and south edges.
As a counterpart, the Edge capacity is not decreased when the
global router connect to a terminal.
* Change: In Katana::RoutingEvent::revalidate(), when in repair stage,
do not expand the slack for horizontal segments in channel mode.
So they may not overlap the standard cell row.
* Bug: In Stratus documentation, do not use the french option in babel,
the documentation is in english!
* New: In Documentation, added Hurricane/Python tutorial, part for drawing
layout.
2018-03-16 10:20:04 -05:00
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/CellNetComponent.html#the-allianceframework-crl-core" > 3.1 The AllianceFramework (CRL Core)< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/CellNetComponent.html#session-mechanism-hurricane" > 3.2 Session Mechanism (Hurricane)< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/CellNetComponent.html#creating-a-new-cell-crl-core" > 3.3 Creating a new Cell (CRL Core)< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/CellNetComponent.html#the-dbu-measurement-unit" > 3.4 The DbU Measurement Unit< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/CellNetComponent.html#setting-up-the-abutment-box" > 3.5 Setting up the Abutment Box< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/CellNetComponent.html#adding-nets-and-components" > 3.6 Adding Nets and Components< / a > < ul >
< li class = "toctree-l4" > < a class = "reference internal" href = "../PythonTutorial/CellNetComponent.html#getting-a-layer" > 3.6.1 Getting a Layer< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../PythonTutorial/CellNetComponent.html#creating-a-net" > 3.6.2 Creating a Net< / a > < / li >
2018-03-18 17:28:49 -05:00
< li class = "toctree-l4" > < a class = "reference internal" href = "../PythonTutorial/CellNetComponent.html#id1" > 3.6.3 Creating a Component< / a > < / li >
Validating channel routing mode (two metals) on SNX.
* New: In Hurricane::Entity, add an id counter limit and a memory size
limit. The two limits are checked only when a new Entity object is
created. This should help avoiding massive memory links.
* New: In CRL Core, add a "crlcore.groundName" and a "crlcore.powerName"
parameter to specify the name of the ground/power signals to be
created if they are missing in a Cell. For Alliance libraries it
would be "vss" & "vdd" (default values), but for real technologies,
it is often "gnd!" & "vdd!".
The Blif parser is modificated to make use of it.
* Bug: In AnabaticEngine::unify(), set the resulting unified segment in
the center of the GCells common side. Gcells under a segment are
found by using the edge that cover the segment axis. When we have
a "bend" GCell stack and the axis is wrong, they could be ommited.
This was causing deleted segments to be not removed from some
Edges, then core dump.
* Change: In Anabatic::AutoSegment::create(), smarter choosing of the
reference contact, select the fixed or terminal one instead of
always the source one.
* New: In Anabatic::Edge::isEnding(), new function to check if a
segment going through an Edge is starting/ending in either source
or target GCell of the edge (active only when running in channel
mode).
* New: In Anabatic::Edge::add(), a segment takes part in the occupancy
only if it is not ending in either source or target (channel mode
only). The occupancy due to terminal is pre-computed in Katana.
* New: In Anabatic::Edge::ripup(), in channel mode, never ripup a
segment which is ending in either source or target (we *have* to
access this edge to connect to the terminal).
* Bug: In Anabatic::GCell::hcut() and vcut(), force the update of
the Edge which is on the side that will get splitted by the cut.
It's capacity will be reduced to it must be updated.
* Change: In Anabatic::GCell::updateGContacts() add a flag to conditionnally
update horizontals or verticals only. We may require only a partial
update when resizing the GCell in only one direction.
This, again, related to the fact that we compute the GCells under
a segment thanks to it's axis position, so we need to be very careful
when modificating axis.
* Change: In Katana::Block::resizeChannels(), only update GContact vertical
position. Do not disturb X positions of segments.
* Bug: In Katana::GlobalRoute::DigitalDistance, in channel mode, some
Edges can have a zero capacity, but still be reachable if the net has
a terminal in either source or target. Look for this case and return
a distance of zero instead of "unreachable". This was causing the
global routing not to complete in channel mode.
For computing the edge distance, makes the vertical edges much more
long (10 times) than the horizontal ones as the vertical capacity is
very limited. Hard coded for now, should make it a parameter in the
future.
* Change: In KatanaEngine::annotateGlobalGraph(), decrease the capacity
of edges with reserveCapacity for each terminal inside a GCell.
Both north and south edges are decreased as we a terminal will
block both north and south edges.
As a counterpart, the Edge capacity is not decreased when the
global router connect to a terminal.
* Change: In Katana::RoutingEvent::revalidate(), when in repair stage,
do not expand the slack for horizontal segments in channel mode.
So they may not overlap the standard cell row.
* Bug: In Stratus documentation, do not use the french option in babel,
the documentation is in english!
* New: In Documentation, added Hurricane/Python tutorial, part for drawing
layout.
2018-03-16 10:20:04 -05:00
< / ul >
< / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/CellNetComponent.html#saving-to-disk-crl-core" > 3.7 Saving to Disk (CRL Core)< / a > < / li >
2018-03-18 17:28:49 -05:00
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/CellNetComponent.html#the-complete-example-file" > 3.8 The Complete Example File< / a > < / li >
Validating channel routing mode (two metals) on SNX.
* New: In Hurricane::Entity, add an id counter limit and a memory size
limit. The two limits are checked only when a new Entity object is
created. This should help avoiding massive memory links.
* New: In CRL Core, add a "crlcore.groundName" and a "crlcore.powerName"
parameter to specify the name of the ground/power signals to be
created if they are missing in a Cell. For Alliance libraries it
would be "vss" & "vdd" (default values), but for real technologies,
it is often "gnd!" & "vdd!".
The Blif parser is modificated to make use of it.
* Bug: In AnabaticEngine::unify(), set the resulting unified segment in
the center of the GCells common side. Gcells under a segment are
found by using the edge that cover the segment axis. When we have
a "bend" GCell stack and the axis is wrong, they could be ommited.
This was causing deleted segments to be not removed from some
Edges, then core dump.
* Change: In Anabatic::AutoSegment::create(), smarter choosing of the
reference contact, select the fixed or terminal one instead of
always the source one.
* New: In Anabatic::Edge::isEnding(), new function to check if a
segment going through an Edge is starting/ending in either source
or target GCell of the edge (active only when running in channel
mode).
* New: In Anabatic::Edge::add(), a segment takes part in the occupancy
only if it is not ending in either source or target (channel mode
only). The occupancy due to terminal is pre-computed in Katana.
* New: In Anabatic::Edge::ripup(), in channel mode, never ripup a
segment which is ending in either source or target (we *have* to
access this edge to connect to the terminal).
* Bug: In Anabatic::GCell::hcut() and vcut(), force the update of
the Edge which is on the side that will get splitted by the cut.
It's capacity will be reduced to it must be updated.
* Change: In Anabatic::GCell::updateGContacts() add a flag to conditionnally
update horizontals or verticals only. We may require only a partial
update when resizing the GCell in only one direction.
This, again, related to the fact that we compute the GCells under
a segment thanks to it's axis position, so we need to be very careful
when modificating axis.
* Change: In Katana::Block::resizeChannels(), only update GContact vertical
position. Do not disturb X positions of segments.
* Bug: In Katana::GlobalRoute::DigitalDistance, in channel mode, some
Edges can have a zero capacity, but still be reachable if the net has
a terminal in either source or target. Look for this case and return
a distance of zero instead of "unreachable". This was causing the
global routing not to complete in channel mode.
For computing the edge distance, makes the vertical edges much more
long (10 times) than the horizontal ones as the vertical capacity is
very limited. Hard coded for now, should make it a parameter in the
future.
* Change: In KatanaEngine::annotateGlobalGraph(), decrease the capacity
of edges with reserveCapacity for each terminal inside a GCell.
Both north and south edges are decreased as we a terminal will
block both north and south edges.
As a counterpart, the Edge capacity is not decreased when the
global router connect to a terminal.
* Change: In Katana::RoutingEvent::revalidate(), when in repair stage,
do not expand the slack for horizontal segments in channel mode.
So they may not overlap the standard cell row.
* Bug: In Stratus documentation, do not use the french option in babel,
the documentation is in english!
* New: In Documentation, added Hurricane/Python tutorial, part for drawing
layout.
2018-03-16 10:20:04 -05:00
< / ul >
< / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../PythonTutorial/Collections.html" > 4. Manipulating Cells, Nets and Components< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/Collections.html#hurricane-collections" > 4.1 Hurricane Collections< / a > < ul >
< li class = "toctree-l4" > < a class = "reference internal" href = "../PythonTutorial/Collections.html#restrictions-about-using-collections" > 4.1.1 Restrictions about using Collections< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/Collections.html#loading-a-cell-with-allianceframework" > 4.2 Loading a Cell with AllianceFramework< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../PythonTutorial/CgtScript.html" > 5. Make a script runnable through < span class = "cb" > cgt< / span > < / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/CgtScript.html#using-breakpoints" > 5.1 Using Breakpoints< / a > < / li >
< / ul >
< / li >
2018-03-18 17:28:49 -05:00
< li class = "toctree-l2" > < a class = "reference internal" href = "../PythonTutorial/Netlist.html" > 6. Making a hierarchical Cell – Netlist< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/Netlist.html#creating-an-instance" > 6.1 Creating an Instance< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/Netlist.html#id1" > 6.2 Creating Nets and connecting to Instances< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/Netlist.html#power-supplies-special-case" > 6.3 Power supplies special case< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/Netlist.html#creating-the-physical-view-of-a-cell-netlist" > 6.4 Creating the physical view of a Cell netlist< / a > < ul >
< li class = "toctree-l4" > < a class = "reference internal" href = "../PythonTutorial/Netlist.html#id2" > 6.4.1 Transformation< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../PythonTutorial/Netlist.html#placing-an-instance" > 6.4.2 Placing an Instance< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../PythonTutorial/Netlist.html#nets-from-plugs-to-routingpads" > 6.4.3 Nets – From Plugs to RoutingPads< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "../PythonTutorial/Netlist.html#nets-regular-wiring" > 6.4.4 Nets – Regular wiring< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/Netlist.html#the-complete-example-file" > 6.5 The Complete Example File< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../PythonTutorial/RealDesigns.html" > 7. Working in real mode< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/RealDesigns.html#loading-a-lef-file" > 7.1 Loading a < span class = "sc" > lef< / span > file< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/RealDesigns.html#loading-a-blif-file-yosys" > 7.2 Loading a < span class = "sc" > blif< / span > file – < span class = "sc" > Yosys< / span > < / a > < / li >
< / ul >
< / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../PythonTutorial/ToolEngines.html" > 8. Tool Engines (CRL Core)< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/ToolEngines.html#placer-etesian" > 8.1 Placer – Etesian< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/ToolEngines.html#router-katana" > 8.1 Router – Katana< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/ToolEngines.html#a-complete-example" > 8.2 A Complete Example< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../PythonTutorial/AdvancedTopics.html" > 9. Advanced Topics< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/AdvancedTopics.html#id1" > 9.1 Occurrence< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/AdvancedTopics.html#id2" > 9.2 RoutingPads< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/AdvancedTopics.html#hypernets" > 9.3 HyperNets< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../PythonTutorial/AdvancedTopics.html#miscellaeous-trans-hierarchical-functions" > 9.4 Miscellaeous trans-hierarchical functions< / a > < / li >
< / ul >
< / li >
Validating channel routing mode (two metals) on SNX.
* New: In Hurricane::Entity, add an id counter limit and a memory size
limit. The two limits are checked only when a new Entity object is
created. This should help avoiding massive memory links.
* New: In CRL Core, add a "crlcore.groundName" and a "crlcore.powerName"
parameter to specify the name of the ground/power signals to be
created if they are missing in a Cell. For Alliance libraries it
would be "vss" & "vdd" (default values), but for real technologies,
it is often "gnd!" & "vdd!".
The Blif parser is modificated to make use of it.
* Bug: In AnabaticEngine::unify(), set the resulting unified segment in
the center of the GCells common side. Gcells under a segment are
found by using the edge that cover the segment axis. When we have
a "bend" GCell stack and the axis is wrong, they could be ommited.
This was causing deleted segments to be not removed from some
Edges, then core dump.
* Change: In Anabatic::AutoSegment::create(), smarter choosing of the
reference contact, select the fixed or terminal one instead of
always the source one.
* New: In Anabatic::Edge::isEnding(), new function to check if a
segment going through an Edge is starting/ending in either source
or target GCell of the edge (active only when running in channel
mode).
* New: In Anabatic::Edge::add(), a segment takes part in the occupancy
only if it is not ending in either source or target (channel mode
only). The occupancy due to terminal is pre-computed in Katana.
* New: In Anabatic::Edge::ripup(), in channel mode, never ripup a
segment which is ending in either source or target (we *have* to
access this edge to connect to the terminal).
* Bug: In Anabatic::GCell::hcut() and vcut(), force the update of
the Edge which is on the side that will get splitted by the cut.
It's capacity will be reduced to it must be updated.
* Change: In Anabatic::GCell::updateGContacts() add a flag to conditionnally
update horizontals or verticals only. We may require only a partial
update when resizing the GCell in only one direction.
This, again, related to the fact that we compute the GCells under
a segment thanks to it's axis position, so we need to be very careful
when modificating axis.
* Change: In Katana::Block::resizeChannels(), only update GContact vertical
position. Do not disturb X positions of segments.
* Bug: In Katana::GlobalRoute::DigitalDistance, in channel mode, some
Edges can have a zero capacity, but still be reachable if the net has
a terminal in either source or target. Look for this case and return
a distance of zero instead of "unreachable". This was causing the
global routing not to complete in channel mode.
For computing the edge distance, makes the vertical edges much more
long (10 times) than the horizontal ones as the vertical capacity is
very limited. Hard coded for now, should make it a parameter in the
future.
* Change: In KatanaEngine::annotateGlobalGraph(), decrease the capacity
of edges with reserveCapacity for each terminal inside a GCell.
Both north and south edges are decreased as we a terminal will
block both north and south edges.
As a counterpart, the Edge capacity is not decreased when the
global router connect to a terminal.
* Change: In Katana::RoutingEvent::revalidate(), when in repair stage,
do not expand the slack for horizontal segments in channel mode.
So they may not overlap the standard cell row.
* Bug: In Stratus documentation, do not use the french option in babel,
the documentation is in english!
* New: In Documentation, added Hurricane/Python tutorial, part for drawing
layout.
2018-03-16 10:20:04 -05:00
< / ul >
< / li >
2017-07-15 10:35:02 -05:00
< li class = "toctree-l1" > < a class = "reference internal" href = "../Stratus/Stratus.html" > Stratus Reference< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../DpGen/DpGen.html" > DpGen Reference< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../Patterns/Patterns.html" > Patterns Reference< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../Hurricane/Hurricane.html" > Hurricane Reference< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../Viewer/Viewer.html" > Viewer Reference< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../CrlCore/CrlCore.html" > CRL Core Reference< / a > < / li >
2017-07-17 12:12:18 -05:00
< li class = "toctree-l1" > < a class = "reference internal" href = "../Katabatic/Katabatic.html" > Katabatic Reference< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../Kite/Kite.html" > Kite Reference< / a > < / li >
2017-07-15 10:35:02 -05:00
< li class = "toctree-l1" > < a class = "reference internal" href = "../Unicorn/Unicorn.html" > Unicorn Reference< / a > < / li >
< li class = "toctree-l1 current" > < a class = "reference internal" href = "index.html" > Hurricane Python/C++ API Tutorial< / a > < ul class = "current" >
< li class = "toctree-l2" > < a class = "reference internal" href = "Introduction.html" > 1. Introduction< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "Introduction.html#first-a-disclaimer" > 1.1 First, A Disclaimer< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "Introduction.html#about-technical-choices" > 1.2 About Technical Choices< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "Introduction.html#botched-design" > 1.3 Botched Design< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "Configuration.html" > 2. Basic File Structure and CMake configuration< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "DBoStandalone.html" > 3. Case 1 - DBo Derived, Standalone< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "DBoStandalone.html#class-associated-header-file" > 3.1 Class Associated Header File< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "DBoStandalone.html#class-associated-file" > 3.2 Class Associated File< / a > < ul >
< li class = "toctree-l4" > < a class = "reference internal" href = "DBoStandalone.html#head-of-the-file" > 3.2.1 Head of the file< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "DBoStandalone.html#the-python-module-part" > 3.2.2 The Python Module Part< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "DBoStandalone.html#python-type-linking" > 3.2.3 Python Type Linking< / a > < / li >
< li class = "toctree-l4" > < a class = "reference internal" href = "DBoStandalone.html#the-shared-library-part" > 3.2.4 The Shared Library Part< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "DBoStandalone.html#python-module-c-namespace" > 3.3 Python Module (C++ namespace)< / a > < / li >
< / ul >
< / li >
2017-10-30 09:33:37 -05:00
< li class = "toctree-l2 current" > < a class = "current reference internal" href = "#" > 4. Case 2 - Hierarchy of DBo Derived Classes< / a > < ul >
2017-07-15 10:35:02 -05:00
< li class = "toctree-l3" > < a class = "reference internal" href = "#base-class-header" > 4.1 Base Class Header< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "#base-class-file" > 4.2 Base Class File< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "#intermediate-class-header" > 4.3 Intermediate Class Header< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "#intermediate-class-file" > 4.4 Intermediate Class File< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "#terminal-class-header" > 4.5 Terminal Class Header< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "#terminal-class-file" > 4.6 Terminal Class File< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "#python-module" > 4.8 Python Module< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "NonDBo.html" > 5. Case 3 - Non-DBo Standalone Classe< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "NonDBo.html#class-header" > 5.1 Class Header< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "NonDBo.html#class-file" > 5.2 Class File< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "NonDBo.html#id1" > 5.2 Class File< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "DbU.html" > 6. Encapsulating DbU< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "Name.html" > 7. No C++ Hurricane::Name encapsulation< / a > < / li >
< / ul >
< / li >
2018-05-04 17:23:44 -05:00
< li class = "toctree-l1" > < a class = "reference internal" href = "../RDS/index.html" > RDS – Symbolic to Real Conversion in Alliance< / a > < ul >
2017-07-15 10:35:02 -05:00
< li class = "toctree-l2" > < a class = "reference internal" href = "../RDS/RDSpage.html" > Symbolic Layout< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "../RDS/RDSpage.html#symbolic-components" > Symbolic Components< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../RDS/RDSpage.html#symbolic-segments" > Symbolic Segments< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../RDS/RDSpage.html#the-rds-file" > The RDS File< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "../RDS/RDSpage.html#physical-grid-lambda-value" > Physical Grid & Lambda Value< / a > < / li >
2017-10-30 09:33:37 -05:00
< li class = "toctree-l3" > < a class = "reference internal" href = "../RDS/RDSpage.html#the-mbk-to-rds-segment-table" > The < code class = "docutils literal" > < span class = "pre" > MBK_TO_RDS_SEGMENT< / span > < / code > table< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../RDS/RDSpage.html#the-mbk-to-rds-via-table" > The < code class = "docutils literal" > < span class = "pre" > MBK_TO_RDS_VIA< / span > < / code > table< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../RDS/RDSpage.html#the-mbk-to-rds-bigvia-hole-table" > The < code class = "docutils literal" > < span class = "pre" > MBK_TO_RDS_BIGVIA_HOLE< / span > < / code > table< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../RDS/RDSpage.html#the-mbk-to-rds-bigvia-metal-table" > The < code class = "docutils literal" > < span class = "pre" > MBK_TO_RDS_BIGVIA_METAL< / span > < / code > table< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../RDS/RDSpage.html#the-mbk-wiresetting-table" > The < code class = "docutils literal" > < span class = "pre" > MBK_WIRESETTING< / span > < / code > table< / a > < / li >
2017-07-15 10:35:02 -05:00
< / ul >
< / li >
< / ul >
< / li >
2017-11-17 05:04:33 -06:00
< li class = "toctree-l1" > < a class = "reference internal" href = "../lefapi/lefapi.html" > LEF API Reference< / a > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "../lefapi/lefapi.html#implementation-notes" > Implementation Notes< / a > < ul >
< li class = "toctree-l3" > < a class = "reference internal" href = "../lefapi/lefapi.html#understanding-units" > Understanding Units< / a > < / li >
< li class = "toctree-l3" > < a class = "reference internal" href = "../lefapi/lefapi.html#callback-calling-order" > Callback Calling Order< / a > < / li >
< / ul >
< / li >
< / ul >
< / li >
2017-10-30 09:33:37 -05:00
< li class = "toctree-l1" > < a class = "reference internal" href = "../defapi/defapi.html" > DEF API Reference< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../lefdef/lefdef.html" > LEF/DEF Language Reference< / a > < / li >
2017-07-15 10:35:02 -05:00
< / ul >
< / div >
< / nav >
< section data-toggle = "wy-nav-shift" class = "wy-nav-content-wrap" >
< nav class = "wy-nav-top" role = "navigation" aria-label = "top navigation" >
< i data-toggle = "wy-nav-top" class = "fa fa-bars" > < / i >
< a href = "../index.html" > Coriolis< / a >
< / nav >
< div class = "wy-nav-content" >
< div class = "rst-content" >
< div role = "navigation" aria-label = "breadcrumbs navigation" >
< ul class = "wy-breadcrumbs" >
< li > < a href = "../index.html" > Docs< / a > » < / li >
< li > < a href = "index.html" > Hurricane Python/C++ API Tutorial< / a > » < / li >
< li > 4. Case 2 - Hierarchy of DBo Derived Classes< / li >
< li class = "wy-breadcrumbs-aside" >
< / li >
< / ul >
< hr / >
< / div >
< div role = "main" class = "document" >
< p > < / p >
< div class = "section" id = "case-2-hierarchy-of-dbo-derived-classes" >
< h1 > 4. Case 2 - Hierarchy of DBo Derived Classes< a class = "headerlink" href = "#case-2-hierarchy-of-dbo-derived-classes" title = "Permalink to this headline" > ¶< / a > < / h1 >
< p > Now we want to export the following C++ class hierarchy into Python:< / p >
2017-10-30 09:33:37 -05:00
< div class = "highlight-default" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > PyEntity< / span > < span class = "o" > < --< / span > < span class = "n" > PyComponent< / span > < span class = "o" > < -+-< / span > < span class = "n" > PyContact< / span >
< span class = "o" > +-< / span > < span class = "n" > PySegment< / span > < span class = "o" > < -+-< / span > < span class = "n" > PyHorizontal< / span >
< span class = "o" > +-< / span > < span class = "n" > PyVertical< / span >
< / pre > < / div >
2017-07-15 10:35:02 -05:00
< / div >
< div class = "section" id = "base-class-header" >
< h2 > 4.1 Base Class Header< a class = "headerlink" href = "#base-class-header" title = "Permalink to this headline" > ¶< / a > < / h2 >
< p > < strong > Remark:< / strong > this is only a partial description of the tree for the sake of
clarity.< / p >
2017-10-30 09:33:37 -05:00
< p > One important fact to remember is that < code class = "docutils literal" > < span class = "pre" > PyEntity< / span > < / code > and < code class = "docutils literal" > < span class = "pre" > PyComponent< / span > < / code >
2017-07-15 10:35:02 -05:00
being related to C++ abstract classes, no objects of those types will be
2017-10-30 09:33:37 -05:00
created, only < code class = "docutils literal" > < span class = "pre" > PyContact< / span > < / code > , < code class = "docutils literal" > < span class = "pre" > PyHorizontal< / span > < / code > or < code class = "docutils literal" > < span class = "pre" > PyVertical< / span > < / code > will.< / p >
< p > The consequence is that there is no < code class = "docutils literal" > < span class = "pre" > PyEntity_Link()< / span > < / code > like in < a class = "reference internal" href = "DBoStandalone.html#id1" > < span class = "std std-ref" > 3.1 Class Associated Header File< / span > < / a >
2017-07-15 10:35:02 -05:00
but instead two functions:< / p >
< ol class = "arabic simple" >
2017-10-30 09:33:37 -05:00
< li > < code class = "docutils literal" > < span class = "pre" > PyEntity_NEW()< / span > < / code > which create the relevant < code class = "docutils literal" > < span class = "pre" > PyEntity< / span > < / code > < em > derived< / em >
object from the < code class = "docutils literal" > < span class = "pre" > Entity< / span > < / code > one. For example, if the < code class = "docutils literal" > < span class = "pre" > Entity*< / span > < / code > given
as argument is in fact a < code class = "docutils literal" > < span class = "pre" > Horizontal*< / span > < / code > , then the function will
return a < code class = "docutils literal" > < span class = "pre" > PyHorizontal*< / span > < / code > .< / li >
< li > < code class = "docutils literal" > < span class = "pre" > EntityCast()< / span > < / code > do the reverse of < code class = "docutils literal" > < span class = "pre" > PyEntity_NEW()< / span > < / code > that is, from
a < code class = "docutils literal" > < span class = "pre" > PyEntity< / span > < / code > , return the C++ < em > derived< / em > object. Again, if the
< code class = "docutils literal" > < span class = "pre" > PyEntity*< / span > < / code > is a < code class = "docutils literal" > < span class = "pre" > PyHorizontal*< / span > < / code > , the function will cast it as
a < code class = "docutils literal" > < span class = "pre" > Horizontal*< / span > < / code > < em > then< / em > return it as an < code class = "docutils literal" > < span class = "pre" > Entity*< / span > < / code > .< / li >
2017-07-15 10:35:02 -05:00
< / ol >
2017-10-30 09:33:37 -05:00
< div class = "highlight-python" > < div class = "highlight" > < pre > < span > < / span > < span class = "c1" > #ifndef ISOBAR_PY_ENTITY_H< / span >
< span class = "c1" > #define ISOBAR_PY_ENTITY_H< / span >
2017-07-15 10:35:02 -05:00
2017-10-30 09:33:37 -05:00
< span class = "c1" > #include " hurricane/isobar/PyHurricane.h" < / span >
< span class = "c1" > #include " hurricane/Entity.h" < / span >
2017-07-15 10:35:02 -05:00
< span class = "n" > namespace< / span > < span class = "n" > Isobar< / span > < span class = "p" > {< / span >
2017-10-30 09:33:37 -05:00
< span class = "n" > extern< / span > < span class = "s2" > " C" < / span > < span class = "p" > {< / span >
2017-07-15 10:35:02 -05:00
< span class = "n" > typedef< / span > < span class = "n" > struct< / span > < span class = "p" > {< / span >
< span class = "n" > PyObject_HEAD< / span >
< span class = "n" > Hurricane< / span > < span class = "p" > ::< / span > < span class = "n" > Entity< / span > < span class = "o" > *< / span > < span class = "n" > _object< / span > < span class = "p" > ;< / span >
< span class = "p" > }< / span > < span class = "n" > PyEntity< / span > < span class = "p" > ;< / span >
< span class = "n" > extern< / span > < span class = "n" > PyObject< / span > < span class = "o" > *< / span > < span class = "n" > PyEntity_NEW< / span > < span class = "p" > (< / span > < span class = "n" > Hurricane< / span > < span class = "p" > ::< / span > < span class = "n" > Entity< / span > < span class = "o" > *< / span > < span class = "n" > entity< / span > < span class = "p" > );< / span >
< span class = "n" > extern< / span > < span class = "n" > void< / span > < span class = "n" > PyEntity_LinkPyType< / span > < span class = "p" > ();< / span >
< span class = "n" > extern< / span > < span class = "n" > PyTypeObject< / span > < span class = "n" > PyTypeEntity< / span > < span class = "p" > ;< / span >
< span class = "n" > extern< / span > < span class = "n" > PyMethodDef< / span > < span class = "n" > PyEntity_Methods< / span > < span class = "p" > [];< / span >
2017-10-30 09:33:37 -05:00
< span class = "c1" > #define IsPyEntity(v) ( (v)-> ob_type == & PyTypeEntity )< / span >
< span class = "c1" > #define PYENTITY(v) ( (PyEntity*)(v) )< / span >
< span class = "c1" > #define PYENTITY_O(v) ( PYENTITY(v)-> _object )< / span >
2017-07-15 10:35:02 -05:00
2017-10-30 09:33:37 -05:00
< span class = "p" > }< / span > < span class = "o" > //< / span > < span class = "n" > extern< / span > < span class = "s2" > " C" < / span > < span class = "o" > .< / span >
2017-07-15 10:35:02 -05:00
< span class = "n" > Hurricane< / span > < span class = "p" > ::< / span > < span class = "n" > Entity< / span > < span class = "o" > *< / span > < span class = "n" > EntityCast< / span > < span class = "p" > (< / span > < span class = "n" > PyObject< / span > < span class = "o" > *< / span > < span class = "n" > derivedObject< / span > < span class = "p" > );< / span >
< span class = "p" > }< / span > < span class = "o" > //< / span > < span class = "n" > Isobar< / span > < span class = "n" > namespace< / span > < span class = "o" > .< / span >
2017-10-30 09:33:37 -05:00
< span class = "c1" > #endif // ISOBAR_PY_ENTITY_H< / span >
2017-07-15 10:35:02 -05:00
< / pre > < / div >
< / div >
< p > < / p >
< / div >
< div class = "section" id = "base-class-file" >
< h2 > 4.2 Base Class File< a class = "headerlink" href = "#base-class-file" title = "Permalink to this headline" > ¶< / a > < / h2 >
2017-10-30 09:33:37 -05:00
< p > Changes from < a class = "reference internal" href = "DBoStandalone.html#class-associated-file" > < span class = "std std-ref" > 3.2 Class Associated File< / span > < / a > are:< / p >
2017-07-15 10:35:02 -05:00
< ol class = "arabic simple" >
2017-10-30 09:33:37 -05:00
< li > No call to < code class = "docutils literal" > < span class = "pre" > DBoLinkCreateMethod()< / span > < / code > because there must be no < code class = "docutils literal" > < span class = "pre" > PyEntity_Link()< / span > < / code > ,
but the definitions of < code class = "docutils literal" > < span class = "pre" > PyEntity_NEW()< / span > < / code > and < code class = "docutils literal" > < span class = "pre" > EntityCast< / span > < / code > .< / li >
< li > For defining the < code class = "docutils literal" > < span class = "pre" > PyTypeEntity< / span > < / code > Python type, we call a different
macro: < code class = "docutils literal" > < span class = "pre" > PyTypeRootObjectDefinitions< / span > < / code > , dedicated to base classes.< / li >
2017-07-15 10:35:02 -05:00
< / ol >
2017-10-30 09:33:37 -05:00
< div class = "highlight-c++" > < div class = "highlight" > < pre > < span > < / span > < span class = "cp" > #include< / span > < span class = "cpf" > " hurricane/isobar/PyCell.h" < / span > < span class = "cp" > < / span >
< span class = "cp" > #include< / span > < span class = "cpf" > " hurricane/isobar/PyHorizontal.h" < / span > < span class = "cp" > < / span >
< span class = "cp" > #include< / span > < span class = "cpf" > " hurricane/isobar/PyVertical.h" < / span > < span class = "cp" > < / span >
< span class = "cp" > #include< / span > < span class = "cpf" > " hurricane/isobar/PyContact.h" < / span > < span class = "cp" > < / span >
2017-07-15 10:35:02 -05:00
< span class = "k" > namespace< / span > < span class = "n" > Isobar< / span > < span class = "p" > {< / span >
< span class = "k" > using< / span > < span class = "k" > namespace< / span > < span class = "n" > Hurricane< / span > < span class = "p" > ;< / span >
< span class = "k" > extern< / span > < span class = "s" > " C" < / span > < span class = "p" > {< / span >
< span class = "cp" > #if defined(__PYTHON_MODULE__)< / span >
< span class = "cp" > #define METHOD_HEAD(function) GENERIC_METHOD_HEAD(Entity,entity,function)< / span >
< span class = "n" > DBoDestroyAttribute< / span > < span class = "p" > (< / span > < span class = "n" > PyEntity_destroy< / span > < span class = "p" > ,< / span > < span class = "n" > PyEntity< / span > < span class = "p" > )< / span >
< span class = "k" > static< / span > < span class = "n" > PyObject< / span > < span class = "o" > *< / span > < span class = "n" > PyEntity_getCell< / span > < span class = "p" > (< / span > < span class = "n" > PyEntity< / span > < span class = "o" > *< / span > < span class = "n" > self< / 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 >
2017-10-30 09:33:37 -05:00
< span class = "nf" > METHOD_HEAD< / span > < span class = "p" > (< / span > < span class = "s" > " Entity.getCell()" )< / span >
2017-07-15 10:35:02 -05:00
< 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 >
2017-10-30 09:33:37 -05:00
< span class = "k" > return< / span > < span class = "nf" > PyCell_Link< / span > < span class = "p" > (< / span > < span class = "n" > cell< / span > < span class = "p" > );< / span >
2017-07-15 10:35:02 -05:00
< span class = "p" > }< / span >
< span class = "n" > PyMethodDef< / span > < span class = "n" > PyEntity_Methods< / span > < span class = "p" > []< / span > < span class = "o" > =< / span >
< span class = "p" > {< / span > < span class = "p" > {< / span > < span class = "s" > " getCell" < / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > PyCFunction< / span > < span class = "p" > )< / span > < span class = "n" > PyEntity_getCell< / span > < span class = "p" > ,< / span > < span class = "n" > METH_NOARGS< / span >
< span class = "p" > ,< / span > < span class = "s" > " Returns the entity cell." < / span > < span class = "p" > }< / span >
< span class = "p" > ,< / span > < span class = "p" > {< / span > < span class = "s" > " destroy" < / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > PyCFunction< / span > < span class = "p" > )< / span > < span class = "n" > PyEntity_destroy< / span > < span class = "p" > ,< / span > < span class = "n" > METH_NOARGS< / span >
< span class = "p" > ,< / span > < span class = "s" > " Destroy associated hurricane object, the python object remains." < / span > < span class = "p" > }< / span >
< span class = "p" > ,< / span > < span class = "p" > {< / span > < span class = "nb" > NULL< / span > < span class = "p" > ,< / span > < span class = "nb" > NULL< / span > < span class = "p" > ,< / span > < span class = "mi" > 0< / span > < span class = "p" > ,< / span > < span class = "nb" > NULL< / span > < span class = "p" > }< / span > < span class = "cm" > /* sentinel */< / span >
< span class = "p" > };< / span >
< span class = "n" > DBoDeleteMethod< / span > < span class = "p" > (< / span > < span class = "n" > Entity< / span > < span class = "p" > )< / span >
< span class = "n" > PyTypeObjectLinkPyType< / span > < span class = "p" > (< / span > < span class = "n" > Entity< / span > < span class = "p" > )< / span >
< span class = "cp" > #else < / span > < span class = "c1" > // End of Python Module Code Part.< / span >
< span class = "n" > PyObject< / span > < span class = "o" > *< / span > < span class = "n" > PyEntity_NEW< / span > < span class = "p" > (< / span > < span class = "n" > Entity< / span > < span class = "o" > *< / span > < span class = "n" > entity< / 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" > entity< / span > < span class = "p" > )< / span > < span class = "p" > {< / span >
< span class = "n" > PyErr_SetString< / span > < span class = "p" > (< / span > < span class = "n" > HurricaneError< / span > < span class = "p" > ,< / span > < span class = "s" > " Invalid Entity (bad occurrence)" < / span > < span class = "p" > );< / span >
< span class = "k" > return< / span > < span class = "nb" > NULL< / span > < span class = "p" > ;< / span >
< span class = "p" > }< / span >
< span class = "n" > Horizontal< / span > < span class = "o" > *< / span > < span class = "n" > horizontal< / span > < span class = "o" > =< / span > < span class = "k" > dynamic_cast< / span > < span class = "o" > < < / span > < span class = "n" > Horizontal< / span > < span class = "o" > *> < / span > < span class = "p" > (< / span > < span class = "n" > entity< / span > < span class = "p" > );< / span >
< span class = "k" > if< / span > < span class = "p" > (< / span > < span class = "n" > horizontal< / span > < span class = "p" > )< / span > < span class = "k" > return< / span > < span class = "n" > PyHorizontal_Link< / span > < span class = "p" > (< / span > < span class = "n" > horizontal< / span > < span class = "p" > );< / span >
< span class = "n" > Vertical< / span > < span class = "o" > *< / span > < span class = "n" > vertical< / span > < span class = "o" > =< / span > < span class = "k" > dynamic_cast< / span > < span class = "o" > < < / span > < span class = "n" > Vertical< / span > < span class = "o" > *> < / span > < span class = "p" > (< / span > < span class = "n" > entity< / span > < span class = "p" > );< / span >
< span class = "k" > if< / span > < span class = "p" > (< / span > < span class = "n" > vertical< / span > < span class = "p" > )< / span > < span class = "k" > return< / span > < span class = "n" > PyVertical_Link< / span > < span class = "p" > (< / span > < span class = "n" > vertical< / 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 = "k" > dynamic_cast< / span > < span class = "o" > < < / span > < span class = "n" > Contact< / span > < span class = "o" > *> < / span > < span class = "p" > (< / span > < span class = "n" > entity< / span > < span class = "p" > );< / span >
< span class = "k" > if< / span > < span class = "p" > (< / span > < span class = "n" > contact< / span > < span class = "p" > )< / span > < span class = "k" > return< / span > < span class = "n" > PyContact_Link< / span > < span class = "p" > (< / span > < span class = "n" > contact< / span > < span class = "p" > );< / span >
< span class = "n" > Py_RETURN_NONE< / span > < span class = "p" > ;< / span >
< span class = "p" > }< / span >
< span class = "n" > PyTypeRootObjectDefinitions< / span > < span class = "p" > (< / span > < span class = "n" > Entity< / span > < span class = "p" > )< / span >
< span class = "cp" > #endif < / span > < span class = "c1" > // Shared Library Code Part (1).< / span >
< span class = "p" > }< / span > < span class = "c1" > // extern " C" .< / span >
< span class = "cp" > #if !defined(__PYTHON_MODULE__)< / span >
< span class = "n" > Hurricane< / span > < span class = "o" > ::< / span > < span class = "n" > Entity< / span > < span class = "o" > *< / span > < span class = "n" > EntityCast< / span > < span class = "p" > (< / span > < span class = "n" > PyObject< / span > < span class = "o" > *< / span > < span class = "n" > derivedObject< / span > < span class = "p" > )< / span > < span class = "p" > {< / span >
< span class = "k" > if< / span > < span class = "p" > (< / span > < span class = "n" > IsPyHorizontal< / span > < span class = "p" > (< / span > < span class = "n" > derivedObject< / span > < span class = "p" > ))< / span > < span class = "k" > return< / span > < span class = "n" > PYHORIZONTAL_O< / span > < span class = "p" > (< / span > < span class = "n" > derivedObject< / span > < span class = "p" > );< / span >
< span class = "k" > if< / span > < span class = "p" > (< / span > < span class = "n" > IsPyVertical< / span > < span class = "p" > (< / span > < span class = "n" > derivedObject< / span > < span class = "p" > ))< / span > < span class = "k" > return< / span > < span class = "n" > PYVERTICAL_O< / span > < span class = "p" > (< / span > < span class = "n" > derivedObject< / span > < span class = "p" > );< / span >
< span class = "k" > if< / span > < span class = "p" > (< / span > < span class = "n" > IsPyContact< / span > < span class = "p" > (< / span > < span class = "n" > derivedObject< / span > < span class = "p" > ))< / span > < span class = "k" > return< / span > < span class = "n" > PYCONTACT_O< / span > < span class = "p" > (< / span > < span class = "n" > derivedObject< / span > < span class = "p" > );< / span >
< span class = "k" > return< / span > < span class = "nb" > NULL< / span > < span class = "p" > ;< / span >
< span class = "p" > }< / span >
< span class = "cp" > #endif < / span > < span class = "c1" > // Shared Library Code Part (2).< / span >
< span class = "p" > }< / span > < span class = "c1" > // Isobar namespace.< / span >
< / pre > < / div >
< / div >
< p > < / p >
< / div >
< div class = "section" id = "intermediate-class-header" >
< h2 > 4.3 Intermediate Class Header< a class = "headerlink" href = "#intermediate-class-header" title = "Permalink to this headline" > ¶< / a > < / h2 >
2017-10-30 09:33:37 -05:00
< p > Changes from < a class = "reference internal" href = "DBoStandalone.html#class-associated-header-file" > < span class = "std std-ref" > 3.1 Class Associated Header File< / span > < / a > are:< / p >
2017-07-15 10:35:02 -05:00
< ol class = "arabic simple" >
2017-10-30 09:33:37 -05:00
< li > As for < code class = "docutils literal" > < span class = "pre" > PyEntity< / span > < / code > , and because this is still an abstract class,
there is no < code class = "docutils literal" > < span class = "pre" > PyComponent_Link()< / span > < / code > function.< / li >
< li > The definition of the < code class = "docutils literal" > < span class = "pre" > PyComponent< / span > < / code > < span class = "cb" > struct< / span > is differs. There is
no < code class = "docutils literal" > < span class = "pre" > PyObject_HEAD< / span > < / code > (it is a Python < em > derived< / em > class). The only
field is of the base class type < code class = "docutils literal" > < span class = "pre" > PyEntity< / span > < / code > and for use with
Coriolis macros, < strong > it must< / strong > be named < code class = "docutils literal" > < span class = "pre" > _baseObject< / span > < / code > (note that
2017-07-15 10:35:02 -05:00
this is < em > not< / em > a pointer but a whole object).< / li >
< / ol >
2017-10-30 09:33:37 -05:00
< div class = "highlight-c++" > < div class = "highlight" > < pre > < span > < / span > < span class = "cp" > #ifndef ISOBAR_PY_COMPONENT_H< / span >
2017-07-15 10:35:02 -05:00
< span class = "cp" > #define ISOBAR_PY_COMPONENT_H< / span >
2017-10-30 09:33:37 -05:00
< span class = "cp" > #include< / span > < span class = "cpf" > " hurricane/isobar/PyEntity.h" < / span > < span class = "cp" > < / span >
< span class = "cp" > #include< / span > < span class = "cpf" > " hurricane/Component.h" < / span > < span class = "cp" > < / span >
2017-07-15 10:35:02 -05:00
< span class = "k" > namespace< / span > < span class = "n" > Isobar< / span > < span class = "p" > {< / span >
< span class = "k" > extern< / span > < span class = "s" > " C" < / span > < span class = "p" > {< / span >
< span class = "k" > typedef< / span > < span class = "k" > struct< / span > < span class = "p" > {< / span >
< span class = "n" > PyEntity< / span > < span class = "n" > _baseObject< / span > < span class = "p" > ;< / span >
< span class = "p" > }< / span > < span class = "n" > PyComponent< / span > < span class = "p" > ;< / span >
< span class = "k" > extern< / span > < span class = "n" > PyTypeObject< / span > < span class = "n" > PyTypeComponent< / span > < span class = "p" > ;< / span >
< span class = "k" > extern< / span > < span class = "n" > PyMethodDef< / span > < span class = "n" > PyComponent_Methods< / span > < span class = "p" > [];< / span >
2017-10-30 09:33:37 -05:00
< span class = "k" > extern< / span > < span class = "kt" > void< / span > < span class = "nf" > PyComponent_LinkPyType< / span > < span class = "p" > ();< / span >
2017-07-15 10:35:02 -05:00
< span class = "cp" > #define IsPyComponent(v) ((v)-> ob_type == & PyTypeComponent)< / span >
< span class = "cp" > #define PYCOMPONENT(v) ((PyComponent*)(v))< / span >
< span class = "cp" > #define PYCOMPONENT_O(v) (static_cast< Component*> (PYCOMPONENT(v)-> _baseObject._object))< / span >
< span class = "p" > }< / span > < span class = "c1" > // extern " C" .< / span >
< span class = "p" > }< / span > < span class = "c1" > // Isobar namespace.< / span >
< span class = "cp" > #endif< / span >
< / pre > < / div >
< / div >
< / div >
< div class = "section" id = "intermediate-class-file" >
< h2 > 4.4 Intermediate Class File< a class = "headerlink" href = "#intermediate-class-file" title = "Permalink to this headline" > ¶< / a > < / h2 >
2017-10-30 09:33:37 -05:00
< p > Changes from < a class = "reference internal" href = "DBoStandalone.html#class-associated-file" > < span class = "std std-ref" > 3.2 Class Associated File< / span > < / a > are:< / p >
2017-07-15 10:35:02 -05:00
< ol class = "arabic simple" >
2017-10-30 09:33:37 -05:00
< li > Redefinition of the default macros < code class = "docutils literal" > < span class = "pre" > ACCESS_OBJECT< / span > < / code > and < code class = "docutils literal" > < span class = "pre" > ACCESS_CLASS< / span > < / code > .< ul >
< li > The pointer to the C++ encapsulated object (attribute < code class = "docutils literal" > < span class = "pre" > _object< / span > < / code > ) is hold
by the base class < code class = "docutils literal" > < span class = "pre" > PyEntity< / span > < / code > . The < code class = "docutils literal" > < span class = "pre" > ACCESS_OBJECT< / span > < / code > macro which is tasked
to give access to that attribute is then < code class = "docutils literal" > < span class = "pre" > _baseObject._object< / span > < / code > as
< code class = "docutils literal" > < span class = "pre" > PyComponent< / span > < / code > is a direct derived class of < code class = "docutils literal" > < span class = "pre" > PyEntity< / span > < / code > .< / li >
< li > < code class = "docutils literal" > < span class = "pre" > ACCESS_CLASS< / span > < / code > is similar to < code class = "docutils literal" > < span class = "pre" > ACCESS_OBJECT< / span > < / code > for accessing the base
class, that is a pointer to < code class = "docutils literal" > < span class = "pre" > PyEntity< / span > < / code > .< / li >
2017-07-15 10:35:02 -05:00
< / ul >
< / li >
< / ol >
< p > < / p >
< ol class = "arabic simple" start = "2" >
2017-10-30 09:33:37 -05:00
< li > For defining the < code class = "docutils literal" > < span class = "pre" > PyTypeComponent< / span > < / code > Python type, we call a yet different
macro: < code class = "docutils literal" > < span class = "pre" > PyTypeInheritedObjectDefinitions()< / span > < / code > , dedicated to derived classes.
2017-07-15 10:35:02 -05:00
For this this macro we need to give as argument the derived class and the
base class.< / li >
< / ol >
2017-10-30 09:33:37 -05:00
< div class = "highlight-c++" > < div class = "highlight" > < pre > < span > < / span > < span class = "cp" > #include< / span > < span class = "cpf" > " hurricane/isobar/PyComponent.h" < / span > < span class = "cp" > < / span >
< span class = "cp" > #include< / span > < span class = "cpf" > " hurricane/isobar/PyNet.h" < / span > < span class = "cp" > < / span >
2017-07-15 10:35:02 -05:00
< span class = "k" > namespace< / span > < span class = "n" > Isobar< / span > < span class = "p" > {< / span >
< span class = "k" > using< / span > < span class = "k" > namespace< / span > < span class = "n" > Hurricane< / span > < span class = "p" > ;< / span >
< span class = "k" > extern< / span > < span class = "s" > " C" < / span > < span class = "p" > {< / span >
< span class = "cp" > #undef ACCESS_OBJECT< / span >
< span class = "cp" > #undef ACCESS_CLASS< / span >
< span class = "cp" > #define ACCESS_OBJECT _baseObject._object< / span >
< span class = "cp" > #define ACCESS_CLASS(_pyObject) & (_pyObject-> _baseObject)< / span >
< span class = "cp" > #define METHOD_HEAD(function) GENERIC_METHOD_HEAD(Component,component,function)< / span >
< span class = "cp" > #if defined(__PYTHON_MODULE__)< / span >
< span class = "n" > DirectGetLongAttribute< / span > < span class = "p" > (< / span > < span class = "n" > PyComponent_getX< / span > < span class = "p" > ,< / span > < span class = "n" > getX< / span > < span class = "p" > ,< / span > < span class = "n" > PyComponent< / span > < span class = "p" > ,< / span > < span class = "n" > Component< / span > < span class = "p" > )< / span >
< span class = "n" > DirectGetLongAttribute< / span > < span class = "p" > (< / span > < span class = "n" > PyComponent_getY< / span > < span class = "p" > ,< / span > < span class = "n" > getY< / span > < span class = "p" > ,< / span > < span class = "n" > PyComponent< / span > < span class = "p" > ,< / span > < span class = "n" > Component< / span > < span class = "p" > )< / span >
< span class = "n" > DBoDestroyAttribute< / span > < span class = "p" > (< / span > < span class = "n" > PyComponent_destroy< / span > < span class = "p" > ,< / span > < span class = "n" > PyComponent< / span > < span class = "p" > )< / span >
< span class = "k" > static< / span > < span class = "n" > PyObject< / span > < span class = "o" > *< / span > < span class = "n" > PyComponent_getNet< / span > < span class = "p" > (< / span > < span class = "n" > PyComponent< / span > < span class = "o" > *< / span > < span class = "n" > self< / span > < span class = "p" > )< / span >
< span class = "p" > {< / span >
< span class = "n" > Net< / span > < span class = "o" > *< / span > < span class = "n" > net< / span > < span class = "o" > =< / span > < span class = "nb" > NULL< / span > < span class = "p" > ;< / span >
< span class = "n" > HTRY< / span >
2017-10-30 09:33:37 -05:00
< span class = "nf" > METHOD_HEAD< / span > < span class = "p" > (< / span > < span class = "s" > " Component.getNet()" )< / span >
2017-07-15 10:35:02 -05:00
< 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 >
2017-10-30 09:33:37 -05:00
< span class = "k" > return< / span > < span class = "nf" > PyNet_Link< / span > < span class = "p" > (< / span > < span class = "n" > net< / span > < span class = "p" > );< / span >
2017-07-15 10:35:02 -05:00
< span class = "p" > }< / span >
< span class = "n" > PyMethodDef< / span > < span class = "n" > PyComponent_Methods< / span > < span class = "p" > []< / span > < span class = "o" > =< / span >
< span class = "p" > {< / span > < span class = "p" > {< / span > < span class = "s" > " getX" < / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > PyCFunction< / span > < span class = "p" > )< / span > < span class = "n" > PyComponent_getX< / span > < span class = "p" > ,< / span > < span class = "n" > METH_NOARGS< / span >
< span class = "p" > ,< / span > < span class = "s" > " Return the Component X value." < / span > < span class = "p" > }< / span >
< span class = "p" > ,< / span > < span class = "p" > {< / span > < span class = "s" > " getY" < / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > PyCFunction< / span > < span class = "p" > )< / span > < span class = "n" > PyComponent_getY< / span > < span class = "p" > ,< / span > < span class = "n" > METH_NOARGS< / span >
< span class = "p" > ,< / span > < span class = "s" > " Return the Component Y value." < / span > < span class = "p" > }< / span >
< span class = "p" > ,< / span > < span class = "p" > {< / span > < span class = "s" > " getNet" < / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > PyCFunction< / span > < span class = "p" > )< / span > < span class = "n" > PyComponent_getNet< / span > < span class = "p" > ,< / span > < span class = "n" > METH_NOARGS< / span >
< span class = "p" > ,< / span > < span class = "s" > " Returns the net owning the component." < / span > < span class = "p" > }< / span >
< span class = "p" > ,< / span > < span class = "p" > {< / span > < span class = "s" > " destroy" < / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > PyCFunction< / span > < span class = "p" > )< / span > < span class = "n" > PyComponent_destroy< / span > < span class = "p" > ,< / span > < span class = "n" > METH_NOARGS< / span >
< span class = "p" > ,< / span > < span class = "s" > " destroy associated hurricane object, the python object remains." < / span > < span class = "p" > }< / span >
< span class = "p" > ,< / span > < span class = "p" > {< / span > < span class = "nb" > NULL< / span > < span class = "p" > ,< / span > < span class = "nb" > NULL< / span > < span class = "p" > ,< / span > < span class = "mi" > 0< / span > < span class = "p" > ,< / span > < span class = "nb" > NULL< / span > < span class = "p" > }< / span > < span class = "cm" > /* sentinel */< / span >
< span class = "p" > };< / span >
< span class = "n" > DBoDeleteMethod< / span > < span class = "p" > (< / span > < span class = "n" > Component< / span > < span class = "p" > )< / span >
< span class = "n" > PyTypeObjectLinkPyType< / span > < span class = "p" > (< / span > < span class = "n" > Component< / span > < span class = "p" > )< / span >
< span class = "cp" > #else < / span > < span class = "c1" > // Python Module Code Part.< / span >
< span class = "n" > PyTypeInheritedObjectDefinitions< / span > < span class = "p" > (< / span > < span class = "n" > Component< / span > < span class = "p" > ,< / span > < span class = "n" > Entity< / span > < span class = "p" > )< / span >
< span class = "cp" > #endif < / span > < span class = "c1" > // Shared Library Code Part.< / span >
< span class = "p" > }< / span > < span class = "c1" > // extern " C" .< / span >
< span class = "p" > }< / span > < span class = "c1" > // Isobar namespace.< / span >
< / pre > < / div >
< / div >
< / div >
< div class = "section" id = "terminal-class-header" >
< h2 > 4.5 Terminal Class Header< a class = "headerlink" href = "#terminal-class-header" title = "Permalink to this headline" > ¶< / a > < / h2 >
< p > The contents of this file is almost identical to < a class = "reference internal" href = "#intermediate-class-header" > 4.3 Intermediate Class Header< / a > ,
2017-10-30 09:33:37 -05:00
save for the presence of a < code class = "docutils literal" > < span class = "pre" > PyContact_Link()< / span > < / code > function. She is present
2017-07-15 10:35:02 -05:00
at this level because the class is a concrete one and can be instanciated.< / p >
2017-10-30 09:33:37 -05:00
< div class = "highlight-c++" > < div class = "highlight" > < pre > < span > < / span > < span class = "cp" > #ifndef ISOBAR_PY_CONTACT_H< / span >
2017-07-15 10:35:02 -05:00
< span class = "cp" > #define ISOBAR_PY_CONTACT_H< / span >
2017-10-30 09:33:37 -05:00
< span class = "cp" > #include< / span > < span class = "cpf" > " hurricane/isobar/PyComponent.h" < / span > < span class = "cp" > < / span >
< span class = "cp" > #include< / span > < span class = "cpf" > " hurricane/Contact.h" < / span > < span class = "cp" > < / span >
2017-07-15 10:35:02 -05:00
< span class = "k" > namespace< / span > < span class = "n" > Isobar< / span > < span class = "p" > {< / span >
< span class = "k" > extern< / span > < span class = "s" > " C" < / span > < span class = "p" > {< / span >
< span class = "k" > typedef< / span > < span class = "k" > struct< / span > < span class = "p" > {< / span >
< span class = "n" > PyComponent< / span > < span class = "n" > _baseObject< / span > < span class = "p" > ;< / span >
< span class = "p" > }< / span > < span class = "n" > PyContact< / span > < span class = "p" > ;< / span >
< span class = "k" > extern< / span > < span class = "n" > PyTypeObject< / span > < span class = "n" > PyTypeContact< / span > < span class = "p" > ;< / span >
< span class = "k" > extern< / span > < span class = "n" > PyMethodDef< / span > < span class = "n" > PyContact_Methods< / span > < span class = "p" > [];< / span >
2017-10-30 09:33:37 -05:00
< 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 >
2017-07-15 10:35:02 -05:00
< span class = "cp" > #define IsPyContact(v) ( (v)-> ob_type == & PyTypeContact )< / span >
< span class = "cp" > #define PYCONTACT(v) ( (PyContact*)(v) )< / span >
< span class = "cp" > #define PYCONTACT_O(v) ( PYCONTACT(v)-> _baseObject._baseObject._object )< / span >
< span class = "p" > }< / span > < span class = "c1" > // extern " C" .< / span >
< span class = "p" > }< / span > < span class = "c1" > // Isobar namespace.< / span >
< span class = "cp" > #endif < / span > < span class = "c1" > // ISOBAR_PY_CONTACT_H< / span >
< / pre > < / div >
< / div >
< / div >
< div class = "section" id = "terminal-class-file" >
< h2 > 4.6 Terminal Class File< a class = "headerlink" href = "#terminal-class-file" title = "Permalink to this headline" > ¶< / a > < / h2 >
< p > Changes from < a class = "reference internal" href = "#intermediate-class-file" > 4.4 Intermediate Class File< / a > are:< / p >
< ol class = "arabic simple" >
2017-10-30 09:33:37 -05:00
< li > As previously, we have to redefine the macros < code class = "docutils literal" > < span class = "pre" > ACCESS_OBJECT< / span > < / code > and < code class = "docutils literal" > < span class = "pre" > ACCESS_CLASS< / span > < / code > .
2017-07-15 10:35:02 -05:00
But, as we are one level deeper into the hierarchy, one more level of
2017-10-30 09:33:37 -05:00
indirection using < code class = "docutils literal" > < span class = "pre" > _baseObject< / span > < / code > must be used.< ul >
< li > < code class = "docutils literal" > < span class = "pre" > ACCESS_OBJECT< / span > < / code > becomes < code class = "docutils literal" > < span class = "pre" > _baseObject._baseObject._object< / span > < / code > .< / li >
< li > < code class = "docutils literal" > < span class = "pre" > ACCESS_CLASS< / span > < / code > becomes < code class = "docutils literal" > < span class = "pre" > & (_pyObject-> _baseObject._baseObject)< / span > < / code > .< / li >
2017-07-15 10:35:02 -05:00
< / ul >
< / li >
2017-10-30 09:33:37 -05:00
< li > For defining the < code class = "docutils literal" > < span class = "pre" > PyTypeContact< / span > < / code > Python type, we call again
< code class = "docutils literal" > < span class = "pre" > PyTypeInheritedObjectDefinitions()< / span > < / code > . It is the same whether the class is
2017-07-15 10:35:02 -05:00
terminal or not.< / li >
< li > And, this time, as the Python class is concrete, we call the macro
2017-10-30 09:33:37 -05:00
< code class = "docutils literal" > < span class = "pre" > DBoLinkCreateMethod()< / span > < / code > to create the < code class = "docutils literal" > < span class = "pre" > PyContact_Link()< / span > < / code > function.< / li >
2017-07-15 10:35:02 -05:00
< / ol >
2017-10-30 09:33:37 -05:00
< div class = "highlight-c++" > < div class = "highlight" > < pre > < span > < / span > < span class = "cp" > #include< / span > < span class = "cpf" > " hurricane/isobar/PyContact.h" < / span > < span class = "cp" > < / span >
2017-07-15 10:35:02 -05:00
< span class = "k" > namespace< / span > < span class = "n" > Isobar< / span > < span class = "p" > {< / span >
< span class = "k" > using< / span > < span class = "k" > namespace< / span > < span class = "n" > Hurricane< / span > < span class = "p" > ;< / span >
< span class = "k" > extern< / span > < span class = "s" > " C" < / span > < span class = "p" > {< / span >
< span class = "cp" > #undef ACCESS_OBJECT< / span >
< span class = "cp" > #undef ACCESS_CLASS< / span >
< span class = "cp" > #define ACCESS_OBJECT _baseObject._baseObject._object< / span >
< span class = "cp" > #define ACCESS_CLASS(_pyObject) & (_pyObject-> _baseObject._baseObject)< / span >
< span class = "cp" > #define METHOD_HEAD(function) GENERIC_METHOD_HEAD(Contact,contact,function)< / span >
< span class = "cp" > #if defined(__PYTHON_MODULE__)< / span >
< span class = "n" > DirectGetLongAttribute< / span > < span class = "p" > (< / span > < span class = "n" > PyContact_getWidth< / span > < span class = "p" > ,< / span > < span class = "n" > getWidth< / span > < span class = "p" > ,< / span > < span class = "n" > PyContact< / span > < span class = "p" > ,< / span > < span class = "n" > Contact< / span > < span class = "p" > )< / span >
< span class = "n" > DirectGetLongAttribute< / span > < span class = "p" > (< / span > < span class = "n" > PyContact_getHeight< / span > < span class = "p" > ,< / span > < span class = "n" > getHeight< / span > < span class = "p" > ,< / span > < span class = "n" > PyContact< / span > < span class = "p" > ,< / span > < span class = "n" > Contact< / span > < span class = "p" > )< / span >
< span class = "n" > DBoDestroyAttribute< / span > < span class = "p" > (< / span > < span class = "n" > PyContact_destroy< / span > < span class = "p" > ,< / span > < span class = "n" > PyContact< / span > < span class = "p" > )< / 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 >
< span class = "c1" > // Usual signature then arguments parsing.< / span >
< span class = "n" > HCATCH< / span >
< span class = "k" > return< / span > < span class = "n" > PyContact_Link< / span > < span class = "p" > (< / span > < span class = "n" > contact< / span > < span class = "p" > );< / span >
< span class = "p" > }< / span >
< span class = "n" > PyMethodDef< / span > < span class = "n" > PyContact_Methods< / span > < span class = "p" > []< / span > < span class = "o" > =< / span >
< span class = "p" > {< / span > < span class = "p" > {< / span > < span class = "s" > " create" < / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > PyCFunction< / span > < span class = "p" > )< / span > < span class = "n" > PyContact_create< / span > < span class = "p" > ,< / span > < span class = "n" > METH_VARARGS< / span > < span class = "o" > |< / span > < span class = "n" > METH_STATIC< / span >
< span class = "p" > ,< / span > < span class = "s" > " Create a new Contact." < / span > < span class = "p" > }< / span >
< span class = "p" > ,< / span > < span class = "p" > {< / span > < span class = "s" > " destroy" < / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > PyCFunction< / span > < span class = "p" > )< / span > < span class = "n" > PyContact_destroy< / span > < span class = "p" > ,< / span > < span class = "n" > METH_NOARGS< / span >
< span class = "p" > ,< / span > < span class = "s" > " Destroy associated hurricane object, the python object remains." < / span > < span class = "p" > }< / span >
< span class = "p" > ,< / span > < span class = "p" > {< / span > < span class = "s" > " getWidth" < / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > PyCFunction< / span > < span class = "p" > )< / span > < span class = "n" > PyContact_getWidth< / span > < span class = "p" > ,< / span > < span class = "n" > METH_NOARGS< / span >
< span class = "p" > ,< / span > < span class = "s" > " Return the contact width." < / span > < span class = "p" > }< / span >
< span class = "p" > ,< / span > < span class = "p" > {< / span > < span class = "s" > " getHeight" < / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > PyCFunction< / span > < span class = "p" > )< / span > < span class = "n" > PyContact_getHeight< / span > < span class = "p" > ,< / span > < span class = "n" > METH_NOARGS< / span >
< span class = "p" > ,< / span > < span class = "s" > " Return the contact height." < / span > < span class = "p" > }< / span >
< span class = "p" > ,< / span > < span class = "p" > {< / span > < span class = "nb" > NULL< / span > < span class = "p" > ,< / span > < span class = "nb" > NULL< / span > < span class = "p" > ,< / span > < span class = "mi" > 0< / span > < span class = "p" > ,< / span > < span class = "nb" > NULL< / span > < span class = "p" > }< / span > < span class = "cm" > /* sentinel */< / span >
< span class = "p" > };< / span >
< span class = "n" > DBoDeleteMethod< / span > < span class = "p" > (< / span > < span class = "n" > Contact< / span > < span class = "p" > )< / span >
< span class = "n" > PyTypeObjectLinkPyType< / span > < span class = "p" > (< / span > < span class = "n" > Contact< / span > < span class = "p" > )< / span >
< span class = "cp" > #else < / span > < span class = "c1" > // Python Module Code Part.< / span >
< span class = "n" > DBoLinkCreateMethod< / span > < span class = "p" > (< / span > < span class = "n" > Contact< / span > < span class = "p" > )< / span >
< span class = "n" > PyTypeInheritedObjectDefinitions< / span > < span class = "p" > (< / span > < span class = "n" > Contact< / span > < span class = "p" > ,< / span > < span class = "n" > Component< / span > < span class = "p" > )< / span >
< span class = "cp" > #endif < / span > < span class = "c1" > // Shared Library Code Part.< / span >
< span class = "p" > }< / span > < span class = "c1" > // extern " C" .< / span >
< span class = "p" > }< / span > < span class = "c1" > // Isobar namespace.< / span >
< / pre > < / div >
< / div >
< / div >
< div class = "section" id = "python-module" >
< h2 > 4.8 Python Module< a class = "headerlink" href = "#python-module" title = "Permalink to this headline" > ¶< / a > < / h2 >
2017-10-30 09:33:37 -05:00
< div class = "highlight-c++" > < div class = "highlight" > < pre > < span > < / span > < span class = "n" > DL_EXPORT< / span > < span class = "p" > (< / span > < span class = "kt" > void< / span > < span class = "p" > )< / span > < span class = "n" > initHurricane< / span > < span class = "p" > ()< / span >
2017-07-15 10:35:02 -05:00
< span class = "p" > {< / span >
< span class = "n" > PyEntity_LinkPyType< / span > < span class = "p" > ();< / span > < span class = "c1" > // step 1.< / span >
< span class = "n" > PyComponent_LinkPyType< / span > < span class = "p" > ();< / span >
< span class = "n" > PyContact_LinkPyType< / span > < span class = "p" > ();< / span >
< span class = "n" > PYTYPE_READY< / span > < span class = "p" > (< / span > < span class = "n" > Entity< / span > < span class = "p" > )< / span > < span class = "c1" > // step 2.< / span >
< span class = "n" > PYTYPE_READY_SUB< / span > < span class = "p" > (< / span > < span class = "n" > Component< / span > < span class = "p" > ,< / span > < span class = "n" > Entity< / span > < span class = "p" > )< / span >
< span class = "n" > PYTYPE_READY_SUB< / span > < span class = "p" > (< / span > < span class = "n" > Contact< / span > < span class = "p" > ,< / span > < span class = "n" > Component< / span > < span class = "p" > )< / span >
2017-10-30 09:33:37 -05:00
< span class = "n" > __cs< / span > < span class = "p" > .< / span > < span class = "n" > addType< / span > < span class = "p" > (< / span > < span class = "s" > " ent" < / span > < span class = "p" > ,< / span > < span class = "o" > & < / span > < span class = "n" > PyTypeEntity< / span > < span class = "p" > ,< / span > < span class = "s" > " < Entity> " < / span > < span class = "p" > ,< / span > < span class = "nb" > false< / span > < span class = "p" > );< / span > < span class = "c1" > // step 3.< / span >
< span class = "n" > __cs< / span > < span class = "p" > .< / span > < span class = "n" > addType< / span > < span class = "p" > (< / span > < span class = "s" > " 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 >
2017-07-15 10:35:02 -05:00
< 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" > 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 = "p" > }< / span >
< / pre > < / div >
< / div >
< / div >
< / div >
< / div >
< footer >
< div class = "rst-footer-buttons" role = "navigation" aria-label = "footer navigation" >
< a href = "NonDBo.html" class = "btn btn-neutral float-right" title = "5. Case 3 - Non-DBo Standalone Classe" accesskey = "n" > Next < span class = "fa fa-arrow-circle-right" > < / span > < / a >
< a href = "DBoStandalone.html" class = "btn btn-neutral" title = "3. Case 1 - DBo Derived, Standalone" accesskey = "p" > < span class = "fa fa-arrow-circle-left" > < / span > Previous< / a >
< / div >
< hr / >
< div role = "contentinfo" >
< table class = "footer1" >
< tr >
< td class = "LFooter" > < small >
Generated by < a href = "http://sphinx-doc.org/" > Sphinx< / a >
2018-05-04 17:23:44 -05:00
using a < a href = "https://readthedocs.org" > RTD< / a > theme on May 05, 2018.
2017-07-15 10:35:02 -05:00
< / small > < / td >
< td class = "RFooter" > < / td >
< / tr >
< / table >
< table class = "footer2" >
< tr >
< td class = "LFooter" > Coriolis 2 Documentation< / td >
< td class = "RFooter" > < small >
2018-01-06 10:55:44 -06:00
© Copyright 2000-2018, UPMC.
2017-07-15 10:35:02 -05:00
< / small > < / td >
< / tr >
< / table >
< / div >
< / footer >
< / div >
< / div >
< / section >
< / div >
< script type = "text/javascript" >
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'../',
VERSION:'2',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'.html',
HAS_SOURCE: true
};
< / script >
< script type = "text/javascript" src = "../_static/jquery.js" > < / script >
< script type = "text/javascript" src = "../_static/underscore.js" > < / script >
< script type = "text/javascript" src = "../_static/doctools.js" > < / script >
< script type = "text/javascript" src = "../_static/js/theme.js" > < / script >
< script type = "text/javascript" >
jQuery(function () {
SphinxRtdTheme.StickyNav.enable();
});
< / script >
< / body >
< / html >