303 lines
9.8 KiB
C++
303 lines
9.8 KiB
C++
// -*- 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 <QAction>
|
|
#include <QMenu>
|
|
#include <QMenuBar>
|
|
#include <QLineEdit>
|
|
#include <QInputDialog>
|
|
#include <QFileDialog>
|
|
#include <QMessageBox>
|
|
#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( "<b>Bora:</b> GraphicBoraEngine not bound to any Viewer." );
|
|
return NULL;
|
|
}
|
|
if (_viewer->getCell() == NULL) {
|
|
throw Error( "<b>Bora:</b> 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.
|