// -*- C++ -*- // // This file is part of the Coriolis Software. // Copyright (c) UPMC 2015-2018, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | // | B o r a - A n a l o g S l i c i n g T r e e | // | | // | Authors : Jean-Paul Chaput, Eric LAO | // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./GraphicBoraEngine.cpp" | // +-----------------------------------------------------------------+ #include #include #include #include #include #include #include #include "hurricane/Error.h" #include "hurricane/Warning.h" #include "hurricane/Breakpoint.h" #include "hurricane/DebugSession.h" #include "hurricane/UpdateSession.h" #include "hurricane/DataBase.h" #include "hurricane/Library.h" #include "hurricane/viewer/Graphics.h" #include "hurricane/viewer/HApplication.h" #include "hurricane/viewer/CellWidget.h" #include "hurricane/viewer/ExceptionWidget.h" #include "crlcore/GdsDriver.h" #include "hurricane/analog/AnalogCellExtension.h" #include "hurricane/analog/LayoutGenerator.h" #include "hurricane/analog/TransistorFamily.h" #include "bora/SlicingWidget.h" #include "bora/SlicingDataWidget.h" #include "bora/SlicingPlotWidget.h" #include "bora/GraphicBoraEngine.h" #include "bora/SlicingWidget.h" namespace Bora { using namespace std; using Hurricane::Error; using Hurricane::Warning; using Hurricane::Breakpoint; using Hurricane::DebugSession; using Hurricane::UpdateSession; using Hurricane::Point; using Hurricane::Net; using Hurricane::Graphics; using Hurricane::ColorScale; using Hurricane::ControllerWidget; using Hurricane::ExceptionWidget; using CRL::GdsDriver; // ------------------------------------------------------------------- // Class : "Bora". size_t GraphicBoraEngine::_references = 0; GraphicBoraEngine* GraphicBoraEngine::_singleton = NULL; BoraEngine* GraphicBoraEngine::createEngine () { cdebug_log(536,0) << "BoraEngine* GraphicBoraEngine::createEngine ()" << endl; Cell* cell = getCell (); if (_slicingWidget == NULL) _slicingWidget = new SlicingWidget(); BoraEngine* bora = BoraEngine::get( cell ); if (not bora) { bora = BoraEngine::create( cell ); bora->setViewer( _viewer ); _slicingWidget->setViewer( _viewer ); } else cerr << Warning( "%s already has a Bora engine.", getString(cell).c_str() ) << endl; return bora; } BoraEngine* GraphicBoraEngine::getForFramework ( unsigned int flags ) { cdebug_log(536,0) << "BoraEngine* GraphicBoraEngine::getForFramework(unsigned int flags) flags:" << (flags==CreateEngine) << endl; // Currently, only one framework is avalaible: Alliance. BoraEngine* bora = BoraEngine::get( getCell() ); if (bora){ if (not _slicingWidget){ bora->setViewer( _viewer ); _slicingWidget = new SlicingWidget(); _slicingWidget->setViewer( _viewer ); connect( _slicingWidget, SIGNAL(updatePlacement ( BoxSet* )) , this , SLOT (updatePlacementST( BoxSet* )) ); } return bora; } if (flags & CreateEngine) { bora = createEngine(); if (not bora) throw Error( "Failed to create Bora engine on %s.", getString( getCell()).c_str() ); connect( _slicingWidget, SIGNAL(updatePlacement ( BoxSet* )) , this , SLOT (updatePlacementST( BoxSet* )) ); } else throw Error( "BoraEngine not created yet, out of sequence action." ); return bora; } void GraphicBoraEngine::updateSlicingTree () { _viewer->clearToolInterrupt(); BoraEngine* bora = getForFramework( CreateEngine ); bora->updateSlicingTree(); _slicingWidget->updateContents(); } void GraphicBoraEngine::updatePlacementST ( BoxSet* boxSet ) { cdebug_log(536,0) << "GraphicBoraEngine::updatePlacementST(BoxSet*)" << endl; _viewer->clearToolInterrupt(); BoraEngine* bora = getForFramework( CreateEngine ); if (bora) bora->updatePlacement( boxSet ); } void GraphicBoraEngine::updatePlacementST ( size_t index ) { cdebug_log(536,0) << "GraphicBoraEngine::updatePlacementST(int)" << endl; _viewer->clearToolInterrupt(); BoraEngine* bora = getForFramework( CreateEngine ); if (bora){ BoxSet* bs = _slicingWidget->getDataWidget()->getBoxSet( index ); bora->updatePlacement( bs ); } } void GraphicBoraEngine::setToleranceRatio () { _viewer->clearToolInterrupt(); BoraEngine* bora = getForFramework( CreateEngine ); if (bora) { double ratioh = QInputDialog::getDouble( _slicingWidget , "Set height tolerance ratio" , "Write the desired height tolerance ratio:" , DbU::getPhysical(bora->getToleranceRatioH(),DbU::Micro) , 0, 10000, 2 ); double ratiow = QInputDialog::getDouble( _slicingWidget , "Set width tolerance ratio" , "Write the desired width tolerance ratio:" , DbU::getPhysical(bora->getToleranceRatioW(),DbU::Micro) , 0, 10000, 2 ); bora->setToleranceRatio( DbU::fromPhysical(ratioh, DbU::Micro) , DbU::fromPhysical(ratiow, DbU::Micro) ); _slicingWidget->updateContents(); } } void GraphicBoraEngine::setToleranceBand () { _viewer->clearToolInterrupt(); BoraEngine* bora = getForFramework( CreateEngine ); if (bora) { double bandh = QInputDialog::getDouble( _slicingWidget , "Set height tolerance band" , "Write the desired height tolerance band:" , DbU::getPhysical(bora->getToleranceBandH(),DbU::Micro) , 0, 10000, 2 ); double bandw = QInputDialog::getDouble( _slicingWidget , "Set width tolerance band" , "Write the desired width tolerance band:" , DbU::getPhysical(bora->getToleranceBandW(),DbU::Micro) , 0, 10000, 2 ); bora->setToleranceBand( DbU::fromPhysical(bandh, DbU::Micro) , DbU::fromPhysical(bandw, DbU::Micro) ); _slicingWidget->updateContents(); } } void GraphicBoraEngine::showPareto () { cdebug_log(536,0) << "GraphicBoraEngine::showPareto(): " << _viewer << endl; if (_viewer) _viewer->clearToolInterrupt(); BoraEngine* bora = getForFramework( CreateEngine ); if (bora) _slicingWidget->show(); } void GraphicBoraEngine::addToMenu ( CellViewer* viewer ) { assert( _viewer == NULL ); _viewer = viewer; _viewer->addMenu ( "analog" , "Analog" , CellViewer::TopMenu ); if (_slicingWidget) _slicingWidget->setViewer( _viewer ); // ?? if (_viewer->hasMenuAction("analog.STree.create")) { cerr << Warning( "GraphicBoraEngine::addToMenu() - Bora tool already hooked in." ) << endl; return; } _viewer->addMenu( "analog.STree", "Slicing Tree", NoFlags ); _viewer->addToMenu( "analog.STree.update" , "Update possible dimensions" , "Update the possible dimensions at each node of the SlicingTree." , std::bind( &GraphicBoraEngine::updateSlicingTree, this ) ); _viewer->addToMenu( "analog.STree.setTR" , "Set global tolerance ratio" , "Set the tolerance of the global ratio." , std::bind( &GraphicBoraEngine::setToleranceRatio, this ) ); _viewer->addToMenu( "analog.STree.setBR" , "Set band tolerance" , "Set the tolerance of the bands inside of the slicing tree." , std::bind( &GraphicBoraEngine::setToleranceBand, this ) ); _viewer->addToMenu( "analog.STree.show" , "Slicing tree curve" , "Show the complete slicing tree curve." , std::bind( &GraphicBoraEngine::showPareto, this ) ); } const Name& GraphicBoraEngine::getName () const { return BoraEngine::staticGetName(); } Cell* GraphicBoraEngine::getCell () { if (_viewer == NULL) { throw Error( "Bora: GraphicBoraEngine not bound to any Viewer." ); return NULL; } if (_viewer->getCell() == NULL) { throw Error( "Bora: No Cell is loaded into the Viewer." ); return NULL; } return _viewer->getCell(); } GraphicBoraEngine* GraphicBoraEngine::grab () { cdebug_log(536,0) << "GraphicBoraEngine::grab()" << endl; if (not _references) { _singleton = new GraphicBoraEngine(); } _references++; return _singleton; } size_t GraphicBoraEngine::release () { --_references; if (not _references) { delete _singleton; _singleton = NULL; } return _references; } GraphicBoraEngine::GraphicBoraEngine () : GraphicTool() , _viewer (NULL) , _slicingWidget(NULL) { } GraphicBoraEngine::~GraphicBoraEngine () { _slicingWidget->deleteLater(); } } // End of Bora namespace.