GCell(3)

NAME
GCell - Routing Global Cell.

SYNOPSIS

Inherits ExtensionGo.

  Classes
class CompareByDensity
GCell Density Comparison Functor.
class CompareByIndex
GCell Index Comparison Functor.
class Key
GCell Key - Density Cache.

  Public Types
typedef set< GCell *, CompareByIndex > SetIndex

  Public Member Functions
virtual const Name & getName () const
bool isSaturated () const
bool isSaturated (unsigned int depth) const
bool isValid () const
bool isAboveDensity (float threshold) const
bool hasFreeTrack (size_t depth, float reserve) const
GCellGrid * getGCellGrid () const
unsigned int getDepth () const
unsigned int getIndex () const
unsigned int getRow () const
unsigned int getColumn () const
GCell * getLeft () const
GCell * getRight () const
GCell * getUp () const
GCell * getDown () const
virtual void translate (const DbU::Unit &, const DbU::Unit &)
virtual Box getBoundingBox () const
DbU::Unit getX () const
DbU::Unit getY () const
DbU::Unit getXMax () const
DbU::Unit getYMax () const
Interval getSide (unsigned int) const
float getHCapacity () const
float getVCapacity () const
float getDensity (unsigned int flags=0) const
float getCDensity (unsigned int flags=0) const
float getWDensity (unsigned int depth, unsigned int flags=0) const
DbU::Unit getBlockage (unsigned int depth) const
float getFragmentation (unsigned int depth) const
float getFeedthroughs (unsigned int depth) const
float getGlobalsCount (unsigned int depth) const
const vector< AutoSegment * > & getHSegments () const
const vector< AutoSegment * > & getVSegments () const
const vector< AutoContact * > & getContacts () const
AutoSegments getHStartSegments ()
AutoSegments getVStartSegments ()
AutoSegments getHStopSegments ()
AutoSegments getVStopSegments ()
AutoSegments getStartSegments (unsigned int direction)
AutoSegments getStopSegments (unsigned int direction)
size_t getRoutingPads (set< RoutingPad *> &)
const Key & getKey () const
size_t checkDensity () const
bool checkEdgeSaturation (size_t hreserved, size_t vreserved) const
void addBlockage (unsigned int depth, DbU::Unit)
void addHSegment (AutoSegment *)
void addVSegment (AutoSegment *)
void addContact (AutoContact *)
void removeVSegment (AutoSegment *)
void removeHSegment (AutoSegment *)
void removeContact (AutoContact *)
void updateContacts ()
size_t updateDensity ()
void updateKey (unsigned int depth)
void rpDesaturate (set< Net *> &)
bool stepDesaturate (unsigned int depth, set< Net *> &, AutoSegment *&moved, unsigned int flags=0)
bool stepNetDesaturate (unsigned int depth, set< Net *> &globalNets, SetIndex &invalidateds)

  Static Public Member Functions
static size_t getAllocateds ()
static DbU::Unit getTopRightShrink ()
static const Name & getStaticName ()

Detailed Description

Routing Global Cell.

GCell Description

Please note that there are two kind of Global Cells (or GCell for short):

•   The GCell used by the global router Knik.

•   The GCell used by the detailed router (Katabatic & Kite). Although the information they hold is obviously related, they are two separate kind of objects.

The area of the design to be routed is divided in a regular grid of rectangular area, the GCellGrid. Each rectangular area is a GCell.

The GCell contains the following informations:

•   The AutoSegments that begins or ends in it. The list of segments is not avalaible directly but through the AutoContacts that are owned by the GCell.

•   The AutoSegments that go straight through it (or over it). Horizontal & Vertical segments are stored in two separeted list. Those two lists are sorted by layer depth (the deepest layers first).

•   A lot of synthetic information about the density of tracks used in the GCell.

AutoContacts are affected to GCells, the area of the GCell is the one into which the AutoContact is allowed to be placed. It is this that way that the respect of the global routing choosen by Knik is enforced. See the AutoContact constraint box.

When tracks are aligned with the GCell boundaries they one exactly on the boundary can belong to the GCell on either side of the boundary. But we want a clear and mutually exclusive ownership of each GCell area. So, we choose that one GCell do not own the topmost and rightmost track. And to implement it, we shrink top and right coordinates by the amount of GCell::getTopRightShrink(), which must be less than the track spacing.

  Saturation & Density Computation
