coriolis/katana/src/Configuration.cpp

259 lines
12 KiB
C++

// -*- mode: C++; explicit-buffer-name: "Configuration.cpp<katana>" -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC 2008-2018, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== |
// | C++ Module : "./Configuration.cpp" |
// +-----------------------------------------------------------------+
#include <string>
#include "hurricane/configuration/Configuration.h"
#include "hurricane/Cell.h"
#include "crlcore/Utilities.h"
#include "katana/Configuration.h"
#include "katana/KatanaEngine.h"
namespace Katana {
using std::cout;
using std::cerr;
using std::endl;
using std::ostringstream;
using Hurricane::tab;
using Hurricane::Error;
using Hurricane::Technology;
// -------------------------------------------------------------------
// Class : "Katana::Configuration".
Configuration::Configuration ()
: Anabatic::Configuration()
, _postEventCb ()
, _searchHalo (Cfg::getParamInt ("katana.searchHalo" , 1)->asInt())
, _longWireUpThreshold1(Cfg::getParamInt ("katana.longWireUpThreshold1" , 60)->asInt())
, _longWireUpReserve1 (Cfg::getParamDouble("katana.longWireUpReserve1" , 1.0)->asDouble())
, _hTracksReservedLocal(Cfg::getParamInt ("katana.hTracksReservedLocal" , 3)->asInt())
, _vTracksReservedLocal(Cfg::getParamInt ("katana.vTracksReservedLocal" , 3)->asInt())
, _termSatReservedLocal(Cfg::getParamInt ("katana.termSatReservedLocal" , 9)->asInt())
, _hTracksReservedMin (Cfg::getParamInt ("katana.hTracksReservedMin" , 1)->asInt())
, _vTracksReservedMin (Cfg::getParamInt ("katana.vTracksReservedMin" , 1)->asInt())
, _termSatThreshold (Cfg::getParamInt ("katana.termSatThreshold" , 8)->asInt())
, _ripupLimits ()
, _ripupCost (Cfg::getParamInt ("katana.ripupCost" , 3)->asInt())
, _eventsLimit (Cfg::getParamInt ("katana.eventsLimit" ,4000000)->asInt())
, _bloatOverloadAdd (Cfg::getParamInt ("katana.bloatOverloadAdd" , 4)->asInt())
, _trackFill (Cfg::getParamInt ("katana.trackFill" , 0)->asInt())
, _flags (0)
, _profileEventCosts (Cfg::getParamBool ("katana.profileEventCosts" ,false )->asBool())
, _runRealignStage (Cfg::getParamBool ("katana.runRealignStage" ,true )->asBool())
, _disableStackedVias (Cfg::getParamBool ("katana.disableStackedVias" ,false )->asBool())
{
_ripupLimits[StrapRipupLimit] = Cfg::getParamInt("katana.strapRipupLimit" ,16)->asInt();
_ripupLimits[LocalRipupLimit] = Cfg::getParamInt("katana.localRipupLimit" , 7)->asInt();
_ripupLimits[GlobalRipupLimit] = Cfg::getParamInt("katana.globalRipupLimit" , 5)->asInt();
_ripupLimits[LongGlobalRipupLimit] = Cfg::getParamInt("katana.longGlobalRipupLimit" , 5)->asInt();
_ripupLimits[ShortNetRipupLimit] = Cfg::getParamInt("katana.shortNetRipupLimit" ,16)->asInt();
if (Cfg::getParamBool("katana.useGlobalEstimate" ,false)->asBool()) _flags |= UseGlobalEstimate;
if (Cfg::getParamBool("katana.useStaticBloatProfile",true )->asBool()) _flags |= UseStaticBloatProfile;
// for ( size_t i=0 ; i<MaxMetalDepth ; ++i ) {
// ostringstream paramName;
// paramName << "katana.metal" << (i+1) << "MinBreak";
// int threshold = 29*50;
// switch ( i ) {
// case 0:
// case 1:
// threshold = 2*50;
// break;
// default:
// threshold = 30*50;
// break;
// }
// Cfg::getParamDouble(paramName.str())->setDouble(threshold);
// _globalMinBreaks[i] = DbU::lambda (Cfg::getParamDouble(paramName.str())->asDouble());
// }
}
Configuration::Configuration ( const Configuration& other )
: Anabatic::Configuration(*other.base())
, _postEventCb (other._postEventCb)
, _searchHalo (other._searchHalo)
, _longWireUpThreshold1(other._longWireUpThreshold1)
, _longWireUpReserve1 (other._longWireUpReserve1)
, _hTracksReservedLocal(other._hTracksReservedLocal)
, _vTracksReservedLocal(other._vTracksReservedLocal)
, _termSatReservedLocal(other._termSatReservedLocal)
, _hTracksReservedMin (other._hTracksReservedMin)
, _vTracksReservedMin (other._vTracksReservedMin)
, _termSatThreshold (other._termSatThreshold)
, _ripupLimits ()
, _ripupCost (other._ripupCost)
, _eventsLimit (other._eventsLimit)
, _bloatOverloadAdd (other._bloatOverloadAdd)
, _trackFill (other._trackFill)
, _flags (other._flags)
, _profileEventCosts (other._profileEventCosts)
, _runRealignStage (other._runRealignStage)
, _disableStackedVias (other._disableStackedVias)
{
_ripupLimits[StrapRipupLimit] = other._ripupLimits[StrapRipupLimit];
_ripupLimits[LocalRipupLimit] = other._ripupLimits[LocalRipupLimit];
_ripupLimits[GlobalRipupLimit] = other._ripupLimits[GlobalRipupLimit];
_ripupLimits[LongGlobalRipupLimit] = other._ripupLimits[LongGlobalRipupLimit];
}
Configuration::~Configuration ()
{ }
Configuration* Configuration::clone () const
{ return new Configuration(*this); }
void Configuration::setRipupLimit ( uint32_t type, uint32_t limit )
{
if ( type >= RipupLimitsTableSize ) {
cerr << Error("setRipupLimit(): Bad ripup limit index: %ud (> %ud)."
,type,RipupLimitsTableSize) << endl;
return;
}
_ripupLimits [ type ] = limit;
}
void Configuration::setHTracksReservedLocal ( uint32_t reserved )
{
// if (reserved > getHEdgeCapacity())
// throw Error( "Configuration::setHTracksReservedLocal(): tracks reserved for local routing (%d) is greater than edge capacity %d."
// , reserved, getHEdgeCapacity() );
_hTracksReservedLocal = reserved;
}
void Configuration::setVTracksReservedLocal ( uint32_t reserved )
{
// if (reserved > 1.0)
// throw Error( "Configuration::setVTracksReservedLocal(): tracks reserved for local routing (%d) is greater than edge capacity %d."
// , reserved, getVEdgeCapacity() );
_vTracksReservedLocal = reserved;
}
void Configuration::setHTracksReservedMin ( uint32_t reserved )
{ _hTracksReservedMin = reserved; }
void Configuration::setVTracksReservedMin ( uint32_t reserved )
{ _vTracksReservedMin = reserved; }
uint32_t Configuration::getRipupLimit ( uint32_t type ) const
{
if ( type >= RipupLimitsTableSize ) {
cerr << Error("getRipupLimit(): Bad ripup limit index: %u (> %u)."
,type,RipupLimitsTableSize) << endl;
return 0;
}
return _ripupLimits[type];
}
void Configuration::print ( Cell* cell ) const
{
if (not cmess1.enabled()) return;
cout << " o Configuration of ToolEngine<Katana> for Cell <" << cell->getName() << ">" << endl;
cout << Dots::asString(" - Net builder style" ,getNetBuilderStyle()) << endl;
cout << Dots::asString(" - Routing style" ,getRoutingStyle().asString()) << endl;
cout << Dots::asUInt (" - Dijkstra GR search halo" ,getSearchHalo()) << endl;
cout << Dots::asBool (" - Use GR density estimate" ,useGlobalEstimate()) << endl;
cout << Dots::asBool (" - Use static bloat profile" ,useStaticBloatProfile()) << endl;
cout << Dots::asInt (" - GCell terminal(RP) saturate number" ,getSaturateRp()) << endl;
cout << Dots::asDouble(" - GCell saturate ratio (LA)" ,getSaturateRatio()) << endl;
cout << Dots::asUInt (" - Long wire threshold1 for move up" ,_longWireUpThreshold1) << endl;
cout << Dots::asDouble(" - Long wire reserved1 for move up" ,_longWireUpReserve1) << endl;
cout << Dots::asUInt (" - Edge min H reserved local" ,_hTracksReservedMin) << endl;
cout << Dots::asUInt (" - Edge min V reserved local" ,_vTracksReservedMin) << endl;
cout << Dots::asUInt (" - Edge max H reserved local" ,_hTracksReservedLocal) << endl;
cout << Dots::asUInt (" - Edge max V reserved local" ,_vTracksReservedLocal) << endl;
cout << Dots::asUInt (" - Terminal saturated edge capacity" ,_termSatReservedLocal) << endl;
cout << Dots::asUInt (" - Terminal saturated GCell threshold" ,_termSatThreshold) << endl;
cout << Dots::asULong (" - Events limit (iterations)" ,_eventsLimit) << endl;
cout << Dots::asUInt (" - Ripup limit, straps & unbreakables" ,_ripupLimits[StrapRipupLimit]) << endl;
cout << Dots::asUInt (" - Ripup limit, locals" ,_ripupLimits[LocalRipupLimit]) << endl;
cout << Dots::asUInt (" - Ripup limit, globals" ,_ripupLimits[GlobalRipupLimit]) << endl;
cout << Dots::asUInt (" - Ripup limit, long globals" ,_ripupLimits[LongGlobalRipupLimit]) << endl;
cout << Dots::asUInt (" - Bloat overload additional penalty" ,_bloatOverloadAdd) << endl;
cout << Dots::asUInt (" - Fill every nth track" ,_trackFill) << endl;
Super::print( cell );
}
string Configuration::_getTypeName () const
{ return "Configuration"; }
string Configuration::_getString () const
{
ostringstream os;
os << "<" << _getTypeName() << " " << getRoutingGauge()->getName() << ">";
return os.str();
}
Record* Configuration::_getRecord () const
{
Record* record = Super::_getRecord();
if ( record ) {
record->add ( getSlot("_searchHalo" ,_searchHalo ) );
record->add ( getSlot("_longWireUpThreshold1" ,_longWireUpThreshold1 ) );
record->add ( getSlot("_longWireUpReserved1" ,_longWireUpReserve1 ) );
record->add ( getSlot("_hTracksReservedLocal" ,_hTracksReservedLocal ) );
record->add ( getSlot("_vTracksReservedLocal" ,_vTracksReservedLocal ) );
record->add ( getSlot("_hTracksReservedMin" ,_hTracksReservedMin ) );
record->add ( getSlot("_vTracksReservedMin" ,_vTracksReservedMin ) );
record->add ( getSlot("_ripupCost" ,_ripupCost ) );
record->add ( getSlot("_eventsLimit" ,_eventsLimit ) );
record->add ( getSlot("_ripupLimits[StrapRipupLimit]" ,_ripupLimits[StrapRipupLimit] ) );
record->add ( getSlot("_ripupLimits[LocalRipupLimit]" ,_ripupLimits[LocalRipupLimit] ) );
record->add ( getSlot("_ripupLimits[GlobalRipupLimit]" ,_ripupLimits[GlobalRipupLimit] ) );
record->add ( getSlot("_ripupLimits[LongGlobalRipupLimit]" ,_ripupLimits[LongGlobalRipupLimit]) );
// for ( size_t i=0 ; i<MaxMetalDepth ; ++i ) {
// ostringstream paramName;
// paramName << "metal" << (i+1) << "MinBreak";
// record->add ( DbU::getValueSlot(paramName.str(),&_globalMinBreaks[i]) );
// }
}
return record;
}
} // Katana namespace.