# Kite - Detailed Router

Public Member Functions | Static Public Member Functions | List of all members
TrackElement Class Referenceabstract

Abstract Class for all Elements inserted inside a Track. More...

Inheritance diagram for TrackElement:
[legend]

## Public Member Functions

virtual bool | isFixed () const
virtual bool | isHorizontal () const =0
virtual bool | isVertical () const =0
virtual bool | isLocal () const
virtual bool | isGlobal () const
virtual bool | isBipoint () const
virtual bool | isTerminal () const
virtual bool | isStrap () const
virtual bool | isSlackened () const
virtual bool | isDogleg () const
bool | isCreated () const
bool | isInvalidated () const
bool | isBlockage () const
bool | isLocked () const
bool | isRouted () const
bool | hasSourceDogleg () const
bool | hasTargetDogleg () const
bool | canRipple () const
virtual bool | canDogleg ()
virtual bool | canDogleg (Interval)
virtual bool | canDogleg (Katabatic::GCell *, unsigned int flags=0)
virtual unsigned long | getId () const
virtual unsigned int | getDirection () const =0
virtual Net * | getNet () const =0
virtual const Layer * | getLayer () const =0
Track * | getTrack () const
size_t | getIndex () const
virtual unsigned long | getFreedomDegree () const
virtual float | getMaxUnderDensity (unsigned int flags=0) const
Box | getBoundingBox () const
virtual TrackElement * | getNext () const
virtual TrackElement * | getPrevious () const
virtual DbU::Unit | getAxis () const =0
DbU::Unit | getSourceU () const
DbU::Unit | getTargetU () const
DbU::Unit | getLength () const
Interval | getCanonicalInterval () const
virtual Interval | getFreeInterval () const
virtual Interval | getSourceConstraints () const
virtual Interval | getTargetConstraints () const
virtual DataNegociate * | getDataNegociate (unsigned int flags=KtDataSelf) const
virtual TrackElement * | getCanonical (Interval &)
virtual size_t | getGCells (Katabatic::GCellVector &) const
virtual TrackElement * | getParent () const
virtual unsigned int | getDoglegLevel () const
virtual TrackElement * | getSourceDogleg ()
virtual TrackElement * | getTargetDogleg ()
virtual TrackElements | getPerpandiculars ()
void | setFlags (unsigned int)
void | unsetFlags (unsigned int)
virtual void | setTrack (Track *)
void | setIndex (size_t)
virtual void | updateFreedomDegree ()
virtual void | setDoglegLevel (unsigned int)
virtual void | swapTrack (TrackElement *)
virtual void | reschedule (unsigned int level)
virtual void | detach ()
virtual void | invalidate ()
virtual void | revalidate ()
virtual void | incOverlapCost (Net *, TrackCost &) const
virtual void | setAxis (DbU::Unit, unsigned int flags=Katabatic::SegAxisSet)
virtual TrackElement * | makeDogleg ()
bool | makeDogleg (Katabatic::GCell *)
virtual TrackElement * | makeDogleg (Interval, unsigned int &flags)
virtual bool | _check () const

## Static Public Member Functions

static SegmentOverlapCostCB * | setOverlapCostCB (SegmentOverlapCostCB *)

## Detailed Description

Abstract Class for all Elements inserted inside a Track.

# TrackElement Abstract

The TrackElement class is abstract and is used as base class for any element that can be inserted in a Track. It represent the footprint of that element inside the Track (an interval). Additionnaly it keep a pointer to the Track and it's index inside it (Track is implemented with a `vector<>`).

To avoid some explicit dynamic cast later, it provides a default implementation for almost all the methods that will be present in all the derived classes. All default methods return `false`, `NULL` or `0` (zero) or whatever is appropriated to tell it is not meaningful.

Design Note

TrackElement has been designed to serve as a base class for TrackSegment and TrackMarker. But, in the end, those two classes have been put in separated vectors inside the Track, thus rendering this design choice less pertinent. We keep it for now because we may introduce other object than TrackSegment inside a Track. If the need do not arise, we may merge back TrackElement and TrackSegment.

## Member Function Documentation

## ◆ setOverlapCostCB()

SegmentOverlapCostCB * setOverlapCostCB | ( | SegmentOverlapCostCB * | cb | ) |

static

