* ./hurricane:

- New: In hurricane/doc, added documentation RoutingPad, HyperNet & Query.
    - New: In isobar, added support for RoutingPad.
    - Change: In PyComponent, getCenter() method moved to it's right place in
        the base class.
    - Change: In PyPath, added duplicated methods (ApplyOn <-> applyOn and
        Invert <-> invert).
This commit is contained in:
Jean-Paul Chaput 2013-03-13 13:38:15 +00:00
parent 5f12dd5e28
commit f8343fdfc4
16 changed files with 960 additions and 64 deletions

View File

@ -7,8 +7,9 @@
*/
html, body, th, td, tr, p, li, h1, h2, h3, h4, h5, h6 {
font-size: 96%;
font-family: verdana, sans-serif;
font-size: 11pt;
/* The Open Sans font family is supplied by TexLive. */
font-family: "Open Sans", Verdana, sans-serif;;
}
body {
@ -19,8 +20,13 @@
background-attachment: fixed;
background-repeat: no-repeat;
margin-top: 2em;
margin-right: 8%;
margin-left: 8%;
width: 550pt;
margin-right: auto;
margin-left: auto;
/*
margin-right: 12%;
margin-left: 12%;
*/
}
hr {
@ -32,14 +38,14 @@
h1, h2, h3, h4, h5, h6 {
font-family: "Liberation Serif", sans-serif;
/*font-family: "Liberation Serif", sans-serif;*/
}
h1 { text-align: center; }
h2, h3, h4, h5, h6 { text-align: left;
padding-top: 2em;
padding-top: 11pt;
}
h1, h2, h3 { font-family: "Liberation Serif", sans-serif;
h1, h2, h3 { /*font-family: "Liberation Serif", sans-serif; */
/*color: #09550B;*/
}
h1 { font-weight:normal; font-size: 170%; letter-spacing:0.2em; word-spacing:0.4em; }
@ -52,8 +58,8 @@
h2.classHierarchy {
/*border: 1px none #008500;*/
border: 1px none #000000;
border-top-width: 2px;
border-top-style: solid;
border-top-width: 1px;
border-top-style: dotted;
padding-top: 1em;
}
@ -110,7 +116,7 @@
pre, tt, code {
font-family: "andale mono", monospace;
/*font-family: "andale mono", monospace;*/
font-size: 100%;
white-space: pre;
}
@ -131,7 +137,7 @@
tt { color: green; }
em { font-style: italic;
font-weight: bold; }
font-weight: normal; }
strong { font-weight: bold; }
span.textit { font-style: italic; }
@ -161,8 +167,6 @@
}
/*
* +-----------------------------------------------------------------+
* | Doxygen Specific Classes |
@ -176,7 +180,7 @@
h1.header {
font-size: 200%;
font-family: times, verdana, sans-serif;
/*font-family: times, verdana, sans-serif;*/
}
center.header {
@ -184,8 +188,8 @@
}
table.header {
/*width: 100%;*/
/*background-color: #EEEEEE;*/
/*width: 100%;*/
/*background-color: #EEEEEE;*/
background-color: #CCE6CA;
}
@ -193,17 +197,26 @@
padding: 2px 14px;
text-align: center;
font-weight: bold;
font-family: verdana, sans-serif;
/*font-family: verdana, sans-serif;*/
font-size: 110%;
}
table.DoxUser td, table.DoxUser th {
padding: 0px 5px;
border: 0px;
}
table.DoxUser th {
background-color: #CCE6CA;
}
table.footer1, table.footer2 { width: 100%; }
td.LFooter { text-align: left; }
td.RFooter { text-align: right; }
td.CFooter { text-align: center;}
table.footer2 td.RFooter { font-weight: bold; width: 35% }
table.footer2 td.CFooter { width: 30% }
table.footer2 td.LFooter { font-weight: bold; width: 35%; font-family: time; }
table.footer2 td.LFooter { font-weight: bold; width: 35%; /*font-family: time;*/ }
table.classHierarchy {
border-collapse: separate;
@ -246,7 +259,7 @@
}
div.ah {
font-family: time;
/*font-family: time;*/
font-size: 250%;
}
@ -270,7 +283,9 @@
a.qindex, a.qindex:visited, a.qindex:hover, a.qindexHL, a.el, a.elRef {
text-decoration: none;
font-weight: bold;
/*font-family: Courier;*/
font-weight: normal;
/*font-size: 110%;*/
}
a.qindex, a.qindex:visited {
@ -407,12 +422,17 @@
span.preprocessor { color: #806020 }
span.stringliteral { color: #002080 }
span.charliteral { color: #008080 }
span.red { color: red }
/* -------------------------------------------------------------------
* Attributes Listing.
*/
p.formulaDsp {
text-align: center;
}
.mdTable {
/*border: 1px solid #868686;*/
/*background-color: #DADAEF;*/

View File

@ -0,0 +1,54 @@
// -*- C++ -*-
namespace Hurricane {
/*! \class HyperNet
* \brief HyperNet description (\b API)
*
* \section secHyperNetIntro Introduction
*
* The HyperNet is a part of the trans-hierarchical mechanism.
* An HyperNet is build upon a Net Occurrence, this occurrence
* is the root of a tree of Net occurrences which represent the
* Net as if flattened. The walkthroughs are provided as
* Collections.
*
* In all the walkthrough, if \c doExtraction is set, a simple
* layout extraction is performed. Of course, it makes the
* walkthrough much slower. By default it's disabled and the
* Net occurrence tree is created only from the Plug information.
*
* \remark The \c allowInteruption is deprecated and do nothing.
*/
//! \function HyperNet::HyperNet ( const Occurrence& occurrence );
//! Build an HyperNet from an Occurrence of Net, Rubber or Component.
//! That is, any Entity from which a Net can be extracted.
//! \function const Occurrence& HyperNet::getNetOccurrence () const;
//! \sreturn The root Net Occurrence.
//! \function Cell* HyperNet::getCell () const;
//! \sreturn The Cell that own the net occurrence (the top Cell).
//! \function Occurrences HyperNet::getNetOccurrences ( bool doExtraction=false, bool allowInterruption=false) const;
//! \param doExtraction Perform a simple layout extraction.
//! \param allowInterruption Allows the extraction process to be interrupted.
//! \return The collection of all the Net occurrences.
//! \function Occurrences HyperNet::getNetOccurrencesUnder ( Box area, bool doExtraction=false, bool allowInterruption=false) const;
//! \param area The area under which do the extraction.
//! \param doExtraction Perform a layout extraction.
//! \param allowInterruption Allows the extraction process to be interrupted.
//! \return The collection of all the Net occurrences under \c area.
//! \function Occurrences HyperNet::getLeafPlugOccurrences ( bool doExtraction=false, bool allowInterruption=false) const;
//! \param doExtraction Perform a layout extraction.
//! \param allowInterruption Allows the extraction process to be interrupted.
//! \return The Collection of all the Plugs from the leaf Cells only.
// \}
}

View File

@ -0,0 +1,185 @@
// -*- C++ -*-
namespace Hurricane {
/*! \class Query
* \brief Query description (\b API)
*
* \section secQueryIntro Introduction
*
* The Query is a part of the trans-hierarchical mechanism.
* A Query performs a walktrough over all the Occurrences
* of objects under a determined area, thus providing a
* virtual flattening service. Please note that only placed
* objects (i.e. inserted in a QuadTree) are took into account.
*
* To use the Query class the user has to create derived classes
* and overload the various callbacks. At least the following
* pure virtual methods must be overloaded:
* - Query::masterCellCallback().
* - Query::goCallback().
* - Query::extensionGoCallback().
*
*
* \section secQueryParameters
*
* A query walkthrough is defined by the following parameters:
* - The starting hierarchical level: only objects with a
* hierarchical depth greater or equal will be explored.
* The top level Cell has a depth of \e zero, the master
* Cell of the instances a depth of \e one and so on.
* - The stoping hierarchical level: only objects with a
* hierarchical depth lesser or equal will be considered.
* - The top Cell on which to start.
* - The area to consider on the top Cell.
* - A transformation to apply on the top Cell.
* - A BasicLayer to select only the Gos containing it.
* - An ExtensionSlice::Mask to select which user-defined slice
* to process.
* - A Mask, to select which kind of Go to process.
*/
//! \enum Query::QueryFilter
//! Set of flags to specify on which types of objects the Query
//! must iterate.
//! \var Query::DoMasterCells
//! Activate the call of the Query::masterCellCallback().
//! \var Query::DoTerminalCells
//! Activate the call of the Query::masterCellCallback(), but only on
//! leaf Cell of the hierarchy.
//! \var Query::DoComponents
//! Activate the call of the Query::goCallback().
//! \var Query::DoMarkers
//! Activate the call of the Query::markerCallback().
//! \var Query::DoRubbers
//! Activate the call of the Query::rubberCallback().
//! \var Query::DoExtensionGos
//! Activate the call of the Query::extensionGoCallback().
//! \var Query::DoAll
//! Activate all the callbacks at once.
//! \function Query::Query ();
//! Default constructor. Initialisation is done through Query::setQuery().
//! \function Query::~Query ();
//! Default destructor.
//! \function unsigned int Query::getStartLevel () const;
//! \sreturn The hierarchical level from which we start to consider objects.
//! \function unsigned int Query::getStopLevel () const;
//! \sreturn The hierarchical level from which we stop to consider objects.
//! \function size_t Query::getDepth () const;
//! \sreturn The hierarchical depth of the current Query walkthrough.
//! \function const Transformation& Query::getTransformation () const;
//! \sreturn The cumulative transformation of the master cell currently under exploration.
//! \function const Box& Query::getArea () const;
//! \sreturn The area to explore, expressed in the coordinates system of the
//! current master cell under exploration. This is the starting area with
//! the inverse of the current transformation applied.
//! \function const BasicLayer* Query::getBasicLayer () const;
//! \sreturn The BasicLayer we are filtering with.
//! \function Cell* Query::getMasterCell ();
//! \sreturn The master Cell currently under exploration.
//! \function Instance* Query::getInstance ();
//! \sreturn The Instance currently under exploration.
//! \function Path Query::getPath () const;
//! \sreturn The instanciation path between the instance currently under inspection
//! and the top cell.
//! \function bool Query::hasGoCallback () const;
//! \sreturn Tells wether the Go callback is present and should be called.
//! \function bool Query::hasMarkerCallback () const;
//! \sreturn Tells wether the Marker callback is present and should be called.
//! \function bool Query::hasRubberCallback () const;
//! \sreturn Tells wether the Rubber callback is present and should be called.
//! \function bool Query::hasExtensionGoCallback () const;
//! \sreturn Tells wether the ExtensionGo callback is present and should be called.
//! \function bool Query::hasMasterCellCallback () const;
//! \sreturn Tells wether the master Cell callback is present and should be called.
//! \function void Query::goCallback ( Go* );
//! \sreturn The method called on each encountered Go. This is a pure virtual
//! method which must be overloaded in derived classes.
//! \function void Query::markerCallback ( Marker* );
//! \sreturn The method called on each encountered Marker. A default implementation
//! is provided, which does absolutely nothing.
//! \function void Query::rubberCallback ( Rubber* );
//! \sreturn The method called on each encountered Rubber. A default implementation
//! is provided, which does absolutely nothing.
//! \function void Query::extensionGoCallback ( Go* );
//! \sreturn The method called on each encountered ExtensionGo. This is a pure virtual
//! method which must be overloaded in derived classes.
//! \function void Query::masterCellCallback ();
//! \sreturn The method called on each encountered master Cell. The Cell is not
//! passed as parameter as it is directly accessible through Query::getCell().
//! This is a pure virtual method which must be overloaded in derived classes.
//! \function void Query::setQuery ( Cell* cell, const Box& area, const Transformation& transformation, const BasicLayer* basicLayer, ExtensionSlice::Mask extensionMask, Mask filter );
//! \param cell The top Cell on which to start the Query.
//! \param area The area under which objects are queried.
//! \param transformation An initial transformation to apply to \c cell.
//! \param basicLayer Consider only objects containing this BasicLayer.
//! \param extensionMask Consider only ExtensionGo matching this mask.
//! \param filter Consider only objects of certain types, as defined in
//! QueryFilter.
//!
//! Initialize the basic parameters of the Query. Those parameters can
//! be changed individually afterwards with specific mutators.
//! \function void Query::setCell ( Cell* cell );
//! Change the top Cell on which to perform the Query.
//! \function void Query::setArea ( const Box& box );
//! Change the top area to query.
//! \function void Query::setTransformation ( const Transformation& transformation );
//! Change the transformation applied to the top level Cell.
//! \function void Query::setBasicLayer ( const BasicLayer* );
//! Change the BasicLayer selector.
//! \function void Query::setExtensionMask ( ExtensionSlice::Mask );
//! Change the filtering mask for ExtensionSlice.
//! \function void Query::setFilter ( Mask );
//! Change the filtering mask for object types.
//! \function void Query::setStartLevel ( unsigned int );
//! Change the starting depth level.
//! \function void Query::setStopLevel ( unsigned int );
//! Change the stoping depth level.
//! \function void Query::doQuery ();
//! Perform the actual Query.
// \}
}

View File

@ -0,0 +1,149 @@
// -*- C++ -*-
namespace Hurricane {
/*! \class RoutingPad
* \brief RoutingPad description (\b API)
*
* \section secRoutingPadIntro Introduction
*
* The RoutingPad is a part of the trans-hierarchical mechanism.
* It allows to connect a Net from the top-level netlist to
* a plug in an Instance at any level inside the hierarchy,
* throuhg a Plug Occurrence. RoutingPad can also be created from
* Pin or Contact Occurrences.
*
* When the RoutingPad is created using a Plug Occurrence, it can
* be set afterward to any of master net external Component.
* An utility method RoutingPad::setOnBestComponent() is also
* provided to automatically set the RoutingPad on a Component
* matching criteria of surface or layer level.
*/
//! \enum RoutingPad::Flags
//! Set of flags to choose how to select the external component of
//! a RoutingPad to be anchored on.
//! \var RoutingPad::BiggestArea
//! Select the external Component of biggest area.
//! \var RoutingPad::LowestLayer
//! Select the external Component of in the lowest layer.
//! \var RoutingPad::HighestLayer
//! Select the external Component of in the highest layer.
//! \var RoutingPad::ComponentSelection
//! A mask to filter bit parts of a flag belonging to component selection.
//! \typedef RoutingPad::Inherit
//! Useful for calling upon methods of the base class without
//! knowing it.
//! \function RoutingPad* RoutingPad::create ( Net* net, Occurrence occurrence, unsigned int flags=0 );
//! \param net The Net of the top-level netlist connected to this RoutingPad.
//! \param occurrence The Occurrence of Plug, Pin or Pad to connect to.
//! \param flags In the case of a Plug, the way to select the external
//! component of the Net.
//! \return The newly created RoutingPad.
//! \function RoutingPad* RoutingPad::create ( Pin* pin );
//! Special variant to create a RoutingPad from a top-level Pin.
//! \function Occurrence RoutingPad::getOccurrence() const;
//! \return The Occurence on which we are anchored on. If a Component has been selected
//! to be the anchor, it's an Occurrence on that component which is returned,
//! not the actual Plug.
//! \function Occurrence RoutingPad::getPlugOccurrence();
//! \return The original Plug Occurrence.
//! \function const Layer* RoutingPad::getLayer() const;
//! \return If anchored on a component, the Layer of that Component. If anchored on
//! a Plug, \c NULL.
//! \function DbU::Unit RoutingPad::getX() const;
//! \return The X position of the RoutingPad. This is the position, as returned by
//! Component::getPosition() of the Component it is anchored on.
//! \function DbU::Unit RoutingPad::getY() const;
//! \return The Y position of the RoutingPad. This is the position, as returned by
//! Component::getPosition() of the Component it is anchored on.
//! \function Box RoutingPad::getBoundingBox() const;
//! \return If it's anchored on a Component, returns the bounding box of that component
//! (with Occurrence Transformation applied). If it's on a Plug, just return a
//! zero-sised box from getPosition().
//! \function Box RoutingPad::getBoundingBox( BasicLayer* layer ) const;
//! \return If it's anchored on a Component, returns the bounding box of that component
//! in the given \c layer. (with Occurrence Transformation applied).
//! If it's on a Plug, just return a zero-sised box from getPosition().
//! \function Point RoutingPad::getCenter() const;
//! \return The center of the bounding box.
//! \function Point RoutingPad::getSourcePosition() const;
//! \return If anchored on a Segment, the source position of it. getPosition()
//! otherwise.
//! \function Point RoutingPad::getTargetPosition() const;
//! \return If anchored on a Segment, the target position of it. getPosition()
//! otherwise.
//! \function Point RoutingPad::getSourceX() const;
//! \return If anchored on a Segment, the X coordinate of the source position.
//! getX() otherwise.
//! \function Point RoutingPad::getSourceY() const;
//! \return If anchored on a Segment, the Y coordinate of the source position.
//! getY() otherwise.
//! \function Point RoutingPad::getTargetX() const;
//! \return If anchored on a Segment, the X coordinate of the target position.
//! getX() otherwise.
//! \function Point RoutingPad::getTargetY() const;
//! \return If anchored on a Segment, the Y coordinate of the target position.
//! getY() otherwise.
//! \function void RoutingPad::translate ( const DbU::Unit& dx, const DbU::Unit& dy );
//! Translate the RoutingPad by <code>(dx,dy)</code>.
//! \function void RoutingPad::setOffset ( const DbU::Unit& dx, const DbU::Unit& dy );
//! Sets the relative position of the RoutingPad from it's anchor to <code>(dx,dy)</code>.
//! \function void RoutingPad::setX ( const DbU::Unit& x );
//! Sets the X coordinate of the RoutingPad.
//! \function void RoutingPad::setY ( const DbU::Unit& y );
//! Sets the X coordinate of the RoutingPad.
//! \function void RoutingPad::setPosition ( const DbU::Unit& x, const DbU::Unit& y );
//! Sets the absolute position of the RoutingPad to <code>(x,y)</code>.
//! \function void RoutingPad::setPosition ( const Point& position );
//! Sets the absolute position of the RoutingPad to <code>position</code>.
//! \function void RoutingPad::setExternalComponent ( Component* component );
//! When the RoutingPad is anchored on a Plug, allow to set the \c component
//! that we will anchor on. The Occurrence of the RoutingPad is updated
//! from the Plug to the \c component.
//!
//! \remark \c component must be tagged as Net external.
//! \function void RoutingPad::setOnBestComponent ( unsigned int flags );
//! Automatically select the best component to anchor on, according
//! to the criteria givens on \c flags (selection occurs in net
//! external components).
//! \function void RoutingPad::restorePlugOccurrence();
//! If the RoutingPad has been anchored on a Component, detach from it and
//! revert to the Plug Occurrence.
// \}
}

View File

@ -123,6 +123,7 @@
<tr><td width="280"></td><td class="virtual"><a href="classHurricane_1_1Component.html">Component</a></td></tr>
</table>
<table class="classHierarchy">
<tr><td width="350"></td><td class="normal"><a href="classHurricane_1_1RoutingPad.html">RoutingPad</a></td></tr>
<tr><td width="350"></td><td class="normal"><a href="classHurricane_1_1Plug.html">Plug</a></td></tr>
<tr><td width="350"></td><td class="normal"><a href="classHurricane_1_1Contact.html">Contact</a></td></tr>
<tr><td width="350"></td><td class="virtual"><a href="classHurricane_1_1Segment.html">Segment</a></td></tr>
@ -203,12 +204,14 @@
<table class="classHierarchy">
<tr><td width="70"></td><td class="normal"><a href="classHurricane_1_1Path.html">Path</a></td></tr>
<tr><td width="70"></td><td class="normal"><a href="classHurricane_1_1Occurrence.html">Occurrence</a></td></tr>
<tr><td width="70"></td><td class="normal"><a href="classHurricane_1_1HyperNet.html">HyperNet</a></td></tr>
</table>
<h2 class="classHierarchy">Fast Access Structures</h2>
<table class="classHierarchy">
<tr><td width="70"></td><td class="normal"><a href="classHurricane_1_1QuadTree.html">Component::QuadTree</a></td></tr>
<tr><td width="70"></td><td class="normal"><a href="classHurricane_1_1Slice.html">Component::Slice</a></td></tr>
<tr><td width="70"></td><td class="normal"><a href="classHurricane_1_1Query.html">Query</a></td></tr>
</table>

View File

@ -659,6 +659,8 @@ INPUT = ../../src/hurricane/hurricane/Commons.h \
../../src/hurricane/hurricane/Nets.h \
../../src/hurricane/hurricane/Net.h \
Net.dox \
../../src/hurricane/hurricane/HyperNet.h \
HyperNet.dox \
../../src/hurricane/hurricane/Gos.h \
../../src/hurricane/hurricane/Go.h \
Go.dox \
@ -691,6 +693,8 @@ INPUT = ../../src/hurricane/hurricane/Commons.h \
Pad.dox \
../../src/hurricane/hurricane/Rubbers.h \
../../src/hurricane/hurricane/Rubber.h \
RoutingPad.dox \
../../src/hurricane/hurricane/RoutingPad.h \
Rubber.dox \
../../src/hurricane/hurricane/Quarks.h \
../../src/hurricane/hurricane/Quark.h \
@ -716,6 +720,8 @@ INPUT = ../../src/hurricane/hurricane/Commons.h \
../../src/hurricane/hurricane/Slices.h \
../../src/hurricane/hurricane/Slice.h \
Slice.dox \
../../src/hurricane/hurricane/Query.h \
Query.dox \
../../src/hurricane/hurricane/UpdateSession.h \
UpdateSession.dox

View File

@ -7,8 +7,9 @@
*/
html, body, th, td, tr, p, li, h1, h2, h3, h4, h5, h6 {
font-size: 96%;
font-family: verdana, sans-serif;
font-size: 11pt;
/* The Open Sans font family is supplied by TexLive. */
font-family: "Open Sans", Verdana, sans-serif;;
}
body {
@ -19,8 +20,13 @@
background-attachment: fixed;
background-repeat: no-repeat;
margin-top: 2em;
margin-right: 8%;
margin-left: 8%;
width: 550pt;
margin-right: auto;
margin-left: auto;
/*
margin-right: 12%;
margin-left: 12%;
*/
}
hr {
@ -32,14 +38,14 @@
h1, h2, h3, h4, h5, h6 {
font-family: "Liberation Serif", sans-serif;
/*font-family: "Liberation Serif", sans-serif;*/
}
h1 { text-align: center; }
h2, h3, h4, h5, h6 { text-align: left;
padding-top: 2em;
padding-top: 11pt;
}
h1, h2, h3 { font-family: "Liberation Serif", sans-serif;
h1, h2, h3 { /*font-family: "Liberation Serif", sans-serif; */
/*color: #09550B;*/
}
h1 { font-weight:normal; font-size: 170%; letter-spacing:0.2em; word-spacing:0.4em; }
@ -52,8 +58,8 @@
h2.classHierarchy {
/*border: 1px none #008500;*/
border: 1px none #000000;
border-top-width: 2px;
border-top-style: solid;
border-top-width: 1px;
border-top-style: dotted;
padding-top: 1em;
}
@ -110,7 +116,7 @@
pre, tt, code {
font-family: "andale mono", monospace;
/*font-family: "andale mono", monospace;*/
font-size: 100%;
white-space: pre;
}
@ -131,7 +137,7 @@
tt { color: green; }
em { font-style: italic;
font-weight: bold; }
font-weight: normal; }
strong { font-weight: bold; }
span.textit { font-style: italic; }
@ -161,8 +167,6 @@
}
/*
* +-----------------------------------------------------------------+
* | Doxygen Specific Classes |
@ -176,7 +180,7 @@
h1.header {
font-size: 200%;
font-family: times, verdana, sans-serif;
/*font-family: times, verdana, sans-serif;*/
}
center.header {
@ -184,8 +188,8 @@
}
table.header {
/*width: 100%;*/
/*background-color: #EEEEEE;*/
/*width: 100%;*/
/*background-color: #EEEEEE;*/
background-color: #CCE6CA;
}
@ -193,17 +197,26 @@
padding: 2px 14px;
text-align: center;
font-weight: bold;
font-family: verdana, sans-serif;
/*font-family: verdana, sans-serif;*/
font-size: 110%;
}
table.DoxUser td, table.DoxUser th {
padding: 0px 5px;
border: 0px;
}
table.DoxUser th {
background-color: #CCE6CA;
}
table.footer1, table.footer2 { width: 100%; }
td.LFooter { text-align: left; }
td.RFooter { text-align: right; }
td.CFooter { text-align: center;}
table.footer2 td.RFooter { font-weight: bold; width: 35% }
table.footer2 td.CFooter { width: 30% }
table.footer2 td.LFooter { font-weight: bold; width: 35%; font-family: time; }
table.footer2 td.LFooter { font-weight: bold; width: 35%; /*font-family: time;*/ }
table.classHierarchy {
border-collapse: separate;
@ -246,7 +259,7 @@
}
div.ah {
font-family: time;
/*font-family: time;*/
font-size: 250%;
}
@ -270,7 +283,9 @@
a.qindex, a.qindex:visited, a.qindex:hover, a.qindexHL, a.el, a.elRef {
text-decoration: none;
font-weight: bold;
/*font-family: Courier;*/
font-weight: normal;
/*font-size: 110%;*/
}
a.qindex, a.qindex:visited {
@ -407,12 +422,17 @@
span.preprocessor { color: #806020 }
span.stringliteral { color: #002080 }
span.charliteral { color: #008080 }
span.red { color: red }
/* -------------------------------------------------------------------
* Attributes Listing.
*/
p.formulaDsp {
text-align: center;
}
.mdTable {
/*border: 1px solid #868686;*/
/*background-color: #DADAEF;*/

View File

@ -64,14 +64,14 @@ namespace Hurricane {
static RoutingPad* create ( Pin* );
public:
// Accessors.
inline Occurrence getOccurrence () const { return _occurrence; };
Occurrence getPlugOccurrence ();
virtual const Layer* getLayer () const;
virtual DbU::Unit getX () const;
virtual DbU::Unit getY () const;
virtual Box getBoundingBox () const;
virtual const Layer* getLayer () const;
virtual Box getBoundingBox ( const BasicLayer* ) const;
virtual Point getCenter () const;
inline Occurrence getOccurrence () const { return _occurrence; };
Occurrence getPlugOccurrence ();
Point getSourcePosition () const;
Point getTargetPosition () const;
DbU::Unit getSourceX () const;

View File

@ -49,6 +49,7 @@
PyPoint.cpp
PyReference.cpp
PyReferenceCollection.cpp
PyRoutingPad.cpp
PySegment.cpp
PySegmentCollection.cpp
PyTechnology.cpp
@ -102,6 +103,7 @@
hurricane/isobar/PyPoint.h
hurricane/isobar/PyReference.h
hurricane/isobar/PyReferenceCollection.h
hurricane/isobar/PyRoutingPad.h
hurricane/isobar/PySegment.h
hurricane/isobar/PySegmentCollection.h
hurricane/isobar/PyTechnology.h

View File

@ -111,6 +111,22 @@ extern "C" {
return PyLayer_Link ( layer );
}
static PyObject* PyComponent_getCenter ( PyComponent *self )
{
trace << "PyComponent_getCenter ()" << endl;
METHOD_HEAD( "Component.getCenter()" )
PyPoint* pyPoint = PyObject_NEW( PyPoint, &PyTypePoint );
if (pyPoint == NULL) return NULL;
HTRY
pyPoint->_object = new Point( component->getCenter() );
HCATCH
return (PyObject*)pyPoint;
}
// ---------------------------------------------------------------
@ -140,6 +156,7 @@ extern "C" {
{ { "getX" , (PyCFunction)PyComponent_getX , METH_NOARGS , "Return the Component X value." }
, { "getY" , (PyCFunction)PyComponent_getY , METH_NOARGS , "Return the Component Y value." }
, { "getPosition" , (PyCFunction)PyComponent_getPosition , METH_NOARGS , "Return the Component position." }
, { "getCenter" , (PyCFunction)PyComponent_getCenter , METH_NOARGS , "Return the Component center position." }
, { "getNet" , (PyCFunction)PyComponent_getNet , METH_NOARGS , "Returns the net owning the component." }
, { "getLayer" , (PyCFunction)PyComponent_getLayer , METH_NOARGS , "Return the component layer." }
, { "getBoundingBox" , (PyCFunction)PyComponent_getBoundingBox, METH_NOARGS , "Return the component boundingBox." }

View File

@ -134,7 +134,7 @@ extern "C" {
PyLayer* pyLayer = NULL;
PyComponent* pyComponent = NULL;
DbU::Unit x=0, y=0, width=0, height=0;
if (PyArg_ParseTuple(args, "O!O!ll|ll:Contact.create",
if (PyArg_ParseTuple(args, "O!O!ll|ll:Contact.create",
&PyTypeNet, &pyNet, &PyTypeLayer, &pyLayer,
&x, &y, &width, &height)) {
contact = Contact::create(PYNET_O(pyNet), PYLAYER_O(pyLayer), x, y, width, height);

View File

@ -84,6 +84,7 @@
#include "hurricane/isobar/PyComponentCollection.h"
#include "hurricane/isobar/PyPlug.h"
#include "hurricane/isobar/PyPlugCollection.h"
#include "hurricane/isobar/PyRoutingPad.h"
#include "hurricane/isobar/PySegment.h"
#include "hurricane/isobar/PySegmentCollection.h"
#include "hurricane/isobar/PyContact.h"
@ -579,6 +580,7 @@ extern "C" {
PyComponent_LinkPyType ();
PySegment_LinkPyType ();
PyPad_LinkPyType ();
PyRoutingPad_LinkPyType ();
PyVertical_LinkPyType ();
PyHorizontal_LinkPyType ();
PyContact_LinkPyType ();
@ -645,6 +647,7 @@ extern "C" {
PYTYPE_READY_SUB ( Reference , Entity )
PYTYPE_READY_SUB ( Net , Entity )
PYTYPE_READY_SUB ( Component , Entity )
PYTYPE_READY_SUB ( RoutingPad , Component)
PYTYPE_READY_SUB ( Segment , Component)
PYTYPE_READY_SUB ( Horizontal , Segment )
PYTYPE_READY_SUB ( Vertical , Segment )
@ -698,6 +701,7 @@ extern "C" {
__cs.addType ( "plug" , &PyTypePlug , "<Plug>" , false, "comp" );
__cs.addType ( "plugCol" , &PyTypePlugCollection , "<PlugCollection>" , false );
__cs.addType ( "point" , &PyTypePoint , "<Point>" , false );
__cs.addType ( "rp" , &PyTypeRoutingPad , "<RoutingPad>" , false, "comp" );
__cs.addType ( "segment" , &PyTypeSegment , "<Segment>" , false, "comp" );
__cs.addType ( "pad " , &PyTypePad , "<Pad>" , false, "comp" );
__cs.addType ( "segmentCol" , &PyTypeSegmentCollection , "<SegmentCollection>" , false );
@ -748,6 +752,8 @@ extern "C" {
Py_INCREF ( &PyTypeQuery );
PyModule_AddObject ( module, "Query" , (PyObject*)&PyTypeQuery );
Py_INCREF ( &PyTypeRoutingPad );
PyModule_AddObject ( module, "RoutingPad" , (PyObject*)&PyTypeRoutingPad );
Py_INCREF ( &PyTypeVertical );
PyModule_AddObject ( module, "PyVertical" , (PyObject*)&PyTypeVertical );
Py_INCREF ( &PyTypeHorizontal );
@ -771,15 +777,16 @@ extern "C" {
PyDict_SetItemString ( dictionnary, "ProxyError" , ProxyError );
PyDict_SetItemString ( dictionnary, "HurricaneError" , HurricaneError );
DbULoadConstants ( dictionnary );
TransformationLoadConstants ( dictionnary );
NetLoadConstants ( dictionnary );
InstanceLoadConstants ( dictionnary );
PinLoadConstants ( dictionnary );
DbULoadConstants ( dictionnary );
TransformationLoadConstants( dictionnary );
NetLoadConstants ( dictionnary );
InstanceLoadConstants ( dictionnary );
PinLoadConstants ( dictionnary );
PyDbU_postModuleInit ();
PyLayer_postModuleInit ();
PyBasicLayer_postModuleInit ();
PyDbU_postModuleInit();
PyLayer_postModuleInit();
PyBasicLayer_postModuleInit();
PyRoutingPad_postModuleInit();
trace << "Hurricane.so loaded " << (void*)&typeid(string) << endl;
}

View File

@ -47,8 +47,9 @@ extern "C" {
// Standart Predicates (Attributes).
DirectGetBoolAttribute(PyOccurrence_isValid ,isValid ,PyOccurrence,Occurrence)
DirectGetBoolAttribute(PyOccurrence_hasProperty,hasProperty,PyOccurrence,Occurrence)
DirectGetBoolAttribute (PyOccurrence_isValid ,isValid ,PyOccurrence,Occurrence)
DirectGetBoolAttribute (PyOccurrence_hasProperty ,hasProperty ,PyOccurrence,Occurrence)
DirectGetStringAttribute(PyOccurrence_getCompactString,getCompactString,PyOccurrence,Occurrence)
// Standart destroy (Attribute).
@ -168,16 +169,17 @@ extern "C" {
// PyOccurrence Attribute Method table.
PyMethodDef PyOccurrence_Methods[] =
{ { "getEntity" , (PyCFunction)PyOccurrence_getEntity , METH_NOARGS, "Returns the referenced entity." }
, { "getPath" , (PyCFunction)PyOccurrence_getPath , METH_NOARGS, "Returns the hierarchical instaciation path." }
, { "getName" , (PyCFunction)PyOccurrence_getName , METH_NOARGS, "Returns the occurrence name (concatenation of path and entity name." }
, { "getOwnerCell" , (PyCFunction)PyOccurrence_getOwnerCell , METH_NOARGS, "Returns the occurrence owner cell." }
, { "getMasterCell" , (PyCFunction)PyOccurrence_getMasterCell , METH_NOARGS, "Returns the cell owning the referenced entity." }
, { "getBoundingBox", (PyCFunction)PyOccurrence_getBoundingBox, METH_NOARGS, "Returns the occurrence bounding box." }
, { "isValid" , (PyCFunction)PyOccurrence_isValid , METH_NOARGS, "Returns true if the occurrence is valid." }
, { "hasProperty" , (PyCFunction)PyOccurrence_hasProperty , METH_NOARGS, "Returns true if the occurrence owns some properties." }
, { "destroy" , (PyCFunction)PyOccurrence_destroy , METH_NOARGS
, "Destroy associated hurricane object, the python object remains." }
{ { "getEntity" , (PyCFunction)PyOccurrence_getEntity , METH_NOARGS, "Returns the referenced entity." }
, { "getPath" , (PyCFunction)PyOccurrence_getPath , METH_NOARGS, "Returns the hierarchical instaciation path." }
, { "getName" , (PyCFunction)PyOccurrence_getName , METH_NOARGS, "Returns the occurrence name (concatenation of path and entity name." }
, { "getCompactString", (PyCFunction)PyOccurrence_getCompactString, METH_NOARGS, "Returns the occurrence name (compact format)." }
, { "getOwnerCell" , (PyCFunction)PyOccurrence_getOwnerCell , METH_NOARGS, "Returns the occurrence owner cell." }
, { "getMasterCell" , (PyCFunction)PyOccurrence_getMasterCell , METH_NOARGS, "Returns the cell owning the referenced entity." }
, { "getBoundingBox" , (PyCFunction)PyOccurrence_getBoundingBox , METH_NOARGS, "Returns the occurrence bounding box." }
, { "isValid" , (PyCFunction)PyOccurrence_isValid , METH_NOARGS, "Returns true if the occurrence is valid." }
, { "hasProperty" , (PyCFunction)PyOccurrence_hasProperty , METH_NOARGS, "Returns true if the occurrence owns some properties." }
, { "destroy" , (PyCFunction)PyOccurrence_destroy , METH_NOARGS
, "Destroy associated hurricane object, the python object remains." }
, {NULL, NULL, 0, NULL} /* sentinel */
};

View File

@ -0,0 +1,371 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2013-2013, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
// | I s o b a r - Hurricane / Python Interface |
// | |
// | Author : Jean-Paul Chaput |
// | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== |
// | C++ Module : "./isobar/PyRoutingPad.cpp" |
// +-----------------------------------------------------------------+
#include "hurricane/isobar/PyPoint.h"
#include "hurricane/isobar/PyNet.h"
#include "hurricane/isobar/PyLayer.h"
#include "hurricane/isobar/PyPin.h"
#include "hurricane/isobar/PyOccurrence.h"
#include "hurricane/isobar/PyRoutingPad.h"
namespace Isobar {
using namespace Hurricane;
extern "C" {
#undef ACCESS_OBJECT
#undef ACCESS_CLASS
#define ACCESS_OBJECT _baseObject._baseObject._object
#define ACCESS_CLASS(_pyObject) &(_pyObject->_baseObject._baseObject)
#define METHOD_HEAD(function) GENERIC_METHOD_HEAD(RoutingPad,rp,function)
// +=================================================================+
// | "PyRoutingPad" Python Module Code Part |
// +=================================================================+
# if defined(__PYTHON_MODULE__)
// x-------------------------------------------------------------x
// | "PyRoutingPad" Attribute Methods |
// x-------------------------------------------------------------x
DirectGetLongAttribute(PyRoutingPad_getX ,getX ,PyRoutingPad,RoutingPad)
DirectGetLongAttribute(PyRoutingPad_getY ,getY ,PyRoutingPad,RoutingPad)
DirectGetLongAttribute(PyRoutingPad_getSourceX ,getSourceX ,PyRoutingPad,RoutingPad)
DirectGetLongAttribute(PyRoutingPad_getSourceY ,getSourceY ,PyRoutingPad,RoutingPad)
DirectGetLongAttribute(PyRoutingPad_getTargetX ,getTargetX ,PyRoutingPad,RoutingPad)
DirectGetLongAttribute(PyRoutingPad_getTargetY ,getTargetY ,PyRoutingPad,RoutingPad)
DirectSetLongAttribute(PyRoutingPad_setX ,setX ,"RoutingPad.setX",PyRoutingPad,RoutingPad)
DirectSetLongAttribute(PyRoutingPad_setY ,setY ,"RoutingPad.setY",PyRoutingPad,RoutingPad)
// Standart destroy (Attribute).
DBoDestroyAttribute(PyRoutingPad_destroy, PyRoutingPad)
static PyObject* PyRoutingPad_create ( PyObject*, PyObject* args )
{
trace << "PyRoutingPad_create()" << endl;
PyObject* arg0 = NULL;
PyObject* arg1 = NULL;
PyObject* arg2 = NULL;
RoutingPad* rp = NULL;
HTRY
__cs.init ("RoutingPad.create");
if (not PyArg_ParseTuple(args,"O&|O&O&:RoutingPad.create"
,Converter,&arg0
,Converter,&arg1
,Converter,&arg2
)) {
PyErr_SetString( ConstructorError, "RoutingPad.create(): Invalid number/bad type of parameters." );
return NULL;
}
if ( __cs.getObjectIds() == ":ent:occur:int" )
rp = RoutingPad::create( PYNET_O(arg0), *(PYOCCURRENCE_O(arg1)), PyInt_AsLong(arg2) );
else if ( __cs.getObjectIds() == ":pin" )
rp = RoutingPad::create( dynamic_cast<Pin*>(EntityCast(arg0)) );
else {
PyErr_SetString ( ConstructorError, "invalid number of parameters for RoutingPad constructor." );
return NULL;
}
HCATCH
return PyRoutingPad_Link( rp );
}
static PyObject* PyRoutingPad_getOccurrence ( PyRoutingPad *self )
{
trace << "PyRoutingPad_getOccurrence ()" << endl;
METHOD_HEAD( "Component.getOccurrence()" )
PyOccurrence* pyOccurrence = PyObject_NEW(PyOccurrence, &PyTypeOccurrence);
if (pyOccurrence == NULL) return NULL;
HTRY
pyOccurrence->_object = new Occurrence(rp->getOccurrence());
HCATCH
return (PyObject*)pyOccurrence;
}
static PyObject* PyRoutingPad_getPlugOccurrence ( PyRoutingPad *self )
{
trace << "PyRoutingPad_getPlugOccurrence ()" << endl;
METHOD_HEAD( "Component.getPlugOccurrence()" )
PyOccurrence* pyOccurrence = PyObject_NEW(PyOccurrence, &PyTypeOccurrence);
if (pyOccurrence == NULL) return NULL;
HTRY
pyOccurrence->_object = new Occurrence(rp->getPlugOccurrence());
HCATCH
return (PyObject*)pyOccurrence;
}
static PyObject* PyRoutingPad_getSourcePosition ( PyRoutingPad *self )
{
trace << "PyRoutingPad_getSourcePosition ()" << endl;
METHOD_HEAD( "Component.getSourcePosition()" )
PyPoint* pyPoint = PyObject_NEW( PyPoint, &PyTypePoint );
if (pyPoint == NULL) return NULL;
HTRY
pyPoint->_object = new Point( rp->getSourcePosition() );
HCATCH
return (PyObject*)pyPoint;
}
static PyObject* PyRoutingPad_getTargetPosition ( PyRoutingPad *self )
{
trace << "PyRoutingPad_getTargetPosition ()" << endl;
METHOD_HEAD( "Component.getTargetPosition()" )
PyPoint* pyPoint = PyObject_NEW( PyPoint, &PyTypePoint );
if (pyPoint == NULL) return NULL;
HTRY
pyPoint->_object = new Point( rp->getTargetPosition() );
HCATCH
return (PyObject*)pyPoint;
}
static PyObject* PyRoutingPad_translate ( PyRoutingPad *self, PyObject* args )
{
trace << "PyRoutingPad_translate ()" << endl;
HTRY
METHOD_HEAD ( "RoutingPad.translate()" )
DbU::Unit dx = 0;
DbU::Unit dy = 0;
if (PyArg_ParseTuple(args,"ll:RoutingPad.translate", &dx, &dy)) {
rp->translate( dx, dy );
} else {
PyErr_SetString( ConstructorError, "invalid number of parameters for RoutingPad.translate()" );
return NULL;
}
HCATCH
Py_RETURN_NONE;
}
static PyObject* PyRoutingPad_setPosition ( PyRoutingPad *self, PyObject* args )
{
trace << "PyRoutingPad_setPosition ()" << endl;
HTRY
METHOD_HEAD ( "RoutingPad.setPosition()" )
PyObject* arg0 = NULL;
PyObject* arg1 = NULL;
__cs.init ("RoutingPad.setPosition");
if (not PyArg_ParseTuple(args,"O&|O&:RoutingPad.setPosition"
,Converter,&arg0
,Converter,&arg1
)) {
PyErr_SetString( ConstructorError, "RoutingPad.setPosition(): Invalid number/bad type of parameters." );
return NULL;
}
if ( __cs.getObjectIds() == ":int:int" )
rp->setPosition( PyInt_AsLong(arg0), PyInt_AsLong(arg1) );
else if ( __cs.getObjectIds() == ":point" )
rp->setPosition( *PYPOINT_O(arg0) );
else {
PyErr_SetString ( ConstructorError, "RoutingPad.setPosition(): Invalid parameters types." );
return NULL;
}
HCATCH
Py_RETURN_NONE;
}
static PyObject* PyRoutingPad_setOffset ( PyRoutingPad *self, PyObject* args )
{
trace << "PyRoutingPad_setOffset ()" << endl;
HTRY
METHOD_HEAD ( "RoutingPad.setOffset()" )
DbU::Unit dx = 0;
DbU::Unit dy = 0;
if (PyArg_ParseTuple(args,"ll:RoutingPad.setOffset", &dx, &dy)) {
rp->setOffset( dx, dy );
} else {
PyErr_SetString( ConstructorError, "invalid number of parameters for RoutingPad.setOffset()" );
return NULL;
}
HCATCH
Py_RETURN_NONE;
}
static PyObject* PyRoutingPad_setExternalComponent ( PyRoutingPad *self, PyObject* args )
{
trace << "PyRoutingPad_setExternalComponent ()" << endl;
HTRY
METHOD_HEAD ( "RoutingPad.setExternalComponent()" )
PyObject* pyComponent = NULL;
if (PyArg_ParseTuple(args,"O:RoutingPad.setExternalComponent", &pyComponent)) {
if (not IsPyComponent(pyComponent)) {
PyErr_SetString( ConstructorError, "RoutingPad.setExternalComponent(): Argument is not of type Component." );
return NULL;
}
rp->setExternalComponent( PYCOMPONENT_O(pyComponent) );
} else {
PyErr_SetString( ConstructorError, "RoutingPad.setExternalComponent(): Invalid number/bad type of parameters." );
return NULL;
}
HCATCH
Py_RETURN_NONE;
}
static PyObject* PyRoutingPad_setOnBestComponent ( PyRoutingPad *self, PyObject* args )
{
trace << "PyRoutingPad_setOnBestComponent ()" << endl;
Component* selected = NULL;
HTRY
METHOD_HEAD ( "RoutingPad.setOnBestComponent()" )
unsigned int flags = 0;
if (PyArg_ParseTuple(args,"I:RoutingPad.setOnBestComponent", &flags)) {
selected = rp->setOnBestComponent( flags );
} else {
PyErr_SetString( ConstructorError, "RoutingPad.setOnBestComponent(): Invalid number/bad type of parameters." );
return NULL;
}
HCATCH
return PyEntity_NEW(selected);
}
static PyObject* PyRoutingPad_restorePlugOccurrence ( PyRoutingPad *self, PyObject* args )
{
trace << "PyRoutingPad_restorePlugOccurrence ()" << endl;
HTRY
METHOD_HEAD ( "RoutingPad.restorePlugOccurrence()" )
rp->restorePlugOccurrence();
HCATCH
Py_RETURN_NONE;
}
// ---------------------------------------------------------------
// PyRoutingPad Attribute Method table.
PyMethodDef PyRoutingPad_Methods[] =
{ { "create" , (PyCFunction)PyRoutingPad_create , METH_VARARGS|METH_STATIC
, "Create a RoutingPad." }
, { "getOccurrence" , (PyCFunction)PyRoutingPad_getOccurrence , METH_NOARGS , "Get the RoutingPad occurrence (may be a component)." }
, { "getPlugOccurrence" , (PyCFunction)PyRoutingPad_getPlugOccurrence , METH_NOARGS , "Get the RoutingPad plug occurrence." }
, { "getX" , (PyCFunction)PyRoutingPad_getX , METH_NOARGS , "Get the RoutingPad X position." }
, { "getY" , (PyCFunction)PyRoutingPad_getY , METH_NOARGS , "Get the RoutingPad Y position." }
, { "getSourcePosition" , (PyCFunction)PyRoutingPad_getSourcePosition , METH_NOARGS , "Get the RoutingPad source position." }
, { "getTargetPosition" , (PyCFunction)PyRoutingPad_getTargetPosition , METH_NOARGS , "Get the RoutingPad target position." }
, { "getSourceX" , (PyCFunction)PyRoutingPad_getSourceX , METH_NOARGS , "Get the RoutingPad source X position." }
, { "getSourceY" , (PyCFunction)PyRoutingPad_getSourceY , METH_NOARGS , "Get the RoutingPad source Y position." }
, { "getTargetX" , (PyCFunction)PyRoutingPad_getTargetX , METH_NOARGS , "Get the RoutingPad target X position." }
, { "getTargetY" , (PyCFunction)PyRoutingPad_getTargetY , METH_NOARGS , "Get the RoutingPad target Y position." }
, { "translate" , (PyCFunction)PyRoutingPad_translate , METH_VARARGS, "Translates the RoutingPad segment of dx and dy." }
, { "setX" , (PyCFunction)PyRoutingPad_setX , METH_VARARGS, "Modify the RoutingPad X position." }
, { "setY" , (PyCFunction)PyRoutingPad_setY , METH_VARARGS, "Modify the RoutingPad Y position." }
, { "setPosition" , (PyCFunction)PyRoutingPad_setPosition , METH_VARARGS, "Sets the RoutingPad absolute position." }
, { "setOffset" , (PyCFunction)PyRoutingPad_setOffset , METH_VARARGS, "Sets the RoutingPad relative position." }
, { "setExternalComponent" , (PyCFunction)PyRoutingPad_setExternalComponent , METH_VARARGS, "Sets the RoutingPad on an master net external component." }
, { "setOnBestComponent" , (PyCFunction)PyRoutingPad_setOnBestComponent , METH_VARARGS, "Sets the RoutingPad on master net best external component." }
, { "restorePlugOccurrence", (PyCFunction)PyRoutingPad_restorePlugOccurrence, METH_VARARGS, "Revert back from an external component to the plug." }
, { "destroy" , (PyCFunction)PyRoutingPad_destroy , METH_NOARGS
, "destroy associated hurricane object, the python object remains." }
, {NULL, NULL, 0, NULL} /* sentinel */
};
// x-------------------------------------------------------------x
// | "PyRoutingPad" Object Methods |
// x-------------------------------------------------------------x
DBoDeleteMethod(RoutingPad)
PyTypeObjectLinkPyType(RoutingPad)
#else // End of Python Module Code Part.
// x=================================================================x
// | "PyRoutingPad" Shared Library Code Part |
// x=================================================================x
// Link/Creation Method.
DBoLinkCreateMethod(RoutingPad)
PyTypeInheritedObjectDefinitions(RoutingPad, Component)
static void RoutingPadLoadConstants ( PyObject* dictionnary ) {
PyObject* constant;
LoadObjectConstant( dictionnary, RoutingPad::BiggestArea , "BiggestArea" )
LoadObjectConstant( dictionnary, RoutingPad::HighestLayer , "HighestLayer" )
LoadObjectConstant( dictionnary, RoutingPad::LowestLayer , "LowestLayer" )
LoadObjectConstant( dictionnary, RoutingPad::ComponentSelection, "ComponentSelection" )
}
extern void PyRoutingPad_postModuleInit ()
{
RoutingPadLoadConstants(PyTypeRoutingPad.tp_dict);
}
#endif // End of Shared Library Code Part.
} // extern "C".
} // Isobar namespace.

View File

@ -478,7 +478,9 @@ extern "C" {
, { "getBox" , (PyCFunction)PyTransformation_getBox , METH_VARARGS, "Return transformed box." }
, { "getInvert" , (PyCFunction)PyTransformation_getInvert , METH_NOARGS, "Return inverse transformation." }
, { "Invert" , (PyCFunction)PyTransformation_Invert , METH_NOARGS, "Inverse transformation." }
, { "invert" , (PyCFunction)PyTransformation_Invert , METH_NOARGS, "Inverse transformation." }
, { "ApplyOn" , (PyCFunction)PyTransformation_ApplyOn , METH_VARARGS, "Apply transformation to object." }
, { "applyOn" , (PyCFunction)PyTransformation_ApplyOn , METH_VARARGS, "Apply transformation to object." }
, { "destroy" , (PyCFunction)PyTransformation_destroy , METH_NOARGS
, "Destroy associated hurricane object, the python object remains." }
, {NULL, NULL, 0, NULL} /* sentinel */

View File

@ -0,0 +1,58 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2013-2013, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
// | I s o b a r - Hurricane / Python Interface |
// | |
// | Author : Jean-Paul Chaput |
// | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== |
// | C++ Header : "./isobar/PyRoutingPad.h" |
// +-----------------------------------------------------------------+
#ifndef ISOBAR_PYROUTINGPAD_H
#define ISOBAR_PYROUTINGPAD_H
#include "hurricane/isobar/PyComponent.h"
#include "hurricane/RoutingPad.h"
namespace Isobar {
extern "C" {
// -------------------------------------------------------------------
// Python Object : "PyRoutingPad".
typedef struct {
PyComponent _baseObject;
} PyRoutingPad;
// -------------------------------------------------------------------
// Functions & Types exported to "PyHurricane.ccp".
extern PyTypeObject PyTypeRoutingPad;
extern PyMethodDef PyRoutingPad_Methods[];
extern PyObject* PyRoutingPad_Link ( Hurricane::RoutingPad* object );
extern void PyRoutingPad_LinkPyType ();
extern void PyRoutingPad_postModuleInit ();
#define IsPyRoutingPad(v) ( (v)->ob_type == &PyTypeRoutingPad )
#define PYROUTINGPAD(v) ( (PyRoutingPad*)(v) )
#define PYROUTINGPAD_O(v) ( PYROUTINGPAD(v)->_baseObject._baseObject._object )
} // extern "C".
} // Isobar namespace.
#endif // ISOBAR_ROUTINGPAD_H