Express "xEdgeCapacity" ratio as "xTracksReservedLocal" a number of tracks.

* Change: In Kite, Katabatic & Knik, express the number of tracks truly
    available to the global router by the number of tracks reserved to
    the local routage inside a GCell. Replace the ratio parameter
    "hEdgeCapacity" by an integer parameter "hTracksReservedLocal"
    (duplicate for verticals).
      It is more explicit to give directly the number of tracks that
    are to be used locally, and potentially saves us from rouding
    problems when calculating the number of availables tracks.
      Note: we cannot do that for the layer saturateRatio as it
    uses the density ratio that take account local wires, leading
    to fractional results.
* Change: In Katabatic, in <GCellGrid>, rename checkEdgeSaturation()
    into checkEdgeOverflow(), more explicit.
* Change: In Knik, in <Graph>, display the computed capacities of the
    lower left node edges (should be the same througout all the grid).
* Change: In Unicorn, in <cgt.py>, uses the new parameters names for
    edge density.
This commit is contained in:
Jean-Paul Chaput 2014-06-10 16:58:52 +02:00
parent 2af6e7eef1
commit 2a1c7e181e
19 changed files with 163 additions and 163 deletions

View File

@ -10,14 +10,14 @@ parametersTable = \
( ("katabatic.globalLengthThreshold",TypeInt ,1450 ) # Katabatic parameters. ( ("katabatic.globalLengthThreshold",TypeInt ,1450 ) # Katabatic parameters.
, ("katabatic.saturateRatio" ,TypePercentage,80 ) , ("katabatic.saturateRatio" ,TypePercentage,80 )
, ("katabatic.saturateRp" ,TypeInt ,8 ) , ("katabatic.saturateRp" ,TypeInt ,8 )
, ('katabatic.topRoutingLayer' , TypeString , 'METAL5') , ('katabatic.topRoutingLayer' ,TypeString , 'METAL5')
# Kite parameters. # Kite parameters.
, ("kite.hEdgeCapacity" ,TypePercentage,85 , { 'min':0, 'max':110 } ) , ("kite.hTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':20 } )
, ("kite.vEdgeCapacity" ,TypePercentage,85 , { 'min':0, 'max':110 } ) , ("kite.vTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':20 } )
, ("kite.eventsLimit" ,TypeInt ,4000002) , ("kite.eventsLimit" ,TypeInt ,4000002 )
, ("kite.ripupCost" ,TypeInt ,3 , { 'min':0 } ) , ("kite.ripupCost" ,TypeInt ,3 , { 'min':0 } )
, ("kite.strapRipupLimit" ,TypeInt ,16 , { 'min':1 } ) , ("kite.strapRipupLimit" ,TypeInt ,16 , { 'min':1 } )
, ("kite.localRipupLimit" ,TypeInt ,9 , { 'min':1 } ) , ("kite.localRipupLimit" ,TypeInt ,9 , { 'min':1 } )
, ("kite.globalRipupLimit" ,TypeInt ,5 , { 'min':1 } ) , ("kite.globalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
, ("kite.longGlobalRipupLimit" ,TypeInt ,5 , { 'min':1 } ) , ("kite.longGlobalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
) )

View File

@ -10,10 +10,10 @@ layoutTable = \
, (TypeOption , "katabatic.topRoutingLayer" , "Top Routing Layer" , 0, 1 ) , (TypeOption , "katabatic.topRoutingLayer" , "Top Routing Layer" , 0, 1 )
, (TypeRule ,) , (TypeRule ,)
, (TypeTitle , "Kite - Detailed Router" ) , (TypeTitle , "Kite - Detailed Router" )
, (TypeOption , "kite.hEdgeCapacity" , "Vert. Edge Capacity (%)", 0 ) , (TypeOption , "kite.hTracksReservedLocal", "Vert. Locally Reserved Tracks", 0 )
, (TypeOption , "kite.vEdgeCapacity" , "Hor. Edge Capacity (%)" , 0 ) , (TypeOption , "kite.vTracksReservedLocal", "Hor. Locally Reserved Tracks" , 0 )
, (TypeOption , "kite.eventsLimit" , "Events Limit" , 0 ) , (TypeOption , "kite.eventsLimit" , "Events Limit" , 0 )
, (TypeOption , "kite.ripupCost" , "Ripup Cost" , 1, 1, Cfg.ParameterWidgetFlags.UseSpinBox ) , (TypeOption , "kite.ripupCost" , "Ripup Cost" , 1, 1, Cfg.ParameterWidgetFlags.UseSpinBox )
, (TypeSection, "Ripup Limits", 1 ) , (TypeSection, "Ripup Limits", 1 )
, (TypeOption , "kite.strapRipupLimit" , "Straps" , 1, 1, Cfg.ParameterWidgetFlags.UseSpinBox ) , (TypeOption , "kite.strapRipupLimit" , "Straps" , 1, 1, Cfg.ParameterWidgetFlags.UseSpinBox )
, (TypeOption , "kite.localRipupLimit" , "Locals" , 1, 1, Cfg.ParameterWidgetFlags.UseSpinBox ) , (TypeOption , "kite.localRipupLimit" , "Locals" , 1, 1, Cfg.ParameterWidgetFlags.UseSpinBox )

View File

@ -11,6 +11,7 @@ parametersTable = \
, ('mauka.plotBins' , TypeBool , True ) , ('mauka.plotBins' , TypeBool , True )
, ('mauka.searchRatio' , TypePercentage, 50 ) , ('mauka.searchRatio' , TypePercentage, 50 )
, ('mauka.standardAnnealing', TypeBool , True ) , ('mauka.standardAnnealing', TypeBool , True )
, ('clockTree.minimumSide' , TypeInt , 300 )
) )
@ -30,9 +31,10 @@ layoutTable = \
, (TypeOption, "metis.Reconst" , "Reconst" , 1 ) , (TypeOption, "metis.Reconst" , "Reconst" , 1 )
# Nimbus part. # Nimbus part.
, (TypeTitle , "Mauka - Placer") , (TypeTitle , "Mauka - Placer")
, (TypeOption, "nimbus.pinsPlacement", "Pins Placement" , 0 ) , (TypeOption, "nimbus.pinsPlacement" , "Pins Placement" , 0 )
, (TypeOption, "nimbus.aspectRatio" , "Aspect Ratio, X/Y (%)", 1 ) , (TypeOption, "nimbus.aspectRatio" , "Aspect Ratio, X/Y (%)", 1 )
, (TypeOption, "nimbus.spaceMargin" , "Space Margin" , 1 ) , (TypeOption, "nimbus.spaceMargin" , "Space Margin" , 1 )
, (TypeOption, "clockTree.minimumSide", "Clock Tree Min. Side" , 1 )
, (TypeRule ,) , (TypeRule ,)
# Mauka part. # Mauka part.
, (TypeOption, "mauka.standardAnnealing", "Standart Annealing" , 0 ) , (TypeOption, "mauka.standardAnnealing", "Standart Annealing" , 0 )

View File

@ -10,14 +10,14 @@ parametersTable = \
( ("katabatic.globalLengthThreshold",TypeInt ,1450 ) # Katabatic parameters. ( ("katabatic.globalLengthThreshold",TypeInt ,1450 ) # Katabatic parameters.
, ("katabatic.saturateRatio" ,TypePercentage,80 ) , ("katabatic.saturateRatio" ,TypePercentage,80 )
, ("katabatic.saturateRp" ,TypeInt ,8 ) , ("katabatic.saturateRp" ,TypeInt ,8 )
, ('katabatic.topRoutingLayer' , TypeString , 'METAL5') , ('katabatic.topRoutingLayer' ,TypeString , 'METAL5')
# Kite parameters. # Kite parameters.
, ("kite.hEdgeCapacity" ,TypePercentage,85 , { 'min':0, 'max':110 } ) , ("kite.hTracksReservedLocal" ,TypeInt ,4 , { 'min':0, 'max':18 } )
, ("kite.vEdgeCapacity" ,TypePercentage,85 , { 'min':0, 'max':110 } ) , ("kite.vTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':18 } )
, ("kite.eventsLimit" ,TypeInt ,4000002) , ("kite.eventsLimit" ,TypeInt ,4000002 )
, ("kite.ripupCost" ,TypeInt ,3 , { 'min':0 } ) , ("kite.ripupCost" ,TypeInt ,3 , { 'min':0 } )
, ("kite.strapRipupLimit" ,TypeInt ,16 , { 'min':1 } ) , ("kite.strapRipupLimit" ,TypeInt ,16 , { 'min':1 } )
, ("kite.localRipupLimit" ,TypeInt ,9 , { 'min':1 } ) , ("kite.localRipupLimit" ,TypeInt ,9 , { 'min':1 } )
, ("kite.globalRipupLimit" ,TypeInt ,5 , { 'min':1 } ) , ("kite.globalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
, ("kite.longGlobalRipupLimit" ,TypeInt ,5 , { 'min':1 } ) , ("kite.longGlobalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
) )

View File

@ -1007,12 +1007,12 @@ namespace Katabatic {
} }
bool GCell::checkEdgeSaturation ( float threshold ) const bool GCell::checkEdgeSaturation ( size_t hreserved, size_t vreserved) const
{ {
unsigned int edgeUpUsage = 0; size_t edgeUpUsage = 0;
unsigned int edgeRightUsage = 0; size_t edgeRightUsage = 0;
float edgeUpSaturation = 0.0; size_t edgeUpCapacity = getGCellGrid()->getVEdgeCapacity() - vreserved;
float edgeRightSaturation = 0.0; size_t edgeRightCapacity = getGCellGrid()->getHEdgeCapacity() - hreserved;
if ( getUp() ) { if ( getUp() ) {
// Up Edge Density. // Up Edge Density.
@ -1030,7 +1030,6 @@ namespace Katabatic {
edgeUpUsage++; edgeUpUsage++;
} }
} }
edgeUpSaturation = (float)edgeUpUsage/getGCellGrid()->getVEdgeCapacity();
} }
if ( getRight() ) { if ( getRight() ) {
@ -1049,24 +1048,24 @@ namespace Katabatic {
edgeRightUsage++; edgeRightUsage++;
} }
} }
edgeRightSaturation = (float)edgeRightUsage/getGCellGrid()->getHEdgeCapacity();
} }
bool overload = false; bool overload = false;
if ( (edgeUpSaturation > threshold) or (edgeRightSaturation > threshold) ) { if ( (edgeUpUsage > edgeUpCapacity) or (edgeRightUsage > edgeRightCapacity) ) {
overload = true; overload = true;
cparanoid << Warning("In %s, (over %.2f) ", _getString().c_str(), threshold); cparanoid << Warning( "In %s, (over h:%d or v:%d)"
, _getString().c_str(), edgeRightCapacity, edgeUpCapacity);
ostringstream message; ostringstream message;
message << setprecision(3); message << setprecision(3);
if ( edgeUpSaturation > threshold ) if ( edgeUpUsage > edgeUpCapacity )
message << "up edge: " << edgeUpUsage << "/" << getGCellGrid()->getVEdgeCapacity() message << "up edge: " << edgeUpUsage << " vs. " << getGCellGrid()->getVEdgeCapacity()
<< " " << edgeUpSaturation; << "-" << vreserved;
if ( edgeRightSaturation > threshold ) { if ( edgeRightUsage > edgeRightCapacity ) {
if ( message.str().size() ) message << " & "; if ( message.str().size() ) message << " & ";
message << "right edge: " << edgeRightUsage << "/" << getGCellGrid()->getHEdgeCapacity() message << "right edge: " << edgeRightUsage << " vs. " << getGCellGrid()->getHEdgeCapacity()
<< " " << edgeRightSaturation; << "-" << hreserved;
} }
cparanoid << message.str() << "." << endl; cparanoid << message.str() << "." << endl;

View File

@ -1,8 +1,7 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved // Copyright (c) UPMC 2008-2014, All Rights Reserved
// //
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
// | C O R I O L I S | // | C O R I O L I S |
@ -179,11 +178,11 @@ namespace Katabatic {
} }
bool GCellGrid::checkEdgeSaturation ( float threshold ) const bool GCellGrid::checkEdgeOverflow ( size_t hreserved, size_t vreserved) const
{ {
bool overload = false; bool overload = false;
forEach ( GCell*, gcell, const_cast<GCellGrid*>(this)->getGCells() ) { forEach ( GCell*, gcell, const_cast<GCellGrid*>(this)->getGCells() ) {
overload = gcell->checkEdgeSaturation(threshold) or overload; overload = gcell->checkEdgeSaturation(hreserved,vreserved) or overload;
} }
return overload; return overload;
} }

View File

@ -1,7 +1,7 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC 2008-2013, All Rights Reserved // Copyright (c) UPMC 2008-2014, All Rights Reserved
// //
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
// | C O R I O L I S | // | C O R I O L I S |
@ -158,7 +158,7 @@ namespace Katabatic {
size_t getRoutingPads ( set<RoutingPad*>& ); size_t getRoutingPads ( set<RoutingPad*>& );
inline const Key& getKey () const; inline const Key& getKey () const;
size_t checkDensity () const; size_t checkDensity () const;
bool checkEdgeSaturation ( float threshold ) const; bool checkEdgeSaturation ( size_t hreserved, size_t vreserved) const;
// Modifiers. // Modifiers.
void addBlockage ( unsigned int depth, DbU::Unit ); void addBlockage ( unsigned int depth, DbU::Unit );
inline void addHSegment ( AutoSegment* ); inline void addHSegment ( AutoSegment* );

View File

@ -1,7 +1,7 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC 2008-2013, All Rights Reserved // Copyright (c) UPMC 2008-2014, All Rights Reserved
// //
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
// | C O R I O L I S | // | C O R I O L I S |
@ -58,7 +58,7 @@ namespace Katabatic {
inline size_t getVEdgeCapacity () const; inline size_t getVEdgeCapacity () const;
Interval getUSide ( unsigned int ) const; Interval getUSide ( unsigned int ) const;
size_t checkDensity () const; size_t checkDensity () const;
bool checkEdgeSaturation ( float threshold ) const; bool checkEdgeOverflow ( size_t hreserved, size_t vreserved ) const;
size_t updateDensity (); size_t updateDensity ();
void updateContacts ( unsigned int flags=KbOpenSession ); void updateContacts ( unsigned int flags=KbOpenSession );
inline void setDensityMode ( unsigned int ); inline void setDensityMode ( unsigned int );

View File

@ -1,7 +1,7 @@
// -*- mode: C++; explicit-buffer-name: "Configuration.cpp<kite>" -*- // -*- mode: C++; explicit-buffer-name: "Configuration.cpp<kite>" -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2014, All Rights Reserved // Copyright (c) UPMC 2008-2014, All Rights Reserved
// //
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
// | C O R I O L I S | // | C O R I O L I S |
@ -42,11 +42,11 @@ namespace Kite {
: Katabatic::Configuration() : Katabatic::Configuration()
, _base (base) , _base (base)
, _postEventCb () , _postEventCb ()
, _hEdgeCapacityPercent(Cfg::getParamPercentage("kite.hEdgeCapacity", 80.0)->asDouble()) , _hTracksReservedLocal(Cfg::getParamInt("kite.hTracksReservedLocal", 3)->asInt())
, _vEdgeCapacityPercent(Cfg::getParamPercentage("kite.vEdgeCapacity", 80.0)->asDouble()) , _vTracksReservedLocal(Cfg::getParamInt("kite.vTracksReservedLocal", 3)->asInt())
, _ripupLimits () , _ripupLimits ()
, _ripupCost (Cfg::getParamInt("kite.ripupCost" , 3)->asInt()) , _ripupCost (Cfg::getParamInt("kite.ripupCost" , 3)->asInt())
, _eventsLimit (Cfg::getParamInt("kite.eventsLimit" ,4000000)->asInt()) , _eventsLimit (Cfg::getParamInt("kite.eventsLimit" ,4000000)->asInt())
{ {
_ripupLimits[StrapRipupLimit] = Cfg::getParamInt("kite.strapRipupLimit" ,16)->asInt(); _ripupLimits[StrapRipupLimit] = Cfg::getParamInt("kite.strapRipupLimit" ,16)->asInt();
_ripupLimits[LocalRipupLimit] = Cfg::getParamInt("kite.localRipupLimit" , 7)->asInt(); _ripupLimits[LocalRipupLimit] = Cfg::getParamInt("kite.localRipupLimit" , 7)->asInt();
@ -78,8 +78,8 @@ namespace Kite {
: Katabatic::Configuration() : Katabatic::Configuration()
, _base (base) , _base (base)
, _postEventCb (other._postEventCb) , _postEventCb (other._postEventCb)
, _hEdgeCapacityPercent(other._hEdgeCapacityPercent) , _hTracksReservedLocal(other._hTracksReservedLocal)
, _vEdgeCapacityPercent(other._vEdgeCapacityPercent) , _vTracksReservedLocal(other._vTracksReservedLocal)
, _ripupLimits () , _ripupLimits ()
, _ripupCost (other._ripupCost) , _ripupCost (other._ripupCost)
, _eventsLimit (other._eventsLimit) , _eventsLimit (other._eventsLimit)
@ -240,23 +240,23 @@ namespace Kite {
} }
void Configuration::setHEdgeCapacityPercent ( float percent ) void Configuration::setHTracksReservedLocal ( size_t reserved )
{ {
if (percent > 1.0) if (reserved > getHEdgeCapacity())
throw Error( "Configuration::setHEdgeCapacityPercent(): edge capacity ratio greater than 1.0 (%.1f)." throw Error( "Configuration::setHTracksReservedLocal(): tracks reserved for local routing (%d) is greater than edge capacity %d."
, percent ); , reserved, getHEdgeCapacity() );
_hEdgeCapacityPercent = percent; _hTracksReservedLocal = reserved;
} }
void Configuration::setVEdgeCapacityPercent ( float percent ) void Configuration::setVTracksReservedLocal ( size_t reserved )
{ {
if (percent > 1.0) if (reserved > 1.0)
throw Error( "Configuration::setVEdgeCapacityPercent(): edge capacity ratio greater than 1.0 (%.1f)." throw Error( "Configuration::setVTracksReservedLocal(): tracks reserved for local routing (%d) is greater than edge capacity %d."
, percent ); , reserved, getVEdgeCapacity() );
_vEdgeCapacityPercent = percent; _vTracksReservedLocal = reserved;
} }
@ -274,13 +274,13 @@ namespace Kite {
void Configuration::print ( Cell* cell ) const void Configuration::print ( Cell* cell ) const
{ {
cout << " o Configuration of ToolEngine<Kite> for Cell <" << cell->getName() << ">" << endl; cout << " o Configuration of ToolEngine<Kite> for Cell <" << cell->getName() << ">" << endl;
cout << Dots::asPercentage(" - Global router H edge capacity" ,_hEdgeCapacityPercent) << endl; cout << Dots::asUInt (" - Global router H reserved local" ,_hTracksReservedLocal) << endl;
cout << Dots::asPercentage(" - Global router V edge capacity" ,_vEdgeCapacityPercent) << endl; cout << Dots::asUInt (" - Global router V reserved local" ,_vTracksReservedLocal) << endl;
cout << Dots::asULong (" - Events limit (iterations)" ,_eventsLimit) << endl; cout << Dots::asULong(" - Events limit (iterations)" ,_eventsLimit) << endl;
cout << Dots::asUInt (" - Ripup limit, straps" ,_ripupLimits[StrapRipupLimit]) << endl; cout << Dots::asUInt (" - Ripup limit, straps" ,_ripupLimits[StrapRipupLimit]) << endl;
cout << Dots::asUInt (" - Ripup limit, locals" ,_ripupLimits[LocalRipupLimit]) << endl; cout << Dots::asUInt (" - Ripup limit, locals" ,_ripupLimits[LocalRipupLimit]) << endl;
cout << Dots::asUInt (" - Ripup limit, globals" ,_ripupLimits[GlobalRipupLimit]) << endl; cout << Dots::asUInt (" - Ripup limit, globals" ,_ripupLimits[GlobalRipupLimit]) << endl;
cout << Dots::asUInt (" - Ripup limit, long globals" ,_ripupLimits[LongGlobalRipupLimit]) << endl; cout << Dots::asUInt (" - Ripup limit, long globals" ,_ripupLimits[LongGlobalRipupLimit]) << endl;
_base->print ( cell ); _base->print ( cell );
} }
@ -305,8 +305,8 @@ namespace Kite {
Record* record = _base->_getRecord(); Record* record = _base->_getRecord();
//record->add ( getSlot ( "_rg" , _rg ) ); //record->add ( getSlot ( "_rg" , _rg ) );
if ( record ) { if ( record ) {
record->add ( getSlot("_hEdgeCapacityPercent" ,_hEdgeCapacityPercent ) ); record->add ( getSlot("_hTracksReservedLocal" ,_hTracksReservedLocal ) );
record->add ( getSlot("_vEdgeCapacityPercent" ,_vEdgeCapacityPercent ) ); record->add ( getSlot("_vTracksReservedLocal" ,_vTracksReservedLocal ) );
record->add ( getSlot("_ripupCost" ,_ripupCost ) ); record->add ( getSlot("_ripupCost" ,_ripupCost ) );
record->add ( getSlot("_eventsLimit" ,_eventsLimit ) ); record->add ( getSlot("_eventsLimit" ,_eventsLimit ) );

View File

@ -247,8 +247,8 @@ namespace Kite {
KatabaticEngine::chipPrep(); KatabaticEngine::chipPrep();
KnikEngine::setHEdgeCapacityPercent( 1.0 ); KnikEngine::setHEdgeReservedLocal( 0 );
KnikEngine::setVEdgeCapacityPercent( 1.0 ); KnikEngine::setVEdgeReservedLocal( 0 );
_knik = KnikEngine::create( cell _knik = KnikEngine::create( cell
, 1 // _congestion , 1 // _congestion
, 2 // _preCongestion , 2 // _preCongestion
@ -259,13 +259,13 @@ namespace Kite {
_knik->setRoutingGauge( getConfiguration()->getRoutingGauge() ); _knik->setRoutingGauge( getConfiguration()->getRoutingGauge() );
_knik->setAllowedDepth( getConfiguration()->getAllowedDepth() ); _knik->setAllowedDepth( getConfiguration()->getAllowedDepth() );
_knik->createRoutingGraph(); _knik->createRoutingGraph();
KnikEngine::setHEdgeCapacityPercent( getHEdgeCapacityPercent() ); KnikEngine::setHEdgeReservedLocal( getHTracksReservedLocal() );
KnikEngine::setVEdgeCapacityPercent( getVEdgeCapacityPercent() ); KnikEngine::setVEdgeReservedLocal( getVTracksReservedLocal() );
// Decrease the edge's capacity only under the core area. // Decrease the edge's capacity only under the core area.
const ChipTools& chipTools = getChipTools(); const ChipTools& chipTools = getChipTools();
float corePercent = 1.00; size_t coreReserved = 0;
float coronaPercent = 0.80; size_t coronaReserved = 4;
forEach ( Knik::Vertex*, ivertex, _knik->getRoutingGraph()->getVertexes() ) { forEach ( Knik::Vertex*, ivertex, _knik->getRoutingGraph()->getVertexes() ) {
for ( int i=0 ; i<2 ; ++i ) { for ( int i=0 ; i<2 ; ++i ) {
@ -279,7 +279,7 @@ namespace Kite {
edge->setCapacity( 0 ); edge->setCapacity( 0 );
continue; continue;
} }
corePercent = getHEdgeCapacityPercent(); coreReserved = getHTracksReservedLocal();
} else { } else {
edge = ivertex->getVEdgeOut(); edge = ivertex->getVEdgeOut();
if (not edge) continue; if (not edge) continue;
@ -288,20 +288,21 @@ namespace Kite {
edge->setCapacity( 0 ); edge->setCapacity( 0 );
continue; continue;
} }
corePercent = getVEdgeCapacityPercent(); coreReserved = getVTracksReservedLocal();
} }
float edgePercent = 1.00; size_t edgeReserved = 0;
if (chipTools.getCorona().getInnerBox().contains(edge->getBoundingBox())) { if (chipTools.getCorona().getInnerBox().contains(edge->getBoundingBox())) {
edgePercent = corePercent; edgeReserved = coreReserved;
} else if (chipTools.getCorona().getOuterBox().contains(edge->getBoundingBox())) { } else if (chipTools.getCorona().getOuterBox().contains(edge->getBoundingBox())) {
edgePercent = coronaPercent; edgeReserved = coronaReserved;
} }
float capacity = edgePercent * (float)edge->getCapacity(); size_t capacity = (edge->getCapacity()>edgeReserved)
? (edge->getCapacity()-edgeReserved) : 0;
//cerr << "Appling capacity percentage " << (edgePercent*100.0) << "% (" //cerr << "Appling capacity percentage " << (edgePercent*100.0) << "% ("
// << capacity << ") on: " << edge << endl; // << capacity << ") on: " << edge << endl;
edge->setCapacity( (unsigned int)capacity ); edge->setCapacity( capacity );
} }
} }
} }
@ -547,7 +548,7 @@ namespace Kite {
KatabaticEngine::loadGlobalRouting( method, nets ); KatabaticEngine::loadGlobalRouting( method, nets );
Session::open( this ); Session::open( this );
getGCellGrid()->checkEdgeSaturation( getHEdgeCapacityPercent() ); getGCellGrid()->checkEdgeOverflow( getHTracksReservedLocal(), getVTracksReservedLocal() );
Session::close(); Session::close();
} }
@ -574,15 +575,20 @@ namespace Kite {
printMeasures( "algo" ); printMeasures( "algo" );
Session::open( this ); Session::open( this );
unsigned int overlaps = 0; unsigned int overlaps = 0;
float edgeCapacity = 1.0; size_t hTracksReservedLocal = getHTracksReservedLocal();
KnikEngine* knik = KnikEngine::get( getCell() ); size_t vTracksReservedLocal = getVTracksReservedLocal();
KnikEngine* knik = KnikEngine::get( getCell() );
if (knik) edgeCapacity = knik->getHEdgeCapacityPercent(); if (knik) {
hTracksReservedLocal = knik->getHEdgeReservedLocal();
vTracksReservedLocal = knik->getVEdgeReservedLocal();
}
if (cparanoid.enabled()) { if (cparanoid.enabled()) {
cparanoid << " o Post-checking Knik capacity overload " << (edgeCapacity*100.0) << "%." << endl; cparanoid << " o Post-checking Knik capacity overload h:" << hTracksReservedLocal
getGCellGrid()->checkEdgeSaturation( edgeCapacity ); << " v:." << vTracksReservedLocal << endl;
getGCellGrid()->checkEdgeOverflow( hTracksReservedLocal, vTracksReservedLocal );
} }
_check( overlaps ); _check( overlaps );

View File

@ -94,14 +94,14 @@ namespace Kite {
inline unsigned long getEventsLimit () const; inline unsigned long getEventsLimit () const;
inline unsigned int getRipupCost () const; inline unsigned int getRipupCost () const;
unsigned int getRipupLimit ( unsigned int type ) const; unsigned int getRipupLimit ( unsigned int type ) const;
inline float getHEdgeCapacityPercent () const; inline size_t getHTracksReservedLocal () const;
inline float getVEdgeCapacityPercent () const; inline size_t getVTracksReservedLocal () const;
inline void setEventsLimit ( unsigned long ); inline void setEventsLimit ( unsigned long );
inline void setRipupCost ( unsigned int ); inline void setRipupCost ( unsigned int );
void setRipupLimit ( unsigned int limit, unsigned int type ); void setRipupLimit ( unsigned int limit, unsigned int type );
inline void setPostEventCb ( PostEventCb_t ); inline void setPostEventCb ( PostEventCb_t );
void setHEdgeCapacityPercent ( float ); void setHTracksReservedLocal ( size_t );
void setVEdgeCapacityPercent ( float ); void setVTracksReservedLocal ( size_t );
virtual Record* _getRecord () const; virtual Record* _getRecord () const;
virtual string _getString () const; virtual string _getString () const;
virtual string _getTypeName () const; virtual string _getTypeName () const;
@ -109,9 +109,9 @@ namespace Kite {
// Attributes. // Attributes.
Katabatic::Configuration* _base; Katabatic::Configuration* _base;
PostEventCb_t _postEventCb; PostEventCb_t _postEventCb;
float _hEdgeCapacityPercent; size_t _hTracksReservedLocal;
float _vEdgeCapacityPercent; size_t _vTracksReservedLocal;
unsigned int _ripupLimits [RipupLimitsTableSize]; unsigned int _ripupLimits [RipupLimitsTableSize];
unsigned int _ripupCost; unsigned int _ripupCost;
unsigned long _eventsLimit; unsigned long _eventsLimit;
private: private:
@ -125,8 +125,8 @@ namespace Kite {
inline Configuration::PostEventCb_t& Configuration::getPostEventCb () { return _postEventCb; } inline Configuration::PostEventCb_t& Configuration::getPostEventCb () { return _postEventCb; }
inline unsigned long Configuration::getEventsLimit () const { return _eventsLimit; } inline unsigned long Configuration::getEventsLimit () const { return _eventsLimit; }
inline unsigned int Configuration::getRipupCost () const { return _ripupCost; } inline unsigned int Configuration::getRipupCost () const { return _ripupCost; }
inline float Configuration::getHEdgeCapacityPercent () const { return _hEdgeCapacityPercent; } inline size_t Configuration::getHTracksReservedLocal () const { return _hTracksReservedLocal; }
inline float Configuration::getVEdgeCapacityPercent () const { return _vEdgeCapacityPercent; } inline size_t Configuration::getVTracksReservedLocal () const { return _vTracksReservedLocal; }
inline void Configuration::setRipupCost ( unsigned int cost ) { _ripupCost = cost; } inline void Configuration::setRipupCost ( unsigned int cost ) { _ripupCost = cost; }
inline void Configuration::setPostEventCb ( PostEventCb_t cb ) { _postEventCb = cb; } inline void Configuration::setPostEventCb ( PostEventCb_t cb ) { _postEventCb = cb; }
inline void Configuration::setEventsLimit ( unsigned long limit ) { _eventsLimit = limit; } inline void Configuration::setEventsLimit ( unsigned long limit ) { _eventsLimit = limit; }

View File

@ -74,8 +74,8 @@ namespace Kite {
inline unsigned int getRipupLimit ( unsigned int type ) const; inline unsigned int getRipupLimit ( unsigned int type ) const;
unsigned int getRipupLimit ( const TrackElement* ) const; unsigned int getRipupLimit ( const TrackElement* ) const;
inline unsigned int getRipupCost () const; inline unsigned int getRipupCost () const;
inline float getHEdgeCapacityPercent () const; inline size_t getHTracksReservedLocal () const;
inline float getVEdgeCapacityPercent () const; inline size_t getVTracksReservedLocal () const;
virtual const Name& getName () const; virtual const Name& getName () const;
inline Configuration::PostEventCb_t& inline Configuration::PostEventCb_t&
getPostEventCb (); getPostEventCb ();
@ -94,8 +94,8 @@ namespace Kite {
inline void setMinimumWL ( double ); inline void setMinimumWL ( double );
inline void setRipupLimit ( unsigned int type, unsigned int ); inline void setRipupLimit ( unsigned int type, unsigned int );
inline void setRipupCost ( unsigned int ); inline void setRipupCost ( unsigned int );
inline void setHEdgeCapacityPercent ( float ); inline void setHTracksReservedLocal ( size_t );
inline void setVEdgeCapacityPercent ( float ); inline void setVTracksReservedLocal ( size_t );
void buildPowerRails (); void buildPowerRails ();
void protectRoutingPads (); void protectRoutingPads ();
void preProcess (); void preProcess ();
@ -153,8 +153,8 @@ namespace Kite {
inline bool KiteEngine::getToolSuccess () const { return _toolSuccess; } inline bool KiteEngine::getToolSuccess () const { return _toolSuccess; }
inline unsigned long KiteEngine::getEventsLimit () const { return _configuration->getEventsLimit(); } inline unsigned long KiteEngine::getEventsLimit () const { return _configuration->getEventsLimit(); }
inline unsigned int KiteEngine::getRipupCost () const { return _configuration->getRipupCost(); } inline unsigned int KiteEngine::getRipupCost () const { return _configuration->getRipupCost(); }
inline float KiteEngine::getHEdgeCapacityPercent () const { return _configuration->getHEdgeCapacityPercent(); } inline size_t KiteEngine::getHTracksReservedLocal () const { return _configuration->getHTracksReservedLocal(); }
inline float KiteEngine::getVEdgeCapacityPercent () const { return _configuration->getVEdgeCapacityPercent(); } inline size_t KiteEngine::getVTracksReservedLocal () const { return _configuration->getVTracksReservedLocal(); }
inline unsigned int KiteEngine::getRipupLimit ( unsigned int type ) const { return _configuration->getRipupLimit(type); } inline unsigned int KiteEngine::getRipupLimit ( unsigned int type ) const { return _configuration->getRipupLimit(type); }
inline NegociateWindow* KiteEngine::getNegociateWindow () { return _negociateWindow; } inline NegociateWindow* KiteEngine::getNegociateWindow () { return _negociateWindow; }
inline size_t KiteEngine::getRoutingPlanesSize () const { return _routingPlanes.size(); } inline size_t KiteEngine::getRoutingPlanesSize () const { return _routingPlanes.size(); }
@ -162,8 +162,8 @@ namespace Kite {
inline void KiteEngine::setEventLimit ( unsigned long limit ) { _configuration->setEventsLimit(limit); } inline void KiteEngine::setEventLimit ( unsigned long limit ) { _configuration->setEventsLimit(limit); }
inline void KiteEngine::setRipupLimit ( unsigned int type, unsigned int limit ) { _configuration->setRipupLimit(limit,type); } inline void KiteEngine::setRipupLimit ( unsigned int type, unsigned int limit ) { _configuration->setRipupLimit(limit,type); }
inline void KiteEngine::setRipupCost ( unsigned int cost ) { _configuration->setRipupCost(cost); } inline void KiteEngine::setRipupCost ( unsigned int cost ) { _configuration->setRipupCost(cost); }
inline void KiteEngine::setHEdgeCapacityPercent ( float percent ) { _configuration->setHEdgeCapacityPercent(percent); } inline void KiteEngine::setHTracksReservedLocal ( size_t reserved ) { _configuration->setHTracksReservedLocal(reserved); }
inline void KiteEngine::setVEdgeCapacityPercent ( float percent ) { _configuration->setVEdgeCapacityPercent(percent); } inline void KiteEngine::setVTracksReservedLocal ( size_t reserved ) { _configuration->setVTracksReservedLocal(reserved); }
inline void KiteEngine::setMinimumWL ( double minimum ) { _minimumWL = minimum; } inline void KiteEngine::setMinimumWL ( double minimum ) { _minimumWL = minimum; }
inline void KiteEngine::setPostEventCb ( Configuration::PostEventCb_t cb ) { _configuration->setPostEventCb(cb); } inline void KiteEngine::setPostEventCb ( Configuration::PostEventCb_t cb ) { _configuration->setPostEventCb(cb); }
inline void KiteEngine::printConfiguration () const { _configuration->print(getCell()); } inline void KiteEngine::printConfiguration () const { _configuration->print(getCell()); }

View File

@ -168,6 +168,10 @@ void Graph::_postCreate()
throw Error ("Graph::_postCreate(): cannot use another method than MatrixVertex"); throw Error ("Graph::_postCreate(): cannot use another method than MatrixVertex");
#endif #endif
} }
cout << Dots::asUInt (" - Global router H edges capacity" ,_lowerLeftVertex->getHEdgeOut()->getCapacity()) << endl;
cout << Dots::asUInt (" - Global router V edges capacity" ,_lowerLeftVertex->getVEdgeOut()->getCapacity()) << endl;
// #ifdef __USE_MATRIXVERTEX__ // #ifdef __USE_MATRIXVERTEX__
// _matrixVertex = MatrixVertex::create(this); // _matrixVertex = MatrixVertex::create(this);
// if ( _routingGrid ) { // if ( _routingGrid ) {
@ -514,13 +518,13 @@ Vertex* Graph::createVertex ( Point position, DbU::Unit halfWidth, DbU::Unit hal
return vertex; return vertex;
} }
void Graph::createHEdge ( Vertex* from, Vertex* to, float ecp ) void Graph::createHEdge ( Vertex* from, Vertex* to, size_t reserved )
// ************************************************************** // ********************************************************************
{ {
unsigned int capacity = 0; size_t capacity = 0;
if ( _routingGrid ) { if ( _routingGrid ) {
capacity = _routingGrid->getHCapacity(); capacity = _routingGrid->getHCapacity();
//cerr << "createHEdge capacity:" << capacity << " ecp:" << ecp << endl; //cerr << "createHEdge capacity:" << capacity << " reserved:" << reserved << endl;
} else { } else {
vector<RoutingLayerGauge*> rtLGauges = _engine->getRoutingGauge()->getLayerGauges(); vector<RoutingLayerGauge*> rtLGauges = _engine->getRoutingGauge()->getLayerGauges();
for ( vector<RoutingLayerGauge*>::iterator it = rtLGauges.begin() ; it != rtLGauges.end() ; it++ ) { for ( vector<RoutingLayerGauge*>::iterator it = rtLGauges.begin() ; it != rtLGauges.end() ; it++ ) {
@ -533,9 +537,9 @@ Vertex* Graph::createVertex ( Point position, DbU::Unit halfWidth, DbU::Unit hal
capacity += routingLayerGauge->getTrackNumber ( from->getYMin(), from->getYMax() ) - 1; capacity += routingLayerGauge->getTrackNumber ( from->getYMin(), from->getYMax() ) - 1;
} }
//cerr << "createHEdge capacity:" << capacity << " ecp:" << ecp << endl; //cerr << "createHEdge capacity:" << capacity << " reserved:" << reserved << endl;
} }
Edge* newEdge = HEdge::create ( from, to, (unsigned)((float)(capacity)*ecp) ); Edge* newEdge = HEdge::create ( from, to, capacity-reserved );
_all_edges.push_back ( newEdge ); _all_edges.push_back ( newEdge );
@ -552,10 +556,10 @@ Vertex* Graph::createVertex ( Point position, DbU::Unit halfWidth, DbU::Unit hal
to->setHEdgeIn ( newEdge ); to->setHEdgeIn ( newEdge );
} }
void Graph::createVEdge ( Vertex* from, Vertex* to, float ecp ) void Graph::createVEdge ( Vertex* from, Vertex* to, size_t reserved )
// ************************************************************ // ******************************************************************
{ {
unsigned int capacity = 0; size_t capacity = 0;
if ( _routingGrid ) if ( _routingGrid )
capacity = _routingGrid->getVCapacity(); capacity = _routingGrid->getVCapacity();
else { else {
@ -570,9 +574,9 @@ void Graph::createVEdge ( Vertex* from, Vertex* to, float ecp )
capacity += routingLayerGauge->getTrackNumber ( from->getXMin(), from->getXMax() ) - 1; capacity += routingLayerGauge->getTrackNumber ( from->getXMin(), from->getXMax() ) - 1;
} }
//cerr << "createVEdge capacity:" << capacity << " ecp:" << ecp << endl; //cerr << "createVEdge capacity:" << capacity << " reserved:" << reserved << endl;
} }
Edge* newEdge = VEdge::create ( from, to, (unsigned)((float)(capacity)*ecp) ); Edge* newEdge = VEdge::create ( from, to, capacity-reserved );
_all_edges.push_back ( newEdge ); _all_edges.push_back ( newEdge );

View File

@ -1,7 +1,7 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2006-2014, All Rights Reserved // Copyright (c) UPMC 2006-2014, All Rights Reserved
// //
// x-----------------------------------------------------------------x // x-----------------------------------------------------------------x
// | C O R I O L I S | // | C O R I O L I S |
@ -63,9 +63,9 @@ namespace Knik {
extern bool __ripupMode__; extern bool __ripupMode__;
const Name KnikEngine::_toolName = "Knik::KnikEngine"; const Name KnikEngine::_toolName = "Knik::KnikEngine";
float KnikEngine::_edgeHCapacityPercent = 1.0; size_t KnikEngine::_hEdgeReservedLocal = 0;
float KnikEngine::_edgeVCapacityPercent = 1.0; size_t KnikEngine::_vEdgeReservedLocal = 0;
KnikEngine::KnikEngine ( Cell* cell KnikEngine::KnikEngine ( Cell* cell

View File

@ -171,8 +171,8 @@ Vertex* MatrixVertex::createRegularMatrix ()
// << " - latestTileHeight : " << _latestTileHeight << endl; // << " - latestTileHeight : " << _latestTileHeight << endl;
// On cree les vecteurs de vertex en meme temps que les vertex et aussi les edges ! // On cree les vecteurs de vertex en meme temps que les vertex et aussi les edges !
float hecp = KnikEngine::get( cell )->getHEdgeCapacityPercent(); size_t hreserved = KnikEngine::get( cell )->getHEdgeReservedLocal();
float vecp = KnikEngine::get( cell )->getVEdgeCapacityPercent(); size_t vreserved = KnikEngine::get( cell )->getVEdgeReservedLocal();
for ( unsigned j = 0 ; j < _nbYTiles ; j++ ) { for ( unsigned j = 0 ; j < _nbYTiles ; j++ ) {
vector<Vertex*> vect; vector<Vertex*> vect;
for ( unsigned i = 0 ; i < _nbXTiles ; i++ ) { for ( unsigned i = 0 ; i < _nbXTiles ; i++ ) {
@ -191,7 +191,7 @@ Vertex* MatrixVertex::createRegularMatrix ()
assert(from); assert(from);
Vertex* to = vect[i]; Vertex* to = vect[i];
assert(to); assert(to);
_routingGraph->createHEdge ( from, to, hecp ); _routingGraph->createHEdge ( from, to, hreserved );
} }
// si j > 0 alors on peut creer une edge verticale entre matrix[i][j-1] et matrix[i][j] c'est a dire _matrix[j-1][i] et vect[i] // si j > 0 alors on peut creer une edge verticale entre matrix[i][j-1] et matrix[i][j] c'est a dire _matrix[j-1][i] et vect[i]
if ( j > 0 ) { // _matrix est un vecteur de vecteur represantant les lignes -> _matrix[ligne][colonne] if ( j > 0 ) { // _matrix est un vecteur de vecteur represantant les lignes -> _matrix[ligne][colonne]
@ -199,7 +199,7 @@ Vertex* MatrixVertex::createRegularMatrix ()
assert(from); assert(from);
Vertex* to = vect[i]; Vertex* to = vect[i];
assert(to); assert(to);
_routingGraph->createVEdge ( from, to, vecp ); _routingGraph->createVEdge ( from, to, vreserved );
} }
} }
_matrix.push_back ( vect ); _matrix.push_back ( vect );

View File

@ -1,15 +1,9 @@
// -*- mode: C++; explicit-buffer-name: "Configuration.h<knik>" -*-
// -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved // Copyright (c) UPMC 2008-2014, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | Knik - Global Router | // | Knik - Global Router |
// | | // | |
@ -17,14 +11,11 @@
// | E-mail : Jean-Paul.Chaput@lip6.fr | // | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Header : "./Configuration.h" | // | C++ Header : "./Configuration.h" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#ifndef __KNIK_CONFIGURATION__ #ifndef KNIK_CONFIGURATION_H
#define __KNIK_CONFIGURATION__ #define KNIK_CONFIGURATION_H
namespace Hurricane { namespace Hurricane {
@ -71,7 +62,6 @@ namespace Knik {
inline const Layer* Configuration::_getGContact () const { return _gContact; } inline const Layer* Configuration::_getGContact () const { return _gContact; }
} // End of Knik namespace. } // Knik namespace.
#endif // KNIK_CONFIGURATION_H
#endif // __KNIK_CONFIGURATION__

View File

@ -144,8 +144,8 @@ namespace Knik {
void setNetStampConnexID ( Segment* segment, int connexID ); void setNetStampConnexID ( Segment* segment, int connexID );
public: public:
Vertex* createVertex ( Point position, DbU::Unit halfWidth, DbU::Unit halfHeight ); Vertex* createVertex ( Point position, DbU::Unit halfWidth, DbU::Unit halfHeight );
void createHEdge ( Vertex* from, Vertex* to, float ecp=1.0 ); void createHEdge ( Vertex* from, Vertex* to, size_t reserved=0 );
void createVEdge ( Vertex* from, Vertex* to, float ecp=1.0 ); void createVEdge ( Vertex* from, Vertex* to, size_t reserved=0 );
void resetVertexes () { _vertexes_to_route.clear(); }; void resetVertexes () { _vertexes_to_route.clear(); };
void setNetStamp ( unsigned netStamp ) { _netStamp = netStamp; }; void setNetStamp ( unsigned netStamp ) { _netStamp = netStamp; };
void incNetStamp () { _netStamp++; }; void incNetStamp () { _netStamp++; };

View File

@ -1,7 +1,7 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2006-2014, All Rights Reserved // Copyright (c) UPMC 2006-2014, All Rights Reserved
// //
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
// | C O R I O L I S | // | C O R I O L I S |
@ -120,8 +120,8 @@ typedef vector<NetRecord> NetVector;
// ********** // **********
private: private:
static const Name _toolName; static const Name _toolName;
static float _edgeHCapacityPercent; static size_t _hEdgeReservedLocal;
static float _edgeVCapacityPercent; static size_t _vEdgeReservedLocal;
RoutingGauge* _routingGauge; RoutingGauge* _routingGauge;
unsigned int _allowedDepth; unsigned int _allowedDepth;
Graph* _routingGraph; Graph* _routingGraph;
@ -160,8 +160,8 @@ typedef vector<NetRecord> NetVector;
// private: void createLimitedZone ( Net* net, set<Vertex*,VertexPositionComp> gcells, Box vertexCenterBoundingBox, unsigned netStamp ); // private: void createLimitedZone ( Net* net, set<Vertex*,VertexPositionComp> gcells, Box vertexCenterBoundingBox, unsigned netStamp );
string adaptString ( string s ); string adaptString ( string s );
public: public:
static void setHEdgeCapacityPercent ( float ecp ) { _edgeHCapacityPercent = ecp; }; static void setHEdgeReservedLocal ( size_t reserved ) { _hEdgeReservedLocal = reserved; };
static void setVEdgeCapacityPercent ( float ecp ) { _edgeVCapacityPercent = ecp; }; static void setVEdgeReservedLocal ( size_t reserved ) { _vEdgeReservedLocal = reserved; };
void setRoutingGauge ( RoutingGauge* ); void setRoutingGauge ( RoutingGauge* );
RoutingGauge* getRoutingGauge () const { return _routingGauge; } RoutingGauge* getRoutingGauge () const { return _routingGauge; }
void setAllowedDepth ( unsigned int ); void setAllowedDepth ( unsigned int );
@ -199,8 +199,8 @@ typedef vector<NetRecord> NetVector;
public: public:
static KnikEngine* get ( const Cell* ); static KnikEngine* get ( const Cell* );
static const Name& staticGetName () { return _toolName; }; static const Name& staticGetName () { return _toolName; };
static float getHEdgeCapacityPercent () { return _edgeHCapacityPercent; }; static float getHEdgeReservedLocal () { return _hEdgeReservedLocal; };
static float getVEdgeCapacityPercent () { return _edgeVCapacityPercent; }; static float getVEdgeReservedLocal () { return _vEdgeReservedLocal; };
const Name& getName () const { return _toolName; }; const Name& getName () const { return _toolName; };
void printTime (); void printTime ();
void computeOverflow (); void computeOverflow ();

View File

@ -104,8 +104,8 @@ if __name__ == '__main__':
parser.add_option( '-G', '--global-route' , action='store_true', dest='globalRoute' , help='Run the global router (Knik).') parser.add_option( '-G', '--global-route' , action='store_true', dest='globalRoute' , help='Run the global router (Knik).')
parser.add_option( '-g', '--load-global' , action='store_true', dest='loadGlobal' , help='Reload a global routing from disk.') parser.add_option( '-g', '--load-global' , action='store_true', dest='loadGlobal' , help='Reload a global routing from disk.')
parser.add_option( '--save-global' , action='store_true', dest='saveGlobal' , help='Save the global routing solution.') parser.add_option( '--save-global' , action='store_true', dest='saveGlobal' , help='Save the global routing solution.')
parser.add_option( '--h-edge' , type='float' , dest='hEdgeCapacity' , help='The horizontal egde density ratio applied on global router\'s edges.') parser.add_option( '--htracks-local' , type='int' , dest='hTracksLocal' , help='The amount of horizontal tracks reserved for the GCell local routing.')
parser.add_option( '--v-edge' , type='float' , dest='vEdgeCapacity' , help='The vertical egde density ratio applied on global router\'s edges.') parser.add_option( '--vtracks-local' , type='int' , dest='vTracksLocal' , help='The amount of vertical tracks reserved for the GCell local routing .')
parser.add_option( '--events-limit' , type='int' , dest='eventsLimit' , help='The maximum number of iterations (events) that the router is allowed to perform.') parser.add_option( '--events-limit' , type='int' , dest='eventsLimit' , help='The maximum number of iterations (events) that the router is allowed to perform.')
parser.add_option( '-R', '--detail-route' , action='store_true', dest='detailRoute' , help='Run the detailed router (Kite).') parser.add_option( '-R', '--detail-route' , action='store_true', dest='detailRoute' , help='Run the detailed router (Kite).')
parser.add_option( '-M', '--dump-measures' , action='store_true', dest='dumpMeasures' , help='Dump some statistical measurements on the disk.') parser.add_option( '-M', '--dump-measures' , action='store_true', dest='dumpMeasures' , help='Dump some statistical measurements on the disk.')
@ -129,9 +129,9 @@ if __name__ == '__main__':
if options.showConf: Cfg.getParamBool ('misc.showConf' ).setBool(True) if options.showConf: Cfg.getParamBool ('misc.showConf' ).setBool(True)
if options.margin: Cfg.getParamPercentage('nimbus.spaceMargin').setPercentage(options.margin) if options.margin: Cfg.getParamPercentage('nimbus.spaceMargin').setPercentage(options.margin)
if options.minPSize: Cfg.getParamInt ('metis.numberOfInstancesStopCriterion').setInt(options.minPSize) if options.minPSize: Cfg.getParamInt ('metis.numberOfInstancesStopCriterion').setInt(options.minPSize)
if options.hEdgeCapacity: Cfg.getParamPercentage('kite.hEdgeCapacity').setPercentage(options.hEdgeCapacity) if options.hTracksLocal: Cfg.getParamInt ('kite.hTracksReservedLocal').setInt(options.hTracksLocal)
if options.vEdgeCapacity: Cfg.getParamPercentage('kite.vEdgeCapacity').setPercentage(options.vEdgeCapacity) if options.vTracksLocal: Cfg.getParamInt ('kite.vTracksReservedLocal').setInt(options.vTracksLocal)
if options.eventsLimit: Cfg.getParamInt ('kite.eventsLimit' ).setInt(options.eventsLimit) if options.eventsLimit: Cfg.getParamInt ('kite.eventsLimit' ).setInt(options.eventsLimit)
if options.topRoutingLayer: Cfg.getParamString ('katabatic.topRoutingLayer').setString(options.topRoutingLayer) if options.topRoutingLayer: Cfg.getParamString ('katabatic.topRoutingLayer').setString(options.topRoutingLayer)
quadPlace = options.quadPlace quadPlace = options.quadPlace