Parameters

  cb | the new overlap cost callback.

Returns
  the previous overlap cost callback.

sets the overlap callback.

Referenced by NegociateWindow::run().

## ◆ isFixed()

bool isFixed | ( |  | ) | const

virtual

See also: Katabatic::AutoSegment::isFixed().

Reimplemented in TrackSegment, and TrackFixedSegment.

Referenced by SegmentFsm::addAction(), SegmentFsm::conflictSolveByPlaceds(), NegociateWindow::createTrackSegment(), SegmentFsm::desaturate(), SegmentAction::doAction(), Manipulator::forceOverLocals(), Manipulator::forceToTrack(), Manipulator::insertInTrack(), Manipulator::isCaged(), Manipulator::makeDogleg(), Manipulator::minimize(), Manipulator::moveUp(), Manipulator::pivotDown(), Manipulator::pivotUp(), Manipulator::relax(), Manipulator::repackPerpandiculars(), Manipulator::ripup(), Manipulator::shrinkToTrack(), and Manipulator::slacken().

## ◆ isHorizontal()

bool isHorizontal | ( |  | ) | const

pure virtual

See also: Katabatic::AutoSegment::isHorizontal().

Implemented in TrackSegment, and TrackFixedSegment.

Referenced by SegmentFsm::conflictSolveByHistory(), and Manipulator::makeDogleg().

## ◆ isVertical()

bool isVertical | ( |  | ) | const

pure virtual

See also: Katabatic::AutoSegment::isVertical().

Implemented in TrackSegment, and TrackFixedSegment.

## ◆ isLocal()

bool isLocal | ( |  | ) | const

virtual

See also: Katabatic::isLocal().

Reimplemented in TrackSegment.

Referenced by SegmentFsm::conflictSolveByPlaceds(), SegmentFsm::doActions(), Manipulator::insertInTrack(), Manipulator::makeDogleg(), Manipulator::moveUp(), Manipulator::pivotUp(), Manipulator::relax(), Manipulator::ripple(), Manipulator::ripupPerpandiculars(), SegmentFsm::SegmentFsm(), Manipulator::shrinkToTrack(), SegmentFsm::slackenTopology(), and SegmentFsm::solveFullBlockages().

## ◆ isGlobal()

bool isGlobal | ( |  | ) | const

virtual

See also: Katabatic::AutoSegment::isGlobal().

Reimplemented in TrackSegment.

Referenced by SegmentFsm::conflictSolveByPlaceds(), Manipulator::insertInTrack(), Manipulator::relax(), Manipulator::repackPerpandiculars(), and SegmentFsm::SegmentFsm().

## ◆ isBipoint()

bool isBipoint | ( |  | ) | const

virtual

See also: Katabatic::AutoSegment::isBipoint().

Reimplemented in TrackSegment.

Referenced by SegmentFsm::desaturate().

## ◆ isTerminal()

bool isTerminal | ( |  | ) | const

virtual

See also: Katabatic::AutoSegment::isTerminal().

Reimplemented in TrackSegment.

Referenced by Manipulator::makeDogleg(), and Manipulator::relax().

## ◆ isStrap()

bool isStrap | ( |  | ) | const

virtual

See also: Katabatic::AutoSegment::isStrap().

Reimplemented in TrackSegment.

Referenced by Manipulator::insertInTrack(), Manipulator::pivotDown(), Manipulator::pivotUp(), SegmentFsm::SegmentFsm(), and SegmentFsm::slackenTopology().

## ◆ isSlackened()

bool isSlackened | ( |  | ) | const

virtual

See also: Katabatic::AutoSegment::isSlackened().

Reimplemented in TrackSegment.

## ◆ isDogleg()

bool isDogleg | ( |  | ) | const

virtual

See also: Katabatic::isDogleg().

Reimplemented in TrackSegment.

## ◆ isCreated()

bool isCreated | ( |  | ) | const

inline

See also: Katabatic::AutoSegment::isCreated().

## ◆ isInvalidated()

bool isInvalidated | ( |  | ) | const

inline

Returns: true if the segment is invalidated (may be different from the supporting AutoSegment status).

Referenced by SegmentObserver::notify().

## ◆ isBlockage()

bool isBlockage | ( |  | ) | const

inline

true if the element is a blockage (obstacle).

