coriolis/deprecated/kite/doc/notes.dox

205 lines
12 KiB
C++

// -*- 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>
*/
}