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 + @@ -203,12 +204,14 @@
RoutingPad
Plug
Contact
Segment
+
Path
Occurrence
HyperNet

Fast Access Structures

+
Component::QuadTree
Component::Slice
Query
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