diff --git a/hurricane/doc/hurricane/ASIM.css b/hurricane/doc/hurricane/ASIM.css
index befe1aef..3b99772e 100644
--- a/hurricane/doc/hurricane/ASIM.css
+++ b/hurricane/doc/hurricane/ASIM.css
@@ -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;*/
diff --git a/hurricane/doc/hurricane/HyperNet.dox b/hurricane/doc/hurricane/HyperNet.dox
new file mode 100644
index 00000000..c8efaa01
--- /dev/null
+++ b/hurricane/doc/hurricane/HyperNet.dox
@@ -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.
+
+ // \}
+
+ }
diff --git a/hurricane/doc/hurricane/Query.dox b/hurricane/doc/hurricane/Query.dox
new file mode 100644
index 00000000..c92133a0
--- /dev/null
+++ b/hurricane/doc/hurricane/Query.dox
@@ -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.
+
+
+ // \}
+
+ }
diff --git a/hurricane/doc/hurricane/RoutingPad.dox b/hurricane/doc/hurricane/RoutingPad.dox
new file mode 100644
index 00000000..ddb07491
--- /dev/null
+++ b/hurricane/doc/hurricane/RoutingPad.dox
@@ -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 (dx,dy)
.
+
+ //! \function void RoutingPad::setOffset ( const DbU::Unit& dx, const DbU::Unit& dy );
+ //! Sets the relative position of the RoutingPad from it's anchor to (dx,dy)
.
+
+ //! \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 (x,y)
.
+
+ //! \function void RoutingPad::setPosition ( const Point& position );
+ //! Sets the absolute position of the RoutingPad to position
.
+
+ //! \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.
+
+ // \}
+
+ }
diff --git a/hurricane/doc/hurricane/customHierarchy.html b/hurricane/doc/hurricane/customHierarchy.html
index e234d882..1e43f7f0 100644
--- a/hurricane/doc/hurricane/customHierarchy.html
+++ b/hurricane/doc/hurricane/customHierarchy.html
@@ -123,6 +123,7 @@
| Component |
+ | RoutingPad |
| Plug |
| Contact |
| Segment |
@@ -203,12 +204,14 @@
Fast Access Structures
diff --git a/hurricane/doc/hurricane/doxyfile b/hurricane/doc/hurricane/doxyfile
index 1127f91c..e93f3a17 100644
--- a/hurricane/doc/hurricane/doxyfile
+++ b/hurricane/doc/hurricane/doxyfile
@@ -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
diff --git a/hurricane/doc/viewer/ASIM.css b/hurricane/doc/viewer/ASIM.css
index befe1aef..3b99772e 100644
--- a/hurricane/doc/viewer/ASIM.css
+++ b/hurricane/doc/viewer/ASIM.css
@@ -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;*/
diff --git a/hurricane/src/hurricane/hurricane/RoutingPad.h b/hurricane/src/hurricane/hurricane/RoutingPad.h
index f1e9173c..f266cd7d 100644
--- a/hurricane/src/hurricane/hurricane/RoutingPad.h
+++ b/hurricane/src/hurricane/hurricane/RoutingPad.h
@@ -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;
diff --git a/hurricane/src/isobar/CMakeLists.txt b/hurricane/src/isobar/CMakeLists.txt
index 117771cd..eb55fb80 100644
--- a/hurricane/src/isobar/CMakeLists.txt
+++ b/hurricane/src/isobar/CMakeLists.txt
@@ -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
diff --git a/hurricane/src/isobar/PyComponent.cpp b/hurricane/src/isobar/PyComponent.cpp
index 324ef7fb..67e4efc8 100644
--- a/hurricane/src/isobar/PyComponent.cpp
+++ b/hurricane/src/isobar/PyComponent.cpp
@@ -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." }
diff --git a/hurricane/src/isobar/PyContact.cpp b/hurricane/src/isobar/PyContact.cpp
index c8c23de8..915ff92d 100644
--- a/hurricane/src/isobar/PyContact.cpp
+++ b/hurricane/src/isobar/PyContact.cpp
@@ -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);
diff --git a/hurricane/src/isobar/PyHurricane.cpp b/hurricane/src/isobar/PyHurricane.cpp
index 8e47710d..e9c10f34 100644
--- a/hurricane/src/isobar/PyHurricane.cpp
+++ b/hurricane/src/isobar/PyHurricane.cpp
@@ -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 , "" , false, "comp" );
__cs.addType ( "plugCol" , &PyTypePlugCollection , "" , false );
__cs.addType ( "point" , &PyTypePoint , "" , false );
+ __cs.addType ( "rp" , &PyTypeRoutingPad , "" , false, "comp" );
__cs.addType ( "segment" , &PyTypeSegment , "" , false, "comp" );
__cs.addType ( "pad " , &PyTypePad , "" , false, "comp" );
__cs.addType ( "segmentCol" , &PyTypeSegmentCollection , "" , 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;
}
diff --git a/hurricane/src/isobar/PyOccurrence.cpp b/hurricane/src/isobar/PyOccurrence.cpp
index 9fa88273..c7b8b327 100644
--- a/hurricane/src/isobar/PyOccurrence.cpp
+++ b/hurricane/src/isobar/PyOccurrence.cpp
@@ -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 */
};
diff --git a/hurricane/src/isobar/PyRoutingPad.cpp b/hurricane/src/isobar/PyRoutingPad.cpp
new file mode 100644
index 00000000..9655d621
--- /dev/null
+++ b/hurricane/src/isobar/PyRoutingPad.cpp
@@ -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(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.
+
diff --git a/hurricane/src/isobar/PyTransformation.cpp b/hurricane/src/isobar/PyTransformation.cpp
index 3e093f9c..9d47d582 100644
--- a/hurricane/src/isobar/PyTransformation.cpp
+++ b/hurricane/src/isobar/PyTransformation.cpp
@@ -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 */
diff --git a/hurricane/src/isobar/hurricane/isobar/PyRoutingPad.h b/hurricane/src/isobar/hurricane/isobar/PyRoutingPad.h
new file mode 100644
index 00000000..2aa3c171
--- /dev/null
+++ b/hurricane/src/isobar/hurricane/isobar/PyRoutingPad.h
@@ -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