coriolis/knik/doc/Knik.dox

131 lines
4.4 KiB
C++

// -*- C++ -*-
namespace KNIK {
/*! \class Knik
* \brief The Global Router CEngine itself.\n
* - \ref KnikTypes "Types"
* - \ref KnikAttributes "Attributes"
* - \ref KnikConstructors "Constructors"
* - \ref KnikModifiers "Modifiers"
*
* \section secKnikImplementation Knik Implementation
* The Global Router CEngine uses a technique based on routing graph and thus relies on another
* CEngine : Nimbus.
*/
/* \struct Knik::NetRecord
*
* \brief A NetRecord in Knik
*
* blablablabla
*/
/*! \anchor KnikAttributes Attributes
* \name
*/
// \{
//
/*! \var NIMBUS::Nimbus* Knik::_nimbus
* The CEngine Nimbus corresponding to the partitionning
*
* \Initial \NULL
*/
/*! \var Graph* Knik::_routingGraph
* The routing graph for Knik
*
* \Initial \NULL
*/
/*! \var CRLCORE::CTimer Knik::_timer
* A useful timer to measure execution time
*/
/*! \var Knik::NetVector Knik::_nets_to_route
* The \STL vector of nets to route by Knik
*
* \Initial empty
*/
// \}
/*! \anchor KnikConstructors Constructors
* \name
*/
// \{
/*! \function static Knik* Knik::Create ( Cell* cell, unsigned congestion, unsigned precongestion, bool benchMode, bool useSegments, float edgeCost );
* \param cell is the cell on which the Knik CEngine will work
* \param congestion 0: None, 1: Congestion
* \param precongestion 0: None, 1: Static, 2: Dynamic
* \param benchMode for ispr 2007 global routing benchmarks
* \param useSegments defines whether routing is done with segments or splitters
* \param edgeCost
* \return the newly created Knik CEngine
*/
// \}
/*! \anchor KnikModifiers Modifiers
* \name
*/
// \{
/*! \function void Knik::InitGlobalRouting();
* This function initializes several thngs that the global routing algorithms will need :
* - creates the routing graph
* - lists the net that will be routed (filters supply and clock nets and also nets with too many pins)
* - creates the estimated congestion (if needed)
*
* \overview
* \code
* if no routing graph exists:
* // creates the routing graph
* Graph::Create ( Knik::_nimbus );
*
* for each net of cell:
* // filters net
* if net->IsGlobal() or net->IsSupply() or net->IsClock() :
* continue;
*
* // get netDegree
* netDegree = Graph::CountVertexes ();
* // still filtering
* if netDegree > 1 and netDegree < 1000
* Knik::_nets_to_route .push_back ( net );
*
* #if defined __USE_STATIC_PRECONGESTION__ or __USE_DYNAMIC_PRECONGESTION__
* // creates the estimate congestion on the routing graph
* Graph::UpdateEstimateCongestion ( true );
*
* // cleans routing graph
* Graph::ResetVertexes ();
* \endcode
*
* \b Note \b 1:
* The <em>for each net of cell</em> loop is in fact a loop on net occurrences which allows to get all nets of the hierarchy
* of the cell. The first thing done in the loop is then to get the net corresponding to the occurrence.
*
* \b Note\b 2:
* The Knik::_nets_to_route vector does not contains Net but NetRecord which is a structure that associates a Net with a value that
* measures it's size. The cost function of the size is :
* \code cost = ( netBoundingBoxWidth + 1 ) * ( netBoundingBoxHeight + 1 )
* \endcode
* This cost function allows to sort nets so flat and small nets will be routed first.
* \exception error if the routing graph already exists
* \exception asserts that Knik::_nets_to_route is empty when the function is called
* \see \ref KNIK_USESTATIC "__USE_STATIC_PRECONGESTION__", \ref KNIK_USEDYNAMIC "__USE_DYNAMIC_PRECONGESTION__"
*/
// \}
/*! \anchor KnikTypes Types
* \name
*/
// \{
/* \typedef vector<Knik::NetRecord> Knik::NetVector;
*/
// \}
}