// -*- C++ -*- namespace Katabatic { /*! \class AutoContact * \brief Self-sizing Contact (\b API). * * \see \ref buildRules. * * \section secAutoContactSplitting AutoContact splitting mechanism * * An AutoContact splitting occurs when more than two layers connects * to a single AutoContact. * * <b>General Case</b> * * <ol> * <li>Create a \b secondary contact, so that both the original * and the secondary abide by the two layers rule. * <li>Create new AutoSegments to connect original to secondary. * There could be one or two segments created according to * the <i>layers distance</i>. * <li>Re-attach the AutoSegments to the right AutoContact. * The rule being that an AutoSegment is attached to the * lowest AutoContact containing it's Layer. * <li>The orignal & secondary contact are passed trough * the connexity restauration procedure. * </ol> * * <b>Importants Points</b> * * <ul> * <li>In the second step: the new AutoSegments must be put on * axis so that after resizing original and secondary AutoContact, * the AutoSegments do not extend outside their previous extension. * <li>Constraints splitting: the constraints on the splitted * AutoSegment mustn't be more restrictive than thoses on the * original one. For example, two AutoSegments that weren't * HAligneds must not become so. * </ul> * * <b>Special Cases</b> * <ul> * <li>The AutoContact is anchored on a \c METAL1 terminal, then * there is only one \c M4 AutoSegment to be re-connected, we * simply create a two-VIA dog leg. * <li>The AutoContact still have connect two connex Layers, just * changes the AutoContact Layer. * </ul> * * \image html AutoContact-12.png * \image html AutoContact-13.png * \image html AutoContact-14.png * \image html AutoContact-15.png * \image latex AutoContact-12.pdf * \image latex AutoContact-13.pdf * \image latex AutoContact-14.pdf * \image latex AutoContact-15.pdf */ /* \var GCell* AutoContact::_gcell * \brief The GCell into which the AutoContact is located. */ /*! \function AutoContact* AutoContact::fromRp ( GCell* gcell, RoutingPad* routingPad, const Layer* layer, Point point, DbU::Unit width, DbU::Unit height, bool fixed=false ); * \param gcell The GCell in which to create the AutoContact. * \param routingPad The RoutingPad on which to anchor the AutoContact. * \param layer The AutoContact's layer. * \param point The absolute position of the AutoContact. * \param width AutoContact's width. * \param height AutoContact's height. * \param fixed The AutoContact cannot be moved. * \return Newly created AutoContact. * * create an AutoContact anchored on a \c RoutingPad. The AutoContact can * be moved along the \c RoutingPad but not outside it. * * A remark on the \c point parameter : it must be absolute coordinates, but * as we uses the \c RoutingPad as an anchor they are translated into an * offset from the \c RoutingPad (see how \c Hurricane handles coordinates * through anchoring). It is also assumed that the AutoContact is to be * electrically connected to the \c RoutingPad (no disconnection). * So, we will faces three cases, depending on the \c RoutingPad * underlying \c Entity : * <ul> * <li>The \c Entity is an horizontal segment : * the Y coordinate is sets to zero, the X coordinate is kept. * <li>The \c Entity is a vertical segment : * keep the Y coordinate, the X coordinate is sets to zero. * <li>The \c Entity is a \c Contact or a \c Pin : * both X and Y are sets to zero. * </ul> */ /*! \function AutoContact* AutoContact::create ( GCell* gcell, Net* net, const Layer* layer, bool hAlignate=false, bool vAlignate=false ) * \param gcell The GCell into which the AutoContact will be put. * \param net The AutoContact's owner Net. * \param layer The AutoContact's layer. * \param hAlignate Keeps alignate (all) horizontal segments. * \param vAlignate Keeps alignate (all) vertical segments. * \return A new AutoContact. * * As AutoContact are Contacts restricted to, at best, two adjacent * routing layers, the layer argument is either a single routing * contact or a two metals only VIA. */ /*! \function AutoContact* AutoContact::create ( GCell* gcell, RoutingPad* rp, const Layer* layer, const DbU::Unit dx, const DbU::Unit dy, const DbU::Unit width, const DbU::Unit height, bool hAlignate=false, bool vAlignate=false, bool fixed=false ); * \param gcell The GCell into which the AutoContact will be put. * \param rp The RoutingPad anchor. * \param layer The AutoContact's layer. * \param dx Horizontal offset to the component. * \param dy Vertical offset to the component. * \param width Width of the AutoContact. * \param height Height of the AutoContact. * \param hAlignate Keeps alignate (all) horizontal segments. * \param vAlignate Keeps alignate (all) vertical segments. * \param fixed The AutoContact cannot be moved. * \return A new AutoContact. * * create an AutoContact anchored on a component : the component must * be a \RoutingPad, sets the isTerminal() flag. * * As AutoContact are Contacts restricted to, at best, two adjacent * routing layers, the layer argument is either a single routing * contact or a two metals only VIA. */ /*! \function GCell* AutoContact::getGCell() const * \brief Returns the GCell into which the AutoContact is located. */ /*! \function void AutoContact::updateGeometry() * \brief Perform the segment resizing. * * As it will resizes Hurricane components, this function call must * be enclosed into an updateSession. */ /*! \function AutoContacts AutoContact::getCollapseds ( unsigned int direction ); * \param direction restrict the search to that direction. * \return The \c Collection of AutoContact that are collapsed on this one, * that is, linked through collapsed AutoSegment of type * \c direction. */ /*! \function bool AutoContact::isTerminal () const; * \return \true if the AutoContact is anchored on a terminal. */ /*! \function bool AutoContact::isHAlignate () const; * \return \true if the horizontal AutoSegment anchored on the AutoContact * must be kept aligned. * \see \ref collapseCanonical */ /*! \function bool AutoContact::isVAlignate () const; * \return \true if the vertical AutoSegment anchored on the AutoContact * must be kept aligned. * \see \ref collapseCanonical */ /*! \function void AutoContact::getLengths ( DbU::Unit* lengths, set<AutoSegment*>& segments ); * \return Increment the table of lengths for the lengths of segments of * this AutoContact and inside it's owning GCell. */ /*! \function void AutoContact::setTerminal ( bool isTerminal ); * \param isTerminal set the terminal flag. */ /*! \function bool AutoContact::isHExtended (); * \return \true if the \b privileged direction of the AutoContact is horizontal. * * To be privileged in horizontal direction means that the \c Y coordinates * of all horizontals of the AutoContact are the same and imposed in either * of the following ways: * <ul> * <li>Have a horizontal global (i.e. stem). The AutoContact could * be non-punctual along the horizontal axis. * <li>All it's horizontals are kept aligneds. * </ul> * \note An AutoContact can be neither horizontally extended nor vertically * extended. In which case it is punctual. * * \image html AutoContact-10.png * \image latex AutoContact-10.pdf */ /*! \function bool AutoContact::isVExtended (); * \return \true if the \b privileged direction of the AutoContact is vertical. * * To be privileged in vertical direction means that the \c X coordinates * of all verticals of the AutoContact are the same and imposed in either * the following way: * <ul> * <li>Have a vertical global (i.e. stem). The AutoContact could * be non-punctual along the vertical axis. * <li>All it's vertical are kept aligneds. * </ul> * \note An AutoContact can be neither horizontally extended nor vertically * extended. In which case it is punctual. * * \image html AutoContact-11.png * \image latex AutoContact-11.pdf */ /*! \function void AutoContact::setHAlignate ( bool hAlignate ); * \param hAlignate The new horizontal alignement mode. * * When horizontal aligment mode is active, all horizontals of the * AutoContact are kept aligned (on the same \b Y coordinate). * \see \ref collapseCanonical */ /*! \function void AutoContact::setVAlignate ( bool vAlignate ); * \param vAlignate The new vertical alignement mode. * * When vertical aligment mode is active, all verticals of the * AutoContact are kept aligned (on the same \b X coordinate). * \see \ref collapseCanonical */ /*! \function void AutoContact::restoreHConnexity ( DbU::Unit y, bool split=false ); * \param y When splitting, the coordinate of the vertical strap segments. * \param split Wether to separate the various horizontals or not. * * Ensure that there is no gap between horizontals of this AutoContact. * <ul> * <li>The default behavior (<tt>split=false</tt>) is simply to sets the * <b>H Alignate</b> flags, thus forcing the alignment on the same \c Y. * <li>To allow the horizontals to be on different axis, we can split * them on differents AutoContacts aligneds vertically. The AutoSegments * created between thoses secondary contacts are calleds "straps" and * sets on the \c Y axis. * </ul> * In case of splitting, all the verticals are kept on the original AutoContact. */ /*! \function void AutoContact::restoreVConnexity ( DbU::Unit x, bool split=false ); * \param x When splitting, the coordinate of the horizontal strap segments. * \param split Wether to separate the various verticals or not. * * Ensure that there is no gap between verticals of this AutoContact. * <ul> * <li>The default behavior (<tt>split=false</tt>) is simply to sets the * <b>V Alignate</b> flags, thus forcing the alignment on the same \c X. * <li>To allow the verticals to be on different axis, we can split * them on differents AutoContacts aligneds horizontally. The AutoSegments * created between thoses secondary contacts are calleds "straps" and * sets on the \c X axis. * </ul> * In case of splitting, all the horizontals are kept on the original AutoContact. */ /*! \function void AutoContact::invalidate (); * Put this AutoContact into the invalidated set (see \ref katabaticSession). */ //! \addtogroup katabaticSession //! \{ /*! \function bool AutoContact::isInvalidated () const; * \return \True if the AutoContact is invalidated, i.e. in the * Katabatic Session, one or more of it's anchored AutoSegment * being moved. * * \see autoInvalidate(). */ /*! \function bool AutoContact::setInvalidated ( bool state ); * \param state set the state of the AutoContact regarding the * Katabatic Session. * * \see autoInvalidate(). */ /*! \function Box AutoContact::getNativeConstraintBox () const; * Return the native constraint box, that is, the \Box of the * owning GCell or the bounding box of the terminal it's anchored * upon. */ /*! \function DbU::Unit AutoContact::getCBXMin () const; * \return The X coordinate of the lower left corner. */ /*! \function DbU::Unit AutoContact::getCBYMin () const; * \return The Y coordinate of the lower left corner. */ /*! \function DbU::Unit AutoContact::getCBXMax () const; * \return The X coordinate of the upper right corner. */ /*! \function DbU::Unit AutoContact::getCBYMax () const; * \return The Y coordinate of the upper right corner. */ /*! \function Box AutoContact::getConstraintBox () const; * \return The current constraint box. */ /*! \function Box& AutoContact::intersectConstraintBox ( Box& box ) const; * \param box The box to intersect width. * \return A reference on the the box given as argument. * * Do the intersection of the constraint box and the one given * as argument. Store the result in place. */ /*! \function void AutoContact::restoreNativeConstraintBox (); * reset the constraint box to the native constraint box. */ /*! \function void AutoContact::setConstraintBox ( const Box& box ); * \param box The new constraint box. * * sets the constraint box. */ /*! \function void AutoContact::restrictConstraintBox ( DbU::Unit constraintMin, DbU::Unit constraintMax, unsigned int direction ); * \param constraintMin The constraint lower bound. * \param constraintMax The constraint upper bound. * \param direction The direction into which apply the constraint. * * restrict the constraint box in one direction. */ /*! \function void AutoContact::setCBXMin ( DbU::Unit xMin ); * \param xMin The X cooordinate of the lower left corner. * * sets the X coordinate of the lower left corner. */ /*! \function void AutoContact::setCBYMin ( DbU::Unit yMin ); * \param yMin The Y cooordinate of the lower left corner. * * sets the Y coordinate of the lower left corner. */ /*! \function void AutoContact::setCBXMax ( DbU::Unit xMax ); * \param xMax The X cooordinate of the upper right corner. * * sets the X coordinate of the upper right corner. */ /*! \function void AutoContact::setCBYMax ( DbU::Unit yMax ); * \param yMax The Y cooordinate of the upper right corner. * * sets the Y coordinate of the upper right corner. */ //! \} } namespace { }