Referenced by SegmentFsm::conflictSolveByPlaceds(), NegociateWindow::createTrackSegment(), Manipulator::insertInTrack(), and Manipulator::isCaged().

## ◆ isLocked()

bool isLocked | ( |  | ) | const

inline

true if the element is part of a net, but must not be moved by the router, whatever the reason.

## ◆ isRouted()

bool isRouted | ( |  | ) | const

inline

true if the router has placed it.

Referenced by TrackSegment::canDogleg().

## ◆ hasSourceDogleg()

bool hasSourceDogleg | ( |  | ) | const

inline

This method purpose has not been reviewed yet.

Referenced by TrackSegment::canDogleg(), TrackSegment::getSourceDogleg(), and TrackSegment::getTargetDogleg().

## ◆ hasTargetDogleg()

bool hasTargetDogleg | ( |  | ) | const

inline

This method purpose has not been reviewed yet.

Referenced by TrackSegment::canDogleg().

## ◆ canRipple()

bool canRipple | ( |  | ) | const

inline

This method purpose has not been reviewed yet.

Referenced by Manipulator::ripple().

## ◆ canDogleg() [1/3]

bool canDogleg | ( |  | ) |

virtual

See also: AutoSegment::canDogleg(). At Kite level, this variant of the method will apply only on local segments and the segment must not already have a source or target dogleg.

Reimplemented in TrackSegment.

Referenced by SegmentFsm::conflictSolveByHistory(), Manipulator::makeDogleg(), and Manipulator::relax().

## ◆ canDogleg() [2/3]

bool canDogleg | ( | Interval |  | ) |

virtual

See also: AutoSegment::canDogleg(). At Kite level, this variant of the method will apply only on local segments and the segment must not already have a source or target dogleg.

Reimplemented in TrackSegment.

## ◆ canDogleg() [3/3]

bool canDogleg | ( | Katabatic::GCell * | doglegGCell,
|  | unsigned int | flags = `0`
| ) |  |

virtual

See also: AutoSegment::canDogleg(). At kite level, this variant of the method is mainly targeted to global segment. For local segment it behave like TrackElement::canDogleg(Interval). For global segment, make the break in the requested GCell `doglegGCell`. If it's in the first or last GCell and there is already a dogleg, allow to reuse it if `flags` contains Kite::KtAllowDoglegReuse.

Reimplemented in TrackSegment.

## ◆ getId()

unsigned long getId | ( |  | ) | const

virtual

Returns
  The `Id` of the supporting AutoSegment, if there is any. Zero otherwise.

Reimplemented in TrackSegment, and TrackFixedSegment.

Referenced by RoutingEvent::process().

## ◆ getDirection()

unsigned int getDirection | ( |  | ) | const

pure virtual

Returns
  The direction of the supporting element (should match the preferred direction of the Track).

Implemented in TrackSegment, and TrackFixedSegment.

Referenced by TrackElement::getBoundingBox(), TrackSegment::getSourceDogleg(), TrackSegment::getTargetDogleg(), Manipulator::makeDogleg(), Manipulator::minimize(), Manipulator::relax(), and Manipulator::ripple().

## ◆ getNet()

Net * getNet | ( |  | ) | const

pure virtual

Returns: The Net associated to the element (may be `NULL`).

Implemented in TrackSegment, and TrackFixedSegment.

Referenced by SegmentFsm::conflictSolveByHistory(), SegmentFsm::conflictSolveByPlaceds(), SegmentFsm::desaturate(), SegmentAction::doAction(), Manipulator::forceOverLocals(), Manipulator::forceToTrack(), TrackElement::getFreeInterval(), TrackElement::getNext(), Track::getOverlapCost(), TrackElement::getPrevious(), TrackElement::incOverlapCost(), Manipulator::insertInTrack(), Manipulator::makeDogleg(), Manipulator::minimize(), RoutingEvent::process(), RoutingEvent::revalidate(), Manipulator::ripple(), Manipulator::ripupPerpandiculars(), SegmentFsm::SegmentFsm(), Manipulator::shrinkToTrack(), SegmentFsm::slackenTopology(), and SegmentFsm::solveFullBlockages().

## ◆ getLayer()

const Layer * getLayer | ( |  | ) | const

pure virtual

Returns: The Layer of the element (should match the one of the Track).

