// -*- 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 : *
    *
  1. For a given net, go through the \c AutoSegment and migrate them * to upper (global) layers if needed. *
  2. 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. * * 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 : * * * 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 { }