coriolis/kite/doc/notes.dox

205 lines
12 KiB
Plaintext
Raw Normal View History

2013-12-03 20:51:02 -06:00
// -*- 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.
*
Added support for "same layer" dogleg. Big fix for pad routing. * Change: In Knik, in Vertex, add a "blocked" flag to signal disabled vertexes in the grid (must not be used by the global router). Modificate the Graph::getVertex() method so that when a vertex is geometrically queried, if is a blocked one, return a non-blocked neighbor. This mechanism is introduced to, at last, prevent the global router to go *under* the pad in case of a commplete chip. * New: In Katabatic, in AutoSegment, a new state has been added: "reduced". A reduced segment is in the same layer as it's perpandiculars. To be reduced, a segments has to be connected on source & target to AutoContactTurn, both of the perpandiculars must be of the same layer (below or above) and it's length must not exceed one pitch in the perpandicular direction. To reduce an AutoSegment, call ::reduce() and to revert the state, call ::raise(). Two associated predicates are associated: ::canReduce() and ::mustRaise(). Note: No two adjacent segments can be reduced at the same time. * Bug: In Katabatic, in GCellTopology, add a new method ::doRp_AccessPad() to connect to the pads. Create wiring, fixed and non managed by Katabatic, to connect the pad connector layer to the lowest routing layers (depth 1 & 2). The former implementation was sometimes leading to gaps (sheared contact) that *must not* occurs during the building stage. Remark: This bug did put under the light the fact that the initial wiring must be created without gaps. Gaps are closed by making doglegs on contacts. But this mechanism could only work when the database if fully initialised (the cache is up to date). Otherwise various problems arise, in the canonization process for example. * New: In Katabatic, in AutoContactTerminal::getNativeConstraintBox(), when anchored on a RoutingPad, now take account the potential rotation of the Path's transformation. Here again, for the chip's pads. * New: In Kite, support for reduced AutoSegment. TrackSegment associateds to reduced AutoSegment are *not* inserted into track to become effectively invisibles. When a segment becomes reduced, a TrackEvent is generated to remove it. Conversely when it is raised a RoutingEvent is created/rescheduled to insert it. All this is mostly managed inside the Session::revalidate() method. * New: In Kite, in KiteEngine::createGlobalGraph(), in case of a chip, mark all global routing vertexes (Knik) that are under a pad, as blockeds. * Bug: In Cumulus, in PadsCorona.Side.getAxis(), inversion between X and Y coordinate of the chip size. Did not show until a non-square chip was routed (i.e. our MIPS R3000). * Change: In Stratus1, in st_placement.py add the ClockBuffer class for backward compatibility with the MIPS32 bench. Have to review this functionnality coming from the deprecated placeAndroute.py. In st_instance.py, no longer creates the Plug ring of a Net. In my opinion it just clutter the display until the P&R is called. Can re-enable later as an option (in Unicorn). * Change: In Unicorn, in cgt.py, more reliable way of loading then running user supplied scripts. Borrowed from alliance-checker-toolkit doChip.py .
2015-08-16 16:29:28 -05:00
* - <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.
*
2013-12-03 20:51:02 -06:00
*
* \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>
*/
}