Implemented in TrackSegment, and TrackFixedSegment.

Referenced by SegmentFsm::conflictSolveByHistory(), SegmentFsm::conflictSolveByPlaceds(), Track::insert(), Manipulator::relax(), RoutingEvent::revalidate(), Manipulator::ripple(), Manipulator::ripupPerpandiculars(), and SegmentFsm::SegmentFsm().

## ◆ getTrack()

Track * getTrack | ( |  | ) | const

inline

Returns: The Track into which the element is inserted (may be `NULL`).

Referenced by RoutingEventQueue::add(), SegmentAction::doAction(), TrackFixedSegment::getAxis(), TrackFixedSegment::getDirection(), DataNegociate::getTrack(), Manipulator::isCaged(), TrackFixedSegment::isHorizontal(), TrackFixedSegment::isVertical(), Manipulator::relax(), and TrackSegment::swapTrack().

## ◆ getIndex()

size_t getIndex | ( |  | ) | const

inline

Returns: The index of the element inside the Track's vector.

Remark: If the element is not inserted in a Track, it is set to
  Track::npos, and obviously must not be used.

Referenced by TrackSegment::swapTrack().

## ◆ getFreedomDegree()

unsigned long getFreedomDegree | ( |  | ) | const

virtual

Returns: The degree of freedom of the element. It is used as a priority value when sorting TrackElement (in RoutingEvent).

Returns: The degree of freedom of the element. It is used as a priority value when sorting TrackElement (in RoutingEvent).

Currently, it is the slack of the Katabatic::AutoSegment.

Reimplemented in TrackSegment.

Referenced by RoutingEvent::process().

## ◆ getMaxUnderDensity()

float getMaxUnderDensity | ( | unsigned int | flags = `0` | ) | const

virtual

Returns: The maximum density of all the GCells under this element.

Reimplemented in TrackSegment.

## ◆ getBoundingBox()

Box getBoundingBox | ( |  | ) | const

inline

Returns: The box that this element uses in the Track.

## ◆ getNext()

TrackElement * getNext | ( |  | ) | const

virtual

Returns: The next TrackElement, on the same track and of a different net. See also: Track::getNext().

Reimplemented in TrackSegment, and TrackFixedSegment.

Referenced by Manipulator::isCaged().

## ◆ getPrevious()

TrackElement * getPrevious | ( |  | ) | const

virtual

Returns: The previous TrackElement, on the same track and of a different net. See also: Track::getPrevious().

Reimplemented in TrackSegment, and TrackFixedSegment.

Referenced by Manipulator::isCaged().

## ◆ getAxis()

DbU::Unit getAxis | ( |  | ) | const

pure virtual

Returns: The axis position of the element (must be the same as the Track).

Implemented in TrackSegment, and TrackFixedSegment.

Referenced by SegmentFsm::conflictSolveByHistory(), TrackElement::getBoundingBox(), Manipulator::ripple(), and Manipulator::ripupPerpandiculars().

## ◆ getSourceU()

DbU::Unit getSourceU | ( |  | ) | const

inline

Returns: The minimun of the interval used by the element (cached in an attribute).

Referenced by TrackSegment::_check(), SegmentFsm::conflictSolveByHistory(), Track::find(), TrackElement::getBoundingBox(), TrackElement::getCanonicalInterval(), TrackElement::getLength(), Manipulator::insertInTrack(), Manipulator::isCaged(), Manipulator::minimize(), and Manipulator::shrinkToTrack().

## ◆ getTargetU()

DbU::Unit getTargetU | ( |  | ) | const

inline

Returns: The maximum of the interval used by the element (cached in an attribute).

Referenced by TrackSegment::_check(), TrackElement::getBoundingBox(), TrackElement::getCanonicalInterval(), TrackElement::getLength(), Manipulator::insertInTrack(), and Manipulator::isCaged().

## ◆ getLength()

DbU::Unit getLength | ( |  | ) | const

inline

Returns: The length of the interval used by the element.

Referenced by NegociateWindow::computeWirelength(), Manipulator::makeDogleg(), Manipulator::moveUp(), and RoutingEvent::revalidate().

## ◆ getCanonicalInterval()

Interval getCanonicalInterval | ( |  | ) | const

inline

Returns: The interval span used by the element inside the Track.

