205 lines
12 KiB
C++
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>
|
|
*/
|
|
|
|
}
|