
 // -*- C++ -*-

 namespace Kite {

 /*! \page  pageNotes  Notes
  *
  *  \section       Summary
  *
  *                 - \ref ssecVariousNotes         "Various Things to Remeber"
  *                 - \ref secPendingModifications  "Pending Modifications"
  *                 - \ref secModificationsHistory  "Modifications History"
  *                 - \ref ssecArchitectureChanges  "Changes in the general architecture"
  *                   - \ref ssecModificationsKiteEngine     "Changes in KiteEngine class design"
  *                   - \ref ssecModificationsDataNegociate  "Changes in DataNegociate class design"
  *                   - \ref ssecModificationsTrackElement   "Changes in TrackElement class design"
  *                   - \ref ssecModificationsTrackSegment   "Changes in TrackSegment class design"
  *                   - \ref ssecModificationsAutoSegment    "Changes in AutoSegment class design"
  *                   - \ref ssecModificationsAutoContact    "Changes in AutoContact class design"
  *                 - \ref ssecBugBusting  "Bug Solving Memento"
  *                 - \ref ssecNanoRoute   "Evaluation with Cadence NanoRoute"
  *
  *  \section       ssecVariousNotes  Various Things to Remember
  *
  *                 - <b>Determinism checking.</b> The trace level to get only determinism related
  *                   log is \c 500. Each line for the determinism is prepended with 'Deter|',
  *                   possible with some leading spaces.
  *
  *                 - The router only sees/manages the aligned segment sets (through a pseudo-
  *                   decorator on their canonical segment). So the non-canonical segments
  *                   and the contacts should not be handled at all at this level.
  *                 - Do do confuse the Session::Event, events that modificate
  *                   the state of the Kite database (insert, move or remove TrackSegment
  *                   in Track) and the RoutingEvent class which request that a segment
  *                   must be processed.
  *                 - In the various processing method of RoutingEvent, when a TrackSegment
  *                   can be inserted inside a Track a Session::Event is generated but
  *                   no further RoutingEvent, this end the placement processus of
  *                   segment (until it is ripped-up).
  *                 - AutoSegment do not invalidate their S/T anchor contacts.
  *                 - AutoContact invalidate their anchored upon AutoSegment.
  *                 - Now that the Hurricane database is deterministic, the router
  *                   seems to be likewise.
  *
  *                 - <b>Reduce/raise mechanism</b>. To manage <em>same layer</em> dogleg
  *                   this mechanism has been implemented. When a candidate dogleg
  *                   perpandicular segment length shrink below one pitch it is
  *                   removed from any track to become <em>invisible</em>.
  *                   Conversely, when a reduced segment length expand over one pitch
  *                   generate a new RoutingEvent to insert it. All this is managed
  *                   in the Session::revalidate() method.
  *
  *
  *  \section       secPendingModifications  Pending Modifications
  *
  *                 - In SegmentAction::doAction(), completly disable the movement of
  *                   TrackSegment on it's target Track axis. This should not be
  *                   needed as, if the algorithm as worked correctly, the next time
  *                   it's RoutingEvent is processed, the target Track will have a
  *                   free space to insert into. Then the Track insertion will
  *                   set the TrackSegment axis.
  *                 - Has to complete the lazy evaluation of the TrackSegment / DataNegociate
  *                   / RoutingEvent. There is still some redundancy when the key of
  *                   the RoutingEvent is updated.
  *                 - In AutoContact::updateTopology() & AutoContact::updateGeometry()
  *                   we could avoid to systematically run through the Hooks to cache
  *                   the connected segments. This can be done once at the first call
  *                   of either method (whichever comes first) on the first revalidate.
  *                   Afterwards the cache can be updated only by AutoContact::updateTopology().
  *                 - The canonization is done in two places, directly on a set of aligneds
  *                   AutoSegments through AutoSegment::canonize() and for the whole net
  *                   Session::_canonize(), which is called after the initial creation and
  *                   each time the topology is modificated. The later may be suppressed
  *                   if we uses more intelligently the former, and gain some more speedup.
  *
  *
  *  \section       secModificationsHistory  Modifications History
  *
  *  \subsection    ssecArchitectureChanges  Changes in the general architecture
  *
  *                 - <b>Lazy Update.</b> Update of DataNegociate and RoutingEvent
  *                   are now delayed until the event is processed, and systematically
  *                   done at this point. Thus, the explicit invalidation of those
  *                   objects is no longer needed. The revalidation is no longer
  *                   triggered by the revalidation of TrackSegment.
  *
  *
  *  \subsection    ssecModificationsKiteEngine  Changes in KiteEngine class design
  *
  *                 - Suppress the lookup table of Hurricane::Segment toward
  *                   TrackSegment. Instead uses the Observer mecanism between 
  *                   Katabatic::AutoSegment and TrackSegment.
  *
  *
  *  \subsection    ssecModificationsDataNegociate  Changes in DataNegociate class design
  *  
  *                 - Merge in the separate class \c Cost.
  *                 - Suppress the \c SlackState::Desalignate, due to the simplificated
  *                   structure of the AutoSegment/AutoContacts (no more collapseds, or
  *                   forced alignements).
  *                 - Displace the computation and caching of the perpandiculars and
  *                   perpandicular free interval from RoutingEvent into DataNegociate.
  *                   Allows code factorization with the attractors computation, and
  *                   data size reduction as there is exaclty one DataNegociate but
  *                   there may be more than one RoutingEvent for the same TrackSegment.
  *
  *
  *  \subsection    ssecModificationsTrackElement  Changes in TrackElement class design
  *
  *                 - Due to the simplificated structure of the Katabatic contacts
  *                   (terminal, turn, vtee & htee), there's no longer collapsed
  *                   AutoSegment or \e expandable contacts. The \b desalignate
  *                   feature, relaxing constraints due to collapsed segments
  *                   or contacts with more than three segments, is no longer
  *                   implemented.
  *                   \redB{Have to redevelop a method to break long segments linked}
  *                   \redB{by HTee or VTee.}
  *
  *
  *  \subsection    ssecModificationsTrackSegment  Changes in TrackSegment class design
  *
  *                 - The method \c TrackSegment::_postModify() is merged with
  *                   TrackSegment::_postDoglegs() as, in the context of TrackSegment
  *                   the only used topological modifications goes through the creation
  *                   of one or more dogleg.
  *
  *
  *  \subsection    ssecModificationsAutoSegment  Changes in AutoSegment class design
  *
  *                 - In AutoSegment::_makeDogleg(), update the local/global status
  *                   of the involved AutoSegment and re-canonize only what is necessary.
  *                   Thus, guarantee that the net's topology is still valid after this
  *                   method call and no topological update is needed at Session level
  *                   (should be \e much faster).
  *                     In this method, the code sharing between AutoHorizontal and
  *                   AutoVertical can still be increased (update mechanisms are
  *                   identicals).
  *                 - The \c id support is now also implemented at Hurricane level.
  *                   We may choose to use as a replacement of the one already present
  *                   in AutoSegment. But in that case, we at least must cache the
  *                   id in the AutoSegment. So we will not gain in memory footprint,
  *                   the only benefit would be to have coherent id number throughout
  *                   all the tools, but the sequentiality will be lost (this may not
  *                   be a big issue).
  *
  *
  *  \subsection    ssecModificationsAutoContact  Changes in AutoContact class design
  *
  *                 - In AutoSegment::invalidate(), no longer uses collection to
  *                   walk through attached AutoSegment, directly uses the cache.
  *                   Much simple and efficient as we exactly know what is attached
  *                   on every kind of contact.
  *
  *
  *  \section       ssecBugBusting  Bug Solving Memento
  *
  *                 <b>LUT lookup change:</b> When breaking a TrackSegment, the break may
  *                 not occurs in the associated canonical AutoSegment. In that case the
  *                 <code>dogleg[O]</code> will not match the one that is looked up
  *                 for the broken (canonical) segment. Thus it was not a bug but a
  *                 misunderstanding...
  *
  *                 <b>Overlap of perpandiculars after a dogleg creation:</b>
  *                 The axis of the new parallel was not set to the axis of it's parent.
  *                 This was due to the uses of AutoSegment::setAxis() in
  *                 AutoHorizontal::_makeDogleg() which silently
  *                 do nothing on non-canonical AutoSegment, and at this point, the
  *                 re-canonisation did not yet take place. Now Uses AutoSegment::_setAxis()
  *                 the atomic variant wich works inconditionnaly.
  *
  *
  *  \section       ssecNanoRoute  Evaluation with Cadence NanoRoute
  *
  *                 To perform a comparison with NanoRoute the procedure is as follow:
  *
  *                   - Export the design in Alliance \c DEF format. It will generate both
  *                     \c DEF file and the supporting \c LEF file containing the technology
  *                     and the abstract of all the standard cell of the design.
  *                     As Alliance uses symbolic units (lambda), they are translated with
  *                     the simple rule: <b>1 lambda == 1 micron</b>.
  *
  *                   - Run the commands in NanoRoute:
  *                       - <tt>loadLefFile design.lef</tt>
  *                       - <tt>loadDefFile design.def</tt>
  *                       - <tt>generateTracks</tt>
  *                       - <tt>generateVias</tt>
  *                       - <tt>setNanoRouteMode -quiet -drouteFixAntenna 0</tt>
  *                       - <tt>setNanoRouteMode -quiet -drouteStartIteration default</tt>
  *                       - <tt>setNanoRouteMode -quiet -routeTopRoutingLayer default</tt>
  *                       - <tt>setNanoRouteMode -quiet -routeBottomRoutingLayer 2</tt>
  *                       - <tt>setNanoRouteMode -quiet -drouteEndIteration default</tt>
  *                       - <tt>setNanoRouteMode -quiet -routeWithTimingDriven false</tt>
  *                       - <tt>setNanoRouteMode -quiet -routeWithSiDriven false</tt>
  *                       - <tt>routeDesign -globalDetail</tt>
  *
  *                   - To perform as fair a comparison as possible, those commands disable
  *                     antenna effect protection and disable the use of the \c M1 as a
  *                     routing layer (<tt>-routeBottomRoutingLayer 2</tt>). Those commands
  *                     are issued through the graphical interface of NanoRoute.
  *
  *                 <em>To see the resulting layout, do not forget to switch the view mode.</em>
  */

 }