Referenced by SegmentFsm::conflictSolveByHistory(), SegmentFsm::conflictSolveByPlaceds(), SegmentFsm::desaturate(), Manipulator::forceOverLocals(), Manipulator::forceToTrack(), Track::getOverlapCost(), Manipulator::insertInTrack(), Manipulator::makeDogleg(), Manipulator::minimize(), Manipulator::relax(), Manipulator::ripple(), Manipulator::ripupPerpandiculars(), Manipulator::shrinkToTrack(), and SegmentFsm::solveFullBlockages().

## ◆ getFreeInterval()

Interval getFreeInterval | ( |  | ) | const

virtual

Returns: The greatest free interval enclosing this element.

Reimplemented in TrackSegment, and TrackFixedSegment.

## ◆ getSourceConstraints()

Interval getSourceConstraints | ( |  | ) | const

virtual

See also: Katabatic::AutoSegment::getSourceConstraints().

Reimplemented in TrackSegment.

## ◆ getTargetConstraints()

Interval getTargetConstraints | ( |  | ) | const

virtual

See also: Katabatic::AutoSegment::getTargetConstraints().

Reimplemented in TrackSegment.

## ◆ getDataNegociate()

DataNegociate * getDataNegociate | ( | unsigned int | flags = `KtDataSelf` | ) | const

virtual

Returns: The additional data-structure supplied by the routing algorithm.

Reimplemented in TrackSegment.

Referenced by NegociateWindow::addRoutingEvent(), SegmentFsm::desaturate(), SegmentAction::doAction(), Manipulator::forceOverLocals(), Manipulator::forceToTrack(), TrackSegment::getDataNegociate(), RoutingEvent::getState(), Manipulator::insertInTrack(), Manipulator::makeDogleg(), RoutingEvent::process(), Manipulator::relax(), Manipulator::repackPerpandiculars(), RoutingEvent::reschedule(), Manipulator::ripple(), SegmentFsm::SegmentFsm(), NegociateWindow::setGCells(), RoutingEvent::setSegment(), RoutingEvent::setState(), and SegmentFsm::slackenTopology().

## ◆ getCanonical()

TrackElement * getCanonical | ( | Interval & | i | ) |

virtual

Inner working still unclear to myself.

Reimplemented in TrackSegment.

Referenced by NegociateWindow::createTrackSegment(), and DataNegociate::update().

## ◆ getGCells()

size_t getGCells | ( | Katabatic::GCellVector & | gcells | ) | const

virtual

Returns: The table of Katabatic::GCell underneath the element whole span.

Reimplemented in TrackSegment.

Referenced by Manipulator::makeDogleg(), and Manipulator::relax().

## ◆ getParent()

TrackElement * getParent | ( |  | ) | const

virtual

Returns: The TrackElement from which the dogleg has been created, if any.

Reimplemented in TrackSegment.

Referenced by RoutingEvent::setAxisHintFromParent().

## ◆ getDoglegLevel()

unsigned int getDoglegLevel | ( |  | ) | const

virtual

Returns: The deepness of the dogleg.

Reimplemented in TrackSegment.

## ◆ getSourceDogleg()

TrackElement * getSourceDogleg | ( |  | ) |

virtual

Returns: The source part of the segment from which the dogleg has been created.

Reimplemented in TrackSegment.

Referenced by Manipulator::relax().

## ◆ getTargetDogleg()

TrackElement * getTargetDogleg | ( |  | ) |

virtual

Returns: The target part of the segment from which the dogleg has been created.

Reimplemented in TrackSegment.

Referenced by Manipulator::relax().

## ◆ getPerpandiculars()

TrackElements getPerpandiculars | ( |  | ) |

virtual

Returns: The collection of all element perpandiculars to this one.

Reimplemented in TrackSegment.

Referenced by Manipulator::forceToTrack(), and Manipulator::insertInTrack().

## ◆ setFlags()

void setFlags | ( | unsigned int | flags | ) |

inline

Set to true `flags` in the element state array.

Referenced by TrackSegment::detach(), TrackSegment::invalidate(), and Manipulator::relax().

## ◆ unsetFlags()

void unsetFlags | ( | unsigned int | flags | ) |

inline

Reset to false `flags` in the element state array.

Referenced by TrackSegment::revalidate().

