678 lines
31 KiB
C++
678 lines
31 KiB
C++
|
|
// -*- C++ -*-
|
|
|
|
|
|
namespace Katabatic {
|
|
|
|
/*! \class AutoSegment
|
|
* \brief Self-sizing segment (\b API).
|
|
*
|
|
* AutoSegment provide an uniform way of accessing AutoHorizontal
|
|
* and AutoVertical self-sizing segments. AutoSegments mainly contains
|
|
* a pointer to the associated Horizontal/Vertical Hurricane segment.
|
|
* This is the Hurricane segment which is part of the ring of the
|
|
* AutoContact. Thus we can directly access the Hurricane segment
|
|
* from the AutoSegment, but for the othey around we uses a lookup
|
|
* table in the Katabatic \c ToolEngine (see the
|
|
* Katabatic::_Lookup() member function).
|
|
*
|
|
* In order to inform the router of an AutoSegment state change,
|
|
* a callback function SegmentRevalidateCB can be positionned.
|
|
*
|
|
* \c Segment associated to AutoSegment are automatically oriented
|
|
* in such a way that the source \c Hook is always \e lower than
|
|
* the target \c hook. For an Horizontal segment it means that
|
|
* the abcissa of the source is inferior to the abcsissa of the
|
|
* target. It goes the same way for Vertical segment with the
|
|
* ordinate.
|
|
*
|
|
* KatabaticSession mechanism : this is fairly similar to the
|
|
* \c Hurricane updateSession one. When a segment is either moved
|
|
* by the router or resized by it's AutoContact it is invalidated
|
|
* with autoInvalidate() and put into the set of invalidated
|
|
* segments. When the KatabaticSession is closed the onRevalidate()
|
|
* member function is called on each segment, which in turn calls
|
|
* the router's callback. See Session::open(), Session::revalidate(),
|
|
* Session::close() and \ref katabaticSession.
|
|
*
|
|
* \remark As this object uses the decorator Design Pattern, almost all
|
|
* functions are pure virtuals. Implementation take place in a
|
|
* derived class \c AutoSegmentConcrete which is not documented,
|
|
* (same specifications as AutoSegment).
|
|
*
|
|
* \see AutoSegmentDecorator class.
|
|
*/
|
|
|
|
/*! \typedef AutoSegment::RevalidateCb_t ( AutoSegment* )
|
|
* Function type for the router callback. See AutoSegment::setRevalidateCb().
|
|
*/
|
|
|
|
/* \function static AutoSegment::RevalidateCb_t* AutoSegment::setRevalidateCb ( RevalidateCb_t* cb );
|
|
* \param cb The new router callback to install.
|
|
* \return The previous router callback.
|
|
*
|
|
* Install the callback to call when an AutoSegment is revalidated,
|
|
* The callback is called by onRevalidate() on closing the Katabatic
|
|
* update session.
|
|
*/
|
|
|
|
/*! \function bool AutoSegment::isHorizontal () const;
|
|
* \return \true if the AutoSegment is horizontal.
|
|
*/
|
|
|
|
/*! \function bool AutoSegment::isVertical () const;
|
|
* \return \true if the AutoSegment is vertical.
|
|
*/
|
|
|
|
/*! \function bool AutoSegment::isGlobal () const;
|
|
* \return \true if the AutoSegment is global : source and target
|
|
* AutoContact are not in the same GCell.
|
|
*/
|
|
|
|
/*! \function bool AutoSegment::isLocal () const;
|
|
* \return \true if the AutoSegment is local : source and target
|
|
* belongs to the same GCell.
|
|
*/
|
|
|
|
/*! \function bool AutoSegment::isTerminal () const;
|
|
* \return \true if the AutoSegment is terminal : the only way
|
|
* to access a terminal AutoContact (may not be directly
|
|
* achored on that terminal).
|
|
*/
|
|
|
|
/*! \function bool AutoSegment::isCollapsed () const;
|
|
* \return \true if the AutoSegment is collapsed : kept to zero-length.
|
|
*/
|
|
|
|
/*! \function bool AutoSegment::isCanonical () const;
|
|
* \return \true if the AutoSegment is canonical that is, the leftmost
|
|
* (for horizontal) or lowest (for vertical) segment of a set
|
|
* of collapsed segments. The canonical segment must be used
|
|
* as the unique representant for the collapsed set.
|
|
*/
|
|
|
|
/*! \function bool AutoSegment::isFixed () const;
|
|
* \return \true if the AutoSegment cannot be moved (through setAxis()).
|
|
*/
|
|
|
|
/*! \function bool AutoSegment::isAccountable () const;
|
|
* \return \true if the AutoSegment is canonical and not collapsed.
|
|
* Normally those flags are mutually exclusives, but better safe
|
|
* than sorry.
|
|
*
|
|
*/
|
|
|
|
/*! \function virtual GCell* AutoSegment::getGCell () const;
|
|
* \return The GCell owning the source AutoContact.
|
|
*/
|
|
|
|
/*! \function Net* AutoSegment::getNet () const;
|
|
* \return The net this AutoSegment is part of.
|
|
*/
|
|
|
|
/*! \function Layer* AutoSegment::getLayer () const;
|
|
* \return The layer of the AutoSegment.
|
|
*/
|
|
|
|
/*! \function virtual Segment* AutoSegment::getSegment ();
|
|
* \return The associated \c Hurricane segment.
|
|
*/
|
|
|
|
/*! \function virtual Segment* AutoSegment::getSegment () const;
|
|
* \return The associated \c Hurricane segment.
|
|
*
|
|
* This function is for use in const members.
|
|
*/
|
|
|
|
/*! \function virtual Segment* AutoSegment::getHorizontal ();
|
|
* \return If the the associated segment is horizontal, returns it.
|
|
* Otherwise (vertical) returns \c NULL.
|
|
*/
|
|
|
|
/*! \function virtual Segment* AutoSegment::getVertical ();
|
|
* \return If the the associated segment is vertical, returns it.
|
|
* Otherwise (horizontal) returns \c NULL.
|
|
*/
|
|
|
|
/*! \function DbU::Unit AutoSegment::getAxis () const;
|
|
* \return The segment axis : Y for horizontals and X for verticals.
|
|
*/
|
|
|
|
/*! \function AutoContact* AutoSegment::getSource () const;
|
|
* \return The source AutoContact.
|
|
*/
|
|
|
|
/*! \function AutoContact* AutoSegment::getTarget () const;
|
|
* \return The target AutoContact.
|
|
*/
|
|
|
|
/*! \function DbU::Unit AutoSegment::getSourcePosition () const;
|
|
* \return The lower bound of the segment into the routing track, equal
|
|
* the source coordinate minus the half pitch.
|
|
*/
|
|
|
|
/*! \function DbU::Unit AutoSegment::getTargetPosition () const;
|
|
* \return The upper bound of the segment into the routing track, equal
|
|
* the target coordinate plus the half pitch.
|
|
*/
|
|
|
|
/*! \function virtual void AutoSegment::setAxis ( DbU::Unit axis, bool realignate=false, set<AutoSegment*>* processeds=NULL );
|
|
* \param axis New coordinate of the axis. For an horizontal segment
|
|
* it will change the Y coordinate and for a vertical,
|
|
* the X coordinate.
|
|
* \param realignate It set to true, the new axis position will be propagated
|
|
* to all collapsed segments, even if the current AutoSegment
|
|
* don't need to be moved.
|
|
* \param processeds The set of already processeds aligneds AutoSegments.
|
|
*
|
|
* setAxis is the API frontend to the alignate function. It actually
|
|
* only checks if the segment has to be moved and if the move is to
|
|
* be propagated to the aligned AutoSegments.
|
|
*/
|
|
|
|
/*! \function virtual void AutoSegment::orient ();
|
|
* sets the source and target \c Hook of the Hurricane segment so
|
|
* the source is always lower than the target.
|
|
*/
|
|
|
|
/*! \function virtual void AutoSegment::invalidate ();
|
|
* adds the AutoSegment to the invalidate session. This will happens
|
|
* whenever a segment is moved by the router through setAxis() or
|
|
* resized by it's AutoContact.
|
|
*/
|
|
|
|
/* \function virtual void AutoSegment::onRevalidate ();
|
|
* This function is called at the time the AutoUpdate session is closed
|
|
* and calls the router's callback.
|
|
*/
|
|
|
|
/*! \function virtual void AutoSegment::getConstraints ( DbU::Unit& constraintMin, DbU::Unit& constraintMax ) const;
|
|
* \param constraintMin Where to store the constraint lower bound.
|
|
* \param constraintMax Where to store the constraint upper bound.
|
|
* \return Always \true (don't remember why...).
|
|
*
|
|
* Constraints are deduced from the constraint box of the source
|
|
* AutoContact.
|
|
*
|
|
* \see \ref NetConstraints
|
|
*/
|
|
|
|
/*! \function virtual void AutoSegment::getConstraints ( Interval& i ) const;
|
|
* \param i The constraint interval.
|
|
* \return Always \true (don't remember why...).
|
|
*
|
|
* \see getConstraints(), \ref NetConstraints
|
|
*/
|
|
|
|
/*! \function DbU::Unit AutoSegment::getSlack () const;
|
|
* \return The length of the constraint interval.
|
|
*
|
|
* \see \ref NetOptimals
|
|
*/
|
|
|
|
/*! \function DbU::Unit AutoSegment::getOptimalMin () const;
|
|
* \return The lower bound of the optimal interval.
|
|
*
|
|
* \see \ref NetOptimals
|
|
*/
|
|
|
|
/*! \function DbU::Unit AutoSegment::getOptimalMax () const;
|
|
* \return The upper bound of the optimal interval.
|
|
*
|
|
* \see \ref NetOptimals
|
|
*/
|
|
|
|
/*! \function Interval& AutoSegment::getOptimal ( Interval& i ) const;
|
|
* \param i The optimal interval.
|
|
* \return The interval given as argument.
|
|
*
|
|
* \see \ref NetOptimals
|
|
*/
|
|
|
|
/*! \function DbU::Unit AutoSegment::getCost ( DbU::Unit axis ) const;
|
|
* \param axis An axis coordinate.
|
|
* \return The distance from the nearest optimal interval bound.
|
|
*
|
|
* \see \ref NetOptimals
|
|
*/
|
|
|
|
/*! \function AutoSegment* AutoSegment::getCanonical ( DbU::Unit& sourcePosition, DbU::Unit& targetPosition );
|
|
* \param sourcePosition Lower bound of the super-AutoSegment.
|
|
* \param targetPosition Upper bound of the super-AutoSegment.
|
|
* \return The canonical AutoSegment of the super-AutoSegment.
|
|
*
|
|
* A super-AutoSegment is the set of all AutoSegment which have been
|
|
* bound together through (perpandicular) collapsed AutoSegment.
|
|
* They behave like one big AutoSegment. For algorithmic purpose we
|
|
* needs a canonical representant : it will be the lower AutoSegment
|
|
* (the one with the lower source coordinates).
|
|
* We also needs to know the real extend of the super-AutoSegment : it's
|
|
* returned through \c sourcePosition and \c targetPosition parameters.
|
|
*/
|
|
|
|
/*! \function AutoSegment* AutoSegment::getCanonical ( Interval& i );
|
|
* \param i interval of the super-AutoSegment.
|
|
* \return The canonical AutoSegment of the super-AutoSegment.
|
|
*
|
|
* \see AutoSegment::getCanonical().
|
|
*/
|
|
|
|
/*! \function AutoSegments AutoSegment::getCollapseds ( bool withPerpand=false );
|
|
* \return The \Collection of AutoSegment that are collapsed to this one
|
|
* (i.e. linked through perpandicual collapsed ones). Together
|
|
* they forms one big virtual AutoSegment.
|
|
*/
|
|
|
|
/*! \function AutoSegments AutoSegment::getCollapsedPerpandiculars ();
|
|
* \return The \Collection of AutoSegment that are perpandicular to this
|
|
* one and it's collapsed fellows.
|
|
*
|
|
* Note that this \Collection contains only \b GLOBAL perpandicular
|
|
* AutoSegment and \b Terminal perpandicular AutoSegment.
|
|
*/
|
|
|
|
/*! \function void AutoSegment::setCanonical ( bool state );
|
|
* \param state sets the isCanonical() flag to this value.
|
|
*/
|
|
|
|
/*! \function void AutoSegment::setTerminal ( bool state );
|
|
* \param state sets the isTerminal() flag to this value.
|
|
*/
|
|
|
|
/*! \function void AutoSegment::setLayer ( const Layer* layer );
|
|
* \param layer Changes the \Hurricane segment layer.
|
|
*/
|
|
|
|
/*! \function void AutoSegment::setPositions ();
|
|
* compute the positions of the AutoSegment into the routing track,
|
|
* from the \Hurricane segment extentions and the half-pitch.
|
|
*
|
|
* \see getSourcePosition() & getTargetPosition().
|
|
*/
|
|
|
|
/*! \function void AutoSegment::collapse ();
|
|
* sets the AutoSegment into collapsed state (zero-length).
|
|
*/
|
|
|
|
/*! \function void AutoSegment::expand ();
|
|
* Uncollapse the AutoSegment, re-compute the constraints on
|
|
* the splitted sets.
|
|
*/
|
|
|
|
/*! \function bool AutoSegment::toConstraintAxis ( set<AutoSegment*>* processeds=NULL );
|
|
* \return \True if the AutoSegment axis has been moved.
|
|
*
|
|
* If the segment axis is outside the constraint interval, set it
|
|
* the nearest constraint interval bound.
|
|
*/
|
|
|
|
/*! \function bool AutoSegment::toOptimalAxis ( set<AutoSegment*>* processeds=NULL );
|
|
* \return \True if the AutoSegment axis has been moved.
|
|
*
|
|
* If the segment axis is outside the optimal interval, set it
|
|
* the nearest optimal interval bound.
|
|
*/
|
|
|
|
/*! \function void AutoSegment::alignate ( DbU::Unit axis );
|
|
* \param axis New axis's coordinate.
|
|
*
|
|
* Move the segment axis to a new position. Adjust positions
|
|
* of the supporting Contact whenever they are anchored on terminals
|
|
* (i.e. RoutingPad).
|
|
* This function is atomic and should not be called directly
|
|
* but rather through setAxis(). It's implemented in the
|
|
* derived classes AutoHorizontal & AutoVertical.
|
|
*/
|
|
|
|
/*! \function void AutoSegment::setOptimalMin ( DbU::Unit oMin );
|
|
* \param oMin sets the lower bound of the optimal interval.
|
|
*
|
|
* \see getOptimalMin(), getOptimalMax(), getCost().
|
|
*/
|
|
|
|
/*! \function void AutoSegment::setOptimalMax ( DbU::Unit oMin );
|
|
* \param oMin sets the upper bound of the optimal interval.
|
|
*
|
|
* \see getOptimalMin(), getOptimalMax(), getCost().
|
|
*/
|
|
|
|
/*! \function void AutoSegment::checkPositions () const;
|
|
* check the coherency between the locally shadowed values
|
|
* of source \& target position and the real ones. If a discrepancy
|
|
* is found issue an error (but do not stop the program).
|
|
*
|
|
* Note that discrepancies are legal while the AutoSegment is
|
|
* invalidated (see \ref katabaticSession).
|
|
*/
|
|
|
|
/*! \function void AutoSegment::checkInvalidated () const;
|
|
* issue an error if the AutoSegment is invalidated. Mainly used
|
|
* to debug the Katabatic Session mechanism (\ref katabaticSession).
|
|
*/
|
|
|
|
|
|
//! \addtogroup NetOptimals
|
|
//! \{
|
|
|
|
/*! \function virtual void AutoSegment::computeOptimal ( set<AutoSegment*>* processeds=NULL );
|
|
* compute the AutoSegment optimal position interval.
|
|
*/
|
|
|
|
/*! \function virtual DbU::Unit AutoSegment::getOrigin () const;
|
|
* \return The lower bound of the GCell in which the AutoSegment is
|
|
* (\c YMin for horizontals, \c XMin for verticals).
|
|
*/
|
|
|
|
/*! \function virtual DbU::Unit AutoSegment::getExtremity () const;
|
|
* \return The upper bound of the GCell in which the AutoSegment is
|
|
* (\c YMax for horizontals, \c XMax for verticals).
|
|
*/
|
|
|
|
//! \}
|
|
|
|
|
|
//! \addtogroup katabaticSession
|
|
//! \{
|
|
|
|
/*! \function bool AutoSegment::isInvalidated () const;
|
|
* \return \True if the AutoSegment is invalidated, i.e. in the
|
|
* Katabatic Session, it's axis having being moved by the
|
|
* router.
|
|
*
|
|
* \see autoInvalidate().
|
|
*/
|
|
|
|
/*! \function bool AutoSegment::setInvalidated ( bool state );
|
|
* \param state set the state of the AutoSegment regarding the
|
|
* Katabatic Session.
|
|
*
|
|
* \see autoInvalidate().
|
|
*/
|
|
|
|
//! \}
|
|
|
|
|
|
/*! \class AutoHorizontal
|
|
* \brief Horizontal AutoSegment (\b API).
|
|
*/
|
|
|
|
/*! \function static AutoHorizontal* AutoHorizontal::create ( Horizontal* horizontal, int type, bool terminal=false, bool collapsed=false );
|
|
* \param horizontal The associated \c Hurricane segment.
|
|
* \param type Global, local or guessed kind.
|
|
* \param terminal Whether the segment is tightly linked to a terminal.
|
|
* \param collapsed Whether the segment must be kept of null length.
|
|
* \return The newly created AutoSegment.
|
|
*/
|
|
|
|
/*! \function static AutoHorizontal* AutoHorizontal::create ( AutoContact* source, AutoContact* target, const Layer* layer, DbU::Unit y, DbU::Unit width, int type, bool terminal=false, bool collapsed=false );
|
|
* \param source The source \c Component.
|
|
* \param target The target \c Component.
|
|
* \param layer The segment's layer.
|
|
* \param y The segment's Y coordinate.
|
|
* \param width The segment's width.
|
|
* \param type Global, local or guessed kind.
|
|
* \param terminal Whether the segment is tightly linked to a terminal.
|
|
* \param collapsed Whether the segment must be kept of null length.
|
|
* \return The newly created AutoSegment.
|
|
*
|
|
* Allocate both \c Hurricane segment and Katabatic AutoSegment.
|
|
*/
|
|
|
|
|
|
/*! \class AutoVertical
|
|
* \brief Vertical AutoSegment (\b API).
|
|
*/
|
|
|
|
/*! \function static AutoVertical* AutoVertical::create ( Vertical* vertical, int type, bool terminal=false, bool collapsed=false );
|
|
* \param vertical The associated \c Hurricane segment.
|
|
* \param type Global, local or guessed kind.
|
|
* \param terminal Whether the segment is tightly linked to a terminal.
|
|
* \param collapsed Whether the segment must be kept of null length.
|
|
* \return The newly created AutoSegment.
|
|
*/
|
|
|
|
/*! \function static AutoVertical* AutoVertical::create ( AutoContact* source, AutoContact* target, const Layer* layer, DbU::Unit x, DbU::Unit width, int type, bool terminal=false, bool collapsed=false );
|
|
* \param source The source \c Component.
|
|
* \param target The target \c Component.
|
|
* \param layer The segment's layer.
|
|
* \param x The segment's X coordinate.
|
|
* \param width The segment's width.
|
|
* \param type Global, local or guessed kind.
|
|
* \param terminal Whether the segment is tightly linked to a terminal.
|
|
* \param collapsed Whether the segment must be kept of null length.
|
|
* \return The newly created AutoSegment.
|
|
*
|
|
* Allocate both \c Hurricane segment and Katabatic AutoSegment.
|
|
*/
|
|
|
|
|
|
/*! \function AutoSegment* AutoSegment::create ( AutoContact* source, AutoContact* target, unsigned int dir, int type, bool terminal=false, bool collapsed=false );
|
|
* \param source The source AutoContact.
|
|
* \param target The target AutoContact.
|
|
* \param dir The AutoSegment direction (\b H / \b V).
|
|
* \param type Whether the AutoSegment is \b LOCAL, \b GLOBAL or must be guessed.
|
|
* \param terminal The AutoSegment is used to connect a terminal.
|
|
* \param collapsed The AutoSegment is collapsed.
|
|
* \return A new AutoSegment.
|
|
*
|
|
* create the AutoSegment between \c source and \c target, update the GCell
|
|
* density if needed.
|
|
*
|
|
* If the \c dir parameter do not contains the \b HORIZONTAL or \b VERTICAL
|
|
* boolean flags an error will be thrown.
|
|
*/
|
|
|
|
|
|
/*! \enum AutoSegment::Type
|
|
* This enumeration is used to hints AutoSegment constructor about
|
|
* the kind of segment we are about to create. Once created, the
|
|
* kind of AutoSegment is stored in a single boolean telling
|
|
* wether it's \b GLOBAL or \b LOCAL (see AutoSegment::isGlobal()).
|
|
*
|
|
* It is always best to avoid using AutoSegment::Guess as it implies findind
|
|
* and checking source and target anchors (through ring access).
|
|
* And in most cases we already known the kind of segment because
|
|
* we created the source and target AutoContact just before...
|
|
* See GCellConfiguration related functions.
|
|
*/
|
|
|
|
/*! \var AutoSegment::Global
|
|
* The AutosSegment crosses at least one GCell boundary (i.e.
|
|
* source and target AutoContact do not belong to the same GCell).
|
|
*/
|
|
|
|
/*! \var AutoSegment::Local
|
|
* The AutoSegment is fully included in one GCell.
|
|
*/
|
|
|
|
/*! \var AutoSegment::Guess
|
|
* The AutoSegment constructor will guess the kind of AutoSegment
|
|
* by examining source and target anchors.
|
|
*/
|
|
|
|
/*! \defgroup collapseCanonical 3. AutoSegment collapse & Canonical (internal)
|
|
*
|
|
* \section AlignedAS Collapsing AutoSegment
|
|
*
|
|
* A set of AutoSegment can be aligned together. The set will
|
|
* behave like one big AutoSegment, especially, moving one
|
|
* AutoSegment through setAxis() will move the whole set.
|
|
*
|
|
* For each set of aligned AutoSegment, we provide a canonical
|
|
* AutoSegment : the leftmost (for horizontal) or lowermost for
|
|
* verticals.
|
|
*
|
|
* There are two ways AutoSegments could be aligned :
|
|
* <ul>
|
|
* <li>Through a collapsed perpandicular AutoSegment.
|
|
* <li>Through a locked AutoContact.
|
|
* </ul>
|
|
*
|
|
* \subsection AlignedByCollapsed Aligned through collapsed AutoSegment
|
|
*
|
|
* When an AutoSegment is collapsed, all perpandicular AutoSegment
|
|
* to it's source and target AutoContact are aligneds. Collapsing
|
|
* an AutoSegment means that it should be kept to zero length and
|
|
* thus not managed by the overlying router.
|
|
*
|
|
* \image html AutoSegmentCollapse-5.png "collapse by AutoSegment"
|
|
* \image latex AutoSegmentCollapse-5.pdf "collapse by AutoSegment" width=0.4\textwidth
|
|
*
|
|
* \subsection AlignedByAutoContact Aligned through collapsed AutoContact
|
|
*
|
|
* With the setHAlignate() and setVAlignate() the alignment of
|
|
* horizontal (resp. vertical) AutoSegment of an AutoContact can be
|
|
* forced.
|
|
*
|
|
* \image html AutoSegmentCollapse-6.png "collapse by AutoContact"
|
|
* \image latex AutoSegmentCollapse-6.pdf "collapse by AutoContact" width=0.4\textwidth
|
|
*
|
|
* \subsection collapsedExample An example of collapse/alignment
|
|
*
|
|
* \image html AutoSegmentCollapse-1.png "collapse - Step 1"
|
|
* \image latex AutoSegmentCollapse-1.pdf "collapse - Step 1" width=0.4\textwidth
|
|
*
|
|
* \image html AutoSegmentCollapse-2.png "collapse - Step 2"
|
|
* \image latex AutoSegmentCollapse-2.pdf "collapse - Step 2" width=0.4\textwidth
|
|
*
|
|
* \image html AutoSegmentCollapse-3.png "collapse - Step 3"
|
|
* \image latex AutoSegmentCollapse-3.pdf "collapse - Step 3" width=0.4\textwidth
|
|
*
|
|
* \image html AutoSegmentCollapse-4.png "collapse - Step 4"
|
|
* \image latex AutoSegmentCollapse-4.pdf "collapse - Step 4" width=0.4\textwidth
|
|
*/
|
|
|
|
|
|
//! \addtogroup collapseCanonical
|
|
//! \{
|
|
|
|
/*! \enum AutoSegment::PerpandicularState
|
|
* set of flags used to build the state of two AutoSegment.
|
|
* \see getPerpandicularState().
|
|
*/
|
|
|
|
/*! \var AutoSegment::PerpandicularAny
|
|
* The \e current AutoSegment is perpandicular to the \e master.
|
|
* May it be or not through collapsed perpandiculars.
|
|
*/
|
|
|
|
/*! \var AutoSegment::PerpandicularIndirect
|
|
* The \e current AutoSegment is perpandicular to the \e master
|
|
* through at least one collapsed perpandicular.
|
|
*/
|
|
|
|
/*! \var AutoSegment::ParallelOrExpanded
|
|
* The \e current AutoSegment is not part of the aligned set,
|
|
* it's either parallel but not aligned (no constraint on the
|
|
* AutoContact) or perpandicular and not collapsed.
|
|
*/
|
|
|
|
/*! \var AutoSegment::ParallelAndLayerChange
|
|
* The \e current AutoSegment is parallel to the master but not on
|
|
* the same layer as the \e source (the \e master by transitivity).
|
|
*/
|
|
|
|
/*! \function unsigned int AutoSegment::getPerpandicularState ( AutoContact* contact, AutoSegment* source, AutoSegment* current, bool isHorizontalMaster, const Layer* masterLayer=NULL )
|
|
* \param contact The AutoContact shared by source \& current.
|
|
* \param source The AutoSegment from where we came.
|
|
* \param current The AutoSegment we are exploring.
|
|
* \param isHorizontalMaster The direction of the reference AutoSegment.
|
|
* \param masterLayer The \Layer of the reference AutoSegment.
|
|
* \return A composite value telling the position of current relative to
|
|
* source and reference.
|
|
*
|
|
* Locators of \Collections like AutoSegment::getCollapseds() or
|
|
* AutoSegment::getCollapsedPerpandiculars() are built on this
|
|
* function. Any \Collection manipulating aligned sets must uses
|
|
* this function which is the keystone of the aligned set walk-through.
|
|
*
|
|
* The return value is a combination of binary flags from the
|
|
* AutoSegment::PerpandicularState enumeration. The function
|
|
* compute the following boolean values :
|
|
* <ul>
|
|
* <li>\e sourcePerpandicular : \True if the \e source is perpandicular
|
|
* to the \e master AutoSegment.
|
|
* <li>\e currentPerpandicular : \True if the \e current is perpandicular
|
|
* to the \e master AutoSegment.
|
|
* <li>\e contactAlignate : \True if the alignment constraint on the
|
|
* AutoContact (if any) applies to \e source \& \e current. For instance
|
|
* it will be \True if both source and current are horizontal
|
|
* \b and AutoContact::isHAlignate() is \True.
|
|
* </ul>
|
|
* Then the return value is computed as follow :
|
|
* <ol>
|
|
* <li>If \e current is parallel to \e master \b but not on the same
|
|
* layer.
|
|
*
|
|
* sets the AutoSegment::AutoSegment::ParallelAndLayerChange flag.
|
|
* <li>If \e current is perpandicular to \e master \b and not
|
|
* collapsed, it is perpandicular to the aligned set of the
|
|
* \e master.
|
|
*
|
|
* sets the AutoSegment::AutoSegment::PerpandicularAny flag.
|
|
* <li>\e source is perpandicular to \e master. There is an implicit
|
|
* context : the only way a perpandicular segment gets took into
|
|
* account, is to be collapsed. Then if the \e current AutoSegment
|
|
* is also perpandicular \b and \b not collapsed, it means
|
|
* that it's a perpandicular to the aligned set of the \e master,
|
|
* The difference with the previous case, is that it's through at
|
|
* least one collapsed perpandicular.
|
|
*
|
|
* sets the AutoSegment::AutoSegment::PerpandicularIndirect flag.
|
|
* <li>\e source is parallel to \e master. Then we check for
|
|
* disconnection in the aligned set. Disconnection arises
|
|
* if the \e contactAlignate flag is \false (either no
|
|
* alignment constraint on the AutoContact or different
|
|
* directions), \b and the \e current segment is not a
|
|
* collapsed perpandicular.
|
|
*
|
|
* sets the AutoSegment::AutoSegment::ParallelOrExpanded flag.
|
|
* </ol>
|
|
* The \b zero return value means that the \e current AutoSegment
|
|
* belong to the same aligned set as the \e master \b or is a
|
|
* perpandicular collapsed AutoSegment.
|
|
*
|
|
* The figures below demonstrate all thoses case :
|
|
*
|
|
* \image html PerpandicularState-1.png "Simple Perpandicular (case 2)"
|
|
* \image latex PerpandicularState-1.pdf "Simple Perpandicular (case 2)" width=0.8\textwidth
|
|
*
|
|
* \image html PerpandicularState-2.png "Indirect Perpandicular (case 3)"
|
|
* \image latex PerpandicularState-2.pdf "Indirect Perpandicular (case 3)" width=0.8\textwidth
|
|
*
|
|
* \image html PerpandicularState-3.png "Parallel (case 4.1)"
|
|
* \image latex PerpandicularState-3.pdf "Parallel (case 4.1)" width=0.8\textwidth
|
|
*
|
|
* \image html PerpandicularState-4.png "Aligned through AutoContact (case 4.2)"
|
|
* \image latex PerpandicularState-4.pdf "Aligned through AutoContact (case 4.2)" width=0.8\textwidth
|
|
*/
|
|
|
|
/*! \function unsigned int AutoSegment::getPerpandicularState ( AutoContact* contact, AutoSegment* source, AutoSegment* current, AutoSegment* master )
|
|
* \param contact The AutoContact shared by source \& current.
|
|
* \param source The AutoSegment from where we came.
|
|
* \param current The AutoSegment we are exploring.
|
|
* \param master The reference AutoSegment.
|
|
* \return A composite value telling the position of current relative to
|
|
* source and reference.
|
|
*/
|
|
|
|
/*! \function bool AutoSegment::arePerpandiculars ( AutoSegment* a, AutoSegment* b );
|
|
* \param a First AutoSegment.
|
|
* \param b Second AutoSegment.
|
|
* \return true if a \& b have perpandicular directions.
|
|
*/
|
|
|
|
/*! \function bool AutoSegment::areAligneds ( AutoSegment* a, AutoSegment* b );
|
|
* \param a First AutoSegment.
|
|
* \param b Second AutoSegment.
|
|
* \return true if a \& b have same directions.
|
|
*/
|
|
|
|
/*! \function bool AutoSegment::arePerpandiculars ( bool isHorizontalA, AutoSegment* b );
|
|
* \param isHorizontalA is the A AutoSegment horizontal.
|
|
* \param b Second AutoSegment.
|
|
* \return true if a \& have perpandicular directions.
|
|
*/
|
|
|
|
}
|