coriolis/katabatic/doc/NetConstraints.dox

129 lines
6.2 KiB
C++

// -*- C++ -*-
namespace Katabatic {
/*! \defgroup NetConstraints 5. Constraints Computations (internal)
*
* This module documents how constraints computation are performed.
* It is intented for developpers only.
*
* Constraints gives the absolute minimal and maximal position an
* \c AutoSegment axis can be set. They materialize the bounds over
* which we may have an electrical disconnection.
*
* Practically, due to the magic of \c AutoContact, disconnections
* can only occurs on \c AutoContact anchored on \c RoutingPad :
* if they go outside the \c RoutingPad area, we are in trouble.
* Those \c AutoContact can be spotted either by the fact they have
* an anchor or the AutoContact::isTerminal() flag is set.
*
*
* \section secConstraintsOrgan Organisation
*
* Due to algorithmic consideration, instead of storing constraint
* interval (one axis) in \c AutoSegment, we store constraint \c Box
* (both axis) in \c AutoContact. They are easier to propagate during the
* computation stage and should takes less memory as \c AutoContact
* are often shared by more than two \c AutoSegment.
*
* To spare memory, each coordinate of the constraint \c Box is expressed
* as a strictly positive offset in \e lambdas from the lower left corner
* of the \c FCell owning the \c AutoContact. Offsets are 8 bits <code>unsigned int</code>,
* thus a \c Box takes one word (32 bits). This leads to two restrictions :
* <ul>
* <li>A \c FCell side cannot be greater than 256 \e lambdas.
* <li>The constraint \c Box minimal precision is the \e lambda.
* </ul>
* In all cases I can foresee, none of them should be a problem.
*
* Constraint interval on \c AutoSegment can be deduced from any of
* the source or target \c AutoContact. For an horizontal \c AutoSegment
* we take the constraint \c Box vertical interval and for a vertical,
* the horizontal interval.
*
*
* \section secNativeConstraints Native Constraints
*
* Before the contraints computation starts, we needs to initialize
* each \c AutoContact \c Box to a reasonable default : the
* <em>Native Constraint Box</em>. Wich is :
* <ul>
* <li>For an anchored/passive \c AutoContact : the bounding box
* of the underlying terminal.
* <li>For any other \c AutoContact : the bounding box of the
* \c FCell owner.
* </ul>
*
*
* \section secConstraintsPropagation Constraints Propagation
*
* The only source of constraints being the anchored \c AutoContact
* we do a full propagation from each of them. Propagation is done
* through \c AutoSegment as follow :
* <ul>
* <li>Horizontal \c AutoSegment propagate the vertical (\b DY)
* constraint part.
* <li>Vertical \c AutoSegment propagate the horizontal (\b DX)
* constraint part.
* </ul>
* Obviously, any constraint diseapear after we have gone through
* exactly one horizontal and one vertical, thus the propagation is
* somewhat limited.
*
* Case of collapsed \c AutoSegment : those are to be kept at
* zero-length, thus they act as a bypass between two \c AutoContact.
* Their source and target can be considered as <em>stacked</em>
* and propagate both vertical and horizontal constraint (that is :
* the whole constraint \c Box).
*
*
* \section secCollapseUncollapse Collapsing & Uncollapsing
*
* Only local \c AutoSegment can be collapsed, as a global
* \c AutoSegment crosses the boundary of at least one \c FCell
* it can't have a null length.
*
* When collapsing a new \c AutoSegment, we can do an incremental
* constraint computation as it will result in a further increase
* of constraint (if any).
*
* When uncollapsing an \c AutoSegment we may have to slacken the
* constraint, but we do not know to which extend. So to make it
* simple we fully recompute constraints from scratch.
*
* Note that collapsing/uncollapsing are exceptionnal operations,
* so we can afford losing a little time there.
*
*
* \section secCollapseExample progressive Collapsing Example
*
* In this set of example we show how constraints propagate along the
* \c AutoSegment, depending on the collapsed ones. We starts we no
* collapse and ends with all \e local \c AutoSegment collapseds.
*
* \image html NetConstraints-1.png "Fully expanded"
* \image latex NetConstraints-1.pdf "Fully expanded" width=0.4\textwidth
* \image html NetConstraints-2.png "After One Vertical collapse"
* \image latex NetConstraints-2.pdf "After One Vertical collapse" width=0.4\textwidth
* \image html NetConstraints-3.png "After Horizontal collapse"
* \image latex NetConstraints-3.pdf "After Horizontal collapse" width=0.4\textwidth
* \image html NetConstraints-4.png "Fully collapsed"
* \image latex NetConstraints-4.pdf "Fully collapsed" width=0.4\textwidth
*/
//! \addtogroup NetConstraints
//! \{
/*! \function void KatabaticEngine::_computeNetConstraints ( Net* net );
* \param net The net for which to compute constraints.
*
* compute constraints on a net.
*/
//! \}
}