// -*- C++ -*- // // This file is part of the Coriolis Software. // Copyright (c) UPMC 2016-2016, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | // | A n a b a t i c - Global Routing Toolbox | // | | // | Author : Jean-Paul Chaput | // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "GraphicAnabaticEngine.cpp" | // +-----------------------------------------------------------------+ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "anabatic/GCell.h" #include "anabatic/GraphicAnabaticEngine.h" namespace Anabatic { using namespace std; using Hurricane::Error; using Hurricane::Warning; using Hurricane::Exception; using Hurricane::Breakpoint; using Hurricane::DebugSession; using Hurricane::Point; using Hurricane::Entity; using Hurricane::Net; using Hurricane::Graphics; using Hurricane::ColorScale; using Hurricane::DisplayStyle; using Hurricane::ControllerWidget; using Hurricane::ExceptionWidget; using CRL::Catalog; using CRL::AllianceFramework; size_t GraphicAnabaticEngine::_references = 0; GraphicAnabaticEngine* GraphicAnabaticEngine::_singleton = NULL; void GraphicAnabaticEngine::initGCell ( CellWidget* widget ) { widget->getDrawingPlanes().setPen( Qt::NoPen ); } void GraphicAnabaticEngine::drawGCell ( CellWidget* widget , const Go* go , const BasicLayer* basicLayer , const Box& box , const Transformation& transformation ) { const GCell* gcell = static_cast(go); QPainter& painter = widget->getPainter(); painter.setPen ( Graphics::getPen ("gcell",widget->getDarkening()) ); painter.setBrush( Graphics::getBrush("gcell",widget->getDarkening()) ); painter.drawRect( widget->dbuToScreenRect(gcell->getBoundingBox()) ); } void GraphicAnabaticEngine::initEdge ( CellWidget* widget ) { widget->getDrawingPlanes().setPen( Qt::NoPen ); } void GraphicAnabaticEngine::drawEdge ( CellWidget* widget , const Go* go , const BasicLayer* basicLayer , const Box& box , const Transformation& transformation ) { const Edge* edge = static_cast(go); if (edge) { unsigned int occupancy = 255; if (edge->getRealOccupancy() < edge->getCapacity()) occupancy = (unsigned int)( 255.0 * ( (float)edge->getRealOccupancy() / (float)edge->getCapacity() ) ); QPainter& painter = widget->getPainter(); if (edge->getRealOccupancy() > edge->getCapacity()) { QColor color ( Qt::cyan ); painter.setPen( DisplayStyle::darken(color,widget->getDarkening()) ); } QBrush brush = QBrush( Qt::white, Qt::DiagCrossPattern ); if (edge->getCapacity() > 0.0) brush = Graphics::getColorScale( ColorScale::Fire ).getBrush( occupancy, widget->getDarkening() ); painter.setPen( Qt::NoPen ); painter.setBrush( brush ); painter.drawRect( widget->dbuToScreenRect(edge->getBoundingBox(), false) ); } } AnabaticEngine* GraphicAnabaticEngine::createEngine () { Cell* cell = getCell(); AnabaticEngine* engine = AnabaticEngine::get( cell ); if (not engine) { engine = AnabaticEngine::create( cell ); } else cerr << Warning( "%s already has a Anabatic engine.", getString(cell).c_str() ) << endl; return engine; } AnabaticEngine* GraphicAnabaticEngine::getForFramework ( unsigned int flags ) { // Currently, only one framework is avalaible: Alliance. AnabaticEngine* engine = AnabaticEngine::get( getCell() ); if (engine) return engine; if (flags & CreateEngine) { engine = createEngine(); if (not engine) throw Error( "Failed to create Anabatic engine on %s.", getString(getCell()).c_str() ); } else { throw Error( "AnabaticEngine not created yet, run the global router first." ); } return engine; } void GraphicAnabaticEngine::_runTest () { if (_viewer) _viewer->emitCellAboutToChange(); AnabaticEngine* engine = getForFramework( CreateEngine ); engine->getSouthWestGCell()->doGrid(); // GCell* row0 = getSouthWestGCell(); // DbU::Unit xcorner = getCell()->getAbutmentBox().getXMin(); // DbU::Unit ycorner = getCell()->getAbutmentBox().getYMin(); // cdebug.log(119,1) << "row0: " << row0 << endl; // GCell* row1 = row0->hcut( ycorner+DbU::fromLambda(50.0) ); // cdebug.tabw(119,-1); // cdebug.log(119,1) << "row1: " << row1 << endl; // GCell* row2 = row1->hcut( ycorner+DbU::fromLambda(2*50.0) ); // cdebug.tabw(119,-1); // cdebug.log(119,1) << "row2: " << row2 << endl; // row0 = row0->vcut( xcorner+DbU::fromLambda(50.0) ); // cdebug.tabw(119,-1); // cdebug.log(119,1) << "row0+1: " << row0 << endl; // row0 = row0->vcut( xcorner+DbU::fromLambda(3*50.0) ); // cdebug.tabw(119,-1); // cdebug.log(119,1) << "row0+2: " << row0 << endl; // row0 = row0->vcut( xcorner+DbU::fromLambda(5*50.0) ); // cdebug.tabw(119,-1); // cdebug.log(119,1) << "row0+3: " << row0 << endl; // row1 = row1->vcut( xcorner+DbU::fromLambda(2*50.0) ); // cdebug.tabw(119,-1); // cdebug.log(119,1) << "row1+1: " << row1 << endl; // cdebug.tabw(119,-1); // gcell = gcell->hcut( ycut+DbU::fromLambda(50.0) ); // cerr << "New GCell: " << gcell << endl; // DbU::Unit ycut = getCell()->getAbutmentBox().getYMin() + DbU::fromLambda(50.0); // for ( ; ycut < getCell()->getAbutmentBox().getYMax() ; ycut += DbU::fromLambda(50.0) ) { // cdebug.log(119,2) << "H cut line (y coordinate): " << DbU::getValueString(ycut) << endl; // gcell = gcell->hcut( ycut ); // cerr << gcell << endl; // cdebug.tabw(119,-2); // } // if (_viewer) _viewer->emitCellChanged(); } void GraphicAnabaticEngine::addToMenu ( CellViewer* viewer ) { assert( _viewer == NULL ); _viewer = viewer; if (_viewer->hasMenuAction("placeAndRoute.anabatic")) { cerr << Warning( "GraphicAnabaticEngine::addToMenu() - Anabatic engine already hooked in." ) << endl; return; } _viewer->addToMenu( "placeAndRoute.anabatic" , "Anabatic - &Test Run" , "Perform a test run of Anabatic on the design" , std::bind(&GraphicAnabaticEngine::_runTest,this) ); } const Name& GraphicAnabaticEngine::getName () const { return AnabaticEngine::staticGetName(); } Cell* GraphicAnabaticEngine::getCell () { if (_viewer == NULL) { throw Error( "Anabatic: GraphicAnabaticEngine not bound to any Viewer." ); return NULL; } if (_viewer->getCell() == NULL) { throw Error( "Anabatic: No Cell is loaded into the Viewer." ); return NULL; } return _viewer->getCell(); } GraphicAnabaticEngine* GraphicAnabaticEngine::grab () { if (not _references) _singleton = new GraphicAnabaticEngine (); _references++; return _singleton; } size_t GraphicAnabaticEngine::release () { --_references; if (not _references) { delete _singleton; _singleton = NULL; } return _references; } GraphicAnabaticEngine::GraphicAnabaticEngine () : GraphicTool() , _viewer (NULL) { addDrawGo( "Anabatic::GCell", initGCell, drawGCell ); addDrawGo( "Anabatic::Edge" , initEdge , drawEdge ); } GraphicAnabaticEngine::~GraphicAnabaticEngine () { } } // Anabatic namespace.