2010-03-09 09:24:29 -06:00
|
|
|
|
|
|
|
// -*- C++ -*-
|
|
|
|
|
|
|
|
namespace Katabatic {
|
|
|
|
|
|
|
|
/*! \class AutoSegment
|
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* \brief Abstract base class for AutoSegment
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* \section secASCreation Creating AutoHorizontal & AutoVertical
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* AutoSegment is the abstract base class for AutoHorizontal and
|
|
|
|
* AutoVertical. They are must be created only through the
|
|
|
|
* factory method: AutoSegment::create().
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* \section secASCharacteristics Characteristics of AutoSegments
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* <ul>
|
|
|
|
* <li>Unique ID: to ease the enforcing of a deterministic behavior
|
|
|
|
* and to gain some independance from the pointers, each AutoSegment
|
|
|
|
* is associated with an unique identifier.
|
|
|
|
* \red{<b>IDs</b> are now directly taken from the Hurricane::Segment.}
|
|
|
|
* <li>Source contact is always lesser than Target contact
|
|
|
|
* <code>(Xs,Ys) < (Xt,Yt)</code>.
|
|
|
|
* <li>When assembled through AutoContactVTee or AutoContactHTee,
|
|
|
|
* AutoSegments became (i.e. must be kept) aligneds. Among a
|
|
|
|
* set of aligned AutoSegments, we distinguish a representative
|
|
|
|
* trough which we can manipulate the whole set. This representative
|
|
|
|
* is called the \e canonical AutoSegment and is the one with the
|
|
|
|
* lowest \c id).
|
|
|
|
* <li>When an aligned set contains at least one global, all the segments
|
|
|
|
* of the set are tagged Katabatic::SegWeakGlobal. This is
|
|
|
|
* especially useful on local ones to know if they are part of a
|
|
|
|
* much longer wire.
|
|
|
|
*
|
|
|
|
* Conversely, a set of aligned may contains only local segments and
|
|
|
|
* thus will not have the flag set.
|
|
|
|
* <li>To allow some optimization, the Katabatic::SegNotAligned
|
|
|
|
* tells if a segment is part of an aligned set. It is deduced from
|
|
|
|
* the type of both source and target contact: not on the parallel
|
|
|
|
* branch of a tee.
|
|
|
|
* </ul>
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* <b>The Ever Fragmenting Data Structure</b>
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* All the transformations applied to the database, after it's initial
|
|
|
|
* building, can be reduced to making new doglegs (and layer changes).
|
|
|
|
* Another way to put it, is that no Tee is ever created after the
|
|
|
|
* initial stage. The consequence is that the segments are only fragmenting
|
|
|
|
* more and more (up to a certain limit). The aligneds sets are progessively
|
|
|
|
* broken apart as needed, and until there remains only one tee per set
|
|
|
|
* (the two segments on the aligned branch).
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* \section secASOperations Operations on AutoSegments
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* <ul>
|
|
|
|
* <li><b>Slackening.</b> Constraints transmited through either source
|
|
|
|
* or target AutoContact are too tight (tighter than the GCell),
|
|
|
|
* by adding straps in the perpandicular direction, the full slack
|
|
|
|
* of the segment is restored.
|
|
|
|
* <li><b>Layer Change.</b> One or two layers above or below the
|
|
|
|
* current layer. One up/down may means into the perpandicular
|
|
|
|
* routing direction.
|
|
|
|
* <li><b>Dogleg Creation.</b> Mean breaking the segment in two.
|
|
|
|
* This operation is used to slacken the constraints on a segment
|
|
|
|
* or restore connexity on source/target contact after a layer
|
|
|
|
* change. The new segment is always created on the source.
|
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
|
|
|
* <li><b>Reduction/Raising.</b> When a segment is a short dogleg,
|
|
|
|
* no greater than one picth, it can use the layer of the
|
|
|
|
* perpandiculars.
|
2013-12-03 18:58:58 -06:00
|
|
|
* </ul>
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* \section secASInvalidate Invalidate on AutoSegments
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* The simple invalidation of an AutoSegment <b>do not</b> invalidate
|
|
|
|
* it's source & target contact.
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* An axis position change or a layer change both invalidate the
|
|
|
|
* AutoSegment <b>and</b> it's source & target contacts.
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* For the complete invalidation/revalidation mechanism see
|
|
|
|
* \ref secSessionAlgo "Session Algorithm".
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* \section secASAttributes Main Attributes of AutoSegments
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* AutoSegment retains all attributes from Segment. The Segment itself
|
|
|
|
* beeing accessible through the base() methods.
|
|
|
|
* <ul>
|
|
|
|
* <li>An unique \c Id (for determinism).
|
|
|
|
* <li>The GCell from wich it starts from. It is the GCell of the
|
|
|
|
* source AutoContact.
|
|
|
|
* <li>A state, combination of flags from Katabatic::AutoSegmentFlag.
|
|
|
|
* <li>An interval for the optimal range of the AutoSegment axis.
|
|
|
|
* <li>An interval for user's defined constraint on the axis.
|
|
|
|
* <li>The interval giving the complete length of the AutoSegment,
|
|
|
|
* that is, with all extentions cap taken into account.
|
|
|
|
* This interval is refered as the \e span.
|
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
|
|
|
* <li>A small counter, of the number of reduced neighbors (never
|
|
|
|
* exceed two).
|
2013-12-03 18:58:58 -06:00
|
|
|
* </ul>
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* \section secASImplementation Implementation Details
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* AutoSegment / AutoHorizontal & AutoVertical are kind of decorators of
|
|
|
|
* Hurricane::Segment (they do not scrictly respect the pattern).
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* Canonical AutoSegment can should be considered as a kind of Composite.
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* Thoses objects are created using a Factory method.
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* \section secASMethodsClassif Methods Classification
|
2010-03-09 09:24:29 -06:00
|
|
|
*
|
2013-12-03 18:58:58 -06:00
|
|
|
* <ul>
|
|
|
|
* <li><em>Wrapper methods</em> on the underlying Hurricane::Segment.
|
|
|
|
* </ul>
|
|
|
|
* <ul>
|
|
|
|
* <li><em>Atomic methods</em> on AutoSegment, that is, which applies exactly
|
|
|
|
* on the current AutoSegment.
|
|
|
|
* </ul>
|
|
|
|
* <ul>
|
|
|
|
* <li><em>Canonical methods</em> that applies on the set of aligned AutoSegments.
|
|
|
|
* There are two kind of those, the methods part of the API, and
|
|
|
|
* the ones that make the link with the atomic methods. Those
|
|
|
|
* intermediate methods hide some cumbersome AutoSegment list
|
|
|
|
* parameters.
|
|
|
|
* <ul>
|
|
|
|
* <li>AutoSegment::invalidate()
|
|
|
|
* <li>AutoSegment::computeOptimal()
|
|
|
|
* <li>AutoSegment::setAxis()
|
|
|
|
* <li>AutoSegment::toConstraintAxis()
|
|
|
|
* <li>AutoSegment::toOptimalAxis()
|
|
|
|
* </ul>
|
|
|
|
* </ul>
|
|
|
|
* <ul>
|
|
|
|
* <li><em>Uniform access</em>, to simplify the managment of AutoHorizontal
|
|
|
|
* and AutoVertical through AutoSegment, a set of uniformized methods is
|
|
|
|
* introduced. For instance, to avoid to check the dynamic type to choose
|
|
|
|
* to call getSourceX() or getSourceY(), we may call getSourceU().
|
|
|
|
* Uniform methods are named by replacing \c X/Y with \c U.
|
|
|
|
* <ul>
|
|
|
|
* <li>AutoSegment::getSourceU()
|
|
|
|
* <li>AutoSegment::getTargetU()
|
|
|
|
* <li>AutoSegment::getDuSource()
|
|
|
|
* <li>AutoSegment::getDuTarget()
|
|
|
|
* <li>AutoSegment::getSpanU()
|
|
|
|
* <li>AutoSegment::setDuSource()
|
|
|
|
* <li>AutoSegment::setDuTarget()
|
|
|
|
* </ul>
|
|
|
|
* </ul>
|
2010-03-09 09:24:29 -06:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \enum AutoSegmentFlag
|
|
|
|
//! Set of flags to describe the internal state of an AutoSegment.
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \var AutoSegmentFlag::SegHorizontal
|
|
|
|
//! This AutoSegment is associated to a Hurricane::Horizontal, if not
|
|
|
|
//! set, it is associated to a Hurricane::Vertical. Set when the object
|
|
|
|
//! is constructed.
|
|
|
|
|
|
|
|
//! \var AutoSegmentFlag::SegFixed
|
|
|
|
//! The Hurricane::Segment associated must/cannot be moved.
|
|
|
|
|
|
|
|
//! \var AutoSegmentFlag::SegGlobal
|
|
|
|
//! The AutoSegment span between at least two GCells (i.e. not fully enclosed
|
|
|
|
//! in one).
|
|
|
|
|
|
|
|
//! \var AutoSegmentFlag::SegWeakGlobal
|
|
|
|
//! The AutoSegment is part of an aligned set which contains at least a global.
|
|
|
|
//! The global segment is itself tagged as weak global.
|
|
|
|
|
|
|
|
//! \var AutoSegmentFlag::SegCanonical
|
|
|
|
//! This AutoSegment is the designated representant of a set of aligned
|
|
|
|
//! AutoSegment.
|
|
|
|
|
|
|
|
//! \var AutoSegmentFlag::SegBipoint
|
|
|
|
//! This AutoSegment is a straight wire between two terminal AutoContact.
|
|
|
|
|
|
|
|
//! \var AutoSegmentFlag::SegDogleg
|
|
|
|
//! This AutoSegment has been created as the perpandicular part of a dogleg.
|
|
|
|
|
|
|
|
//! \var AutoSegmentFlag::SegStrap
|
|
|
|
//! This AutoSegment has been created to to reconnect parts of an AutoSegment
|
|
|
|
//! after slackening.
|
|
|
|
|
Support of RoutingGauge, part 2.
In Katabatic & Kite, remove all hard-coded values related to track pitches.
* New: In <Session>, add more convenience function to access RoutingGauge
characteristics.
* New: In <AutoSegment>, <AutoContact>, add support for the "depth spin",
that is, if the source/target contacts are going "top" or "down".
Used to compute the perpandicular pitch. Need a small modification
of the revalidation mechanism. The observers of <AutoSegment> are
notified when the spin changes.
* New: In <AutoSegment>, the getPPitch() method allow to compute the
"perpandicular pitch". For now it is simply the greatest from the
source perpandicular pitch and the target perpandicular pitch.
Make uses of the "depth spin".
* New: In <TrackElement>, <TrackSegment>, cache the perpandicular pitch.
Updated through the notification from the observable.
2014-05-19 10:58:38 -05:00
|
|
|
//! \var AutoSegmentFlag::SegSourceTop
|
|
|
|
//! The source contact of this segment is connected to the <em>top</em> layer.
|
|
|
|
|
|
|
|
//! \var AutoSegmentFlag::SegSourceBottom
|
|
|
|
//! The source contact of this segment is connected to the <em>bottom</em> layer.
|
|
|
|
|
|
|
|
//! \var AutoSegmentFlag::SegTargetTop
|
|
|
|
//! The target contact of this segment is connected to the <em>top</em> layer.
|
|
|
|
|
|
|
|
//! \var AutoSegmentFlag::SegTargetBottom
|
|
|
|
//! The target contact of this segment is connected to the <em>bottom</em> layer.
|
|
|
|
|
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
|
|
|
//! \var AutoSegmentFlag::SegIsReduced
|
|
|
|
//! This segment is the perpandicular part of a dogleg which will use the
|
|
|
|
//! <em>same</em> layer as the parallels.
|
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \var AutoSegmentFlag::SegLayerChange
|
|
|
|
//! This AutoSegment has been created to to reconnect parts of an AutoSegment
|
|
|
|
//! after a layer change.
|
|
|
|
|
|
|
|
//! \var AutoSegmentFlag::SegSlackened
|
|
|
|
//! This AutoSegment has been slackened, that is freed from any constraints from
|
|
|
|
//! source or target through the insertion of straps.
|
|
|
|
|
|
|
|
//! \var AutoSegmentFlag::SegStrongTerminal
|
|
|
|
//! This AutoSegment directly connected to a terminal.
|
|
|
|
|
|
|
|
//! \var AutoSegmentFlag::SegWeakTerminal1
|
|
|
|
//! This AutoSegment indirectly connected to a terminal with medium strength.
|
|
|
|
|
|
|
|
//! \var AutoSegmentFlag::SegWeakTerminal2
|
|
|
|
//! This AutoSegment indirectly connected to a terminal with weak strength.
|
|
|
|
|
|
|
|
//! \var AutoSegmentFlag::SegNotSourceAligned
|
|
|
|
//! This source contact of the segment is not the aligned part of a tee
|
|
|
|
//! (\c h1 or \c h2 for a \c HTee, \c v1 or \c v2 for a \c VTee).
|
|
|
|
//!
|
|
|
|
//! \sa AutoSegmentFlag::SegNotAligned
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \var AutoSegmentFlag::SegNotTargetAligned
|
|
|
|
//! This target contact of the segment is not the aligned part of a tee
|
|
|
|
//! (\c h1 or \c h2 for a \c HTee, \c v1 or \c v2 for a \c VTee).
|
|
|
|
//!
|
|
|
|
//! \sa AutoSegmentFlag::SegNotAligned
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \var AutoSegmentFlag::SegAxisSet
|
|
|
|
//! This AutoSegment has been explicitly positionned at least once.
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \var AutoSegmentFlag::SegInvalidated
|
|
|
|
//! This position or topology of this AutoSegment has been changed, needing
|
|
|
|
//! a revalidation.
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \var AutoSegmentFlag::SegInvalidatedLayer
|
|
|
|
//! The segment has been chenged of layer, but the source & target AutoContact
|
|
|
|
//! have not been topologicaly checked yet. This flag \b must be used in
|
|
|
|
//! whith AutoSegmentFlag::SegInvalidated.
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \var AutoSegmentFlag::SegCreated
|
|
|
|
//! The AutoSegment has just been created. This flag is set only from the
|
|
|
|
//! contruction of the object until is \e first revalidation. Used to
|
|
|
|
//! disable some tests that cannot be satisfied initially.
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \var AutoSegmentFlag::SegWeakTerminal
|
|
|
|
//! A mask composed of:
|
|
|
|
//! - Katabatic::SegStrongTerminal
|
|
|
|
//! - Katabatic::SegWeakTerminal1
|
|
|
|
//! - Katabatic::SegWeakTerminal2
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \var AutoSegmentFlag::SegNotAligned
|
|
|
|
//! A mask composed of:
|
|
|
|
//! - Katabatic::SegNotSourceAligned
|
|
|
|
//! - Katabatic::SegNotTargetAligned
|
|
|
|
//!
|
|
|
|
//! This mask is a quick way to know if a segment is \b not part of an aligned set.
|
|
|
|
//! It means that the segment is, on both ends, either connected to a terminal,
|
|
|
|
//! a turn <em>or the stem part of a tee</em>.
|
2010-03-09 09:24:29 -06:00
|
|
|
|
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function AutoSegment* AutoSegment::create ( AutoContact* source, AutoContact* target, Segment* hurricaneSegment );
|
|
|
|
//! \param source The source AutoContact.
|
|
|
|
//! \param target The target AutoContact.
|
|
|
|
//! \param hurricaneSegment The Hurricane::Segment to decorate.
|
|
|
|
//! \return The AutoHorizontal/AutoVertical decorator segment.
|
|
|
|
//!
|
|
|
|
//! Factory method to create AutoHorizontal or AutoVertical. It is important
|
|
|
|
//! to note that this function may modify the underlying Hurricane::Segment.
|
|
|
|
//! - Layer is set to the default (bottom) routing Layers.
|
|
|
|
//! - Source & target anchor of \c hurricaneSegment are set on \c source
|
|
|
|
//! and \c target. If the \c hurricaneSegment is already anchored and
|
|
|
|
//! \c source or \c target are not the one decorating the anchors, an
|
|
|
|
//! exception is thrown.
|
2010-03-09 09:24:29 -06:00
|
|
|
|
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
|
|
|
//! \function AutoSegment* AutoSegment::create ( AutoContact* source, AutoContact* target, unsigned int dir, size_t depth );
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \param source The source AutoContact.
|
|
|
|
//! \param target The target AutoContact.
|
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
|
|
|
//! \param dir Specify the segment direction.
|
|
|
|
//! \param depth The layer, given by it's depth in the RoutingGauge.
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \return The AutoHorizontal/AutoVertical.
|
|
|
|
//!
|
|
|
|
//! Factory method to create AutoHorizontal or AutoVertical.
|
|
|
|
//! \c flags indicate the direction (KbHorizontal or KbVertical).
|
|
|
|
//! The underlying Hurricane segment is also created.
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function Segment* AutoSegment::base() const;
|
|
|
|
//! \sreturn the decorated Hurricane::Segment (const flavor).
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function Segment* AutoSegment::base();
|
|
|
|
//! \sreturn the decorated Hurricane::Segment.
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function Horizontal* AutoSegment::getHorizontal();
|
|
|
|
//! \sreturn If the decorated segment is a Hurricane::Horizontal, return it.
|
|
|
|
//! \c NULL otherwise.
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function Vertical* AutoSegment::getVertical();
|
|
|
|
//! \sreturn If the decorated segment is a Hurricane::Vertical, return it.
|
|
|
|
//! \c NULL otherwise.
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function Cell* AutoSegment::getCell() const;
|
|
|
|
//! \see Segment::getCell().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function Net* AutoSegment::getNet() const;
|
|
|
|
//! \see Segment::getNet().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function const Layer* AutoSegment::getLayer() const;
|
|
|
|
//! \see Segment::getLayer().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function BoundingBox* AutoSegment::getBoundingBox() const;
|
|
|
|
//! \see Segment::getBoundingBox().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function Hook* AutoSegment::getSourceHook();
|
|
|
|
//! \see Segment::getSourceHook().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function Hook* AutoSegment::getTargetHook();
|
|
|
|
//! \see Segment::getTargetHook().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function Contact* AutoSegment::getSource() const;
|
|
|
|
//! \see Segment::getSource().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function Contact* AutoSegment::getTarget() const;
|
|
|
|
//! \see Segment::getTarget().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function Component* AutoSegment::getOppositeAnchor( Component* ) const;
|
|
|
|
//! \see Segment::getNet().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function Components AutoSegment::getAnchors() const;
|
|
|
|
//! \see Segment::getAnchors().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function DbU::Unit AutoSegment::getX() const;
|
|
|
|
//! \see Segment::getX().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function DbU::Unit AutoSegment::getY() const;
|
|
|
|
//! \see Segment::getY().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function DbU::Unit AutoSegment::getWidth() const;
|
|
|
|
//! \see Segment::getWidth().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function DbU::Unit AutoSegment::getLength() const;
|
|
|
|
//! \see Segment::getLength().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function DbU::Unit AutoSegment::getSourcePosition() const;
|
|
|
|
//! \see Segment::getSourcePosition().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function DbU::Unit AutoSegment::getTargetPosition() const;
|
|
|
|
//! \see Segment::getTargetPosition().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function DbU::Unit AutoSegment::getSourceX() const;
|
|
|
|
//! \see Segment::getSourceX().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function DbU::Unit AutoSegment::getSourceY() const;
|
|
|
|
//! \see Segment::getSourceY().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function DbU::Unit AutoSegment::getTargetX() const;
|
|
|
|
//! \see Segment::getTargetX().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function DbU::Unit AutoSegment::getTargetY() const;
|
|
|
|
//! \see Segment::getTargetY().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function DbU::Unit AutoSegment::invert();
|
|
|
|
//! \see Segment::invert().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function void AutoSegment::setLayer( const Layer* );
|
|
|
|
//! \see Segment::setLayer().
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function bool AutoSegment::isHorizontal() const;
|
|
|
|
//! \sreturn \true if the Hurricane::Segment is Horizontal.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::isVertical() const;
|
|
|
|
//! \sreturn \true if the Hurricane::Segment is Vertical.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::isGlobal() const;
|
|
|
|
//! \sreturn \true if the segment is global (span over more than one GCell).
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::isLocal() const;
|
|
|
|
//! \sreturn \true if the segment is local (fully enclosed in one GCell).
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::isFixed() const;
|
|
|
|
//! \sreturn \true if segment must not be moved by the router.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::isBipoint() const;
|
|
|
|
//! \sreturn \true if the segment straigh join two terminals.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::isWeakTerminal() const;
|
|
|
|
//! \sreturn \true if segment is indirectly connected to a terminal.
|
2010-03-09 09:24:29 -06:00
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function bool AutoSegment::isStrongTerminal( unsigned int flags=0 ) const;
|
|
|
|
//! \sreturn \true if segment is directly connected to a terminal.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::isLayerChange() const;
|
|
|
|
//! \sreturn \true if segment is a strap used only to connect between two different
|
|
|
|
//! metal layers on the way up or down.
|
|
|
|
|
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
|
|
|
//! \function bool AutoSegment::isSpinTop() const;
|
|
|
|
//! \sreturn \true if segment is connected to turns and both perpandiculars segments
|
|
|
|
//! are in the \e top layer (candidate for reduction).
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::isSpinBottom() const;
|
|
|
|
//! \sreturn \true if segment is connected to turns and both perpandiculars segments
|
|
|
|
//! are in the \e bottom layer (candidate for reduction).
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::isSpinTopOrBottom() const;
|
|
|
|
//! \sreturn \true if segment is either <em>spin top</em> or <em>spin bottom</em>
|
|
|
|
//! (candidate for reduction).
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::isReduced() const;
|
|
|
|
//! \sreturn \true if segment is actually in a reduced state: it's effective layer
|
|
|
|
//! will be the one of it's perpandiculars.
|
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function bool AutoSegment::isStrap() const;
|
|
|
|
//! \sreturn \true if segment has been created from a slackening operation to
|
|
|
|
//! restore the slack of another segment.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::isDogleg() const;
|
|
|
|
//! \sreturn \true if segment has been created as the perpandicular part of a dogleg.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::isInvalidated() const;
|
|
|
|
//! \sreturn \true if segment has been moved or topologicaly altered.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::isInvalidatedLayer() const;
|
|
|
|
//! \sreturn \true if segment has been changed of layer. Source and Target AutoContact
|
|
|
|
//! may need to be altered.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::isCreated() const;
|
|
|
|
//! \sreturn \true if segment has just been created and is not revalidated for the
|
|
|
|
//! first time
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::isCanonical() const;
|
|
|
|
//! \sreturn \true if segment is the representant of an aligned set.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::isUnsetAxis() const;
|
|
|
|
//! \sreturn \true if the segment axis has never been set.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::isSlackened() const;
|
|
|
|
//! \sreturn \true if the segment has already been slackened.
|
|
|
|
|
|
|
|
//! \function unsigned int AutoSegment::canDogleg( Interval interval );
|
|
|
|
//! \sreturn non-zero if the aligned set of segment can be broken \e outside \c interval.
|
|
|
|
//! The returned value could be zero (failure) or Katabatic::KbDoglegOnLeft
|
|
|
|
//! or Katabatic::KbDoglegOnRight menaing that the aligned set could be broken
|
|
|
|
//! on the left of the \c interval (resp. right of it).
|
|
|
|
|
|
|
|
// \function bool AutoSegment::canDesalignate( AutoContact* contact ) const;
|
|
|
|
// \sreturn \true if \c contact restrict the slack of the segment.
|
|
|
|
|
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
|
|
|
//! \function bool AutoSegment::canReduce() const;
|
|
|
|
//! \sreturn \true if the segment can be reduced. That is:
|
|
|
|
//! - Source & target are AutoContactTurn.
|
|
|
|
//! - It is either <em>spin top</em> or <em>spin bottom</em>, that is
|
|
|
|
//! connecting perpandiculars both in the same layer.
|
|
|
|
//! - Has a length less or equal one pitch in the perpandicular direction.
|
|
|
|
//! - Neither of the perpandicular are also reduceds.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::mustRaise() const;
|
|
|
|
//! \sreturn \true if the segment must \e be reduced. That is:
|
|
|
|
//! - It is in reduced state...
|
|
|
|
//! - It is no longer <em>spin top</em> or <em>spin bottom</em>.
|
|
|
|
//! - It's length exceed one pitch in the perpandicular direction.
|
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function bool AutoSegment::canSlacken( unsigned int flags=0 ) const;
|
|
|
|
//! \sreturn \true if the segment can be slackened. That is, source or target constraints
|
|
|
|
//! are less than three pitches.
|
|
|
|
//!
|
|
|
|
//! If \c flags contains KbPropagate, look on the whole aligned set.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::_canSlacken() const;
|
|
|
|
//! \sreturn \true if the segment can be slackened. That is, source or target constraints
|
|
|
|
//! are less than three pitches.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::canMoveULeft( float reserve ) const;
|
|
|
|
//! \return \true if the \e global segment can be moved on the left GCell (for a
|
|
|
|
//! vertical) or down (for an horizontal). The move is accepted only if
|
|
|
|
//! it do not change the amount of global wiring. Thus the following
|
|
|
|
//! conditions:
|
|
|
|
//! - The segment mustn't be on the leftmost GCell (obvious...).
|
|
|
|
//! - The segment must be global.
|
|
|
|
//! - The source and target contacts must be AutoContactTurn(s).
|
|
|
|
//! - At least one of the perpandicular must be global \b and connected
|
|
|
|
//! through the \e target. That is, it's a global which extends toward
|
|
|
|
//! left.
|
|
|
|
//! - The GCell of maximum density on the left must remains below the
|
|
|
|
//! current GCell of maximum density, with a margin of \c reserve
|
|
|
|
//! (expressed in total saturation percentage).
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::canMoveURight( float reserve ) const;
|
|
|
|
//! \return \true if the \e global segment can be moved on the right GCell (for a
|
|
|
|
//! vertical) or up (for an horizontal). The move is accepted only if
|
|
|
|
//! it do not change the amount of global wiring. Thus the following
|
|
|
|
//! conditions:
|
|
|
|
//! - The segment mustn't be on the leftmost GCell (obvious...).
|
|
|
|
//! - The segment must be global.
|
|
|
|
//! - The source and target contacts must be AutoContactTurn(s).
|
|
|
|
//! - At least one of the perpandicular must be global \b and connected
|
|
|
|
//! through the \e source. That is, it's a global which extends toward
|
|
|
|
//! right.
|
|
|
|
//! - The GCell of maximum density on the left must remains below the
|
|
|
|
//! current GCell of maximum density, with a margin of \c reserve
|
|
|
|
//! (expressed in total saturation percentage).
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::canMoveUp( float reserve, unsigned int flags ) const;
|
|
|
|
//! \param reserve Number of track that must remains free \e after the move.
|
|
|
|
//! \param flags Modificate the method behavior, see below.
|
|
|
|
//! \return \true if the segment can be moved up, that is to the next layer above in
|
|
|
|
//! the same preferred routing direction. This method will check that in
|
|
|
|
//! every GCell of the segment, at least \c reserve tracks are still avalaible
|
|
|
|
//! \e after the segment has been moved up (\c reserve can be less than
|
|
|
|
//! \c 1.0).
|
|
|
|
//!
|
|
|
|
//! Possible (bitwise) value for \c flags :
|
|
|
|
//! - \c KbAllowTerminal : allow strong terminal to be moved up.
|
|
|
|
//! - \c KbAllowLocal : allow local segments to be moved up.
|
|
|
|
//! - \c KbPropagate : perform the check on the whole aligned set.
|
|
|
|
//! - \c KbWithPerpands : also check the density on the perpandiculars
|
|
|
|
//! begin & end GCell, there must be at least a \c 0.5 density
|
|
|
|
//! reserve on them.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::canPivotUp( float reserve, unsigned int flags ) const;
|
|
|
|
//! \param reserve Number of track that must remains free \e after the move.
|
|
|
|
//! \param flags Modificate the method behavior, see below.
|
|
|
|
//!
|
|
|
|
//! Checks of the segment can be \e pivoted up. The difference between
|
|
|
|
//! \c canMoveUp() and \c canPivotUp() lies in the fact that no
|
|
|
|
//! perpandicular segment needs to be altered if the current segment
|
|
|
|
//! is moved up. For example an \b M3 segment connected to only \b M4 can
|
|
|
|
//! be pivoted up (in \b M5), but if connected to \b M2, it cannot.
|
|
|
|
//!
|
|
|
|
//! Possible (bitwise) value for \c flags :
|
|
|
|
//! - \c KbPropagate : perform the check on the whole aligned set.
|
|
|
|
//! - \c KbIgnoreContacts : do not check the source & target layers
|
|
|
|
//! to know if the segment can be pivoted up.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::canPivotDown( float reserve, unsigned int flags ) const;
|
|
|
|
//! \param reserve Number of track that must remains free \e after the move.
|
|
|
|
//! \param flags Modificate the method behavior, see below.
|
|
|
|
//!
|
|
|
|
//! Checks of the segment can be \e pivoted down. The difference between
|
|
|
|
//! \c canMoveDown() and \c canPivotDown() lies in the fact that no
|
|
|
|
//! perpandicular segment needs to be altered if the current segment
|
|
|
|
//! is moved down.
|
|
|
|
//!
|
|
|
|
//! Possible (bitwise) value for \c flags :
|
|
|
|
//! - \c KbPropagate : perform the check on the whole aligned set.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::checkPositions() const;
|
|
|
|
//! \sreturn \true if the relative positions of source & target are coherent.
|
|
|
|
//! (source <= target).
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::checkConstraints() const;
|
|
|
|
//! \sreturn \true if the constraint intervel is coherent (non-empty or
|
|
|
|
//! punctual in the worst case).
|
|
|
|
|
|
|
|
//! \function unsigned long AutoSegment::getId() const;
|
|
|
|
//! \sreturn The AutoSegment unique identifier.
|
|
|
|
|
|
|
|
//! \function unsigned int AutoSegment::getDirection() const;
|
|
|
|
//! \sreturn Katabatic::KbHorizontal or Katabatic::KbVertical according to the decorated segment.
|
|
|
|
|
|
|
|
//! \function GCell* AutoSegment::getGCell() const;
|
|
|
|
//! \sreturn The GCell into which the AutoSegment starts (the one of the source).
|
|
|
|
|
|
|
|
//! \function size_t AutoSegment::getGCells( vector<GCell*>& gcells ) const;
|
|
|
|
//! \param gcells A vector that will be filled by all the GCells that the
|
|
|
|
//! segment overlap. In increasing order, from source to target.
|
|
|
|
//! \return The vector's size.
|
|
|
|
|
|
|
|
//! \function AutoContact* AutoSegment::getAutoSource() const;
|
|
|
|
//! \sreturn The source AutoContact.
|
|
|
|
|
|
|
|
//! \function AutoContact* AutoSegment::getAutoTarget() const;
|
|
|
|
//! \sreturn The target AutoContact.
|
|
|
|
|
|
|
|
//! \function AutoContact* AutoSegment::getOppositeAnchor( AutoContact* contact ) const;
|
|
|
|
//! \sreturn The source or target AutoContact opposite to \c contact.
|
|
|
|
|
|
|
|
//! \function size_t AutoSegment::getPerpandicularsBound( set<AutoSegment*>& bounds );
|
|
|
|
//! \param bounds A vector that will be filled by all the AutoSegments perpandicular
|
|
|
|
//! to this one that induce a constraint.
|
|
|
|
//! \return The vector's size.
|
|
|
|
|
|
|
|
//! \function AutoSegment* AutoSegment::getParent() const;
|
|
|
|
//! \sreturn If this segment has been created by a dogleg operation, the parent is
|
|
|
|
//! the one from which we fragmented.
|
|
|
|
|
|
|
|
//! \function DbU::Unit AutoSegment::getAxis() const;
|
|
|
|
//! \sreturn The AutoSegment axis position.
|
|
|
|
|
|
|
|
//! \function DbU::Unit AutoSegment::getSourceU() const;
|
|
|
|
//! \sreturn The AutoSegment \e uniform source position. (X for an horizontal and
|
|
|
|
//! Y for a Vertical).
|
|
|
|
|
|
|
|
//! \function DbU::Unit AutoSegment::getTargetU() const;
|
|
|
|
//! \sreturn The AutoSegment \e uniform target position. (X for an horizontal and
|
|
|
|
//! Y for a Vertical).
|
|
|
|
|
|
|
|
//! \function DbU::Unit AutoSegment::getDuSource() const;
|
|
|
|
//! \sreturn The AutoSegment \e uniform delta from source. (dX for an horizontal and
|
|
|
|
//! dY for a Vertical).
|
|
|
|
|
|
|
|
//! \function DbU::Unit AutoSegment::getDuTarget() const;
|
|
|
|
//! \sreturn The AutoSegment \e uniform delta from source. (dX for an horizontal and
|
|
|
|
//! dY for a Vertical).
|
|
|
|
|
|
|
|
//! \function DbU::Unit AutoSegment::getOrigin() const;
|
|
|
|
//! \sreturn The AutoSegment \e uniform source (lowest) GCell coordinate. (dX for an horizontal and
|
|
|
|
//! dY for a Vertical).
|
|
|
|
|
|
|
|
//! \function DbU::Unit AutoSegment::getExtremity() const;
|
|
|
|
//! \sreturn The AutoSegment \e uniform target (greatest) GCell coordinate. (dX for an horizontal and
|
|
|
|
//! dY for a Vertical).
|
|
|
|
|
|
|
|
//! \function Interval AutoSegment::getSpanU() const;
|
|
|
|
//! \sreturn The AutoSegment \e uniform occupying interval (on X for horizontal and
|
|
|
|
//! on Y for vertical).
|
|
|
|
|
|
|
|
//! \function Interval AutoSegment::getSourceConstraints( unsigned int flags ) const;
|
|
|
|
//! \return The Interval into witch the source AutoContact can vary. By default
|
|
|
|
//! all deduced constraints and user constraints are took into account.
|
|
|
|
//! If \c flags contains \c KbNativeConstraints the constraint returned is
|
|
|
|
//! only the enclosing GCell.
|
|
|
|
|
|
|
|
//! \function Interval AutoSegment::getTargetConstraints( unsigned int flags ) const;
|
|
|
|
//! \return The Interval into witch the target AutoContact can vary. By default
|
|
|
|
//! all deduced constraints and user constraints are took into account.
|
|
|
|
//! If \c flags contains \c KbNativeConstraints the constraint returned is
|
|
|
|
//! only the enclosing GCell.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::getConstraints( DbU::Unit& min, DbU::Unit& max ) const;
|
|
|
|
//! \sreturn in \c min & \c max the allowed range for the segment axis.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::getConstraints( Interval& i ) const;
|
|
|
|
//! \sreturn in \c i the allowed range for the segment axis.
|
|
|
|
|
|
|
|
//! \function const Interval& AutoSegment::getUserConstraints() const;
|
|
|
|
//! \sreturn A reference to the additional constraints added to the axis of the segment.
|
|
|
|
|
|
|
|
//! \function DbU::Unit AutoSegment::getSlack() const;
|
|
|
|
//! \sreturn The length of the axis constraint interval.
|
|
|
|
|
|
|
|
//! \function DbU::Unit AutoSegment::getOptimalMin() const;
|
|
|
|
//! \sreturn The AutoSegment minimum axis optimal range.
|
|
|
|
|
|
|
|
//! \function DbU::Unit AutoSegment::getOptimalMax() const;
|
|
|
|
//! \sreturn The AutoSegment maximum axis optimal range.
|
|
|
|
|
|
|
|
//! \function Interval& AutoSegment::getOptimal( Interval& i ) const;
|
|
|
|
//! Inialize \c i with the AutoSegment axis optimal range.
|
|
|
|
|
|
|
|
//! \function DbU::Unit AutoSegment::getCost( DbU::Unit axis ) const;
|
|
|
|
//! \return The cost if this segment is placed at \c axis. The cost is null if
|
|
|
|
//! \c axis is inside the optimal interval and is the distance toward
|
|
|
|
//! the nearest bound outside.
|
|
|
|
|
|
|
|
//! \function AutoSegment* AutoSegment::getCanonical( Interval& i );
|
|
|
|
//! \return The canonical segment associated to this one. Additionnaly compute
|
|
|
|
//! the source & target position of the whole set of aligned segments.
|
|
|
|
|
|
|
|
//! \function AutoSegment* AutoSegment::getCanonical( DbU::Unit& min, DbU::Unit& max );
|
|
|
|
//! \return The canonical segment associated to this one. Additionnaly compute
|
|
|
|
//! the source & target position of the whole set of aligned segments.
|
|
|
|
|
|
|
|
//! \function unsigned int AutoSegment::_getFlags () const;
|
|
|
|
//! Sets \c flags given as arguments.
|
|
|
|
|
|
|
|
//! \function void AutoSegment::setFlags ( unsigned int flags );
|
|
|
|
//! Sets \c flags given as arguments.
|
|
|
|
|
|
|
|
//! \function void AutoSegment::unsetFlags ( unsigned int flags );
|
|
|
|
//! Unsets \c flags given as arguments.
|
|
|
|
|
|
|
|
//! \function void AutoSegment::setDuSource( DbU::Unit du );
|
|
|
|
//! Set the \e uniform \c dU from source anchor (dX for Horizontal,
|
|
|
|
//! dY for Vertical).
|
|
|
|
|
|
|
|
//! \function void AutoSegment::setDuTarget( DbU::Unit du );
|
|
|
|
//! Set the \e uniform \c dU from target anchor (dX for Horizontal,
|
|
|
|
//! dY for Vertical).
|
|
|
|
|
|
|
|
//! \function void AutoSegment::updateOrient ();
|
|
|
|
//! Ensure that source is lower than target. Swap them if needed.
|
|
|
|
//! Swap never occurs on global segment because their source and target
|
|
|
|
//! anchors are from different GCell, which are already ordered.
|
|
|
|
|
|
|
|
//! \function void AutoSegment::computeTerminal ();
|
|
|
|
//! Recompute the terminal status of an AutoSegment. Initially, a
|
|
|
|
//! segment which source or target is a terminal is flagged as
|
|
|
|
//! SegStrongTerminal. After a topological modification, if the
|
|
|
|
//! segment is no longer directly attached to a terminal, the
|
|
|
|
//! status is progessively weakened. Once it reaches the weakest
|
|
|
|
//! level, it stays on it so the algorithm can work out which
|
|
|
|
//! segments is a start to a path toward a terminal.
|
|
|
|
//!
|
|
|
|
//! Status from stronger to weaker:
|
|
|
|
//! - Katabatic::SegStrongTerminal.
|
|
|
|
//! - Katabatic::SegWeakTerminal1
|
|
|
|
//! - Katabatic::SegWeakTerminal2
|
|
|
|
//!
|
|
|
|
//! \remark The weakening is poorly done. After making a dogleg we do not
|
|
|
|
//! know which of the segment must be weakened if not directly attached
|
|
|
|
//! on a terminal. We must examinate source & target.
|
|
|
|
|
|
|
|
//! \function void AutoSegment::updatePositions();
|
|
|
|
//! Update the segment begenning and ending positions. The positions
|
|
|
|
//! takes into account the extension caps and reflect the real space
|
|
|
|
//! used by the segment under it's long axis.
|
|
|
|
|
|
|
|
//! \function void AutoSegment::mergeUserConstraints( const Interval& constraints );
|
|
|
|
//! Constraints applies on the valid axis interval.
|
|
|
|
//! Merge in \c constraints with the user's constraints. The resulting
|
|
|
|
//! constraints is the intersection of the former user's contraints and
|
|
|
|
//! the one given as argument.
|
|
|
|
|
|
|
|
//! \function void AutoSegment::resetUserConstraints();
|
|
|
|
//! Constraints applies on the valid axis interval.
|
|
|
|
//! Suppress all user's constraints.
|
|
|
|
|
|
|
|
//! \function void AutoSegment::setOptimalMin( DbU::Unit min );
|
|
|
|
//! Sets the lower bound of the optimal axis interval.
|
|
|
|
|
|
|
|
//! \function void AutoSegment::setOptimalMax( DbU::Unit max );
|
|
|
|
//! Sets the lower bound of the optimal axis interval.
|
|
|
|
|
|
|
|
//! \function Interval AutoSegment::_invalidate();
|
|
|
|
//! Invalidate this segment. The segment is scheduled into the Session
|
|
|
|
//! revalidation mechanism.
|
|
|
|
|
|
|
|
//! \function Interval AutoSegment::revalidate();
|
|
|
|
//! Mark this segment as valid (unset the Invalidated flag) and update
|
|
|
|
//! positions. Unlike AutoSegment::invalidate(), it's an atomic method.
|
|
|
|
|
|
|
|
//! \function Interval AutoSegment::getMinSpanU() const;
|
|
|
|
//! \return The AutoSegment \e uniform minimum occupying interval, computed from the
|
|
|
|
//! constraints of all the supporting aligned AutoContacts.
|
|
|
|
//! (on X for horizontal and on Y for vertical).
|
|
|
|
|
|
|
|
//! \function AutoSegment* AutoSegment::canonize ( unsigned int flags=KbNoFlags );
|
|
|
|
//! Find and set the canonical AutoSegment from a set of aligneds. For the
|
|
|
|
//! time beeing we assumes that there is no merging process, so the Segments
|
|
|
|
//! will only gets more and more fragmented. This implies that a segment can
|
|
|
|
//! become canonical but it will never revert to normal status.
|
|
|
|
//!
|
|
|
|
//! The canonical AutoSegment is the one with the lowest \c Id. This a way
|
|
|
|
//! of ensuring reproductible results. Note that the canonical one may not
|
|
|
|
//! be the \e geometrically lowest one.
|
|
|
|
//!
|
|
|
|
//! \remark Canonical aware method.
|
|
|
|
|
|
|
|
//! \function Interval AutoSegment::computeOptimal( set<AutoSegment*>& processeds );
|
|
|
|
//! \param processeds A set of already processeds AutoSegment. Used by the
|
|
|
|
//! caller function to avoid doing again the computation
|
|
|
|
//! on an AutoSegment from an already proccessed aligned set.
|
|
|
|
//! Compute the optimal axis interval for the aligned set.
|
|
|
|
//!
|
|
|
|
//! \remark Canonical aware method.
|
|
|
|
|
|
|
|
//! \function void AutoSegment::invalidate( unsigned int flags=KbPropagate );
|
|
|
|
//! Invalidate this AutoSegment, or if the Katabatic::KbPropagate flags
|
|
|
|
//! is set, the whole set of aligned segments.
|
|
|
|
//!
|
|
|
|
//! \remark If Katabatic is in the destruction stage, this function does nothing.
|
|
|
|
//! \remark Canonical aware method.
|
|
|
|
|
|
|
|
//! \function void AutoSegment::setAxis( DbU::Unit axis, unsigned int flags=0 );
|
|
|
|
//! \param axis The new position of the axis.
|
|
|
|
//! \param flags See KbRealignate.
|
|
|
|
//!
|
|
|
|
//! Set the axis of an aligned set. This method does nothing if not called
|
|
|
|
//! on the canonical AutoSegment of the set. If the new value of the axis
|
|
|
|
//! is equal to the previous one, nothing is done (non-canonical AutoSegment
|
|
|
|
//! are not looked after). To force an actual axis set, with invalidation of
|
|
|
|
//! the whole AutoSegment set, set the KbRealignate flag.
|
|
|
|
//!
|
|
|
|
//! \remark Canonical aware method.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::toConstraintAxis();
|
|
|
|
//! If the AutoSegment axis is outside the constraint interval, put it on
|
|
|
|
//! nearest bound. This method is active only on canonical AutoSegments.
|
|
|
|
//!
|
|
|
|
//! \return \true if an actual axis change is made.
|
|
|
|
//!
|
|
|
|
//! \remark Canonical aware method.
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::toOptimalAxis();
|
|
|
|
//! If the AutoSegment axis is outside the optimal interval, put it on
|
|
|
|
//! nearest bound. This method is active only on canonical AutoSegments.
|
|
|
|
//!
|
|
|
|
//! \return \true if an actual axis change is made.
|
|
|
|
//!
|
|
|
|
//! \remark Canonical aware method.
|
|
|
|
|
|
|
|
//! \function AutoSegments AutoSegment::getAligneds ( unsigned int flags );
|
|
|
|
//! The Collection of AutoSegments that are aligned on this one
|
|
|
|
//! through AutoContactHTee or AutoContactVTee. If the \c flags
|
|
|
|
//! contains Katabatic::KbWithPerpands, the Collection will also
|
|
|
|
//! includes the AutoSegments directly perpandiculars to the whole
|
|
|
|
//! aligned set.
|
|
|
|
|
|
|
|
//! \function AutoSegments AutoSegment::getPerpandiculars ();
|
|
|
|
//! The Collection of all AutoSegments directly perpandiculars to the
|
|
|
|
//! whole aligned set.
|
|
|
|
|
|
|
|
//! \function AutoSegments AutoSegment::getOnSourceContact ( unsigned int direction );
|
|
|
|
//! \sreturn The Collection of AutoSegment in \c direction that are on this segment
|
|
|
|
//! source contact.
|
|
|
|
|
|
|
|
//! \function AutoSegments AutoSegment::getOnTargetContact ( unsigned int direction );
|
|
|
|
//! \sreturn The Collection of AutoSegment in \c direction that are on this segment
|
|
|
|
//! target contact.
|
|
|
|
|
|
|
|
//! \function AutoSegment::~AutoSegment ()
|
|
|
|
//! AutoSegment destructor. It is not directly accessible, instead use
|
|
|
|
//! one flavor of the AutoSegment::create().
|
|
|
|
|
|
|
|
//! \function AutoSegment::AutoSegment ( Segment* segment );
|
|
|
|
//! AutoSegment constructor. It is not directly accessible, instead use
|
|
|
|
//! one flavor of the AutoSegment::create().
|
|
|
|
|
|
|
|
//! \function void AutoSegment::_preCreate( AutoContact* source, AutoContact* target );
|
|
|
|
//! Perform sanity checks before allowing the actual creation of an
|
|
|
|
//! AutoSegment. If an error occurs throw an exception.
|
|
|
|
//!
|
|
|
|
//! Check for:
|
|
|
|
//! - \c source and \c target must not be \NULL.
|
|
|
|
//! - \c source and \c target must be different.
|
|
|
|
|
|
|
|
//! \function void AutoSegment::_postCreate ();
|
|
|
|
//! Perform operations that, given the data structure cannot be done
|
|
|
|
//! in the constructor. Also allows for sharing code with the derived
|
|
|
|
//! classes. Currently:
|
|
|
|
//! - Invalidate the whole net (topology change).
|
|
|
|
//! - Insert the AutoSegment in the lookup/Session machanism.
|
|
|
|
//! - Call AutoSegment::invalidate().
|
|
|
|
//! - Call AutoSegment::updateOrient().
|
|
|
|
//! - Call AutoSegment::updatePositions().
|
|
|
|
|
|
|
|
//! \function void AutoSegment::_preDestroy ();
|
|
|
|
//! Perform operations that must be done before the actual destructor is
|
|
|
|
//! called. Merely whidrawn the AutoSegment from the lookup/Session mechanism.
|
|
|
|
|
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
|
|
|
//! \function bool AutoSegment::reduce ();
|
|
|
|
//! Sets the segment into reduced state.
|
|
|
|
//!
|
|
|
|
//! \sreturn \true if the operation did succeed. The layer will not be actually changed
|
|
|
|
//! until the Katabatic database is saved/destroyed.
|
|
|
|
//!
|
|
|
|
//! A segment can be reduced if:
|
|
|
|
//! - Source & target are AutoContactTurn.
|
|
|
|
//! - It is either <em>spin top</em> or <em>spin bottom</em>, that is
|
|
|
|
//! connecting perpandiculars both in the same layer.
|
|
|
|
//! - Has a length less or equal one pitch in the perpandicular direction.
|
|
|
|
//! - Neither of the perpandicular are also reduceds.
|
|
|
|
//!
|
|
|
|
//! \image html reduce-1.png "Reduce Example"
|
|
|
|
//!
|
|
|
|
//! If segment \c id:12 is reduced, it prevents \c id:10 & \c id:14 to
|
|
|
|
//! be also reduced, by increasing the \c _reduced counter. In this
|
|
|
|
//! example \c id:14 is <em>spin top</em> and \c id:12 is <em>spin bottom</em>.
|
|
|
|
//!
|
|
|
|
//! If we reduce two adjacent segments, one will go up while the other
|
|
|
|
//! will go down (they will actually exchange their layers), it will
|
|
|
|
//! thus defeat the purpose of creating a <em>same layer</em> dogleg.
|
|
|
|
//! Besides, the turn contact between them will be changed into a pure
|
|
|
|
//! metal one, generating a disconnexion...
|
|
|
|
//!
|
|
|
|
//! \see AutoSegment::raise()
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::raise ();
|
|
|
|
//! Get a segment out of \e reduced state.
|
|
|
|
//!
|
|
|
|
//! \sreturn \true if a state change did really take place.
|
|
|
|
//!
|
|
|
|
//! \see AutoSegment::reduce()
|
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
//! \function AutoSegment* AutoSegment::makeDogleg ( AutoContact* from );
|
|
|
|
//! \param from The AutoContact \e from which we want to make a dogleg.
|
|
|
|
//!
|
|
|
|
//! This method is dedicated for the restauration of topology connexity on
|
|
|
|
//! AutoContcact after a layer change on one of their connected AutoSegment.
|
|
|
|
//!
|
|
|
|
//! It perform three operations:
|
|
|
|
//! -# Create a dogleg on the AutoSegment (using the normal GCell variant).
|
|
|
|
//! -# Adjust the layers of the dogleg according whether we are going \e up
|
|
|
|
//! or \e down from the AutoContact \c from to the segment.
|
|
|
|
//! -# Returns the new AutoSegment connected to \c from (it may be the
|
|
|
|
//! same as before, \b if the AutoContact is the source of the
|
|
|
|
//! segment).
|
|
|
|
|
|
|
|
//! \function unsigned int AutoSegment::makeDogleg ( GCell* doglegGCell, unsigned int flags=KbNoFlags );
|
|
|
|
//! Make a dogleg <em>in a set of aligned segments</em>, thus the dogleg
|
|
|
|
//! may not be created on \c this segment but in the one which is under
|
|
|
|
//! \c doglegGCell.
|
|
|
|
//!
|
|
|
|
//! \sreturn A flag telling if the above or below layer was used for the
|
|
|
|
//! perpandicular segment (Katabatic::KbUseAboveLayer or
|
|
|
|
//! Katabatic::KbUseBelowLayer).
|
|
|
|
|
|
|
|
//! \function unsigned int AutoSegment::makeDogleg ( Interval interval, unsigned int flags=KbNoFlags );
|
|
|
|
//! Make a dogleg <em>in a set of aligned segments</em>, thus the dogleg
|
|
|
|
//! may not be created on \c this segment but in one which span intersect
|
|
|
|
//! \c interval.
|
|
|
|
//!
|
|
|
|
//! \sreturn A set of flags telling if the break has occured on the left candidate
|
|
|
|
//! (Katabatic::KbDoglegOnLeft) or right (Katabatic::KbDoglegOnRight).
|
|
|
|
//! it is combined with the flag telling if the above or below layer was
|
|
|
|
//! used for the dogleg. In case of failure, zero is returned.
|
|
|
|
//!
|
|
|
|
//! Break the set of aligned segments so the break point is \e outside
|
|
|
|
//! \c interval. The break point so can occurs on the \e left of the
|
|
|
|
//! interval (Katabatic::KbDoglegOnLeft) or on the \e right of the
|
|
|
|
//! interval (Katabatic::KbDoglegOnRight). When the set of aligned
|
|
|
|
//! segments fully enclose \c interval, a choice has to be made between
|
|
|
|
//! the left and right candidate. The rules are as follow:
|
|
|
|
//! - A \e left candidate include the \e min of the interval into
|
|
|
|
//! it's span.
|
|
|
|
//! - A \e right candidate include the \e max of the interval into
|
|
|
|
//! it's span.
|
|
|
|
//! - In certain topologies, there can be more than left or right
|
|
|
|
//! candidates (more than one segment of the set intersect the
|
|
|
|
//! bounds of the interval). Thoses candidates are ecludeds.
|
|
|
|
//! - If the two candidates are avalaibles, we choose the one
|
|
|
|
//! with the greated \e native constraints.
|
|
|
|
//! - In case of strict equality, the left candidate is choosen.
|
|
|
|
//!
|
|
|
|
//! \image html _makeDogleg-4.png "Example Case 4"
|
|
|
|
|
|
|
|
//! \function unsigned int AutoSegment::_makeDogleg ( GCell* doglegGCell, unsigned int flags );
|
|
|
|
//! <b>This method is the workhorse for the various dogleg and topology
|
|
|
|
//! restauration methods.</b> It is the atomic method that actually
|
|
|
|
//! make the dogleg on \b this segment.
|
|
|
|
//!
|
|
|
|
//! \sreturn Katabatic::KbUseAboveLayer if the dogleg is using the \e above layer
|
|
|
|
//! (Katabatic::KbUseBelowLayer for the below layer).
|
|
|
|
//!
|
|
|
|
//! Break the current segment in two (a.k.a. making a dogleg).
|
|
|
|
//! - The segment is broken inside \c doglegGCell.
|
|
|
|
//! - Two new segments are createds, one perpandicular and one parallel.
|
|
|
|
//! - The original segment is always kept attached to the \e source.
|
|
|
|
//! (the new parallel fragment is attached to the \e target).
|
|
|
|
//! - The perpandicular segment is in the layer \e above by default.
|
|
|
|
//! If we are already on the topmost routing layer, the \e below
|
|
|
|
//! layer is used.
|
|
|
|
//! - If the segment pass through the breaking GCell, it's axis is set
|
|
|
|
//! into the center. If the segment is local, the axis is the middle
|
|
|
|
//! of the segment.
|
|
|
|
//! - The Local/Global kind of the original segment is updated.
|
|
|
|
//! The local/global status is computed by the constructor of the AutoSegment
|
|
|
|
//! for the perpandicular and the new parallel.
|
|
|
|
//! - The terminal state is updated. If the segment is a strong terminal
|
|
|
|
//! the part that is no longer directly connected to the terminal is
|
|
|
|
//! demoted to Katabatic::SegWeakTerminal1.
|
|
|
|
//! - The perpandicular is obviously a canonical. If the broken segment
|
|
|
|
//! is canonical, the original \b is left canonical and only the new parallel
|
|
|
|
//! is re-canonized. Otherwise, we re-canonise both sets of aligned segments
|
|
|
|
//! (the one on the source and the one on the target).
|
|
|
|
//! - The three segments are added to the session dogleg stack.
|
|
|
|
//!
|
|
|
|
//! \red{After this method call the net topology is guarantee to be valid.}
|
|
|
|
//!
|
|
|
|
//! \image html _makeDogleg-1.png "Example Case 1"
|
|
|
|
//! \image html _makeDogleg-2.png "Example Case 2"
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::moveULeft ();
|
|
|
|
//! <b>This function do not manage an aligned set. It applies on \c this
|
|
|
|
//! segment only.</b>
|
|
|
|
//!
|
|
|
|
//! Displace an Horizontal or Vertical segment to the GCell below (a.k.a.
|
|
|
|
//! lower or inferior). Rules for displacement:
|
|
|
|
//! - The segment must be connected at both end to a turn contact
|
|
|
|
//! (we do not want to manage more complex cases for the time beeing).
|
|
|
|
//! - And, of course, the segment must not already by on the bottomost
|
|
|
|
//! GCell...
|
|
|
|
//!
|
|
|
|
//! The displacement take care of:
|
|
|
|
//! - Managing the status of the various perpandiculars. The stretched
|
|
|
|
//! one are made global if needed. The shrinked one made local, if
|
|
|
|
//! needed.
|
|
|
|
//! - The supporting AutoContact (source & target) are changed of
|
|
|
|
//! GCell.
|
|
|
|
//! - If the segment is global, the go-through GCells are updateds.
|
|
|
|
//!
|
|
|
|
//! \sreturn \true if the move has succeeded.
|
|
|
|
//!
|
|
|
|
//! \image html moveULeft-1.png "moveULeft() for an Horizontal"
|
|
|
|
|
|
|
|
//! \function bool AutoSegment::moveURight ();
|
|
|
|
//! <b>This function do not manage an aligned set. It applies on \c this
|
|
|
|
//! segment only.</b>
|
|
|
|
//!
|
|
|
|
//! Displace an Horizontal or Vertical segment to the GCell above (a.k.a.
|
|
|
|
//! upper or superior). Rules for displacement:
|
|
|
|
//!
|
|
|
|
//! \sa AutoSegment::moveULeft() for a complete description.
|
|
|
|
|
|
|
|
//! \function void AutoSegment::slacken ( unsigned int flags );
|
|
|
|
//!
|
|
|
|
//! If the the AutoSegment is attached trough source and/or target to a
|
|
|
|
//! terminal with too tight constraints, create a dogleg on overconstrained
|
|
|
|
//! extremities.
|
|
|
|
//!
|
|
|
|
//! If \c flags contains Katabatic::KbPropagate, not only the current segment will be
|
|
|
|
//! looked up, but the whole aligned set. Note that due to the structure of
|
|
|
|
//! the database, there can be no more than two terminal connected segments
|
|
|
|
//! on the whole set (one on each extremity).
|
|
|
|
//!
|
|
|
|
//! If \c flags contains Katabatic::KbHalfSlacken, the number of tracks under which
|
|
|
|
//! the constraints are considered too tight is 3. Otherwise it is 10, that is a
|
|
|
|
//! whole GCell side span. This flag should be used when a long set of global
|
|
|
|
//! wire is overconstrained by only one of it's terminal, the other one offering
|
|
|
|
//! sufficient slack (typically: 8).
|
|
|
|
//!
|
|
|
|
//! The segment will also be slackened from it's terminal if the difference
|
|
|
|
//! between the current slack (resulting from all the constraints of the
|
|
|
|
//! aligned set) and the native slack is less than 3 tracks. This case means
|
|
|
|
//! that we are already near the native slack and it not sufficent enough
|
|
|
|
//! a degree of freedom.
|
|
|
|
//!
|
|
|
|
//! \image html _slacken-1.png "slacken() for an Horizontal"
|
|
|
|
//!
|
|
|
|
//! The \c slacken() method reject the slackening of short locals as shown in
|
|
|
|
//! figure \b 2.a. One way or another, we must connect to the terminal through
|
|
|
|
//! \b this short local. If we cannot place it, breaking it in two other
|
|
|
|
//! short local wouldn't help. In fact, it will only clutter more the GCell
|
|
|
|
//! and make subsequent routing more difficult.
|
|
|
|
//!
|
|
|
|
//! The figures \b 2.b and \b 2.c shows the special case of slackening an
|
|
|
|
//! horizontal from an \e horizontal terminal. In the original configuration,
|
|
|
|
//! the slack on segment \c id:10 is null, it's only choice is to be aligned
|
|
|
|
//! with the terminal. If a slackening is requested, it generally implies that
|
|
|
|
//! the horizontal track is blocked, and close to the terminal. Based on thoses
|
|
|
|
//! hypothesis, when we slacken the segment \c id:10 we impose that the
|
|
|
|
//! \e source contact is \b fixed on the terminal itself. That is, the segment
|
|
|
|
//! \c id:10 will be reduced to a zero-length and we made an immediate turn
|
|
|
|
//! (see \b 2.c ).
|
|
|
|
//!
|
|
|
|
//! \image html _slacken-2.png "slacken() for an Horizontal (special cases)"
|
|
|
|
|
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
|
|
|
//! \function bool AutoSegment::reduceDoglegLayer ();
|
|
|
|
//!
|
|
|
|
//! Perform the actual layer change on a reduced segment. This method is to
|
|
|
|
//! be called juste before destroying the Katabatic database.
|
|
|
|
//!
|
|
|
|
//! \sreturn \true if a change occurs.
|
|
|
|
|
2013-12-03 18:58:58 -06:00
|
|
|
}
|