At any depth (i.e. layer), in the preferred routing direction, a GCell can pass a finite length of wire. For example on an horizontal preferred layer: Then the density, is the ratio between $WL_{max}$ and the actually used wirelength: Normally, the ratio musn't exceed 1.0, but the occupied wire length computation, for now, doesn't merge overlapping wires belonging to the same net, so the ratio may be slightly inaccurate. Thus in some pathological cases may be greater than 1.0 whithout truly been overloaded.

A Cell is considered as saturated if the overall density is above the saturation ratio given by Session::getSaturateRatio().

Contact density is calculated as follow: Cont_{density} = ac{|Contacts|}{Htracks imes Vtracks imes 4} ] It is a ratio over the number of actual contacts in the GCell and the maximal number. The maximal number being the product of the number of tracks in both direction and 4 stands for the hardwired number of layers (the depth).

Should not be hardwired... To be corrected in future versions.

  Feedthrough Computation
The feedtrough value is an estimate is of how many complete tracks have been used on a given layer of the GCell. It varies between zero and the number of track on the GCell (complete saturation). As an estimate, it doesn't tell you the actual number of free track, but how many you may expect assuming the routing is reasonably well done.

Computation is done as follow: Wire typeEstimated Cost Straight wire (feedthrough) 1.0 Beginning or ending global wire 0.5 Local wire. 1/3 Blockage wire The exact percentage of the track

  Track Computation
The number of track that can go through a GCell in the horizontal direction is computed as follow:

The pitch is assumed to be the same for every layer and is hardwired to 5.0 lambda.

This is a bad architectural choice. The informations pertaining to routing should be held at Kite level, not be hardwired and the pitch should be made variable with the layer... To be corrected in future versions.

GCell Lazy Evaluation

To save processing time, the densities are not recomputed every time a segment is modified (added, removed or moved). Instead a lazy evaluation mechanism is used. Densities are recomputed each time a density is queried and the lazy evaluation not explicitly disabled (flag NoUpdate).

GCell Sorting Key

In order to perform a lexicographical sort on the tuple $(density(depth),id)$ of a GCell, a specific slave object GCell::Key is introduced. It is the density on one specific depth, not the average density.

GCell Desaturation / Layer Assignment

In addition to it's geometrical and density functionality, the GCell provides desaturation capabilities. Desaturation is the operation of moving up feedthough AutoSegment from the bottom layers towards the upper ones in order to balance the densities in the different densities. Thoses operations provides building blocks for the layer assignment stage which is provided by the Kabatic tool.

Two strategies are avalaibles, moving one global AutoSegment at a time with GCell::stepDesaturate() or, when one AutoSegment is moved up, move up the whole net trunk with GCell::stepNetDesaturate().

GCell Implantation

GCell derives from Hurricane::ExtensionGo to allow a graphical rendering of the routing density.

Member Typedef Documentation

  typedef set< GCell *, CompareByIndex > SetIndex
Shorthand for a set of GCell sorted on their index.

Member Function Documentation

  size_t getAllocateds () [static]
Returns: The number of allocated GCells.

  DbU::Unit getTopRightShrink () [static]
Returns: The amount of shrink on the top and right boundaries.

  const Name & getStaticName () [static]
Returns: The name of the Go slice: 'Katabatic::GCell'.

See also:
    Hurricane::ExtensionGo

  const Name & getName () const [virtual]
Returns: The name of the Go slice: 'Katabatic::GCell'.

See also:
    Hurricane::ExtensionGo

Referenced by GCell::checkDensity().

  bool isSaturated () const [inline]
Returns: true if at least one layer exceed a saturation of 1.0 (more wirelength that it can hold).

Referenced by GCell::checkDensity(), GCell::stepDesaturate(), and GCell::updateDensity().

  bool isSaturated (unsigned int depth) const
Returns: true if the saturation ratio of layer depth is over the threshold defined for the GCells.

References GCell::getDensity(), and Session::getSaturateRatio().

  bool isValid () const [inline]
Returns: true if all the AutoContact/AutoSegment of the GCell are valids.

Referenced by GCell::checkDensity(), GCell::getCDensity(), GCell::getDensity(), GCell::getFeedthroughs(), GCell::getFragmentation(), GCell::getGlobalsCount(), GCell::getWDensity(), GCell::hasFreeTrack(), GCell::isAboveDensity(), and GCell::updateDensity().

  bool isAboveDensity (float threshold) const
