// -*- C++ -*- // // This file is part of the Coriolis Software. // Copyright (c) UPMC/LIP6 2008-2018, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | // | M a u k a - P l a c e r | // | | // | Author : Jean-Paul Chaput | // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Header : "./GraphicMaukaEngine.cpp" | // +-----------------------------------------------------------------+ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include namespace Mauka { using namespace std; using Hurricane::Error; using Hurricane::Warning; using Hurricane::Breakpoint; using Hurricane::DebugSession; using Hurricane::UpdateSession; using Hurricane::Net; using Hurricane::Graphics; using Hurricane::ColorScale; using Hurricane::ControllerWidget; using Hurricane::ExceptionWidget; using CRL::Catalog; using CRL::getInstancesCount; using CRL::AllianceFramework; using Nimbus::NimbusEngine; using Metis::MetisEngine; size_t GraphicMaukaEngine::_references = 0; GraphicMaukaEngine* GraphicMaukaEngine::_singleton = NULL; void GraphicMaukaEngine::initMaukaContainer ( CellWidget* widget ) { widget->getDrawingPlanes().setPen ( Graphics::getPen ("mauka.container",widget->getDarkening()) ); widget->getDrawingPlanes().setBrush ( Graphics::getBrush("mauka.container",widget->getDarkening()) ); } void GraphicMaukaEngine::drawMaukaContainer ( CellWidget* widget , const Go* go , const BasicLayer* basicLayer , const Box& box , const Transformation& transformation ) { const Container* container = static_cast(go); QPainter& painter = widget->getPainter(); painter.drawRect ( widget->dbuToDisplayRect(container->getBoundingBox()) ); } void GraphicMaukaEngine::refreshViewer () { //static unsigned int count = 0; //if ( not (count++ % 500) ) { //UpdateSession::close (); _viewer->getCellWidget()->fitToContents (); _viewer->getCellWidget()->refresh (); QApplication::processEvents (); //UpdateSession::open (); // if ( _viewer->isToolInterrupted() ) { // KiteEngine* kite = KiteEngine::get ( getCell() ); // if ( kite ) kite->setInterrupt ( true ); // _viewer->clearToolInterrupt (); // } //} } MaukaEngine* GraphicMaukaEngine::createEngine () { Cell* cell = getCell (); MaukaEngine* mauka = MaukaEngine::get ( cell ); if ( mauka == NULL ) { NimbusEngine* nimbus = NimbusEngine::get ( cell ); if ( nimbus == NULL ) NimbusEngine::create ( cell ); mauka = MaukaEngine::create ( cell ); if ( cmess1.enabled() ) mauka->getConfiguration()->print( cell ); } else cerr << Warning("%s already has a Mauka engine.",getString(cell).c_str()) << endl; return mauka; } MaukaEngine* GraphicMaukaEngine::getForFramework ( unsigned int flags ) { MaukaEngine* mauka = MaukaEngine::get( getCell() ); if (mauka) return mauka; if (flags & CreateEngine) { mauka = createEngine(); if (not mauka) throw Error( "Failed to create Mauka engine on %s.", getString(getCell()).c_str() ); } else { throw Error( "MaukaEngine not created yet, out of sequence action." ); } return mauka; } void GraphicMaukaEngine::_doQuadriPart () { if ( not MetisEngine::isHMetisCapable() ) { cerr << Warning("Mauka has not been compiled againts hMETIS.\n" " Quadri-partition step is disabled, simulated annealing may be *very* long." ) << endl; return; } Cell* cell = getCell(); NimbusEngine* nimbus = NimbusEngine::get( cell ); if (nimbus == NULL) { nimbus = NimbusEngine::create( cell ); if (cmess1.enabled()) nimbus->getConfiguration()->print( cell ); } MetisEngine* metis = MetisEngine::get( cell ); if (metis == NULL) { metis = MetisEngine ::create( cell ); if (getInstancesCount(cell) < metis->getNumberOfInstancesStopCriterion()*4) return; if (cmess1.enabled()) metis->getConfiguration()->print( cell ); } metis->setRefreshCb( std::bind(&GraphicMaukaEngine::refreshViewer,this) ); MetisEngine::doQuadriPart( cell ); MaukaEngine* mauka = MaukaEngine::get( cell ); if (mauka != NULL) throw Warning("GraphicMaukaEngine::doQuadriPart(): Placement already done on <%s>" ,getString(cell->getName()).c_str()); mauka = createEngine(); MaukaEngine::regroupOverloadedGCells( cell ); _viewer->clearToolInterrupt(); _viewer->getCellWidget()->fitToContents(); //_viewer->redrawCellWidget(); } void GraphicMaukaEngine::_doSimulatedAnnealing () { MaukaEngine* mauka = getForFramework( CreateEngine ); mauka->setRefreshCb ( std::bind(&GraphicMaukaEngine::refreshViewer,this) ); _viewer->clearToolInterrupt (); _viewer->getCellWidget()->fitToContents (); mauka->Run (); //_viewer->redrawCellWidget(); } void GraphicMaukaEngine::_place () { if (MetisEngine::isHMetisCapable()) { _doQuadriPart(); } else { cerr << Warning("Mauka has not been compiled againts hMETIS.\n" " Quadri-partition step is disabled, simulated annealing may be *very* long." ) << endl; } _doSimulatedAnnealing(); _save(); } void GraphicMaukaEngine::_save () { MaukaEngine* mauka = getForFramework( NoFlags ); _viewer->clearToolInterrupt (); //_viewer->redrawCellWidget(); mauka->Save (); } void GraphicMaukaEngine::addToMenu ( CellViewer* viewer ) { assert( _viewer == NULL ); _viewer = viewer; if (_viewer->hasMenuAction("placeAndRoute.maukaPlace")) { cerr << Warning( "GraphicMaukaEngine::addToMenu() - Mauka placer already hooked in." ) << endl; return; } _viewer->addToMenu( "placeAndRoute.maukaPlace" , "Mauka - &Place" , "Run the Mauka placer" , std::bind(&GraphicMaukaEngine::_place,this) ); _viewer->addToMenu( "placeAndRoute.stepByStep.quadriPartition" , "Mauka - &QuadriPartition" , "Run the hMETIS quadri-partitioner" , std::bind(&GraphicMaukaEngine::_doQuadriPart,this) ); _viewer->addToMenu( "placeAndRoute.stepByStep.simulatedAnnealing" , "Mauka - &Simulated Annealing" , "Run the Mauka simulated annealing detailed placer" , std::bind(&GraphicMaukaEngine::_doSimulatedAnnealing,this) ); } const Name& GraphicMaukaEngine::getName () const { return MaukaEngine::staticGetName (); } Cell* GraphicMaukaEngine::getCell () { if ( _viewer == NULL ) { throw Error ( "Mauka: GraphicMaukaEngine not bound to any Viewer." ); return NULL; } if ( _viewer->getCell() == NULL ) { throw Error ( "Mauka: No Cell is loaded into the Viewer." ); return NULL; } return _viewer->getCell(); } GraphicMaukaEngine* GraphicMaukaEngine::grab () { if ( not _references ) { _singleton = new GraphicMaukaEngine (); } _references++; return _singleton; } size_t GraphicMaukaEngine::release () { _references--; if ( not _references ) { delete _singleton; _singleton = NULL; } return _references; } GraphicMaukaEngine::GraphicMaukaEngine () : GraphicTool() , _viewer (NULL) { addDrawGo ( "Mauka::Container", initMaukaContainer, drawMaukaContainer ); addDrawGo ( "Mauka::Bin" , initMaukaContainer, drawMaukaContainer ); } GraphicMaukaEngine::~GraphicMaukaEngine () { } } // End of Mauka namespace.