// -*- C++ -*-
namespace Katabatic {
/*! \defgroup katabaticSession 7. Katabatic update Session Mechanism (internal)
*
* This module documents the Katabatic update Session Mechanism.
* It is intented for developpers only.
*
*
* \section secSessionGoal Goal of The Katabatic::Session
*
* Due to obvious performance issue, we do not recompute the
* geometry of source and target of a Katabatic::AutoSegment
* each time it's moved by the router. Instead we uses a simple
* queuing mechanism : the Katabatic::Session.
*
* Note that, most of the time, the router only moves segments,
* that is, never modifies directly Katabatic::AutoContact.
* The only exceptions being during the initial building stage
* or when the router decide to change the topology of a net.
*
* The router knows which Katabatic::AutoSegment it has moved,
* but during the update of a Katabatic::AutoContact geometry
* more segments will be modified. The modification being a
* change in their soure and/or target extention. And of thoses
* the router will not know about. To solve this problem,
* the router has to set a callback Katabatic::SegmentRevalidateCB
* which will be called for each modificated Katabatic::AutoSegment.
*
* Note that, in order to uniformize the procedure, this callback
* will also be run on Katabatic::AutoSegment modificated by
* the router.
*
*
* \section secSectionLookup The lookup function.
*
* To find a Katabatic::AutoSegment from it's associated \Hurricane
* segment, we build a simple \STL map in the Katabatic \c ToolEngine.
* This lookup table, can be accessed through the Session lookup()
* function, once the session is open.
*
*
* \section secSessionRevalidate The Revalidate procedure
*
* The sequence of calls is as follow :
*
* - The Router modifies some Katabatic::AutoSegment by moving
* their axis. For example, horizontal segments in an horizontal
* routing channel.
*
- The Katabatic::AutoSegment is then invalidated : put in the
* invalidated segment set. It's Katabatic::AutoContact anchors
* are also invalidated and put in the set of invalidated contacts.
*
- At some point, a global revalidation is performed :
* Katabatic::Session::revalidate(). Says, when the channel
* is successfully routed.
*
- Katabatic::updateGeometry() is called and update the
* geometry of all invalided Katabatic::AutoContact. Doing so
* almost surely leads to the invalidation of more Katabatic::AutoSegment
* which are added to the invalidated set. In this example, as
* we moved horizontal segments, the new invalidated segments
* will be vertical ones incident to the formers.
*
- Finally we call Katabatic::AutoSegment::onRevalidate()
* fonction for each Katabatic::AutoSegment.
* This function encapsulate the callback from the router, so it
* can take into account the segment extension change.
*
*
* \image html AutoInvalidate-1.png "Revalidate Procedure"
* \image latex AutoInvalidate-1.pdf "Revalidate Procedure" width=0.9\textwidth
*
*
* \section secStaticAccess The Static Member choice
*
* Almost all Session function members are \c static, this is
* because they refers to the currently opened Session which is
* kept entirely internal to the \c KatabaticSession module.
* This avoid carrying a global variable for the Session object.
*/
/*! \class Session
* \brief Katabatic update Session (\b API).
*
* The Katabatic Session is mandatory before any AutoSegment /
* AutoContact to be modified (supposedly by a router).
*
* Unlike \Hurricane \c update \c Session only one session
* can be opened at a time (no stacking mechanism). Opening a
* Katabatic update Session also opens an \Hurricane \c update
* \c Session.
*
* For details on how Katabatic Sessions works, have a look to
* \ref katabaticSession.
*/
/*! \function static Session* Session::get ();
* \return The currently opened session, \c NULL if no session has
* been opened.
*/
/*! \function static Katabatic* Session::getKatabatic ();
* \return The Katabatic ToolEngine associated to the current update
* session.
*/
/*! \function static AutoSegment* Session::lookup ( Segment* segment );
* \param segment An \Hurricane segment.
* \return The associated Katabatic AutoSegment.
*
* For this function to work, a Katabatic Session must be opened
* as it's a simple bypass to the Katabatic::_Lookup() member.
*/
/*! \function static Session* Session::open ( KatabaticEngine* ktbt );
* \param ktbt A Katabatic ToolEngine on which to work.
*
* Open a new Katabatic update Session on the \c ktbt \c ToolEngine.
* At this point only one session can be opened at a time. Attempt
* to open a second one will result in an exception.
*/
/*! \function static size_t Session::close ();
* \return The number of AutoContact / AutoSegment that have been revalidateds.
*
* Ends an update Session. This functions made a call to Revalidate to
* ensure that no AutoContact / AutoSegment remains invalidated.
*/
/*! \function static size_t Session::revalidate ();
* \return The number of AutoContact / AutoSegment that have been revalidateds.
*
* Revalidate all AutoContact / AutoSegment currently in the queue :
* that is, update the AutoContact geometry and AutoSegment extentions.
*/
/*! \function void Session::invalidate ( AutoSegment* segment );
* \param segment An AutoSegment that has been moved.
*
* The invalidated AutoSegment are stored into a \STL set,
* so it can be added multiples times without problems.
*/
/*! \function void Session::invalidate ( AutoContact* contact );
* \param contact An AutoContact of which a AutoSegment has been moved.
*
* The invalidated AutoContact are stored into a \STL set,
* so it can be added multiples times without problems.
*/
}