Taking into account the configuration flag + wipeout routing function
This commit is contained in:
parent
524b27451e
commit
bded70971e
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
||||||
|
|
|
@ -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); }
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue