.TH "AutoVertical" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME AutoVertical \- Concrete Vertical \fBAutoSegment\fP\&. .SH SYNOPSIS .br .PP .PP Inherits \fBAutoSegment\fP\&. .SS "Public Member Functions" .in +1c .ti -1c .RI "virtual bool \fB_canSlacken\fP () const" .br .ti -1c .RI "virtual bool \fBcanMoveULeft\fP (float reserve=0\&.0) const" .br .ti -1c .RI "virtual bool \fBcanMoveURight\fP (float reserve=0\&.0) const" .br .ti -1c .RI "virtual \fBSegment\fP * \fBbase\fP ()" .br .ti -1c .RI "virtual \fBSegment\fP * \fBbase\fP () const" .br .ti -1c .RI "virtual \fBVertical\fP * \fBgetVertical\fP ()" .br .ti -1c .RI "virtual \fBDbU::Unit\fP \fBgetSourceU\fP () const" .br .ti -1c .RI "virtual \fBDbU::Unit\fP \fBgetTargetU\fP () const" .br .ti -1c .RI "virtual \fBDbU::Unit\fP \fBgetDuSource\fP () const" .br .ti -1c .RI "virtual \fBDbU::Unit\fP \fBgetDuTarget\fP () const" .br .ti -1c .RI "virtual \fBInterval\fP \fBgetSpanU\fP () const" .br .ti -1c .RI "virtual bool \fBgetConstraints\fP (\fBDbU::Unit\fP &min, \fBDbU::Unit\fP &max) const" .br .ti -1c .RI "virtual \fBInterval\fP \fBgetSourceConstraints\fP (unsigned int flags=0) const" .br .ti -1c .RI "virtual \fBInterval\fP \fBgetTargetConstraints\fP (unsigned int flags=0) const" .br .ti -1c .RI "virtual unsigned int \fBgetDirection\fP () const" .br .ti -1c .RI "virtual size_t \fBgetGCells\fP (vector< \fBGCell\fP *> &) const" .br .ti -1c .RI "virtual void \fBsetDuSource\fP (\fBDbU::Unit\fP)" .br .ti -1c .RI "virtual void \fBsetDuTarget\fP (\fBDbU::Unit\fP)" .br .ti -1c .RI "virtual void \fBupdateOrient\fP ()" .br .ti -1c .RI "virtual void \fBupdatePositions\fP ()" .br .ti -1c .RI "virtual bool \fBcheckPositions\fP () const" .br .ti -1c .RI "virtual bool \fBcheckConstraints\fP () const" .br .ti -1c .RI "virtual unsigned int \fB_makeDogleg\fP (\fBGCell\fP *, unsigned int flags)" .br .ti -1c .RI "virtual bool \fBmoveULeft\fP ()" .br .ti -1c .RI "virtual bool \fBmoveURight\fP ()" .br .in -1c .SS "Protected Member Functions" .in +1c .ti -1c .RI "virtual void \fB_postCreate\fP ()" .br .ti -1c .RI "virtual void \fB_preDestroy\fP ()" .br .in -1c .SS "Additional Inherited Members" .SH "Detailed Description" .PP Concrete Vertical \fBAutoSegment\fP\&. .SH "Member Function Documentation" .PP .SS "bool _canSlacken () const\fC [virtual]\fP" \fBReturns:\fP \fBtrue\fP if the segment can be slackened\&. That is, source or target constraints are less than three pitches\&. .PP Implements \fBAutoSegment\fP\&. .PP References Interval::contains(), AutoSegment::getAutoSource(), AutoSegment::getAutoTarget(), AutoContact::getGCell(), GCell::getSide(), Interval::inflate(), and Katabatic::KbHorizontal\&. .SS "bool canMoveULeft (float reserve = \fC0\&.0\fP) const\fC [virtual]\fP" .PP \fBReturns:\fP .RS 4 \fBtrue\fP if the \fIglobal\fP segment can be moved on the left \fBGCell\fP (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: .IP "\(bu" 2 The segment mustn't be on the leftmost \fBGCell\fP (obvious\&.\&.\&.)\&. .IP "\(bu" 2 The segment must be global\&. .IP "\(bu" 2 The source and target contacts must be AutoContactTurn(s)\&. .IP "\(bu" 2 At least one of the perpandicular must be global \fBand\fP connected through the \fItarget\fP\&. That is, it's a global which extends toward left\&. .IP "\(bu" 2 The \fBGCell\fP of maximum density on the left must remains below the current \fBGCell\fP of maximum density, with a margin of \fCreserve\fP (expressed in total saturation percentage)\&. .PP .RE .PP .PP Implements \fBAutoSegment\fP\&. .PP References AutoSegment::getAutoSource(), AutoSegment::getAutoTarget(), AutoContact::getGCell(), AutoSegment::getGCell(), AutoSegment::getLayer(), RoutingGauge::getLayerDepth(), GCell::getLeft(), Session::getRoutingGauge(), AutoContact::getSegment(), GCell::getUp(), GCell::getWDensity(), and AutoSegment::isGlobal()\&. .SS "bool canMoveURight (float reserve = \fC0\&.0\fP) const\fC [virtual]\fP" .PP \fBReturns:\fP .RS 4 \fBtrue\fP if the \fIglobal\fP segment can be moved on the right \fBGCell\fP (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: .IP "\(bu" 2 The segment mustn't be on the leftmost \fBGCell\fP (obvious\&.\&.\&.)\&. .IP "\(bu" 2 The segment must be global\&. .IP "\(bu" 2 The source and target contacts must be AutoContactTurn(s)\&. .IP "\(bu" 2 At least one of the perpandicular must be global \fBand\fP connected through the \fIsource\fP\&. That is, it's a global which extends toward right\&. .IP "\(bu" 2 The \fBGCell\fP of maximum density on the left must remains below the current \fBGCell\fP of maximum density, with a margin of \fCreserve\fP (expressed in total saturation percentage)\&. .PP .RE .PP .PP Implements \fBAutoSegment\fP\&. .PP References AutoSegment::getAutoSource(), AutoSegment::getAutoTarget(), AutoContact::getGCell(), AutoSegment::getGCell(), AutoSegment::getLayer(), RoutingGauge::getLayerDepth(), GCell::getRight(), Session::getRoutingGauge(), AutoContact::getSegment(), GCell::getUp(), GCell::getWDensity(), and AutoSegment::isGlobal()\&. .SS "\fBSegment\fP * base ()\fC [virtual]\fP" \fBReturns:\fP the decorated \fBHurricane::Segment\fP\&. .PP Implements \fBAutoSegment\fP\&. .SS "\fBSegment\fP * base () const\fC [virtual]\fP" \fBReturns:\fP the decorated \fBHurricane::Segment\fP (const flavor)\&. .PP Implements \fBAutoSegment\fP\&. .SS "\fBVertical\fP * getVertical ()\fC [virtual]\fP" \fBReturns:\fP If the decorated segment is a \fBHurricane::Vertical\fP, return it\&. \fCNULL\fP otherwise\&. .PP Reimplemented from \fBAutoSegment\fP\&. .SS "\fBDbU::Unit\fP getSourceU () const\fC [virtual]\fP" \fBReturns:\fP The \fBAutoSegment\fP \fIuniform\fP source position\&. (X for an horizontal and Y for a Vertical)\&. .PP Implements \fBAutoSegment\fP\&. .PP References Segment::getSourceY()\&. .SS "\fBDbU::Unit\fP getTargetU () const\fC [virtual]\fP" \fBReturns:\fP The \fBAutoSegment\fP \fIuniform\fP target position\&. (X for an horizontal and Y for a Vertical)\&. .PP Implements \fBAutoSegment\fP\&. .PP References Segment::getTargetY()\&. .SS "\fBDbU::Unit\fP getDuSource () const\fC [virtual]\fP" \fBReturns:\fP The \fBAutoSegment\fP \fIuniform\fP delta from source\&. (dX for an horizontal and dY for a Vertical)\&. .PP Implements \fBAutoSegment\fP\&. .PP References Vertical::getDySource()\&. .SS "\fBDbU::Unit\fP getDuTarget () const\fC [virtual]\fP" \fBReturns:\fP The \fBAutoSegment\fP \fIuniform\fP delta from source\&. (dX for an horizontal and dY for a Vertical)\&. .PP Implements \fBAutoSegment\fP\&. .PP References Vertical::getDyTarget()\&. .SS "\fBInterval\fP getSpanU () const\fC [virtual]\fP" \fBReturns:\fP The \fBAutoSegment\fP \fIuniform\fP occupying interval (on X for horizontal and on Y for vertical)\&. .PP Implements \fBAutoSegment\fP\&. .PP References Segment::getSourceY(), and Segment::getTargetY()\&. .SS "bool getConstraints (\fBDbU::Unit\fP & min, \fBDbU::Unit\fP & max) const\fC [virtual]\fP" \fBReturns:\fP in \fCmin\fP & \fCmax\fP the allowed range for the segment axis\&. .PP Implements \fBAutoSegment\fP\&. .PP References AutoSegment::getAutoSource(), AutoSegment::getAutoTarget(), AutoContact::getCBXMax(), AutoContact::getCBXMin(), AutoSegment::getUserConstraints(), and DbU::getValueString()\&. .SS "\fBInterval\fP getSourceConstraints (unsigned int flags = \fC0\fP) const\fC [virtual]\fP" .PP \fBReturns:\fP .RS 4 The Interval into witch the source \fBAutoContact\fP can vary\&. By default all deduced constraints and user constraints are took into account\&. If \fCflags\fP contains \fCKbNativeConstraints\fP the constraint returned is only the enclosing \fBGCell\fP\&. .RE .PP .PP Implements \fBAutoSegment\fP\&. .PP References AutoSegment::getAutoSource(), Box::getXMax(), Box::getXMin(), and Katabatic::KbNativeConstraints\&. .SS "\fBInterval\fP getTargetConstraints (unsigned int flags = \fC0\fP) const\fC [virtual]\fP" .PP \fBReturns:\fP .RS 4 The Interval into witch the target \fBAutoContact\fP can vary\&. By default all deduced constraints and user constraints are took into account\&. If \fCflags\fP contains \fCKbNativeConstraints\fP the constraint returned is only the enclosing \fBGCell\fP\&. .RE .PP .PP Implements \fBAutoSegment\fP\&. .PP References AutoSegment::getAutoTarget(), Box::getXMax(), Box::getXMin(), and Katabatic::KbNativeConstraints\&. .SS "unsigned int getDirection () const\fC [virtual]\fP" \fBReturns:\fP \fBKatabatic::KbHorizontal\fP or \fBKatabatic::KbVertical\fP according to the decorated segment\&. .PP Implements \fBAutoSegment\fP\&. .PP References Katabatic::KbVertical\&. .SS "size_t getGCells (vector< \fBGCell\fP *> & gcells) const\fC [virtual]\fP" .PP \fBParameters:\fP .RS 4 \fIgcells\fP A vector that will be filled by all the GCells that the segment overlap\&. In increasing order, from source to target\&. .RE .PP \fBReturns:\fP .RS 4 The vector's size\&. .RE .PP .PP Implements \fBAutoSegment\fP\&. .PP References AutoSegment::getAutoSource(), AutoSegment::getAutoTarget(), AutoContact::getGCell(), AutoSegment::getGCell(), and GCell::getUp()\&. .SS "void setDuSource (\fBDbU::Unit\fP du)\fC [virtual]\fP" Set the \fIuniform\fP \fCdU\fP from source anchor (dX for Horizontal, dY for Vertical)\&. .PP Implements \fBAutoSegment\fP\&. .SS "void setDuTarget (\fBDbU::Unit\fP du)\fC [virtual]\fP" Set the \fIuniform\fP \fCdU\fP from target anchor (dX for Horizontal, dY for Vertical)\&. .PP Implements \fBAutoSegment\fP\&. .SS "void updateOrient ()\fC [virtual]\fP" 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 \fBGCell\fP, which are already ordered\&. .PP Implements \fBAutoSegment\fP\&. .PP References Segment::getSourceY(), Segment::getTargetY(), Segment::invert(), Katabatic::SegSourceBottom, Katabatic::SegSourceTop, Katabatic::SegTargetBottom, Katabatic::SegTargetTop, AutoSegment::setFlags(), and AutoSegment::unsetFlags()\&. .SS "void updatePositions ()\fC [virtual]\fP" 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\&. .PP Implements \fBAutoSegment\fP\&. .PP References Session::getExtensionCap(), AutoSegment::getLayer(), Segment::getSourceY(), and Segment::getTargetY()\&. .SS "bool checkPositions () const\fC [virtual]\fP" \fBReturns:\fP \fBtrue\fP if the relative positions of source & target are coherent\&. (source <= target)\&. .PP Implements \fBAutoSegment\fP\&. .PP References Session::getExtensionCap(), AutoSegment::getLayer(), Segment::getSourceY(), Segment::getTargetY(), and DbU::getValueString()\&. .SS "bool checkConstraints () const\fC [virtual]\fP" \fBReturns:\fP \fBtrue\fP if the constraint intervel is coherent (non-empty or punctual in the worst case)\&. .PP Implements \fBAutoSegment\fP\&. .PP References AutoSegment::getAutoSource(), AutoSegment::getAutoTarget(), and Interval::intersect()\&. .SS "unsigned int _makeDogleg (\fBGCell\fP * doglegGCell, unsigned int flags)\fC [virtual]\fP" \fBThis method is the workhorse for the various dogleg and topology restauration methods\&.\fP It is the atomic method that actually make the dogleg on \fBthis\fP segment\&. .PP \fBReturns:\fP \fBKatabatic::KbUseAboveLayer\fP if the dogleg is using the \fIabove\fP layer (\fBKatabatic::KbUseBelowLayer\fP for the below layer)\&. .PP Break the current segment in two (a\&.k\&.a\&. making a dogleg)\&. .IP "\(bu" 2 The segment is broken inside \fCdoglegGCell\fP\&. .IP "\(bu" 2 Two new segments are createds, one perpandicular and one parallel\&. .IP "\(bu" 2 The original segment is always kept attached to the \fIsource\fP\&. (the new parallel fragment is attached to the \fItarget\fP)\&. .IP "\(bu" 2 The perpandicular segment is in the layer \fIabove\fP by default\&. If we are already on the topmost routing layer, the \fIbelow\fP layer is used\&. .IP "\(bu" 2 If the segment pass through the breaking \fBGCell\fP, it's axis is set into the center\&. If the segment is local, the axis is the middle of the segment\&. .IP "\(bu" 2 The Local/Global kind of the original segment is updated\&. The local/global status is computed by the constructor of the \fBAutoSegment\fP for the perpandicular and the new parallel\&. .IP "\(bu" 2 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 \fBKatabatic::SegWeakTerminal1\fP\&. .IP "\(bu" 2 The perpandicular is obviously a canonical\&. If the broken segment is canonical, the original \fBis\fP 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)\&. .IP "\(bu" 2 The three segments are added to the session dogleg stack\&. .PP .PP After this method call the net topology is guarantee to be valid\&. .PP Example Case 1 Example Case 2 .PP Implements \fBAutoSegment\fP\&. .PP References AutoContact::base(), AutoSegment::canonize(), AutoContactTurn::create(), AutoSegment::create(), Session::dogleg(), AutoSegment::getAutoSource(), AutoSegment::getAutoTarget(), Session::getConfiguration(), RoutingGauge::getContactLayer(), AutoContact::getGCell(), Component::getLayer(), AutoSegment::getLayer(), RoutingGauge::getLayerDepth(), Component::getNet(), Session::getRoutingGauge(), RoutingGauge::getRoutingLayer(), AutoSegment::getSourceY(), AutoSegment::getTargetY(), GCell::getUp(), AutoSegment::getX(), GCell::getY(), GCell::getYMax(), AutoContact::invalidate(), AutoSegment::invalidate(), AutoSegment::isCanonical(), AutoSegment::isLocal(), AutoSegment::isSlackened(), AutoSegment::isWeakTerminal(), Katabatic::KbHorizontal, Katabatic::KbUseAboveLayer, Katabatic::KbUseBelowLayer, Katabatic::KbVertical, AutoContact::migrateConstraintBox(), GCell::removeVSegment(), Katabatic::SegCanonical, Katabatic::SegDogleg, Katabatic::SegGlobal, Katabatic::SegNotAligned, Katabatic::SegSlackened, Katabatic::SegWeakTerminal1, AutoSegment::setFlags(), AutoSegment::setLayer(), and AutoSegment::unsetFlags()\&. .SS "bool moveULeft ()\fC [virtual]\fP" \fBThis function do not manage an aligned set\&. It applies on \fCthis\fP segment only\&.\fP .PP Displace an Horizontal or Vertical segment to the \fBGCell\fP below (a\&.k\&.a\&. lower or inferior)\&. Rules for displacement: .IP "\(bu" 2 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)\&. .IP "\(bu" 2 And, of course, the segment must not already by on the bottomost \fBGCell\fP\&.\&.\&. .PP .PP The displacement take care of: .IP "\(bu" 2 Managing the status of the various perpandiculars\&. The stretched one are made global if needed\&. The shrinked one made local, if needed\&. .IP "\(bu" 2 The supporting \fBAutoContact\fP (source & target) are changed of \fBGCell\fP\&. .IP "\(bu" 2 If the segment is global, the go-through GCells are updateds\&. .PP .PP \fBReturns:\fP \fBtrue\fP if the move has succeeded\&. .PP moveULeft() for an Horizontal .PP Implements \fBAutoSegment\fP\&. .PP References GCell::addHSegment(), AutoSegment::getAutoSource(), AutoSegment::getAutoTarget(), AutoContact::getGCell(), AutoSegment::getGCell(), GCell::getLeft(), AutoContact::getSegment(), GCell::getSide(), GCell::getUp(), Interval::getVMax(), AutoSegment::isLocal(), Katabatic::KbHorizontal, GCell::removeHSegment(), Katabatic::SegGlobal, AutoSegment::setAxis(), AutoSegment::setFlags(), AutoContact::setGCell(), and AutoSegment::unsetFlags()\&. .SS "bool moveURight ()\fC [virtual]\fP" \fBThis function do not manage an aligned set\&. It applies on \fCthis\fP segment only\&.\fP .PP Displace an Horizontal or Vertical segment to the \fBGCell\fP above (a\&.k\&.a\&. upper or superior)\&. Rules for displacement: .PP \fBSee also:\fP .RS 4 \fBAutoSegment::moveULeft()\fP for a complete description\&. .RE .PP .PP Implements \fBAutoSegment\fP\&. .PP References GCell::addHSegment(), AutoSegment::getAutoSource(), AutoSegment::getAutoTarget(), AutoContact::getGCell(), AutoSegment::getGCell(), GCell::getRight(), AutoContact::getSegment(), GCell::getSide(), GCell::getUp(), DbU::getValueString(), Interval::getVMin(), AutoSegment::isLocal(), Katabatic::KbHorizontal, GCell::removeHSegment(), Katabatic::SegGlobal, AutoSegment::setAxis(), AutoSegment::setFlags(), AutoContact::setGCell(), and AutoSegment::unsetFlags()\&. .SS "void _postCreate ()\fC [protected]\fP, \fC [virtual]\fP" In addition to \fBAutoSegment::_postCreate()\fP, detect whether the segment is global or local and register it in the relevant GCells (if needed)\&. .PP If the segment is anchored directly on a terminal, adjust the axis so it's connected\&. .PP Reimplemented from \fBAutoSegment\fP\&. .PP References AutoSegment::_postCreate(), GCell::addVSegment(), AutoSegment::getAutoSource(), AutoSegment::getAutoTarget(), AutoContact::getGCell(), GCell::getUp(), Component::getX(), GCell::getY(), Katabatic::SegGlobal, AutoSegment::setFlags(), and AutoContact::setX()\&. .SS "void _preDestroy ()\fC [protected]\fP, \fC [virtual]\fP" Perform operations that must be done before the actual destructor is called\&. Merely whidrawn the \fBAutoSegment\fP from the lookup/Session mechanism\&. .PP Reimplemented from \fBAutoSegment\fP\&. .PP References AutoSegment::_preDestroy(), AutoSegment::getAutoSource(), AutoSegment::getAutoTarget(), AutoContact::getGCell(), AutoSegment::getId(), GCell::getUp(), GCell::getY(), and GCell::removeVSegment()\&. .SH "Author" .PP Generated automatically by Doxygen for Katabatic - Routing Toolbox from the source code\&.