## ◆ setTrack()

void setTrack | ( | Track * | track | ) |

virtual

Insert the element into `track`, also used as an insertion marker.

Reimplemented in TrackSegment.

Referenced by Track::insert(), and TrackSegment::setTrack().

## ◆ setIndex()

void setIndex | ( | size_t | index | ) |

inline

Cache the element's index in the Track internal vector.

Referenced by TrackSegment::detach(), and TrackSegment::swapTrack().

## ◆ updateFreedomDegree()

void updateFreedomDegree | ( |  | ) |

virtual

Update, from the element characteristics, it's degree of freedom.

Reimplemented in TrackSegment.

## ◆ setDoglegLevel()

void setDoglegLevel | ( | unsigned int | level | ) |

virtual

Sets the level of dogleg of the element.

Reimplemented in TrackSegment.

## ◆ swapTrack()

void swapTrack | ( | TrackElement * | other | ) |

virtual

Swap the tracks of `this` and `other`.

Reimplemented in TrackSegment.

## ◆ reschedule()

void reschedule | ( | unsigned int | level | ) |

virtual

If the TrackElement has already an event scheduled, change the level of this event, otherwise create a new event.

See also: NegotiateWindow::rescheduleEvent().

Reimplemented in TrackSegment.

Referenced by TrackSegment::_postDoglegs().

## ◆ detach()

void detach | ( |  | ) |

virtual

Remove the link from the TrackElement to it's owning Track, marking it for removal. The removal from the Track's vector is managed by the Track itself during the Session revalidation stage.

Reimplemented in TrackSegment.

## ◆ invalidate()

void invalidate | ( |  | ) |

virtual

See also: AutoSegment::invalidate().

Reimplemented in TrackSegment.

Referenced by NegociateWindow::createTrackSegment(), and SegmentObserver::notify().

## ◆ revalidate()

void revalidate | ( |  | ) |

virtual

Actualize the TrackElement characteristics from the supporting elements (set of AutoSegment).

Must be completed with the event management

Reimplemented in TrackSegment.

## ◆ incOverlapCost()

void incOverlapCost | ( | Net * | net,
|  | TrackCost & | cost
| ) |  | const

virtual

See also: Compute the cost of overlap between this segment and the interval specified in `cost`. Mainly calls the relevant callback.

## ◆ setAxis()

void setAxis | ( | DbU::Unit | ,
|  | unsigned int | flags = `Katabatic::SegAxisSet`
| ) |  |

virtual

Sets the axis of the TrackElement.

Reimplemented in TrackSegment.

Referenced by NegociateWindow::createTrackSegment(), SegmentAction::doAction(), Track::insert(), TrackSegment::makeDogleg(), and Manipulator::relax().

## ◆ makeDogleg() [1/3]

TrackElement * makeDogleg | ( |  | ) |

virtual

Create a dogleg on the source end of the TrackSegment. Put the dogleg axis on the source To be further reviewed.

See also: Dogleg management.

Post-processing done by TrackSegment::_postDoglegs().

Reimplemented in TrackSegment.

Referenced by SegmentFsm::conflictSolveByHistory(), Manipulator::makeDogleg(), TrackElement::makeDogleg(), and Manipulator::relax().

## ◆ makeDogleg() [2/3]

TrackElement * makeDogleg | ( | Katabatic::GCell * | gcell | ) |

inline

See also: AutoSegment::makeDogleg(), Dogleg management.

Post-processing done by TrackSegment::_postDoglegs().

## ◆ makeDogleg() [3/3]

TrackElement * makeDogleg | ( | Interval | interval,
|  | unsigned int & | flags
| ) |  |

virtual

See also: AutoSegment::makeDogleg(), Dogleg management, the return flags from this method are returned through the `flags` variable.

Post-processing done by TrackSegment::_postDoglegs().

Reimplemented in TrackSegment.

## ◆ _check()

bool _check | ( |  | ) | const

virtual

Check the coherency of the element. For a TrackSegment:

- The supporting AutoSegment the canonical one of the set.
- The cached `min` & `max` values are identical to the computed ones.

Returns: true on success.

Reimplemented in TrackSegment.

The documentation for this class was generated from the following files:

- TrackElement.h
- TrackElement.cpp
- TrackElement.dox
- TrackSegment.dox