Returns: true if the overall saturation ratio greater than threshold.

References GCell::getDensity(), GCell::isValid(), and GCell::updateDensity().

  bool hasFreeTrack (size_t depth, float reserve) const
Returns: true if there should be enough wire length to pass a wire completly trough this GCell.

References GCell::getHCapacity(), GCell::getIndex(), RoutingGauge::getLayerDepth(), Layer::getName(), Session::getRoutingGauge(), RoutingGauge::getRoutingLayer(), GCell::getVCapacity(), GCell::isValid(), Katabatic::KbHorizontal, Katabatic::KbVertical, and GCell::updateDensity().

  GCellGrid * getGCellGrid () const [inline]
Returns: The Grid of which GCell is part of.

Referenced by GCell::checkEdgeSaturation(), GCell::getDensity(), GCell::getDown(), GCell::getLeft(), GCell::getRight(), GCell::getUp(), and GCell::stepNetDesaturate().

  unsigned int getDepth () const [inline]
Returns: The depth (i.e. number of routing layers) of the GCell.

  unsigned int getIndex () const [inline]
Returns: The linear index of the GCell in the GCellGrid vector.

See also:
    GCellGrid for the meaning of the index.

Referenced by AutoSegment::canMoveUp(), GCell::hasFreeTrack(), and GCell::stepDesaturate().

  unsigned int getRow () const
Returns: The row of the GCell in the GCellGrid.

References BaseGrid::getRow().

Referenced by GCell::checkDensity(), and AutoSegment::computeOptimal().

  unsigned int getColumn () const
Returns: The Column of the GCell in the GCellGrid.

References BaseGrid::getColumn().

Referenced by GCell::checkDensity(), and AutoSegment::computeOptimal().

  GCell * getLeft () const
Returns: The left neighbor of the GCell (NULL if it is the leftmost GCell).

References GCell::getGCellGrid(), and Grid< GCellT >::getGCellLeft().

Referenced by AutoVertical::canMoveULeft(), and AutoVertical::moveULeft().

  GCell * getRight () const
Returns: The right neighbor of the GCell (NULL if it is the rightmost GCell).

References GCell::getGCellGrid(), and Grid< GCellT >::getGCellRight().

Referenced by AutoHorizontal::_makeDogleg(), AutoHorizontal::_postCreate(), AutoHorizontal::_preDestroy(), AutoHorizontal::canMoveULeft(), AutoHorizontal::canMoveURight(), AutoVertical::canMoveURight(), GCell::checkEdgeSaturation(), AutoHorizontal::getGCells(), AutoSegment::makeDogleg(), AutoHorizontal::moveULeft(), AutoHorizontal::moveURight(), and AutoVertical::moveURight().

  GCell * getUp () const
Returns: The top neighbor of the GCell (NULL if it is the topmost GCell).

References GCell::getGCellGrid(), and Grid< GCellT >::getGCellUp().

Referenced by AutoVertical::_makeDogleg(), AutoVertical::_postCreate(), AutoVertical::_preDestroy(), AutoVertical::canMoveULeft(), AutoHorizontal::canMoveURight(), AutoVertical::canMoveURight(), GCell::checkEdgeSaturation(), AutoVertical::getGCells(), AutoSegment::makeDogleg(), AutoVertical::moveULeft(), AutoHorizontal::moveURight(), and AutoVertical::moveURight().

  GCell * getDown () const
Returns: The bottom neighbor of the GCell (NULL if it is the bottommost GCell).

References Grid< GCellT >::getGCellDown(), and GCell::getGCellGrid().

Referenced by AutoHorizontal::canMoveULeft(), and AutoHorizontal::moveULeft().

  void translate (const DbU::Unit &, const DbU::Unit &) [virtual]
Required to exists as a Hurricane::Go derived class. But must never be used...

  Box getBoundingBox () const [virtual]
Returns: The bounding box of the GCell, with the top right shrink applied.

Referenced by AutoSegment::AutoSegment(), AutoSegment::computeOptimal(), and AutoContactTerminal::getNativeConstraintBox().

  DbU::Unit getX () const [inline]
Returns: The lower left X coordinate of the GCell box.

References Box::getXMin().

Referenced by AutoHorizontal::_makeDogleg(), AutoHorizontal::_postCreate(), AutoHorizontal::_preDestroy(), AutoContact::getCBXMax(), AutoContact::getCBXMin(), AutoSegment::getOrigin(), AutoContact::setCBXMax(), and AutoContact::setCBXMin().

  DbU::Unit getY () const [inline]
Returns: The lower left Y coordinate of the GCell box.

References Box::getYMin().

Referenced by AutoVertical::_makeDogleg(), AutoVertical::_postCreate(), AutoVertical::_preDestroy(), AutoContact::getCBYMax(), AutoContact::getCBYMin(), AutoSegment::getOrigin(), AutoContact::setCBYMax(), and AutoContact::setCBYMin().

  DbU::Unit getXMax () const [inline]
Returns: The upper right X coordinate of the GCell box (top right shrink applied).

References Box::getXMax().

Referenced by AutoHorizontal::_makeDogleg(), AutoSegment::getExtremity(), and AutoContact::setCBXMax().

  DbU::Unit getYMax () const [inline]
Returns: The upper right Y coordinate of the GCell box (top right shrink applied).

References Box::getYMax().

Referenced by AutoVertical::_makeDogleg(), AutoSegment::getExtremity(), and AutoContact::setCBYMax().

  Interval getSide (unsigned int direction) const
Returns: The interval corresponding to the side position of the GCell box, in direction.

References Box::getXMax(), Box::getXMin(), Box::getYMax(), Box::getYMin(), Katabatic::KbHorizontal, and Katabatic::KbVertical.

Referenced by AutoHorizontal::_canSlacken(), AutoVertical::_canSlacken(), AutoSegment::makeDogleg(), AutoHorizontal::moveULeft(), AutoVertical::moveULeft(), AutoHorizontal::moveURight(), AutoVertical::moveURight(), and AutoSegment::toConstraintAxis().

  float getHCapacity () const

Returns:
    The number of track that can go through the GCell in the horizontal direction. For a detailed explanation of the computation see Track Computation.

References Box::getHeight().

Referenced by GCell::hasFreeTrack(), and GCell::updateDensity().

  float getVCapacity () const

Returns:
    The number of track that can go through the GCell in the vertical direction. For a detailed explanation of the computation see Track Computation.

References Box::getWidth().

Referenced by GCell::hasFreeTrack(), and GCell::updateDensity().

  float getDensity (unsigned int flags = 0) const
Returns: The average density of the GCell, for all the depths.

Saturation & Density Computation, GCell Lazy Evaluation.

References GCellGrid::AverageHDensity, GCellGrid::AverageHVDensity, GCellGrid::AverageVDensity, GCellGrid::getDensityMode(), GCell::getGCellGrid(), GCell::isValid(), GCellGrid::MaxDensity, GCellGrid::MaxHDensity, GCellGrid::MaxHVDensity, GCellGrid::MaxVDensity, and GCell::updateDensity().

Referenced by GCell::isAboveDensity(), and GCell::isSaturated().

  float getCDensity (unsigned int flags = 0) const [inline]
Returns: The density of contacts.

Saturation & Density Computation, GCell Lazy Evaluation.

References GCell::isValid(), and GCell::updateDensity().

  float getWDensity (unsigned int depth, unsigned int flags = 0) const [inline]
Returns: The density of wires at depth.

Saturation & Density Computation, GCell Lazy Evaluation.

References GCell::isValid(), and GCell::updateDensity().

Referenced by AutoHorizontal::canMoveULeft(), AutoVertical::canMoveULeft(), AutoHorizontal::canMoveURight(), and AutoVertical::canMoveURight().

  DbU::Unit getBlockage (unsigned int depth) const [inline]
Returns: The total length of blockage wire on layer at depth.

  float getFragmentation (unsigned int depth) const [inline]
Returns: The longest free fragment size on layer depth (in percent).

References GCell::isValid(), and GCell::updateDensity().

Referenced by AutoSegment::canMoveUp().

  float getFeedthroughs (unsigned int depth) const [inline]
Returns: The estimate number of occupied tracks on layer depth.

See also:
    Feedthrough Computation

References GCell::isValid(), and GCell::updateDensity().

  float getGlobalsCount (unsigned int depth) const [inline]
Returns: The number of global wires that go completly through the GCell at layer depth. This do not includes the global wires that begins or ends in the GCell.

References GCell::isValid(), and GCell::updateDensity().

  const vector< AutoSegment * > & getHSegments () const [inline]

Returns:
    The vector of all horizontal AutoSegments that completly goes through the GCell.

  const vector< AutoSegment * > & getVSegments () const [inline]

Returns:
    The vector of all vertical AutoSegments that completly goes through the GCell.

  const vector< AutoContact * > & getContacts () const [inline]

Returns:
    The vector of all AutoContacts owned by the GCell.

  AutoSegments getHStartSegments ()

Returns:
    A Collection of the horizontal AutoSegments that starts from this GCell.

References Katabatic::KbHorizontal, and Katabatic::KbSource.

Referenced by GCell::getStartSegments().

  AutoSegments getVStartSegments ()

Returns:
    A Collection of the vertical AutoSegments that starts from this GCell.

References Katabatic::KbSource, and Katabatic::KbVertical.

Referenced by GCell::getStartSegments().

  AutoSegments getHStopSegments ()

Returns:
    A Collection of the horizontal AutoSegments that stops in this GCell.

References Katabatic::KbHorizontal, and Katabatic::KbTarget.

Referenced by GCell::getStopSegments().

  AutoSegments getVStopSegments ()

Returns:
    A Collection of the vertical AutoSegments that stops in this GCell.

References Katabatic::KbTarget, and Katabatic::KbVertical.

Referenced by GCell::getStopSegments().

  AutoSegments getStartSegments (unsigned int direction) [inline]

Returns:
    A Collection of the horizontal or vertical AutoSegments that starts from this GCell according to direction.

References GCell::getHStartSegments(), GCell::getVStartSegments(), and Katabatic::KbHorizontal.

  AutoSegments getStopSegments (unsigned int direction) [inline]

Returns:
    A Collection of the horizontal or vertical AutoSegments that stops in this GCell according to direction.

References GCell::getHStopSegments(), GCell::getVStopSegments(), and Katabatic::KbHorizontal.

  size_t getRoutingPads (set< RoutingPad *> & rps)

Returns:
    The size of the RoutingPad set.

Fills the rps set with all the RoutingPads that appears in this GCell. (looks at all the anchors of the owned AutoContact)

Referenced by GCell::rpDesaturate().

  const Key & getKey () const [inline]

Returns:
    The sorting key of the GCell.

See also:
    GCell Sorting Key

  size_t checkDensity () const

Returns:
    1 if the GCell is saturated, 0 otherwise.

Check, if the GCell is saturated, layer by layer. Issue a warning if that is the case.

References Session::doWarnGCellOverload(), GCell::getColumn(), GCell::getName(), Session::getRoutingGauge(), GCell::getRow(), Session::isInDemoMode(), GCell::isSaturated(), GCell::isValid(), and GCell::updateDensity().

Referenced by GCell::updateDensity().

  bool checkEdgeSaturation (size_t hreserved, size_t vreserved) const

Returns:
    true if the Up/Right edge is over the threshold.

Check if the number of AutoSegments crossing the Up & Right edges of the GCell exceed threshold. The thresold must be expressed as a percentage of the full capacity of the edges. The overload is computed as a whole and not depth by depth.

References GCell::getGCellGrid(), GCellGrid::getHEdgeCapacity(), GCell::getRight(), GCell::getUp(), GCellGrid::getVEdgeCapacity(), AutoSegment::isLocal(), and Session::lookup().

  void addBlockage (unsigned int depth, DbU::Unit length)
Adds length of wire blockage to layer depth.

References DbU::getValueString().

  void addHSegment (AutoSegment * segment) [inline]
Adds segment to the list of horizontal feedthroughs.

Referenced by AutoHorizontal::_postCreate(), AutoVertical::moveULeft(), and AutoVertical::moveURight().

  void addVSegment (AutoSegment * segment) [inline]
Adds segment to the list of vertical feedthroughs.

Referenced by AutoVertical::_postCreate(), AutoHorizontal::moveULeft(), and AutoHorizontal::moveURight().

  void addContact (AutoContact * contact) [inline]
Adds contact to the list of contacts owned by this GCell.

Referenced by AutoContact::setGCell().

  void removeVSegment (AutoSegment * segment)
Removes segment to the list of vertical feedthroughs.

Referenced by AutoVertical::_makeDogleg(), AutoVertical::_preDestroy(), AutoHorizontal::moveULeft(), and AutoHorizontal::moveURight().

  void removeHSegment (AutoSegment * segment)
Removes segment to the list of horizontal feedthroughs.

Referenced by AutoHorizontal::_makeDogleg(), AutoHorizontal::_preDestroy(), AutoVertical::moveULeft(), and AutoVertical::moveURight().

  void removeContact (AutoContact * contact)
Removes contact to the list of contacts owned by this GCell.

References AutoContact::base().

  void updateContacts ()
Force a geometry update on all the AutoContact of the GCell.

  size_t updateDensity ()
Returns: true if the GCell is saturated.

Update the various densities of the GCell. No actual computation is performed if the GCell is not invalidated.

References GCell::checkDensity(), GCell::getHCapacity(), Box::getHeight(), RoutingGauge::getLayerDepth(), Session::getRoutingGauge(), GCell::getVCapacity(), Box::getWidth(), Box::getXMax(), Box::getXMin(), Box::getYMax(), Box::getYMin(), GCell::isSaturated(), GCell::isValid(), Katabatic::KbHorizontal, and Katabatic::KbVertical.

Referenced by GCell::checkDensity(), GCell::getCDensity(), GCell::getDensity(), GCell::getFeedthroughs(), GCell::getFragmentation(), GCell::getGlobalsCount(), GCell::getWDensity(), GCell::hasFreeTrack(), GCell::isAboveDensity(), GCell::stepDesaturate(), and GCell::stepNetDesaturate().

  void updateKey (unsigned int depth) [inline]
Update the GCell key with the new density at layer depth.

See also:
    GCell Sorting Key.

References GCell::Key::update().

  bool rpDesaturate (set< Net *> & nets)
If the number of RoutingPad in the first routing layer exceed the Session::getSaturateRp() threshold, force a desaturation of layer depth 1 until it is below 0.5.

See also:
    GCell Desaturation / Layer Assignment

References Session::getRoutingLayer(), GCell::getRoutingPads(), Session::getSaturateRp(), Katabatic::KbForceMove, and GCell::stepDesaturate().

  bool stepDesaturate (unsigned int depth, set< Net *> & globalNets, AutoSegment *& moved, unsigned int flags = 0)

Parameters:
    depth The depth to desaturate.
    globalNets The set of Nets of which at least one segment has been moved up.
    moved The moved up AutoSegment.
    flags If KbForceMove is set, force one AutoSegment to move up, event if the GCell is not saturated in the relevant depth.

Returns: true if an AutoSegment has actually been moved up.

Perform the atomic desaturation, that is move up one AutoSegment from layer depth to layer depth+2, longuests AutoSegments are moved first. Only global feedthrough AutoSegments are candidates to be moved up. The Net owning the moved up segment is added to the globalNets set. If the GCell is not saturated on layer depth, nothing is done. If the forced flag is set, one global AutoSegment is moved up regardless of the saturation status.

See also:
    GCell Desaturation / Layer Assignment

References GCell::getIndex(), RoutingGauge::getLayerDepth(), Session::getRoutingGauge(), GCell::isSaturated(), Katabatic::KbForceMove, Katabatic::KbHorizontal, Katabatic::KbVertical, and GCell::updateDensity().

Referenced by GCell::rpDesaturate().

  bool stepNetDesaturate (unsigned int depth, set< Net *> & globalNets, GCell::SetIndex & invalidateds)

Parameters:
    depth The depth to desaturate.
    globalNets The set of Nets of which at least one segment has been moved up.
    invalidateds The set of GCell ids that have been invalidateds.

Returns: true if a Net has been moved up.

Perform a desaturation by whole Net trunk. Select the longest feedthrough AutoSegment in layer depth, then attempt to move up the whole Net (all it's global AutoSegments are moved up).

See also:
    GCell Desaturation / Layer Assignment

References GCell::getGCellGrid(), RoutingGauge::getLayerDepth(), Session::getRoutingGauge(), Katabatic::KbHorizontal, Katabatic::KbVertical, and GCell::updateDensity().

Author

Generated automatically by Doxygen for Katabatic - Routing Toolbox from the source code.