// -*- 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 unsigned int, * thus a \c Box takes one word (32 bits). This leads to two restrictions : * * 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 * Native Constraint Box. Wich is : * * * * \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 : * * 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 stacked * 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. */ //! \} }