coriolis/deprecated/mauka/src/GraphicMaukaEngine.cpp

317 lines
9.1 KiB
C++

// -*- 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 <QAction>
#include <QMenu>
#include <QMenuBar>
#include <QApplication>
#include <hurricane/Warning.h>
#include <hurricane/Error.h>
#include <hurricane/Breakpoint.h>
#include <hurricane/DebugSession.h>
#include <hurricane/Go.h>
#include <hurricane/Net.h>
#include <hurricane/Cell.h>
#include <hurricane/UpdateSession.h>
#include <hurricane/viewer/Graphics.h>
#include <hurricane/viewer/CellWidget.h>
#include <hurricane/viewer/CellViewer.h>
#include <hurricane/viewer/ControllerWidget.h>
#include <hurricane/viewer/ExceptionWidget.h>
#include <crlcore/Utilities.h>
#include <crlcore/ToolBox.h>
#include <crlcore/AllianceFramework.h>
#include <nimbus/NimbusEngine.h>
#include <metis/MetisEngine.h>
#include <mauka/Container.h>
#include <mauka/GraphicMaukaEngine.h>
//#include <mauka/ConfigurationWidget.h>
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<const Container*>(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 <b>Mauka</b> placer"
, std::bind(&GraphicMaukaEngine::_place,this)
);
_viewer->addToMenu( "placeAndRoute.stepByStep.quadriPartition"
, "Mauka - &QuadriPartition"
, "Run the <b>hMETIS</b> quadri-partitioner"
, std::bind(&GraphicMaukaEngine::_doQuadriPart,this)
);
_viewer->addToMenu( "placeAndRoute.stepByStep.simulatedAnnealing"
, "Mauka - &Simulated Annealing"
, "Run the <b>Mauka</b> 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 ( "<b>Mauka:</b> GraphicMaukaEngine not bound to any Viewer." );
return NULL;
}
if ( _viewer->getCell() == NULL ) {
throw Error ( "<b>Mauka:</b> 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.