coriolis/kite/doc/Session.dox

170 lines
8.5 KiB
Plaintext
Raw Normal View History

// -*- mode: C++; explicit-buffer-name: "Session.dox<kite>" -*-
namespace Kite {
/*! \class Session
* \brief Kite update Session
*
* Session extend the Katabatic update session to the Kite
* router level. Mainly by managing Track update.
*
* <b>Difference between Kite & Katabatic sessions:</b>
* - In Katabatic, segments are actually moved \e before the
* revalidation, then \e during the revalidation, contacts
* and topologies are adjusteds
* - In Kite, nothing is moved until the revalidation.
* Requests for segment displacement are queued for the session.
*
* <b>Asymmetry between invalidation & revalidation:</b>
* - When a TrackSegment (or directly an AutoSegment) is invalidated
* both associated AutoSegment and TrackSegment are invalidated
* (through the Observer mechanism).
* - When an AutoSegment is revalidated, the TrackSegment is \b not
* immediatly revalidated. See the revalidate algorithm for more
* details.
*
* <b>Indirect TrackSegment invalidation:</b>
* - TrackSegment invalidation do not result only from direct insertion
* in Track. For example, any or all of it's perpandicular can be
* invalidated trough the Katabatic::Session update (the perpandicular
* Katabatic::AutoSegment is revalidated, generating invalidation on their
* associated TrackSegment).
*
* For details on how Katabatic Sessions works, have a look to
* Katabatic::Session.
*
*
* \section secSessionMechanism The Session Mechanism.
*
* Delayed modification procedure :
* - Modifications events are recorded (queued) into the Session.
* At this step, no modification are actually done, the
* data-base retains it's previous state and coherency.
* - The \c revalidate() procedure is called (or the Session
* is closed), then all the modification events are applied.
* The data-base is in now in it's new state.
*
*
* \section secKiteSessionRevalidate The Revalidate Algorithm.
*
* Revalidation steps :
* - Process all remove events. detach TrackSegment from
* their Track, but do not remove the pointer from the
* internal \vector.
* - Pack all Track in which removal have took place.
* - Process all insert events. <b>This is the time TrackSegment
* are moved into their new Track (physical displacement)</b>.
* It is at this point that the invalidation of both AutoSegment
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
* and TrackSegment is done.
* - Call the Katabatic::Session::revalidate() method which
* will recompute the correct contact extensions and topologies.
* \e After this step the Katabatic data-base is up to date,
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
* but \e not the Kite one. AutoSegment are revalidated.
* - Recompute the canonical position of source and target
* of all invalidateds TrackSegment (take account of
* extention modifications). The set of invalidated TrackSegment
* is computed from the revalidated AutoSegment, that is
* AutoSegment that are canonical.
* - Perform a sort() on all Track that have been modifieds.
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
* - Now that the size of the segments have been accurately computed,
* look for revalidateds TrackSegment that:
* -# Can be reduced, generate a track remove event.
* -# Must be raised, generate a routing event (put into the
* queue).
* - Process the additional track remove events.
*
* <b>Note:</b> We cannot use the Observer mechanism to automatically
* update TrackSegment from an AutoSegment, because we must wait for all
* AutoSegments (canonical or not) involved into the TrackSegment to be
* up to date before we can update it.
*
* <b>Note:</b> Have to talk about the special case when new canonical
* AutoSegment appears after dogleg creation.
*
*
* \section secKiteSessionLookup The Lookup Mechanism
*
* There are two lookup mechanisms:
* - From a Hurricane::Segment, we uses the Katabatic segment lookup
* table (slow, stored in a \c map<>).
* - From a Katabatic::AutoSegment, we uses the Observer, it's owner
* is the TrackSegment (fast).
*/
//! \function Session* Session::open ( KiteEngine* kite );
//! \param kite A Kite ToolEngine on which to work.
//! \return A new Kite update Session.
//!
//! Open a new Kite update Session on the \c kite \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 Session* Session::get ( const char* message=NULL );
//! \sreturn The currently opened session, \c NULL if no session has
//! been opened.
//! \function Katabatic::Session* Session::base ();
//! \sreturn The Session, casted as it's base object.
//! \function bool Session::isEmpty ();
//! Ensure that the Session is empty and can be closed (deleted)
//! safely.
//! \function Configuration* Session::getConfiguration ();
//! \sreturn The Kite Configuration of the Router (proxy helper).
//! \function Net* Session::getBlockageNet ();
//! \sreturn The net used to create blockage components (proxy helper).
//! \function KiteEngine* Session::getKiteEngine ();
//! \sreturn The Kite ToolEngine associated to the current update
//! session (proxy helper).
//! \function NegociateWindow* Session::getNegociateWindow ();
//! \sreturn The current NegociateWindow (proxy helper).
//! \function Katabatic::GCell* Session::getGCellUnder ( DbU::Unit x, DbU::Unit y );
//! \sreturn The GCell under \c (x,y) (proxy helper, see Katabatic::GCellGrid::getGCell()).
//! \function void Session::addInsertEvent ( TrackElement* segment, Track* track );
//! \param segment An AutoSegment to insert in a Track.
//! \param track The Track into which the \e segment will be inserted.
//!
//! Schedule the insertion of \e segment into Track \e track.
//! The \e segment must not already be part of a Track.
//! \function void Session::addRemoveEvent ( TrackElement* segment );
//! \param segment A TrackSegment to remove from a Track.
//!
//! Schedule the removal of \e segment from Track \e track.
//! \function void Session::addMoveEvent ( TrackElement* segment, Track* track );
//! \param segment An AutoSegment to move into a new Track.
//! \param track The Track into which the \e segment will be moved.
//!
//! Schedule the displacement of \e segment into Track \e track.
//! \function void Session::addSortEvent ( Track* track, bool forced=false );
//! \param track The Track to update.
//! \param forced Force the invalidation of the \Track.
//!
//! Schedule the update of Track \e track. If the \Track has not been
//! invalidated, no actual sort will takes place. To force a sort
//! (manually invalidating the \Track), sets \b forced to \true.
//!
//! \sa Track::pack() & Track::sort().
//! \function void Session::revalidate ();
//! Applies all the requested modifications, but keeping the session
//! opened.
//! \function TrackElement* Session::lookup ( Segment* segment );
//! \sreturn the TrackElement associated to \c segment.
//! \function TrackElement* Session::lookup ( AutoSegment* segment );
//! \sreturn the TrackElement associated to \c segment.
}