* ./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:
parent
5f12dd5e28
commit
f8343fdfc4
|
@ -7,8 +7,9 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
html, body, th, td, tr, p, li, h1, h2, h3, h4, h5, h6 {
|
html, body, th, td, tr, p, li, h1, h2, h3, h4, h5, h6 {
|
||||||
font-size: 96%;
|
font-size: 11pt;
|
||||||
font-family: verdana, sans-serif;
|
/* The Open Sans font family is supplied by TexLive. */
|
||||||
|
font-family: "Open Sans", Verdana, sans-serif;;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
|
@ -19,8 +20,13 @@
|
||||||
background-attachment: fixed;
|
background-attachment: fixed;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
margin-top: 2em;
|
margin-top: 2em;
|
||||||
margin-right: 8%;
|
width: 550pt;
|
||||||
margin-left: 8%;
|
margin-right: auto;
|
||||||
|
margin-left: auto;
|
||||||
|
/*
|
||||||
|
margin-right: 12%;
|
||||||
|
margin-left: 12%;
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
hr {
|
hr {
|
||||||
|
@ -32,14 +38,14 @@
|
||||||
|
|
||||||
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
h1, h2, h3, h4, h5, h6 {
|
||||||
font-family: "Liberation Serif", sans-serif;
|
/*font-family: "Liberation Serif", sans-serif;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
h1 { text-align: center; }
|
h1 { text-align: center; }
|
||||||
h2, h3, h4, h5, h6 { text-align: left;
|
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;*/
|
/*color: #09550B;*/
|
||||||
}
|
}
|
||||||
h1 { font-weight:normal; font-size: 170%; letter-spacing:0.2em; word-spacing:0.4em; }
|
h1 { font-weight:normal; font-size: 170%; letter-spacing:0.2em; word-spacing:0.4em; }
|
||||||
|
@ -52,8 +58,8 @@
|
||||||
h2.classHierarchy {
|
h2.classHierarchy {
|
||||||
/*border: 1px none #008500;*/
|
/*border: 1px none #008500;*/
|
||||||
border: 1px none #000000;
|
border: 1px none #000000;
|
||||||
border-top-width: 2px;
|
border-top-width: 1px;
|
||||||
border-top-style: solid;
|
border-top-style: dotted;
|
||||||
padding-top: 1em;
|
padding-top: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,7 +116,7 @@
|
||||||
|
|
||||||
|
|
||||||
pre, tt, code {
|
pre, tt, code {
|
||||||
font-family: "andale mono", monospace;
|
/*font-family: "andale mono", monospace;*/
|
||||||
font-size: 100%;
|
font-size: 100%;
|
||||||
white-space: pre;
|
white-space: pre;
|
||||||
}
|
}
|
||||||
|
@ -131,7 +137,7 @@
|
||||||
|
|
||||||
tt { color: green; }
|
tt { color: green; }
|
||||||
em { font-style: italic;
|
em { font-style: italic;
|
||||||
font-weight: bold; }
|
font-weight: normal; }
|
||||||
strong { font-weight: bold; }
|
strong { font-weight: bold; }
|
||||||
|
|
||||||
span.textit { font-style: italic; }
|
span.textit { font-style: italic; }
|
||||||
|
@ -161,8 +167,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------------------------------------------------------------+
|
* +-----------------------------------------------------------------+
|
||||||
* | Doxygen Specific Classes |
|
* | Doxygen Specific Classes |
|
||||||
|
@ -176,7 +180,7 @@
|
||||||
|
|
||||||
h1.header {
|
h1.header {
|
||||||
font-size: 200%;
|
font-size: 200%;
|
||||||
font-family: times, verdana, sans-serif;
|
/*font-family: times, verdana, sans-serif;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
center.header {
|
center.header {
|
||||||
|
@ -184,8 +188,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
table.header {
|
table.header {
|
||||||
/*width: 100%;*/
|
/*width: 100%;*/
|
||||||
/*background-color: #EEEEEE;*/
|
/*background-color: #EEEEEE;*/
|
||||||
background-color: #CCE6CA;
|
background-color: #CCE6CA;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,17 +197,26 @@
|
||||||
padding: 2px 14px;
|
padding: 2px 14px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-family: verdana, sans-serif;
|
/*font-family: verdana, sans-serif;*/
|
||||||
font-size: 110%;
|
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%; }
|
table.footer1, table.footer2 { width: 100%; }
|
||||||
td.LFooter { text-align: left; }
|
td.LFooter { text-align: left; }
|
||||||
td.RFooter { text-align: right; }
|
td.RFooter { text-align: right; }
|
||||||
td.CFooter { text-align: center;}
|
td.CFooter { text-align: center;}
|
||||||
table.footer2 td.RFooter { font-weight: bold; width: 35% }
|
table.footer2 td.RFooter { font-weight: bold; width: 35% }
|
||||||
table.footer2 td.CFooter { width: 30% }
|
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 {
|
table.classHierarchy {
|
||||||
border-collapse: separate;
|
border-collapse: separate;
|
||||||
|
@ -246,7 +259,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
div.ah {
|
div.ah {
|
||||||
font-family: time;
|
/*font-family: time;*/
|
||||||
font-size: 250%;
|
font-size: 250%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,7 +283,9 @@
|
||||||
|
|
||||||
a.qindex, a.qindex:visited, a.qindex:hover, a.qindexHL, a.el, a.elRef {
|
a.qindex, a.qindex:visited, a.qindex:hover, a.qindexHL, a.el, a.elRef {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
font-weight: bold;
|
/*font-family: Courier;*/
|
||||||
|
font-weight: normal;
|
||||||
|
/*font-size: 110%;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
a.qindex, a.qindex:visited {
|
a.qindex, a.qindex:visited {
|
||||||
|
@ -407,12 +422,17 @@
|
||||||
span.preprocessor { color: #806020 }
|
span.preprocessor { color: #806020 }
|
||||||
span.stringliteral { color: #002080 }
|
span.stringliteral { color: #002080 }
|
||||||
span.charliteral { color: #008080 }
|
span.charliteral { color: #008080 }
|
||||||
|
span.red { color: red }
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------
|
/* -------------------------------------------------------------------
|
||||||
* Attributes Listing.
|
* Attributes Listing.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
p.formulaDsp {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
.mdTable {
|
.mdTable {
|
||||||
/*border: 1px solid #868686;*/
|
/*border: 1px solid #868686;*/
|
||||||
/*background-color: #DADAEF;*/
|
/*background-color: #DADAEF;*/
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
// \}
|
||||||
|
|
||||||
|
}
|
|
@ -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.
|
||||||
|
|
||||||
|
|
||||||
|
// \}
|
||||||
|
|
||||||
|
}
|
|
@ -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.
|
||||||
|
|
||||||
|
// \}
|
||||||
|
|
||||||
|
}
|
|
@ -123,6 +123,7 @@
|
||||||
<tr><td width="280"></td><td class="virtual"><a href="classHurricane_1_1Component.html">Component</a></td></tr>
|
<tr><td width="280"></td><td class="virtual"><a href="classHurricane_1_1Component.html">Component</a></td></tr>
|
||||||
</table>
|
</table>
|
||||||
<table class="classHierarchy">
|
<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_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="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>
|
<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">
|
<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_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_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>
|
</table>
|
||||||
|
|
||||||
<h2 class="classHierarchy">Fast Access Structures</h2>
|
<h2 class="classHierarchy">Fast Access Structures</h2>
|
||||||
<table class="classHierarchy">
|
<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_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_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>
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -659,6 +659,8 @@ INPUT = ../../src/hurricane/hurricane/Commons.h \
|
||||||
../../src/hurricane/hurricane/Nets.h \
|
../../src/hurricane/hurricane/Nets.h \
|
||||||
../../src/hurricane/hurricane/Net.h \
|
../../src/hurricane/hurricane/Net.h \
|
||||||
Net.dox \
|
Net.dox \
|
||||||
|
../../src/hurricane/hurricane/HyperNet.h \
|
||||||
|
HyperNet.dox \
|
||||||
../../src/hurricane/hurricane/Gos.h \
|
../../src/hurricane/hurricane/Gos.h \
|
||||||
../../src/hurricane/hurricane/Go.h \
|
../../src/hurricane/hurricane/Go.h \
|
||||||
Go.dox \
|
Go.dox \
|
||||||
|
@ -691,6 +693,8 @@ INPUT = ../../src/hurricane/hurricane/Commons.h \
|
||||||
Pad.dox \
|
Pad.dox \
|
||||||
../../src/hurricane/hurricane/Rubbers.h \
|
../../src/hurricane/hurricane/Rubbers.h \
|
||||||
../../src/hurricane/hurricane/Rubber.h \
|
../../src/hurricane/hurricane/Rubber.h \
|
||||||
|
RoutingPad.dox \
|
||||||
|
../../src/hurricane/hurricane/RoutingPad.h \
|
||||||
Rubber.dox \
|
Rubber.dox \
|
||||||
../../src/hurricane/hurricane/Quarks.h \
|
../../src/hurricane/hurricane/Quarks.h \
|
||||||
../../src/hurricane/hurricane/Quark.h \
|
../../src/hurricane/hurricane/Quark.h \
|
||||||
|
@ -716,6 +720,8 @@ INPUT = ../../src/hurricane/hurricane/Commons.h \
|
||||||
../../src/hurricane/hurricane/Slices.h \
|
../../src/hurricane/hurricane/Slices.h \
|
||||||
../../src/hurricane/hurricane/Slice.h \
|
../../src/hurricane/hurricane/Slice.h \
|
||||||
Slice.dox \
|
Slice.dox \
|
||||||
|
../../src/hurricane/hurricane/Query.h \
|
||||||
|
Query.dox \
|
||||||
../../src/hurricane/hurricane/UpdateSession.h \
|
../../src/hurricane/hurricane/UpdateSession.h \
|
||||||
UpdateSession.dox
|
UpdateSession.dox
|
||||||
|
|
||||||
|
|
|
@ -7,8 +7,9 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
html, body, th, td, tr, p, li, h1, h2, h3, h4, h5, h6 {
|
html, body, th, td, tr, p, li, h1, h2, h3, h4, h5, h6 {
|
||||||
font-size: 96%;
|
font-size: 11pt;
|
||||||
font-family: verdana, sans-serif;
|
/* The Open Sans font family is supplied by TexLive. */
|
||||||
|
font-family: "Open Sans", Verdana, sans-serif;;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
|
@ -19,8 +20,13 @@
|
||||||
background-attachment: fixed;
|
background-attachment: fixed;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
margin-top: 2em;
|
margin-top: 2em;
|
||||||
margin-right: 8%;
|
width: 550pt;
|
||||||
margin-left: 8%;
|
margin-right: auto;
|
||||||
|
margin-left: auto;
|
||||||
|
/*
|
||||||
|
margin-right: 12%;
|
||||||
|
margin-left: 12%;
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
hr {
|
hr {
|
||||||
|
@ -32,14 +38,14 @@
|
||||||
|
|
||||||
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
h1, h2, h3, h4, h5, h6 {
|
||||||
font-family: "Liberation Serif", sans-serif;
|
/*font-family: "Liberation Serif", sans-serif;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
h1 { text-align: center; }
|
h1 { text-align: center; }
|
||||||
h2, h3, h4, h5, h6 { text-align: left;
|
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;*/
|
/*color: #09550B;*/
|
||||||
}
|
}
|
||||||
h1 { font-weight:normal; font-size: 170%; letter-spacing:0.2em; word-spacing:0.4em; }
|
h1 { font-weight:normal; font-size: 170%; letter-spacing:0.2em; word-spacing:0.4em; }
|
||||||
|
@ -52,8 +58,8 @@
|
||||||
h2.classHierarchy {
|
h2.classHierarchy {
|
||||||
/*border: 1px none #008500;*/
|
/*border: 1px none #008500;*/
|
||||||
border: 1px none #000000;
|
border: 1px none #000000;
|
||||||
border-top-width: 2px;
|
border-top-width: 1px;
|
||||||
border-top-style: solid;
|
border-top-style: dotted;
|
||||||
padding-top: 1em;
|
padding-top: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,7 +116,7 @@
|
||||||
|
|
||||||
|
|
||||||
pre, tt, code {
|
pre, tt, code {
|
||||||
font-family: "andale mono", monospace;
|
/*font-family: "andale mono", monospace;*/
|
||||||
font-size: 100%;
|
font-size: 100%;
|
||||||
white-space: pre;
|
white-space: pre;
|
||||||
}
|
}
|
||||||
|
@ -131,7 +137,7 @@
|
||||||
|
|
||||||
tt { color: green; }
|
tt { color: green; }
|
||||||
em { font-style: italic;
|
em { font-style: italic;
|
||||||
font-weight: bold; }
|
font-weight: normal; }
|
||||||
strong { font-weight: bold; }
|
strong { font-weight: bold; }
|
||||||
|
|
||||||
span.textit { font-style: italic; }
|
span.textit { font-style: italic; }
|
||||||
|
@ -161,8 +167,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------------------------------------------------------------+
|
* +-----------------------------------------------------------------+
|
||||||
* | Doxygen Specific Classes |
|
* | Doxygen Specific Classes |
|
||||||
|
@ -176,7 +180,7 @@
|
||||||
|
|
||||||
h1.header {
|
h1.header {
|
||||||
font-size: 200%;
|
font-size: 200%;
|
||||||
font-family: times, verdana, sans-serif;
|
/*font-family: times, verdana, sans-serif;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
center.header {
|
center.header {
|
||||||
|
@ -184,8 +188,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
table.header {
|
table.header {
|
||||||
/*width: 100%;*/
|
/*width: 100%;*/
|
||||||
/*background-color: #EEEEEE;*/
|
/*background-color: #EEEEEE;*/
|
||||||
background-color: #CCE6CA;
|
background-color: #CCE6CA;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,17 +197,26 @@
|
||||||
padding: 2px 14px;
|
padding: 2px 14px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-family: verdana, sans-serif;
|
/*font-family: verdana, sans-serif;*/
|
||||||
font-size: 110%;
|
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%; }
|
table.footer1, table.footer2 { width: 100%; }
|
||||||
td.LFooter { text-align: left; }
|
td.LFooter { text-align: left; }
|
||||||
td.RFooter { text-align: right; }
|
td.RFooter { text-align: right; }
|
||||||
td.CFooter { text-align: center;}
|
td.CFooter { text-align: center;}
|
||||||
table.footer2 td.RFooter { font-weight: bold; width: 35% }
|
table.footer2 td.RFooter { font-weight: bold; width: 35% }
|
||||||
table.footer2 td.CFooter { width: 30% }
|
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 {
|
table.classHierarchy {
|
||||||
border-collapse: separate;
|
border-collapse: separate;
|
||||||
|
@ -246,7 +259,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
div.ah {
|
div.ah {
|
||||||
font-family: time;
|
/*font-family: time;*/
|
||||||
font-size: 250%;
|
font-size: 250%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,7 +283,9 @@
|
||||||
|
|
||||||
a.qindex, a.qindex:visited, a.qindex:hover, a.qindexHL, a.el, a.elRef {
|
a.qindex, a.qindex:visited, a.qindex:hover, a.qindexHL, a.el, a.elRef {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
font-weight: bold;
|
/*font-family: Courier;*/
|
||||||
|
font-weight: normal;
|
||||||
|
/*font-size: 110%;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
a.qindex, a.qindex:visited {
|
a.qindex, a.qindex:visited {
|
||||||
|
@ -407,12 +422,17 @@
|
||||||
span.preprocessor { color: #806020 }
|
span.preprocessor { color: #806020 }
|
||||||
span.stringliteral { color: #002080 }
|
span.stringliteral { color: #002080 }
|
||||||
span.charliteral { color: #008080 }
|
span.charliteral { color: #008080 }
|
||||||
|
span.red { color: red }
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------
|
/* -------------------------------------------------------------------
|
||||||
* Attributes Listing.
|
* Attributes Listing.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
p.formulaDsp {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
.mdTable {
|
.mdTable {
|
||||||
/*border: 1px solid #868686;*/
|
/*border: 1px solid #868686;*/
|
||||||
/*background-color: #DADAEF;*/
|
/*background-color: #DADAEF;*/
|
||||||
|
|
|
@ -64,14 +64,14 @@ namespace Hurricane {
|
||||||
static RoutingPad* create ( Pin* );
|
static RoutingPad* create ( Pin* );
|
||||||
public:
|
public:
|
||||||
// Accessors.
|
// Accessors.
|
||||||
|
inline Occurrence getOccurrence () const { return _occurrence; };
|
||||||
|
Occurrence getPlugOccurrence ();
|
||||||
|
virtual const Layer* getLayer () const;
|
||||||
virtual DbU::Unit getX () const;
|
virtual DbU::Unit getX () const;
|
||||||
virtual DbU::Unit getY () const;
|
virtual DbU::Unit getY () const;
|
||||||
virtual Box getBoundingBox () const;
|
virtual Box getBoundingBox () const;
|
||||||
virtual const Layer* getLayer () const;
|
|
||||||
virtual Box getBoundingBox ( const BasicLayer* ) const;
|
virtual Box getBoundingBox ( const BasicLayer* ) const;
|
||||||
virtual Point getCenter () const;
|
virtual Point getCenter () const;
|
||||||
inline Occurrence getOccurrence () const { return _occurrence; };
|
|
||||||
Occurrence getPlugOccurrence ();
|
|
||||||
Point getSourcePosition () const;
|
Point getSourcePosition () const;
|
||||||
Point getTargetPosition () const;
|
Point getTargetPosition () const;
|
||||||
DbU::Unit getSourceX () const;
|
DbU::Unit getSourceX () const;
|
||||||
|
|
|
@ -49,6 +49,7 @@
|
||||||
PyPoint.cpp
|
PyPoint.cpp
|
||||||
PyReference.cpp
|
PyReference.cpp
|
||||||
PyReferenceCollection.cpp
|
PyReferenceCollection.cpp
|
||||||
|
PyRoutingPad.cpp
|
||||||
PySegment.cpp
|
PySegment.cpp
|
||||||
PySegmentCollection.cpp
|
PySegmentCollection.cpp
|
||||||
PyTechnology.cpp
|
PyTechnology.cpp
|
||||||
|
@ -102,6 +103,7 @@
|
||||||
hurricane/isobar/PyPoint.h
|
hurricane/isobar/PyPoint.h
|
||||||
hurricane/isobar/PyReference.h
|
hurricane/isobar/PyReference.h
|
||||||
hurricane/isobar/PyReferenceCollection.h
|
hurricane/isobar/PyReferenceCollection.h
|
||||||
|
hurricane/isobar/PyRoutingPad.h
|
||||||
hurricane/isobar/PySegment.h
|
hurricane/isobar/PySegment.h
|
||||||
hurricane/isobar/PySegmentCollection.h
|
hurricane/isobar/PySegmentCollection.h
|
||||||
hurricane/isobar/PyTechnology.h
|
hurricane/isobar/PyTechnology.h
|
||||||
|
|
|
@ -113,6 +113,22 @@ extern "C" {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------
|
// ---------------------------------------------------------------
|
||||||
// Attribute Method : "PyComponent_getBoundingBox ()"
|
// Attribute Method : "PyComponent_getBoundingBox ()"
|
||||||
|
|
||||||
|
@ -140,6 +156,7 @@ extern "C" {
|
||||||
{ { "getX" , (PyCFunction)PyComponent_getX , METH_NOARGS , "Return the Component X value." }
|
{ { "getX" , (PyCFunction)PyComponent_getX , METH_NOARGS , "Return the Component X value." }
|
||||||
, { "getY" , (PyCFunction)PyComponent_getY , METH_NOARGS , "Return the Component Y value." }
|
, { "getY" , (PyCFunction)PyComponent_getY , METH_NOARGS , "Return the Component Y value." }
|
||||||
, { "getPosition" , (PyCFunction)PyComponent_getPosition , METH_NOARGS , "Return the Component position." }
|
, { "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." }
|
, { "getNet" , (PyCFunction)PyComponent_getNet , METH_NOARGS , "Returns the net owning the component." }
|
||||||
, { "getLayer" , (PyCFunction)PyComponent_getLayer , METH_NOARGS , "Return the component layer." }
|
, { "getLayer" , (PyCFunction)PyComponent_getLayer , METH_NOARGS , "Return the component layer." }
|
||||||
, { "getBoundingBox" , (PyCFunction)PyComponent_getBoundingBox, METH_NOARGS , "Return the component boundingBox." }
|
, { "getBoundingBox" , (PyCFunction)PyComponent_getBoundingBox, METH_NOARGS , "Return the component boundingBox." }
|
||||||
|
|
|
@ -134,7 +134,7 @@ extern "C" {
|
||||||
PyLayer* pyLayer = NULL;
|
PyLayer* pyLayer = NULL;
|
||||||
PyComponent* pyComponent = NULL;
|
PyComponent* pyComponent = NULL;
|
||||||
DbU::Unit x=0, y=0, width=0, height=0;
|
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,
|
&PyTypeNet, &pyNet, &PyTypeLayer, &pyLayer,
|
||||||
&x, &y, &width, &height)) {
|
&x, &y, &width, &height)) {
|
||||||
contact = Contact::create(PYNET_O(pyNet), PYLAYER_O(pyLayer), x, y, width, height);
|
contact = Contact::create(PYNET_O(pyNet), PYLAYER_O(pyLayer), x, y, width, height);
|
||||||
|
|
|
@ -84,6 +84,7 @@
|
||||||
#include "hurricane/isobar/PyComponentCollection.h"
|
#include "hurricane/isobar/PyComponentCollection.h"
|
||||||
#include "hurricane/isobar/PyPlug.h"
|
#include "hurricane/isobar/PyPlug.h"
|
||||||
#include "hurricane/isobar/PyPlugCollection.h"
|
#include "hurricane/isobar/PyPlugCollection.h"
|
||||||
|
#include "hurricane/isobar/PyRoutingPad.h"
|
||||||
#include "hurricane/isobar/PySegment.h"
|
#include "hurricane/isobar/PySegment.h"
|
||||||
#include "hurricane/isobar/PySegmentCollection.h"
|
#include "hurricane/isobar/PySegmentCollection.h"
|
||||||
#include "hurricane/isobar/PyContact.h"
|
#include "hurricane/isobar/PyContact.h"
|
||||||
|
@ -579,6 +580,7 @@ extern "C" {
|
||||||
PyComponent_LinkPyType ();
|
PyComponent_LinkPyType ();
|
||||||
PySegment_LinkPyType ();
|
PySegment_LinkPyType ();
|
||||||
PyPad_LinkPyType ();
|
PyPad_LinkPyType ();
|
||||||
|
PyRoutingPad_LinkPyType ();
|
||||||
PyVertical_LinkPyType ();
|
PyVertical_LinkPyType ();
|
||||||
PyHorizontal_LinkPyType ();
|
PyHorizontal_LinkPyType ();
|
||||||
PyContact_LinkPyType ();
|
PyContact_LinkPyType ();
|
||||||
|
@ -645,6 +647,7 @@ extern "C" {
|
||||||
PYTYPE_READY_SUB ( Reference , Entity )
|
PYTYPE_READY_SUB ( Reference , Entity )
|
||||||
PYTYPE_READY_SUB ( Net , Entity )
|
PYTYPE_READY_SUB ( Net , Entity )
|
||||||
PYTYPE_READY_SUB ( Component , Entity )
|
PYTYPE_READY_SUB ( Component , Entity )
|
||||||
|
PYTYPE_READY_SUB ( RoutingPad , Component)
|
||||||
PYTYPE_READY_SUB ( Segment , Component)
|
PYTYPE_READY_SUB ( Segment , Component)
|
||||||
PYTYPE_READY_SUB ( Horizontal , Segment )
|
PYTYPE_READY_SUB ( Horizontal , Segment )
|
||||||
PYTYPE_READY_SUB ( Vertical , Segment )
|
PYTYPE_READY_SUB ( Vertical , Segment )
|
||||||
|
@ -698,6 +701,7 @@ extern "C" {
|
||||||
__cs.addType ( "plug" , &PyTypePlug , "<Plug>" , false, "comp" );
|
__cs.addType ( "plug" , &PyTypePlug , "<Plug>" , false, "comp" );
|
||||||
__cs.addType ( "plugCol" , &PyTypePlugCollection , "<PlugCollection>" , false );
|
__cs.addType ( "plugCol" , &PyTypePlugCollection , "<PlugCollection>" , false );
|
||||||
__cs.addType ( "point" , &PyTypePoint , "<Point>" , false );
|
__cs.addType ( "point" , &PyTypePoint , "<Point>" , false );
|
||||||
|
__cs.addType ( "rp" , &PyTypeRoutingPad , "<RoutingPad>" , false, "comp" );
|
||||||
__cs.addType ( "segment" , &PyTypeSegment , "<Segment>" , false, "comp" );
|
__cs.addType ( "segment" , &PyTypeSegment , "<Segment>" , false, "comp" );
|
||||||
__cs.addType ( "pad " , &PyTypePad , "<Pad>" , false, "comp" );
|
__cs.addType ( "pad " , &PyTypePad , "<Pad>" , false, "comp" );
|
||||||
__cs.addType ( "segmentCol" , &PyTypeSegmentCollection , "<SegmentCollection>" , false );
|
__cs.addType ( "segmentCol" , &PyTypeSegmentCollection , "<SegmentCollection>" , false );
|
||||||
|
@ -748,6 +752,8 @@ extern "C" {
|
||||||
Py_INCREF ( &PyTypeQuery );
|
Py_INCREF ( &PyTypeQuery );
|
||||||
PyModule_AddObject ( module, "Query" , (PyObject*)&PyTypeQuery );
|
PyModule_AddObject ( module, "Query" , (PyObject*)&PyTypeQuery );
|
||||||
|
|
||||||
|
Py_INCREF ( &PyTypeRoutingPad );
|
||||||
|
PyModule_AddObject ( module, "RoutingPad" , (PyObject*)&PyTypeRoutingPad );
|
||||||
Py_INCREF ( &PyTypeVertical );
|
Py_INCREF ( &PyTypeVertical );
|
||||||
PyModule_AddObject ( module, "PyVertical" , (PyObject*)&PyTypeVertical );
|
PyModule_AddObject ( module, "PyVertical" , (PyObject*)&PyTypeVertical );
|
||||||
Py_INCREF ( &PyTypeHorizontal );
|
Py_INCREF ( &PyTypeHorizontal );
|
||||||
|
@ -771,15 +777,16 @@ extern "C" {
|
||||||
PyDict_SetItemString ( dictionnary, "ProxyError" , ProxyError );
|
PyDict_SetItemString ( dictionnary, "ProxyError" , ProxyError );
|
||||||
PyDict_SetItemString ( dictionnary, "HurricaneError" , HurricaneError );
|
PyDict_SetItemString ( dictionnary, "HurricaneError" , HurricaneError );
|
||||||
|
|
||||||
DbULoadConstants ( dictionnary );
|
DbULoadConstants ( dictionnary );
|
||||||
TransformationLoadConstants ( dictionnary );
|
TransformationLoadConstants( dictionnary );
|
||||||
NetLoadConstants ( dictionnary );
|
NetLoadConstants ( dictionnary );
|
||||||
InstanceLoadConstants ( dictionnary );
|
InstanceLoadConstants ( dictionnary );
|
||||||
PinLoadConstants ( dictionnary );
|
PinLoadConstants ( dictionnary );
|
||||||
|
|
||||||
PyDbU_postModuleInit ();
|
PyDbU_postModuleInit();
|
||||||
PyLayer_postModuleInit ();
|
PyLayer_postModuleInit();
|
||||||
PyBasicLayer_postModuleInit ();
|
PyBasicLayer_postModuleInit();
|
||||||
|
PyRoutingPad_postModuleInit();
|
||||||
|
|
||||||
trace << "Hurricane.so loaded " << (void*)&typeid(string) << endl;
|
trace << "Hurricane.so loaded " << (void*)&typeid(string) << endl;
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,8 +47,9 @@ extern "C" {
|
||||||
|
|
||||||
|
|
||||||
// Standart Predicates (Attributes).
|
// Standart Predicates (Attributes).
|
||||||
DirectGetBoolAttribute(PyOccurrence_isValid ,isValid ,PyOccurrence,Occurrence)
|
DirectGetBoolAttribute (PyOccurrence_isValid ,isValid ,PyOccurrence,Occurrence)
|
||||||
DirectGetBoolAttribute(PyOccurrence_hasProperty,hasProperty,PyOccurrence,Occurrence)
|
DirectGetBoolAttribute (PyOccurrence_hasProperty ,hasProperty ,PyOccurrence,Occurrence)
|
||||||
|
DirectGetStringAttribute(PyOccurrence_getCompactString,getCompactString,PyOccurrence,Occurrence)
|
||||||
|
|
||||||
|
|
||||||
// Standart destroy (Attribute).
|
// Standart destroy (Attribute).
|
||||||
|
@ -168,16 +169,17 @@ extern "C" {
|
||||||
// PyOccurrence Attribute Method table.
|
// PyOccurrence Attribute Method table.
|
||||||
|
|
||||||
PyMethodDef PyOccurrence_Methods[] =
|
PyMethodDef PyOccurrence_Methods[] =
|
||||||
{ { "getEntity" , (PyCFunction)PyOccurrence_getEntity , METH_NOARGS, "Returns the referenced entity." }
|
{ { "getEntity" , (PyCFunction)PyOccurrence_getEntity , METH_NOARGS, "Returns the referenced entity." }
|
||||||
, { "getPath" , (PyCFunction)PyOccurrence_getPath , METH_NOARGS, "Returns the hierarchical instaciation path." }
|
, { "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." }
|
, { "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." }
|
, { "getCompactString", (PyCFunction)PyOccurrence_getCompactString, METH_NOARGS, "Returns the occurrence name (compact format)." }
|
||||||
, { "getMasterCell" , (PyCFunction)PyOccurrence_getMasterCell , METH_NOARGS, "Returns the cell owning the referenced entity." }
|
, { "getOwnerCell" , (PyCFunction)PyOccurrence_getOwnerCell , METH_NOARGS, "Returns the occurrence owner cell." }
|
||||||
, { "getBoundingBox", (PyCFunction)PyOccurrence_getBoundingBox, METH_NOARGS, "Returns the occurrence bounding box." }
|
, { "getMasterCell" , (PyCFunction)PyOccurrence_getMasterCell , METH_NOARGS, "Returns the cell owning the referenced entity." }
|
||||||
, { "isValid" , (PyCFunction)PyOccurrence_isValid , METH_NOARGS, "Returns true if the occurrence is valid." }
|
, { "getBoundingBox" , (PyCFunction)PyOccurrence_getBoundingBox , METH_NOARGS, "Returns the occurrence bounding box." }
|
||||||
, { "hasProperty" , (PyCFunction)PyOccurrence_hasProperty , METH_NOARGS, "Returns true if the occurrence owns some properties." }
|
, { "isValid" , (PyCFunction)PyOccurrence_isValid , METH_NOARGS, "Returns true if the occurrence is valid." }
|
||||||
, { "destroy" , (PyCFunction)PyOccurrence_destroy , METH_NOARGS
|
, { "hasProperty" , (PyCFunction)PyOccurrence_hasProperty , METH_NOARGS, "Returns true if the occurrence owns some properties." }
|
||||||
, "Destroy associated hurricane object, the python object remains." }
|
, { "destroy" , (PyCFunction)PyOccurrence_destroy , METH_NOARGS
|
||||||
|
, "Destroy associated hurricane object, the python object remains." }
|
||||||
, {NULL, NULL, 0, NULL} /* sentinel */
|
, {NULL, NULL, 0, NULL} /* sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -478,7 +478,9 @@ extern "C" {
|
||||||
, { "getBox" , (PyCFunction)PyTransformation_getBox , METH_VARARGS, "Return transformed box." }
|
, { "getBox" , (PyCFunction)PyTransformation_getBox , METH_VARARGS, "Return transformed box." }
|
||||||
, { "getInvert" , (PyCFunction)PyTransformation_getInvert , METH_NOARGS, "Return inverse transformation." }
|
, { "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." }
|
||||||
|
, { "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." }
|
||||||
|
, { "applyOn" , (PyCFunction)PyTransformation_ApplyOn , METH_VARARGS, "Apply transformation to object." }
|
||||||
, { "destroy" , (PyCFunction)PyTransformation_destroy , METH_NOARGS
|
, { "destroy" , (PyCFunction)PyTransformation_destroy , METH_NOARGS
|
||||||
, "Destroy associated hurricane object, the python object remains." }
|
, "Destroy associated hurricane object, the python object remains." }
|
||||||
, {NULL, NULL, 0, NULL} /* sentinel */
|
, {NULL, NULL, 0, NULL} /* sentinel */
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue