// -*- C++ -*-
namespace Katabatic {
/*! \defgroup layerAssign 4. Layer Assignment (internal)
*
* This modules documents how layer assignment is performed. It is intented
* for developpers only.
*
* Layer Assignment functions works in two steps :
*
* - For a given net, go through the \c AutoSegment and migrate them
* to upper (global) layers if needed.
*
- For each \c AutoContact of which at least one \c AutoSegment has been
* migrated, split the \c AutoContact (with SplitAutoContact()).
*
*
* SplitAutoContact() relies on the hypothesis that the split occurs
* between two sets of \b HV layers. For example between \b M2/M3 and
* \b M4/M5 but not between \b M2/M3 and \b M6/M7.
*
* The following figures shows all possible configurations, except for
* the most obvious : when all \c AutoSegment are migrated from \b M2/M3 to
* \b M4/M5 we just change the layer of the \c AutoContact from \b C23 to \b C34.
* SplitAutoContact() compute the layer span of the AutoContact,
* that is, the distance between the lowest layer and the higher one (it
* cannot exceed 3 as from \b M2 to \b M5). Then it detach the higher
* \c AutoSegment and re-attach them to a newly created \c AutoContact.
* In turn this new \c AutoContact is connected to the previous one.
*
* - The span is 3 (\b M2 to \b M5) : creates 2 \c AutoContact and
* 2 \c AutoSegment.
*
- The span is 2 (\b M2 to \b M4 or \b M3 to \b M5) : creates one
* \c AutoContact and one \c AutoSegment.
*
- The span is 1 (\b M3 to \b M4) : just change the layer of the
* \c AutoContact to \b C34.
*
* Simpler rules could be formulated : if \b M2 is present creates the
* \b M3 additionnal \c AutoSegment. If \b M5 is present, created the
* \b M4 additionnal \c AutoSegment.
*
* In M2+M3+M4+M5, M3+M4+M5 and M2+M3+M4 configurations
* two separates \b M4 \c AutoSegment (resp. \b M3 \c AutoSegment) are needed
* to avoid the incomplete AutoContact wiring problem
* (see \ref ssecFaultyTopologies).
*
* \image html SplitAutoContact-1.png "Full Configuration"
* \image latex SplitAutoContact-1.pdf "Full Configuration" width=0.4\textwidth
* \image html SplitAutoContact-2.png "No M3 Configuration"
* \image latex SplitAutoContact-2.pdf "No M3 Configuration" width=0.4\textwidth
* \image html SplitAutoContact-3.png "No M3,M4 Configuration"
* \image latex SplitAutoContact-3.pdf "No M3,M4 Configuration" width=0.4\textwidth
* \image html SplitAutoContact-4.png "No M2 Configuration (degenerate)"
* \image latex SplitAutoContact-4.pdf "No M2 Configuration (degenerate)" width=0.4\textwidth
* \image html SplitAutoContact-5.png "No M5 Configuration (degenerate)"
* \image latex SplitAutoContact-5.pdf "No M5 Configuration (degenerate)" width=0.4\textwidth
* \image html SplitAutoContact-6.png "No M2,M5 Configuration (degenerate)"
* \image latex SplitAutoContact-6.pdf "No M2,M5 Configuration (degenerate)" width=0.4\textwidth
*/
/*! \enum LayerAssignMethod
* List all avalaible global layer assignment algorithm avalaible for
* layerAssign().
*/
/*! \var LayerAssign LayerAssignByLength
* See layerAssign().
*/
/*! \var LayerAssign LayerAssignByTrunk
* See layerAssign().
*/
/*! \function void KatabaticEngine::layerAssign ( unsigned int method )
* \param method specify the algorithm used to perform the layer assignement.
*
* The loadGlobalRouting() method build a topology for each net using only the
* two first routing layers avalaibles (usually \e metal2 and \e metal3).
* To use upper routing layer we needs to go through a layer assignment
* step. The layerAssign() method provides two simples approaches to do so :
*
* - layerAssignByLength : every global AutoSegment which
* length is superior to the global threshold is moved to the upper layer.
*
- layerAssignByTrunk : if any AutoSegment of a net
* exceed the global threshold, then all the global wiring of this
* net is put into the upper layers.
*
*
* This method is a switch to _layerAssignByLength() or _layerAssignByTrunk().
*
* The global threshold is to be sets using the setGlobalThreshold()
* method.
*/
//! \addtogroup layerAssign
//! \{
/*! \function void KatabaticEngine::_layerAssignByLength ( unsigned long& total, unsigned long& global, set& globalNets );
*
* Perform the layer assignment on all nets, using the
* layerAssignByLength algorithm. See layerAssign().
*/
/*! \function void KatabaticEngine::_layerAssignByLength ( Net* net, unsigned long& total, unsigned long& global, set& globalNets );
* \param net The net to process.
* \param total The total number of AutoSegment.
* \param global The number of AutoSegment that have been sets global.
* \param globalNets Set of global Nets.
*
* Perform the layer assignment on one net, using the
* layerAssignByLength algorithm. See layerAssign().
*/
/*! \function void KatabaticEngine::_layerAssignByTrunk ( unsigned long& total, unsigned long& global, set& globalNets );
*
* Perform the layer assignment on all nets, using the
* layerAssignByTrunk algorithm. See layerAssign().
*/
/*! \function void KatabaticEngine::_layerAssignByTrunk ( Net* net, unsigned long& total, unsigned long& global, set& globalNets );
* \param net The net to process.
* \param total The total number of AutoSegment.
* \param global The number of AutoSegment that have been sets global.
* \param globalNets Set of global Nets.
*
* Perform the layer assignment on one net, using the
* layerAssignByTrunk algorithm. See layerAssign().
*/
//! \}
}
namespace {
}