Taking into account the configuration flag + wipeout routing function

This commit is contained in:
Gabriel Gouvine 2015-04-23 16:14:06 +02:00
parent 524b27451e
commit bded70971e
6 changed files with 67 additions and 41 deletions

View File

@ -56,7 +56,8 @@ namespace Etesian {
: _cg ( NULL ) : _cg ( NULL )
, _placeEffort ( static_cast<Effort> (Cfg::getParamEnumerate ("etesian.effort" , Standard )->asInt()) ) , _placeEffort ( static_cast<Effort> (Cfg::getParamEnumerate ("etesian.effort" , Standard )->asInt()) )
, _updateConf ( static_cast<GraphicUpdate> (Cfg::getParamEnumerate ("etesian.graphics" , LowerBound )->asInt()) ) , _updateConf ( static_cast<GraphicUpdate> (Cfg::getParamEnumerate ("etesian.graphics" , LowerBound )->asInt()) )
, _spreadingConf( Cfg::getParamBool ("etesian.uniformDensity", false )->asBool()?ForceUniform:MaxDensity ) , _spreadingConf( Cfg::getParamBool ("etesian.uniformDensity", false )->asBool()? ForceUniform : MaxDensity )
, _routingDriven( Cfg::getParamBool ("etesian.routingDriven", false )->asBool())
, _spaceMargin ( Cfg::getParamPercentage("etesian.spaceMargin" , 5.0)->asDouble() ) , _spaceMargin ( Cfg::getParamPercentage("etesian.spaceMargin" , 5.0)->asDouble() )
, _aspectRatio ( Cfg::getParamPercentage("etesian.aspectRatio" ,100.0)->asDouble() ) , _aspectRatio ( Cfg::getParamPercentage("etesian.aspectRatio" ,100.0)->asDouble() )
{ {
@ -95,6 +96,7 @@ namespace Etesian {
cout << Dots::asInt (" - Place Effort" ,_placeEffort ) << endl; cout << Dots::asInt (" - Place Effort" ,_placeEffort ) << endl;
cout << Dots::asInt (" - Update Conf" ,_updateConf ) << endl; cout << Dots::asInt (" - Update Conf" ,_updateConf ) << endl;
cout << Dots::asInt (" - Spreading Conf",_spreadingConf) << endl; cout << Dots::asInt (" - Spreading Conf",_spreadingConf) << endl;
cout << Dots::asBool (" - Routing driven",_routingDriven) << endl;
cout << Dots::asPercentage(" - Space Margin" ,_spaceMargin ) << endl; cout << Dots::asPercentage(" - Space Margin" ,_spaceMargin ) << endl;
cout << Dots::asPercentage(" - Aspect Ratio" ,_aspectRatio ) << endl; cout << Dots::asPercentage(" - Aspect Ratio" ,_aspectRatio ) << endl;
} }

View File

@ -811,6 +811,7 @@ namespace Etesian {
Effort placementEffort = getPlaceEffort(); Effort placementEffort = getPlaceEffort();
GraphicUpdate placementUpdate = getUpdateConf(); GraphicUpdate placementUpdate = getUpdateConf();
Density densityConf = getSpreadingConf(); Density densityConf = getSpreadingConf();
bool routingDriven = getRoutingDriven();
startMeasures(); startMeasures();
double sliceHeight = getSliceHeight() / getPitch(); double sliceHeight = getSliceHeight() / getPitch();
@ -872,47 +873,29 @@ namespace Etesian {
cmess1 << " o Detailed Placement." << endl; cmess1 << " o Detailed Placement." << endl;
detailedPlace(detailedIterations, detailedEffort, detailedOptions); detailedPlace(detailedIterations, detailedEffort, detailedOptions);
using namespace Kite; if(routingDriven){
KiteEngine* kiteE = KiteEngine::create(_cell); bool success = false;
kiteE->runGlobalRouter(0); int routingDrivenIteration = 0;
kiteE->loadGlobalRouting(Katabatic::EngineLoadGrByNet); using namespace Kite;
kiteE->balanceGlobalDensity(); while(true){
kiteE->layerAssign(Katabatic::EngineNoNetLayerAssign); cmess2 << "Routing-driven placement iteration " << routingDrivenIteration << endl;
kiteE->runNegociate(); KiteEngine* kiteE = KiteEngine::create(_cell);
feedRoutingBack(); kiteE->runGlobalRouter(0);
kiteE->destroy(); kiteE->loadGlobalRouting(Katabatic::EngineLoadGrByNet);
kiteE->balanceGlobalDensity();
UpdateSession::open(); kiteE->layerAssign(Katabatic::EngineNoNetLayerAssign);
forEach(Net*, inet, _cell->getNets()){ kiteE->runNegociate();
if(NetRoutingExtension::isManualGlobalRoute(*inet)) success = kiteE->getToolSuccess();
continue; feedRoutingBack();
// First pass: destroy the contacts kiteE->destroy();
std::vector<Contact*> contactPointers; KiteEngine::wipeOutRouting(_cell);
forEach(Component*, icom, (*inet)->getComponents()){ if(success){
Contact * contact = dynamic_cast<Contact*>(*icom); cmess2 << "The design is routable; exiting" << endl;
if(contact){ break;
contactPointers.push_back(contact); }
detailedPlace(detailedIterations, detailedEffort, detailedOptions);
} }
}
for(Contact* contact : contactPointers)
contact->destroy();
// Second pass: destroy unconnected segments added by Knik as blockages
std::vector<Component*> compPointers;
forEach(Component*, icom, (*inet)->getComponents()){
Horizontal * h = dynamic_cast<Horizontal*>(*icom);
if(h){
compPointers.push_back(h);
}
Vertical * v = dynamic_cast<Vertical*>(*icom);
if(v){
compPointers.push_back(v);
}
}
for(Component* comp : compPointers)
comp->destroy();
} }
UpdateSession::close();
detailedPlace(detailedIterations, detailedEffort, detailedOptions);
cmess2 << " o Adding feed cells." << endl; cmess2 << " o Adding feed cells." << endl;
addFeeds(); addFeeds();

View File

@ -66,6 +66,7 @@ namespace Etesian {
inline Effort getPlaceEffort () const; inline Effort getPlaceEffort () const;
inline GraphicUpdate getUpdateConf () const; inline GraphicUpdate getUpdateConf () const;
inline Density getSpreadingConf () const; inline Density getSpreadingConf () const;
inline bool getRoutingDriven () const;
inline double getSpaceMargin () const; inline double getSpaceMargin () const;
inline double getAspectRatio () const; inline double getAspectRatio () const;
void print ( Cell* ) const; void print ( Cell* ) const;
@ -78,6 +79,7 @@ namespace Etesian {
Effort _placeEffort; Effort _placeEffort;
GraphicUpdate _updateConf; GraphicUpdate _updateConf;
Density _spreadingConf; Density _spreadingConf;
bool _routingDriven;
double _spaceMargin; double _spaceMargin;
double _aspectRatio; double _aspectRatio;
private: private:
@ -90,6 +92,7 @@ namespace Etesian {
inline Effort Configuration::getPlaceEffort () const { return _placeEffort; } inline Effort Configuration::getPlaceEffort () const { return _placeEffort; }
inline GraphicUpdate Configuration::getUpdateConf () const { return _updateConf; } inline GraphicUpdate Configuration::getUpdateConf () const { return _updateConf; }
inline Density Configuration::getSpreadingConf () const { return _spreadingConf; } inline Density Configuration::getSpreadingConf () const { return _spreadingConf; }
inline bool Configuration::getRoutingDriven () const { return _routingDriven; }
inline double Configuration::getSpaceMargin () const { return _spaceMargin; } inline double Configuration::getSpaceMargin () const { return _spaceMargin; }
inline double Configuration::getAspectRatio () const { return _aspectRatio; } inline double Configuration::getAspectRatio () const { return _aspectRatio; }

View File

@ -65,6 +65,7 @@ namespace Etesian {
inline Effort getPlaceEffort () const; inline Effort getPlaceEffort () const;
inline GraphicUpdate getUpdateConf () const; inline GraphicUpdate getUpdateConf () const;
inline Density getSpreadingConf () const; inline Density getSpreadingConf () const;
inline bool getRoutingDriven () const;
inline double getSpaceMargin () const; inline double getSpaceMargin () const;
inline double getAspectRatio () const; inline double getAspectRatio () const;
inline const FeedCells& getFeedCells () const; inline const FeedCells& getFeedCells () const;
@ -137,6 +138,7 @@ namespace Etesian {
inline Effort EtesianEngine::getPlaceEffort () const { return getConfiguration()->getPlaceEffort(); } inline Effort EtesianEngine::getPlaceEffort () const { return getConfiguration()->getPlaceEffort(); }
inline GraphicUpdate EtesianEngine::getUpdateConf () const { return getConfiguration()->getUpdateConf(); } inline GraphicUpdate EtesianEngine::getUpdateConf () const { return getConfiguration()->getUpdateConf(); }
inline Density EtesianEngine::getSpreadingConf () const { return getConfiguration()->getSpreadingConf(); } inline Density EtesianEngine::getSpreadingConf () const { return getConfiguration()->getSpreadingConf(); }
inline bool EtesianEngine::getRoutingDriven () const { return getConfiguration()->getRoutingDriven(); }
inline double EtesianEngine::getSpaceMargin () const { return getConfiguration()->getSpaceMargin(); } inline double EtesianEngine::getSpaceMargin () const { return getConfiguration()->getSpaceMargin(); }
inline double EtesianEngine::getAspectRatio () const { return getConfiguration()->getAspectRatio(); } inline double EtesianEngine::getAspectRatio () const { return getConfiguration()->getAspectRatio(); }
inline void EtesianEngine::useFeed ( Cell* cell ) { _feedCells.useFeed(cell); } inline void EtesianEngine::useFeed ( Cell* cell ) { _feedCells.useFeed(cell); }

View File

@ -20,6 +20,7 @@
#include <iomanip> #include <iomanip>
#include "vlsisapd/utilities/Path.h" #include "vlsisapd/utilities/Path.h"
#include "hurricane/DebugSession.h" #include "hurricane/DebugSession.h"
#include "hurricane/UpdateSession.h"
#include "hurricane/Bug.h" #include "hurricane/Bug.h"
#include "hurricane/Error.h" #include "hurricane/Error.h"
#include "hurricane/Warning.h" #include "hurricane/Warning.h"
@ -175,7 +176,6 @@ namespace Kite {
return kite; return kite;
} }
void KiteEngine::_preDestroy () void KiteEngine::_preDestroy ()
{ {
ltrace(90) << "KiteEngine::_preDestroy()" << endl; ltrace(90) << "KiteEngine::_preDestroy()" << endl;
@ -207,6 +207,41 @@ namespace Kite {
ltraceout(90); ltraceout(90);
} }
void KiteEngine::wipeOutRouting( Cell * cell ){
if(KiteEngine::get(cell) != NULL or KatabaticEngine::get(cell) != NULL)
throw Error("Trying to wipe out a routing with a routing engine\n");
using namespace Hurricane;
UpdateSession::open();
forEach(Net*, inet, cell->getNets()){
if(NetRoutingExtension::isManualGlobalRoute(*inet))
continue;
// First pass: destroy the contacts
std::vector<Contact*> contactPointers;
forEach(Component*, icom, (*inet)->getComponents()){
Contact * contact = dynamic_cast<Contact*>(*icom);
if(contact){
contactPointers.push_back(contact);
}
}
for(Contact* contact : contactPointers)
contact->destroy();
// Second pass: destroy unconnected segments added by Knik as blockages
std::vector<Component*> compPointers;
forEach(Component*, icom, (*inet)->getComponents()){
Horizontal * h = dynamic_cast<Horizontal*>(*icom);
if(h){
compPointers.push_back(h);
}
Vertical * v = dynamic_cast<Vertical*>(*icom);
if(v){
compPointers.push_back(v);
}
}
for(Component* comp : compPointers)
comp->destroy();
}
UpdateSession::close();
}
KiteEngine::~KiteEngine () KiteEngine::~KiteEngine ()
{ delete _configuration; } { delete _configuration; }

View File

@ -63,6 +63,7 @@ namespace Kite {
static const Name& staticGetName (); static const Name& staticGetName ();
static KiteEngine* create ( Cell* ); static KiteEngine* create ( Cell* );
static KiteEngine* get ( const Cell* ); static KiteEngine* get ( const Cell* );
static void wipeOutRouting ( Cell* );
public: public:
inline bool useClockTree () const; inline bool useClockTree () const;
inline CellViewer* getViewer () const; inline CellViewer* getViewer () const;