* ./hurricane/src/hviewer,
./coriolis/src/crlcore, ./coriolis/src/knik, ./coriolis/src/katabatic, ./coriolis/src/kite, ./coriolis/src/equinox, ./coriolis/src/solstice, ./coriolis/src/ispd: - SVN MOVE: Source tree simplification & uniformisation. Now all tools are at the same level, directly under the root of the repository. No more "coriolis/src".
This commit is contained in:
parent
a1726771b6
commit
05036113bf
|
@ -0,0 +1,27 @@
|
||||||
|
PROJECT(SOLSTICE)
|
||||||
|
|
||||||
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.4.0)
|
||||||
|
IF(COMMAND CMAKE_POLICY)
|
||||||
|
CMAKE_POLICY(SET CMP0003 NEW)
|
||||||
|
ENDIF(COMMAND CMAKE_POLICY)
|
||||||
|
|
||||||
|
SET(CMAKE_C_FLAGS_DEBUG "-g -Wall" CACHE STRING "Debug options." FORCE)
|
||||||
|
SET(CMAKE_CXX_FLAGS_DEBUG "-g -Wall" CACHE STRING "Debug options." FORCE)
|
||||||
|
#SET(CMAKE_LINKER_FLAGS_DEBUG "-pg" CACHE STRING "Debug options." FORCE)
|
||||||
|
#SET(CMAKE_SHARED_LINKER_FLAGS_DEBUG "-pg" CACHE STRING "Debug options." FORCE)
|
||||||
|
#SET(CMAKE_MODULE_LINKER_FLAGS_DEBUG "-pg" CACHE STRING "Debug options." FORCE)
|
||||||
|
#SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "-pg" CACHE STRING "Debug options." FORCE)
|
||||||
|
|
||||||
|
SET(CMAKE_MODULE_PATH "$ENV{HURRICANE_TOP}/share/cmake_modules/")
|
||||||
|
|
||||||
|
SET(QT_USE_QTXML "true")
|
||||||
|
|
||||||
|
FIND_PACKAGE(Qt4 REQUIRED) # find and setup Qt4 for this project
|
||||||
|
FIND_PACKAGE(HURRICANE REQUIRED)
|
||||||
|
FIND_PACKAGE(CORIOLIS REQUIRED)
|
||||||
|
FIND_PACKAGE(EQUINOX REQUIRED)
|
||||||
|
|
||||||
|
SET_LIB_LINK_MODE()
|
||||||
|
|
||||||
|
ADD_SUBDIRECTORY(src)
|
||||||
|
ADD_SUBDIRECTORY(cmake_modules)
|
|
@ -0,0 +1 @@
|
||||||
|
install ( FILES FindSOLSTICE.cmake DESTINATION /share/cmake_modules )
|
|
@ -0,0 +1,47 @@
|
||||||
|
# - Find the Solstice includes and libraries.
|
||||||
|
# The following variables are set if Coriolis is found. If SOLSTICE is not
|
||||||
|
# found, SOLSTICE_FOUND is set to false.
|
||||||
|
# SOLSTICE_FOUND - True when the Coriolis include directory is found.
|
||||||
|
# SOLSTICE_INCLUDE_DIR - the path to where the Coriolis include files are.
|
||||||
|
# SOLSTICE_LIBRARIES - The path to where the Coriolis library files are.
|
||||||
|
|
||||||
|
|
||||||
|
SET(SOLSTICE_INCLUDE_PATH_DESCRIPTION "directory containing the Solstice include files. E.g /usr/local/include/coriolis or /asim/coriolis/include/coriolis")
|
||||||
|
|
||||||
|
SET(SOLSTICE_DIR_MESSAGE "Set the SOLSTICE_INCLUDE_DIR cmake cache entry to the ${SOLSTICE_INCLUDE_PATH_DESCRIPTION}")
|
||||||
|
|
||||||
|
# don't even bother under WIN32
|
||||||
|
IF(UNIX)
|
||||||
|
|
||||||
|
SET(SOLSTICE_DIR_SEARCH $ENV{CORIOLIS_TOP} $ENV{HURRICANE_TOP})
|
||||||
|
#
|
||||||
|
# Look for an installation.
|
||||||
|
#
|
||||||
|
FIND_PATH(SOLSTICE_INCLUDE_PATH NAMES solstice/Equi.h PATHS
|
||||||
|
# Look in other places.
|
||||||
|
${SOLSTICE_DIR_SEARCH}
|
||||||
|
PATH_SUFFIXES include/coriolis
|
||||||
|
# Help the user find it if we cannot.
|
||||||
|
DOC "The ${SOLSTICE_INCLUDE_PATH_DESCRIPTION}"
|
||||||
|
)
|
||||||
|
|
||||||
|
FIND_LIBRARY(SOLSTICE_LIBRARY_PATH
|
||||||
|
NAMES solstice
|
||||||
|
PATHS ${SOLSTICE_DIR_SEARCH}
|
||||||
|
PATH_SUFFIXES lib
|
||||||
|
# Help the user find it if we cannot.
|
||||||
|
DOC "The ${SOLSTICE_INCLUDE_PATH_DESCRIPTION}"
|
||||||
|
)
|
||||||
|
|
||||||
|
FIND_LIBRARY(SOLSTICE_STATIC_LIBRARY_PATH
|
||||||
|
NAMES solstice-static
|
||||||
|
PATHS ${SOLSTICE_DIR_SEARCH}
|
||||||
|
PATH_SUFFIXES lib
|
||||||
|
# Help the user find it if we cannot.
|
||||||
|
DOC "The ${SOLSTICE_INCLUDE_PATH_DESCRIPTION}"
|
||||||
|
)
|
||||||
|
|
||||||
|
SET_LIBRARIES_PATH(SOLSTICE SOLSTICE)
|
||||||
|
HURRICANE_CHECK_LIBRARIES(SOLSTICE)
|
||||||
|
|
||||||
|
ENDIF(UNIX)
|
|
@ -0,0 +1,98 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./Brick.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "hurricane/Occurrence.h"
|
||||||
|
#include "hurricane/Box.h"
|
||||||
|
#include "hurricane/BasicLayer.h"
|
||||||
|
#include "hurricane/DbU.h"
|
||||||
|
|
||||||
|
#include "hurricane/Error.h"
|
||||||
|
#include "crlcore/Utilities.h"
|
||||||
|
#include<equinox/Interval.h>
|
||||||
|
|
||||||
|
#include<solstice/Brick.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
using namespace Hurricane;
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
const DbU::Unit& Brick::getXmin() const { return _box.getXMin(); };
|
||||||
|
const DbU::Unit& Brick::getYmin() const { return _box.getYMin(); };
|
||||||
|
const DbU::Unit& Brick::getXmax() const { return _box.getXMax(); };
|
||||||
|
const DbU::Unit& Brick::getYmax() const { return _box.getYMax(); };
|
||||||
|
long Brick::GetLowPoint() const { return _box.getYMin(); }
|
||||||
|
long Brick::GetHighPoint() const { return _box.getYMax(); }
|
||||||
|
|
||||||
|
bool Brick::isEmpty () const { return _box.isEmpty(); };
|
||||||
|
|
||||||
|
|
||||||
|
Brick::Brick(const Occurrence& hypernet, const Occurrence& componentoccurrence, const Box& box,
|
||||||
|
BasicLayer* basiclayer)
|
||||||
|
: _hypernet(hypernet)
|
||||||
|
, _componentoccurrence(componentoccurrence)
|
||||||
|
, _box(box)
|
||||||
|
, _basicLayer(basiclayer)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Brick::~Brick() {};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Brick* Brick::create(const Occurrence& hypernet, const Occurrence& componentoccurrence, const Box& box,
|
||||||
|
BasicLayer* basiclayer)
|
||||||
|
{
|
||||||
|
Brick* brick = new Brick(hypernet, componentoccurrence, box, basiclayer);
|
||||||
|
if(!brick) {
|
||||||
|
throw Error("can't create Brick : allocation failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
return brick;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Brick::destroy() {
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
|
||||||
|
string Brick::_getString() const {
|
||||||
|
string s = "< Brick " + getString(_hypernet) + " " + getString(_componentoccurrence) + " ";
|
||||||
|
s += "\n" + getString(_box) + " " + getString(_basicLayer->getName()) + " >";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}// End of namespace Solstice
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./BrickSweepLine.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
#include <hurricane/ExtensionGo.h>
|
||||||
|
#include <hurricane/DataBase.h>
|
||||||
|
#include <hurricane/Technology.h>
|
||||||
|
#include <hurricane/Occurrence.h>
|
||||||
|
|
||||||
|
#include <hurricane/Component.h>
|
||||||
|
|
||||||
|
#include <equinox/Strategy.h>
|
||||||
|
#include <equinox/IntervalTree.h>
|
||||||
|
#include <equinox/Tiles.h>
|
||||||
|
#include <equinox/SweepLine.h>
|
||||||
|
#include <equinox/TileSweepLine.h>
|
||||||
|
#include <solstice/RoutingError.h>
|
||||||
|
#include "solstice/SolsticeEngine.h"
|
||||||
|
#include "solstice/Brick.h"
|
||||||
|
namespace Equinox {
|
||||||
|
|
||||||
|
using Solstice::SolsticeEngine;
|
||||||
|
using Solstice::Brick;
|
||||||
|
|
||||||
|
template class SweepLine<Brick*,SolsticeEngine*>;
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
|
||||||
|
include ( ${QT_USE_FILE} )
|
||||||
|
|
||||||
|
include_directories ( ${SOLSTICE_SOURCE_DIR}/src
|
||||||
|
${HURRICANE_INCLUDE_DIR}
|
||||||
|
${CORIOLIS_INCLUDE_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
set ( includes solstice/Brick.h
|
||||||
|
solstice/ShortCircuitError.h
|
||||||
|
solstice/DisconnectError.h
|
||||||
|
solstice/SolsticeEngine.h
|
||||||
|
solstice/RoutingError.h
|
||||||
|
solstice/BrickSweepLine.h
|
||||||
|
solstice/RoutingErrorInformations.h
|
||||||
|
)
|
||||||
|
set ( mocIncludes solstice/RoutingErrorListModel.h
|
||||||
|
solstice/RoutingErrorListWidget.h
|
||||||
|
solstice/TabRoutingErrorList.h
|
||||||
|
solstice/GraphicSolsticeEngine.h )
|
||||||
|
|
||||||
|
set ( cpps Brick.cpp
|
||||||
|
RoutingError.cpp
|
||||||
|
BrickSweepLine.cpp
|
||||||
|
SolsticeEngine.cpp
|
||||||
|
ShortCircuitError.cpp
|
||||||
|
GraphicSolsticeEngine.cpp
|
||||||
|
RoutingErrorListModel.cpp
|
||||||
|
DisconnectError.cpp
|
||||||
|
RoutingErrorListWidget.cpp
|
||||||
|
TabRoutingErrorList.cpp
|
||||||
|
RoutingErrorInformations.cpp
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
qt4_wrap_cpp ( mocCpps ${mocIncludes} )
|
||||||
|
|
||||||
|
add_library ( solstice ${cpps} ${mocCpps} )
|
||||||
|
target_link_libraries ( solstice ${EQUINOX_LIBRARIES}
|
||||||
|
${CORIOLIS_LIBRARIES}
|
||||||
|
${HURRICANE_LIBRARIES}
|
||||||
|
${HURRICANE_GRAPHICAL_LIBRARIES}
|
||||||
|
${QT_LIBRARIES}
|
||||||
|
${LEFDEF_LIBRARIES}
|
||||||
|
${OA_LIBRARIES}
|
||||||
|
)
|
||||||
|
install ( TARGETS solstice DESTINATION /lib)
|
||||||
|
install ( FILES ${includes}
|
||||||
|
${mocIncludes} DESTINATION /include/coriolis/solstice )
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | |
|
||||||
|
// | Updater : Bodin bruno |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./DisconnectError.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
#include <hurricane/Cell.h>
|
||||||
|
#include <hurricane/Net.h>
|
||||||
|
#include <equinox/Strategy.h>
|
||||||
|
#include <solstice/SolsticeEngine.h>
|
||||||
|
#include <solstice/DisconnectError.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
using namespace Hurricane;
|
||||||
|
DisconnectError::DisconnectError(Cell*cell, const Occurrence& occurrence, int count) :
|
||||||
|
RoutingError(cell,count),
|
||||||
|
_occurrence(occurrence)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (dynamic_cast<Net*>(occurrence.getEntity()))
|
||||||
|
forEach ( Component*, component, dynamic_cast<Net*>(occurrence.getEntity())->getComponents() ) {
|
||||||
|
_occurrences->insert(Occurrence ( *component ) );
|
||||||
|
}
|
||||||
|
// _area = occurrence.getBoundingBox();
|
||||||
|
_area = Box();
|
||||||
|
}
|
||||||
|
DisconnectError::~DisconnectError() {};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
string DisconnectError::getErrorDescription () const
|
||||||
|
{
|
||||||
|
return "Deconnexion du Net " + _occurrence.getEntity()->_getString() ;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Solstice namespace.
|
|
@ -0,0 +1,249 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./GraphicSolsticeEngine.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
#include <QAction>
|
||||||
|
#include <QMenu>
|
||||||
|
#include <QMenuBar>
|
||||||
|
|
||||||
|
#include <hurricane/Warning.h>
|
||||||
|
#include <hurricane/Go.h>
|
||||||
|
#include <hurricane/Error.h>
|
||||||
|
#include <hurricane/Cell.h>
|
||||||
|
|
||||||
|
#include <hurricane/viewer/Graphics.h>
|
||||||
|
#include <hurricane/viewer/CellWidget.h>
|
||||||
|
#include <hurricane/viewer/PaletteWidget.h>
|
||||||
|
#include <hurricane/viewer/CellViewer.h>
|
||||||
|
#include <hurricane/viewer/ControllerWidget.h>
|
||||||
|
|
||||||
|
#include <crlcore/AllianceFramework.h>
|
||||||
|
#include <crlcore/GraphicToolEngine.h>
|
||||||
|
|
||||||
|
#include <solstice/GraphicSolsticeEngine.h>
|
||||||
|
#include <solstice/SolsticeEngine.h>
|
||||||
|
|
||||||
|
#include <solstice/TabRoutingErrorList.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using Hurricane::Error;
|
||||||
|
using Hurricane::Warning;
|
||||||
|
using Hurricane::Graphics;
|
||||||
|
using CRL::AllianceFramework;
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "CRL::GraphicSolsticeEngine".
|
||||||
|
|
||||||
|
|
||||||
|
size_t GraphicSolsticeEngine::_references = 0;
|
||||||
|
GraphicSolsticeEngine* GraphicSolsticeEngine::_singleton = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
SolsticeEngine* GraphicSolsticeEngine::createEngine ( )
|
||||||
|
{
|
||||||
|
Cell* cell = getCell ();
|
||||||
|
|
||||||
|
SolsticeEngine* solstice = SolsticeEngine::get ( cell );
|
||||||
|
if ( !solstice ) {
|
||||||
|
solstice = SolsticeEngine::create ( cell );
|
||||||
|
}
|
||||||
|
return solstice;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GraphicSolsticeEngine::initSolsticeRoutingError ( CellWidget* widget )
|
||||||
|
{
|
||||||
|
// QPainter& painter = widget->getPainter();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GraphicSolsticeEngine::drawSolsticeRoutingError ( CellWidget* widget
|
||||||
|
, const Go* go
|
||||||
|
, const BasicLayer* basicLayer
|
||||||
|
, const Box& box
|
||||||
|
, const Transformation& transformation
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const RoutingError* error = static_cast<const RoutingError*>(go);
|
||||||
|
QPainter& painter = widget->getPainter();
|
||||||
|
QColor c = QColor(Qt::red);
|
||||||
|
c.setAlpha(100);
|
||||||
|
c = c.darker(widget->getDarkening());
|
||||||
|
painter.setPen (QPen(c,15));
|
||||||
|
painter.setBrush(c);
|
||||||
|
painter.drawRect ( widget->dbuToDisplayRect(error->getBoundingBox()) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
GraphicSolsticeEngine* GraphicSolsticeEngine::grab ()
|
||||||
|
{
|
||||||
|
if ( !_references )
|
||||||
|
_singleton = new GraphicSolsticeEngine ();
|
||||||
|
_references++;
|
||||||
|
return _singleton;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const Name& GraphicSolsticeEngine::getName () const
|
||||||
|
{ return SolsticeEngine::getStaticName(); }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Cell* GraphicSolsticeEngine::getCell ()
|
||||||
|
{
|
||||||
|
if ( !_viewer ) {
|
||||||
|
throw Error ( "<b>Solstice:</b> GraphicSolsticeEngine not bound to any Viewer." );
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !_viewer->getCell() ) {
|
||||||
|
throw Error ( "<b>Solstice:</b> No Cell is loaded into the Viewer." );
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _viewer->getCell();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
size_t GraphicSolsticeEngine::release ()
|
||||||
|
{
|
||||||
|
_references--;
|
||||||
|
if ( !_references ) {
|
||||||
|
delete _singleton;
|
||||||
|
_singleton = NULL;
|
||||||
|
}
|
||||||
|
return _references;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GraphicSolsticeEngine::addToMenu ( CellViewer* viewer )
|
||||||
|
{
|
||||||
|
assert ( _viewer == NULL );
|
||||||
|
_viewer = viewer;
|
||||||
|
|
||||||
|
QMenu* prMenu = _viewer->findChild<QMenu*>("viewer.menuBar.extract");
|
||||||
|
if ( !prMenu ) {
|
||||||
|
throw("Solstice doit être chargé avant Equinox (c'est plus convenable , Non ??");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
QAction* gTestAction = _viewer->findChild<QAction*>("viewer.menuBar.extract.solstice.test");
|
||||||
|
if ( gTestAction )
|
||||||
|
cerr << Warning("GraphicSolsticeEngine::addToMenu() - Solstice test already hooked in.") << endl;
|
||||||
|
else {
|
||||||
|
gTestAction = new QAction ( tr("Solstice - Testing"), _viewer );
|
||||||
|
gTestAction->setObjectName ( "viewer.menuBar.extract.test" );
|
||||||
|
gTestAction->setStatusTip ( tr("Run the <b>Solstice</b> Test") );
|
||||||
|
gTestAction->setVisible ( true );
|
||||||
|
prMenu->addAction ( gTestAction );
|
||||||
|
|
||||||
|
connect ( gTestAction, SIGNAL(triggered()), this, SLOT(test()) );
|
||||||
|
}
|
||||||
|
|
||||||
|
// fin du sous menu
|
||||||
|
|
||||||
|
connect ( this, SIGNAL(cellPreModificated ()), _viewer->getCellWidget(), SLOT(cellPreModificate ()) );
|
||||||
|
connect ( this, SIGNAL(cellPostModificated()), _viewer->getCellWidget(), SLOT(cellPostModificate()) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GraphicSolsticeEngine::test ()
|
||||||
|
{
|
||||||
|
SolsticeEngine* solstice = createEngine ( );
|
||||||
|
if ( !solstice ) return;
|
||||||
|
|
||||||
|
emit cellPreModificated ();
|
||||||
|
|
||||||
|
solstice->compare ();
|
||||||
|
|
||||||
|
emit cellPostModificated ();
|
||||||
|
_viewer->dumpObjectTree();
|
||||||
|
QTabWidget* ctrlTab = _viewer->getControllerWidget();
|
||||||
|
if (ctrlTab) {
|
||||||
|
ctrlTab->addTab ( _tabRoutingErrorList , "RoutingError" );
|
||||||
|
(static_cast<ControllerTab*>((_tabRoutingErrorList)))->setCellWidget ( _viewer->getCellWidget() );
|
||||||
|
|
||||||
|
PaletteWidget* palette = ctrlTab->findChild<PaletteWidget*>("controller.tabPalette.palette");
|
||||||
|
if (palette)
|
||||||
|
{
|
||||||
|
palette->setItemVisible(RoutingError::_extensionName,true);
|
||||||
|
} else {
|
||||||
|
throw Warning("l'onglet controller.tabPalette.palette n'existe pas");
|
||||||
|
}
|
||||||
|
|
||||||
|
}else {
|
||||||
|
throw Warning("Le panel des erreurs de s'affichera pas");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GraphicSolsticeEngine::GraphicSolsticeEngine ()
|
||||||
|
: GraphicTool ()
|
||||||
|
, _viewer (NULL)
|
||||||
|
, _tabRoutingErrorList (new TabRoutingErrorList())
|
||||||
|
{
|
||||||
|
_tabRoutingErrorList ->setObjectName ( "controller.tabRoutingErrorList" );
|
||||||
|
addDrawGo ( RoutingError::_extensionName , initSolsticeRoutingError , drawSolsticeRoutingError );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GraphicSolsticeEngine::~GraphicSolsticeEngine()
|
||||||
|
{
|
||||||
|
// destruction des outils graphiques
|
||||||
|
//removeDrawGo ( RoutingError::_extensionName );
|
||||||
|
//_tabRoutingErrorList->destroy();
|
||||||
|
|
||||||
|
// destruction de solstice
|
||||||
|
cout << "get cell" <<endl;
|
||||||
|
Cell* cell = getCell ();
|
||||||
|
cout << "get cell (bis)" <<endl;
|
||||||
|
SolsticeEngine* solstice = SolsticeEngine::get ( cell );
|
||||||
|
cout << "destroy" <<endl;
|
||||||
|
if (solstice)
|
||||||
|
solstice->destroy();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Solstice namespace.
|
|
@ -0,0 +1,55 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | |
|
||||||
|
// | Updater : Bodin bruno |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./RoutingError.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#include <hurricane/Name.h>
|
||||||
|
#include <hurricane/Box.h>
|
||||||
|
#include <solstice/RoutingError.h>
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
const Name RoutingError::_extensionName = "Solstice::RoutingError";
|
||||||
|
|
||||||
|
RoutingError::~RoutingError() {};
|
||||||
|
|
||||||
|
RoutingError::RoutingError(Cell* cell,int count):
|
||||||
|
ExtensionGo(cell),
|
||||||
|
_cell(cell),
|
||||||
|
_area(),
|
||||||
|
_count(count)
|
||||||
|
{
|
||||||
|
_occurrences = new set<Occurrence>;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RoutingError::translate ( const DbU::Unit& dx, const DbU::Unit& dy )
|
||||||
|
{
|
||||||
|
// cout << "Translate !! " << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Solstice namespace.
|
|
@ -0,0 +1,124 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | H U R R I C A N E |
|
||||||
|
// | V L S I B a c k e n d D a t a - B a s e |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul CHAPUT |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Module : "./RoutingErrorInformations.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "hurricane/Name.h"
|
||||||
|
#include "solstice/RoutingError.h"
|
||||||
|
#include "solstice/RoutingErrorInformations.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "RoutingErrorInformations"
|
||||||
|
|
||||||
|
|
||||||
|
int RoutingErrorInformations::getColumnCount ()
|
||||||
|
{ return 1; }
|
||||||
|
|
||||||
|
|
||||||
|
QVariant RoutingErrorInformations::getColumnName ( int column )
|
||||||
|
{
|
||||||
|
switch ( column ) {
|
||||||
|
case 0: return QVariant(QObject::tr("RoutingError"));
|
||||||
|
}
|
||||||
|
return QVariant(QObject::tr("Column Out of Bound"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QVariant RoutingErrorInformations::getColumn ( int column )
|
||||||
|
{
|
||||||
|
switch ( column ) {
|
||||||
|
case 0: return QVariant(getString(getName()).c_str());
|
||||||
|
}
|
||||||
|
return QVariant(QObject::tr("Column Out of Bound"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
RoutingErrorInformations::RoutingErrorInformations ( const RoutingError* routingError )
|
||||||
|
: _routingError(routingError)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
RoutingErrorInformations::~RoutingErrorInformations ()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "SimpleRoutingErrorInformations"
|
||||||
|
|
||||||
|
string SimpleRoutingErrorInformations::getDescription() const {
|
||||||
|
return _routingError->getErrorDescription();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int SimpleRoutingErrorInformations::getColumnCount ()
|
||||||
|
{ return 3; }
|
||||||
|
|
||||||
|
|
||||||
|
QVariant SimpleRoutingErrorInformations::getColumnName ( int column )
|
||||||
|
{
|
||||||
|
switch ( column ) {
|
||||||
|
case 0: return QVariant(QObject::tr("RoutingError"));
|
||||||
|
case 1: return QVariant(QObject::tr("Equipotentials"));
|
||||||
|
case 2: return QVariant(QObject::tr("Description"));
|
||||||
|
}
|
||||||
|
return QVariant(QObject::tr("Column Out of Bound"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QVariant SimpleRoutingErrorInformations::getColumn ( int column )
|
||||||
|
{
|
||||||
|
switch ( column ) {
|
||||||
|
case 0: return QVariant(getString(getName()).c_str());
|
||||||
|
case 1: return QVariant((unsigned int)_routingError->getCount());
|
||||||
|
case 2: return QVariant(getString( getDescription()).c_str());
|
||||||
|
}
|
||||||
|
return QVariant(QObject::tr("Column Out of Bound"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SimpleRoutingErrorInformations::SimpleRoutingErrorInformations ( const RoutingError* routingError )
|
||||||
|
: RoutingErrorInformations(routingError)
|
||||||
|
, _plugsCount(_routingError->getAllOccurrences()->size())
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
SimpleRoutingErrorInformations::~SimpleRoutingErrorInformations ()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "AbstractRoutingErrorInformationsVector"
|
||||||
|
|
||||||
|
|
||||||
|
AbstractRoutingErrorInformationsVector::~AbstractRoutingErrorInformationsVector ()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
|
@ -0,0 +1,123 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./RoutingErrorlistModel.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include <QFont>
|
||||||
|
#include <QApplication>
|
||||||
|
|
||||||
|
#include "hurricane/Name.h"
|
||||||
|
|
||||||
|
#include "hurricane/Cell.h"
|
||||||
|
#include "hurricane/viewer/Graphics.h"
|
||||||
|
#include "solstice/RoutingError.h"
|
||||||
|
#include "solstice/RoutingErrorInformations.h"
|
||||||
|
#include "solstice/RoutingErrorListModel.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
|
||||||
|
RoutingErrorListModel::RoutingErrorListModel ( QObject* parent )
|
||||||
|
: QAbstractTableModel(parent)
|
||||||
|
, _cell(NULL)
|
||||||
|
, _routingErrorList(NULL)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
RoutingErrorListModel::~RoutingErrorListModel ()
|
||||||
|
{
|
||||||
|
if ( _routingErrorList ) delete _routingErrorList;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QVariant RoutingErrorListModel::data ( const QModelIndex& index, int role ) const
|
||||||
|
{
|
||||||
|
static QFont nameFont = Graphics::getFixedFont ( QFont::Bold );
|
||||||
|
static QFont valueFont = Graphics::getFixedFont ( QFont::Normal, true );
|
||||||
|
|
||||||
|
if ( role == Qt::SizeHintRole ) {
|
||||||
|
switch (index.column()) {
|
||||||
|
case 0: return 200;
|
||||||
|
default: return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( role == Qt::FontRole ) {
|
||||||
|
switch (index.column()) {
|
||||||
|
case 0: return nameFont;
|
||||||
|
default: return valueFont;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !index.isValid() ) return QVariant ();
|
||||||
|
|
||||||
|
if ( role == Qt::DisplayRole ) {
|
||||||
|
int row = index.row ();
|
||||||
|
return _routingErrorList->getRow(row)->getColumn(index.column());
|
||||||
|
}
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QVariant RoutingErrorListModel::headerData ( int section
|
||||||
|
, Qt::Orientation orientation
|
||||||
|
, int role ) const
|
||||||
|
{
|
||||||
|
if ( ( orientation == Qt::Vertical ) || (role != Qt::DisplayRole) )
|
||||||
|
return QVariant();
|
||||||
|
|
||||||
|
if ( !_routingErrorList ) {
|
||||||
|
if ( section == 0 ) return QVariant("RoutingError");
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( section < _routingErrorList->getColumnCount() )
|
||||||
|
return _routingErrorList->getColumnName(section);
|
||||||
|
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int RoutingErrorListModel::rowCount ( const QModelIndex& parent ) const
|
||||||
|
{
|
||||||
|
return (_routingErrorList) ? _routingErrorList->size() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int RoutingErrorListModel::columnCount ( const QModelIndex& parent ) const
|
||||||
|
{
|
||||||
|
return (_routingErrorList) ? _routingErrorList->getColumnCount() : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const RoutingError* RoutingErrorListModel::getRoutingError ( int row )
|
||||||
|
{
|
||||||
|
if ( !_routingErrorList || ( row >= (int)_routingErrorList->size() ) ) return NULL;
|
||||||
|
|
||||||
|
return _routingErrorList->getRow(row)->getRoutingError();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
|
@ -0,0 +1,218 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./RoutingErrorListWidget.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#include <QFontMetrics>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QLineEdit>
|
||||||
|
#include <QHeaderView>
|
||||||
|
#include <QKeyEvent>
|
||||||
|
#include <QGroupBox>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QAction>
|
||||||
|
|
||||||
|
|
||||||
|
#include <hurricane/Commons.h>
|
||||||
|
|
||||||
|
#include <crlcore/Utilities.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include <solstice/RoutingError.h>
|
||||||
|
#include <hurricane/viewer/Graphics.h>
|
||||||
|
#include <solstice/RoutingErrorListModel.h>
|
||||||
|
#include <solstice/RoutingErrorListWidget.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
|
||||||
|
RoutingErrorListWidget::RoutingErrorListWidget ( QWidget* parent )
|
||||||
|
: QWidget (parent)
|
||||||
|
, _cellWidget (NULL)
|
||||||
|
, _cell (NULL)
|
||||||
|
, _baseModel (new RoutingErrorListModel(this))
|
||||||
|
, _sortModel (new QSortFilterProxyModel(this))
|
||||||
|
, _view (new QTableView(this))
|
||||||
|
, _rowHeight (20)
|
||||||
|
, _selecteds ()
|
||||||
|
, _forceReselect(false)
|
||||||
|
{
|
||||||
|
setAttribute ( Qt::WA_DeleteOnClose );
|
||||||
|
setAttribute ( Qt::WA_QuitOnClose, false );
|
||||||
|
setContextMenuPolicy ( Qt::ActionsContextMenu );
|
||||||
|
|
||||||
|
_rowHeight = QFontMetrics(Graphics::getFixedFont()).height() + 4;
|
||||||
|
|
||||||
|
_sortModel->setSourceModel ( _baseModel );
|
||||||
|
_sortModel->setDynamicSortFilter ( true );
|
||||||
|
_sortModel->setFilterKeyColumn ( 0 );
|
||||||
|
|
||||||
|
_view->setShowGrid(false);
|
||||||
|
_view->setAlternatingRowColors(true);
|
||||||
|
_view->setSelectionBehavior(QAbstractItemView::SelectRows);
|
||||||
|
_view->setSortingEnabled(true);
|
||||||
|
_view->setModel ( _sortModel );
|
||||||
|
_view->horizontalHeader()->setStretchLastSection ( true );
|
||||||
|
|
||||||
|
QHeaderView* horizontalHeader = _view->horizontalHeader ();
|
||||||
|
horizontalHeader->setStretchLastSection ( true );
|
||||||
|
horizontalHeader->setMinimumSectionSize ( 200 );
|
||||||
|
|
||||||
|
QHeaderView* verticalHeader = _view->verticalHeader ();
|
||||||
|
verticalHeader->setVisible ( false );
|
||||||
|
|
||||||
|
_filterPatternLineEdit = new QLineEdit(this);
|
||||||
|
QLabel* filterPatternLabel = new QLabel(tr("&Filter pattern:"), this);
|
||||||
|
filterPatternLabel->setBuddy(_filterPatternLineEdit);
|
||||||
|
|
||||||
|
QGridLayout* gLayout = new QGridLayout();
|
||||||
|
gLayout->addWidget(_view , 1, 0, 1, 2);
|
||||||
|
gLayout->addWidget(filterPatternLabel , 2, 0);
|
||||||
|
gLayout->addWidget(_filterPatternLineEdit, 2, 1);
|
||||||
|
|
||||||
|
setLayout ( gLayout );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
QAction* fitErrorAction = new QAction ( tr("&Fit to Error"), this );
|
||||||
|
fitErrorAction->setShortcut ( QKeySequence(tr("CTRL+F")) );
|
||||||
|
fitErrorAction->setStatusTip ( tr("Fit the view to the Routing Error bounding box") );
|
||||||
|
addAction ( fitErrorAction );
|
||||||
|
|
||||||
|
connect ( _filterPatternLineEdit , SIGNAL(textChanged(const QString &))
|
||||||
|
, this , SLOT (textFilterChanged()) );
|
||||||
|
connect ( _view->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&,const QItemSelection&))
|
||||||
|
, this , SLOT (updateSelecteds (const QItemSelection&,const QItemSelection&)) );
|
||||||
|
connect ( _baseModel, SIGNAL(layoutChanged()), this, SLOT(forceRowHeight ()) );
|
||||||
|
|
||||||
|
connect ( fitErrorAction , SIGNAL(triggered ()), this, SLOT(fitToError ()) );
|
||||||
|
|
||||||
|
|
||||||
|
resize(300, 300);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RoutingErrorListWidget::fitToError ()
|
||||||
|
{
|
||||||
|
const RoutingError* routingError = _baseModel->getRoutingError ( _sortModel->mapToSource(_view->currentIndex()).row() );
|
||||||
|
|
||||||
|
if ( routingError )
|
||||||
|
{
|
||||||
|
_cellWidget->reframe(routingError->getBoundingBox().getInflated(DbU::lambda(30)),true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RoutingErrorListWidget::forceRowHeight ()
|
||||||
|
{
|
||||||
|
for ( int rows=_sortModel->rowCount()-1; rows >= 0 ; rows-- )
|
||||||
|
_view->setRowHeight ( rows, _rowHeight );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RoutingErrorListWidget::goTo ( int delta )
|
||||||
|
{
|
||||||
|
if ( delta == 0 ) return;
|
||||||
|
|
||||||
|
QModelIndex newIndex = _sortModel->index ( _view->currentIndex().row()+delta, 0, QModelIndex() );
|
||||||
|
|
||||||
|
if ( newIndex.isValid() )
|
||||||
|
_view->selectRow ( newIndex.row() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RoutingErrorListWidget::updateSelecteds ()
|
||||||
|
{
|
||||||
|
_forceReselect = true;
|
||||||
|
|
||||||
|
QItemSelection dummy;
|
||||||
|
updateSelecteds ( dummy, dummy );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RoutingErrorListWidget::updateSelecteds ( const QItemSelection& , const QItemSelection& )
|
||||||
|
{
|
||||||
|
if ( _cellWidget ) _cellWidget->openRefreshSession ();
|
||||||
|
|
||||||
|
_selecteds.resetAccesses ();
|
||||||
|
|
||||||
|
const RoutingError* routingError;
|
||||||
|
QModelIndexList iList = _view->selectionModel()->selectedRows();
|
||||||
|
for ( int i=0 ; i<iList.size() ; i++ ) {
|
||||||
|
|
||||||
|
routingError = _baseModel->getRoutingError ( _sortModel->mapToSource(iList[i]).row() );
|
||||||
|
if ( routingError ) {
|
||||||
|
|
||||||
|
_selecteds.insert ( routingError );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( _forceReselect ) {
|
||||||
|
_selecteds.forceInserteds();
|
||||||
|
_forceReselect = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
SelectedRoutingErrorSet::iterator remove;
|
||||||
|
SelectedRoutingErrorSet::iterator isel = _selecteds.begin ();
|
||||||
|
|
||||||
|
while ( isel != _selecteds.end() ) {
|
||||||
|
|
||||||
|
switch ( isel->getAccesses() ) {
|
||||||
|
case 1: break;
|
||||||
|
case 64:
|
||||||
|
for(set<Occurrence>::iterator i = isel->getRoutingError()->getAllOccurrences()->begin();i != isel->getRoutingError()->getAllOccurrences()->end();i++)
|
||||||
|
{
|
||||||
|
emit occurrenceSelected ( *i );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
for(set<Occurrence>::iterator i = isel->getRoutingError()->getAllOccurrences()->begin();i != isel->getRoutingError()->getAllOccurrences()->end();i++)
|
||||||
|
{
|
||||||
|
emit occurrenceUnselected ( *i );
|
||||||
|
}
|
||||||
|
remove = isel;
|
||||||
|
++isel;
|
||||||
|
_selecteds.erase ( remove );
|
||||||
|
continue;
|
||||||
|
default:
|
||||||
|
cerr << Bug("RoutingErrorListWidget::updateSelecteds(): invalid code %d"
|
||||||
|
,isel->getAccesses()) << endl;
|
||||||
|
}
|
||||||
|
++isel;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( _cellWidget ) _cellWidget->closeRefreshSession ();
|
||||||
|
_cellWidget->refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RoutingErrorListWidget::textFilterChanged ()
|
||||||
|
{
|
||||||
|
_sortModel->setFilterRegExp ( _filterPatternLineEdit->text() );
|
||||||
|
forceRowHeight ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
|
@ -0,0 +1,105 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | |
|
||||||
|
// | Updater : Bodin bruno |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./ShortCircuitError.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
#include <hurricane/Cell.h>
|
||||||
|
#include <solstice/SolsticeEngine.h>
|
||||||
|
#include <solstice/ShortCircuitError.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
using namespace Hurricane;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ShortCircuitError::ShortCircuitError(Cell*cell, const Occurrence&occurrence1, const Occurrence&occurrence2)
|
||||||
|
: RoutingError(cell,1)
|
||||||
|
{
|
||||||
|
_errorOccurrences = new set<Occurrence>;
|
||||||
|
_errorOccurrences->insert(occurrence1);
|
||||||
|
_errorOccurrences->insert(occurrence2);
|
||||||
|
|
||||||
|
if(occurrence1 < occurrence2) {
|
||||||
|
_occurrence1 = occurrence2;
|
||||||
|
_occurrence2 = occurrence1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_occurrence1 = occurrence1;
|
||||||
|
_occurrence2 = occurrence2;
|
||||||
|
}
|
||||||
|
|
||||||
|
_hypernet1 = SolsticeEngine::getTopNetOccurrence(_occurrence1);
|
||||||
|
_hypernet2 = SolsticeEngine::getTopNetOccurrence(_occurrence2);
|
||||||
|
_shortcircuitarea = _occurrence1.getBoundingBox().getIntersection(_occurrence2.getBoundingBox());
|
||||||
|
|
||||||
|
|
||||||
|
// forEach ( Component*, component, dynamic_cast<Net*>(_hypernet1.getEntity())->getComponents() ) {
|
||||||
|
// _occurrences->insert(Occurrence ( *component , _hypernet1.getPath() ) );
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// forEach ( Component*, component, dynamic_cast<Net*>(_hypernet2.getEntity())->getComponents() ) {
|
||||||
|
// _occurrences->insert(Occurrence ( *component , _hypernet2.getPath()) );
|
||||||
|
// }
|
||||||
|
//_occurrences->insert(Occurrence(this));
|
||||||
|
|
||||||
|
_occurrences->insert(_hypernet1);
|
||||||
|
_occurrences->insert(_hypernet2);
|
||||||
|
|
||||||
|
_area = _occurrence1.getBoundingBox().getUnion(_occurrence2.getBoundingBox());
|
||||||
|
_area = _shortcircuitarea;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
string ShortCircuitError::getErrorDescription ()const
|
||||||
|
{
|
||||||
|
return "contact invalide entre "
|
||||||
|
+ (_hypernet1).getEntity()->_getString() + " et "
|
||||||
|
+ (_hypernet2).getEntity()->_getString() ;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const Name& ShortCircuitError::getName () const {return _extensionName;} ;
|
||||||
|
int ShortCircuitError::getCount() const {return 1;};
|
||||||
|
set<Occurrence>* ShortCircuitError::getErrorOccurrences () const {return _errorOccurrences;};
|
||||||
|
|
||||||
|
|
||||||
|
string ShortCircuitError::_getString() const
|
||||||
|
// *****************************************
|
||||||
|
{
|
||||||
|
string s = " " + getString(getCell()->getName()) + " : Short-Circuit happen at the position : ";
|
||||||
|
s += getString(_shortcircuitarea) ;
|
||||||
|
s += "\n between " + getString(_occurrence1) + " of " + getString(_occurrence1.getBoundingBox()) + " of HyperNet " + getString(_hypernet1);
|
||||||
|
s += "\n and " + getString(_occurrence2) + " of " + getString(_occurrence2.getBoundingBox()) + " of HyperNet " + getString(_hypernet2);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Solstice namespace.
|
|
@ -0,0 +1,487 @@
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./SolsticeEngine.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
#include <hurricane/DataBase.h>
|
||||||
|
#include <hurricane/Cell.h>
|
||||||
|
#include <hurricane/Technology.h>
|
||||||
|
|
||||||
|
#include <crlcore/Utilities.h>
|
||||||
|
#include <crlcore/ToolEngine.h>
|
||||||
|
|
||||||
|
#include <equinox/Equi.h>
|
||||||
|
#include <equinox/Strategy.h>
|
||||||
|
#include <equinox/IntervalTree.h>
|
||||||
|
#include <equinox/Tiles.h>
|
||||||
|
#include <equinox/EquinoxEngine.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include <solstice/Brick.h>
|
||||||
|
#include <solstice/SolsticeEngine.h>
|
||||||
|
#include <solstice/BrickSweepLine.h>
|
||||||
|
#include <solstice/RoutingError.h>
|
||||||
|
#include <solstice/ShortCircuitError.h>
|
||||||
|
#include <solstice/DisconnectError.h>
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace Hurricane;
|
||||||
|
using Equinox::DefaultStrategy;
|
||||||
|
using Equinox::EquinoxEngine;
|
||||||
|
using Equinox::Equi;
|
||||||
|
using Equinox::CompByXmin;
|
||||||
|
using Equinox::CompByXmax;
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Solstice::SolsticeEngine".
|
||||||
|
|
||||||
|
Name SolsticeEngine::_toolName = "Solstice";
|
||||||
|
Strategy * SolsticeEngine::_strategy = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void SolsticeEngine::setStrategy (Strategy * s)
|
||||||
|
{
|
||||||
|
if (_strategy)
|
||||||
|
delete _strategy;
|
||||||
|
_strategy = s;
|
||||||
|
};
|
||||||
|
|
||||||
|
Strategy* SolsticeEngine::getStrategy ()
|
||||||
|
{
|
||||||
|
if (!_strategy) {
|
||||||
|
_strategy = new DefaultStrategy();
|
||||||
|
}
|
||||||
|
return _strategy;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Cell* SolsticeEngine::getCommonPath(Path path1, Path path2, Path& newpath1, Path& newpath2)
|
||||||
|
{
|
||||||
|
Instance * instance1 = path1.getHeadInstance();
|
||||||
|
Instance * instance2 = path2.getHeadInstance();
|
||||||
|
Path commonpath;
|
||||||
|
|
||||||
|
while(instance1==instance2)
|
||||||
|
{
|
||||||
|
if(!instance1) break;
|
||||||
|
|
||||||
|
path1 = path1.getTailPath();
|
||||||
|
path2 = path2.getTailPath();
|
||||||
|
|
||||||
|
commonpath = commonpath.isEmpty()?Path(instance1):Path(commonpath, instance1);
|
||||||
|
|
||||||
|
if(path1.isEmpty()) break;
|
||||||
|
if(path2.isEmpty()) break;
|
||||||
|
|
||||||
|
instance1 = path1.getHeadInstance();
|
||||||
|
instance2 = path2.getHeadInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
newpath1 = path1;
|
||||||
|
newpath2 = path2;
|
||||||
|
|
||||||
|
if (commonpath.isEmpty())
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return commonpath.getMasterCell();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SolsticeEngine* SolsticeEngine::create (Cell* cell)
|
||||||
|
{
|
||||||
|
SolsticeEngine* solstice = new SolsticeEngine ( cell );
|
||||||
|
|
||||||
|
if(!solstice){
|
||||||
|
throw Error("can't create Solstice : allocation failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
solstice->_postCreate ();
|
||||||
|
return solstice;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SolsticeEngine::_depthCreate(Cell * cell)
|
||||||
|
{
|
||||||
|
forEach(Instance*,instance, cell->getInstances())
|
||||||
|
{
|
||||||
|
Cell * subcell = (*instance)->getMasterCell();
|
||||||
|
SolsticeEngine * solstice = get(subcell);
|
||||||
|
if( (!(subcell->isLeaf())) && (!solstice) ) {
|
||||||
|
_depthCreate(subcell);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SolsticeEngine * solstice = get(cell);
|
||||||
|
if(!solstice)
|
||||||
|
create(cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SolsticeEngine* SolsticeEngine::get (const Cell* cell )
|
||||||
|
{
|
||||||
|
return static_cast<SolsticeEngine*>(ToolEngine::get(cell,_toolName));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Record* SolsticeEngine::_getRecord () const
|
||||||
|
{
|
||||||
|
Record* record = ToolEngine::_getRecord ();
|
||||||
|
return ( record );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SolsticeEngine::~SolsticeEngine ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
SolsticeEngine::SolsticeEngine (Cell* cell):
|
||||||
|
ToolEngine(cell),
|
||||||
|
_isCompared(false),
|
||||||
|
_routingErrors()
|
||||||
|
{
|
||||||
|
_routingErrors = new set<RoutingError*>;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void SolsticeEngine::_depthDestroy()
|
||||||
|
{
|
||||||
|
if(_cell->isLeaf())
|
||||||
|
return ;
|
||||||
|
else {
|
||||||
|
forEach(Instance*,instance, _cell->getInstances())
|
||||||
|
{
|
||||||
|
Cell * cell = (*instance)->getMasterCell();
|
||||||
|
SolsticeEngine * solstice = get(cell);
|
||||||
|
if(solstice) solstice->_depthDestroy();
|
||||||
|
}
|
||||||
|
this->destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void SolsticeEngine::compare()
|
||||||
|
{
|
||||||
|
// Verify the extractor Equinox
|
||||||
|
// ******************************
|
||||||
|
EquinoxEngine * equinox = EquinoxEngine::get(_cell);
|
||||||
|
if(!equinox){
|
||||||
|
throw Error("Can't do comparison, because the extractor haven't been created");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!(equinox->isExtracted())) {
|
||||||
|
throw Error("Can't do comparison, because the extraction haven't been done");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create CEngine Solstice for all models except standards models.
|
||||||
|
// *****************************************************************
|
||||||
|
_depthCreate(_cell);
|
||||||
|
|
||||||
|
// If repeat Comparison, flush those olds errors and reset flags to false.
|
||||||
|
// *************************************************************************
|
||||||
|
if(isCompared()) flushErrors();
|
||||||
|
|
||||||
|
// Run comparison and Print Statistique datas.
|
||||||
|
// *********************************************
|
||||||
|
runComparison();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void SolsticeEngine::runComparison()
|
||||||
|
{
|
||||||
|
map<Occurrence, set<Equi*> > map_hypernet2hyperequi;
|
||||||
|
set<Occurrence> hypernets;
|
||||||
|
EquinoxEngine * equinox = Equinox::EquinoxEngine::get(_cell);
|
||||||
|
|
||||||
|
forEach(Equi*,equi, equinox->getRoutingEquis())
|
||||||
|
{
|
||||||
|
forEach(Occurrence,occurrence, (*equi)->getAllOccurrences())
|
||||||
|
{
|
||||||
|
|
||||||
|
// Check Net Power/Ground/Global
|
||||||
|
//*******************************
|
||||||
|
Net * net = dynamic_cast<Net*>((*occurrence).getEntity());
|
||||||
|
if(!net)
|
||||||
|
net = dynamic_cast<Component*>((*occurrence).getEntity())->getNet();
|
||||||
|
|
||||||
|
if(net->isGlobal() || net->isGround() || net->isPower()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Add HyperNet
|
||||||
|
//**************
|
||||||
|
Occurrence hypernet = getTopNetOccurrence((*occurrence));
|
||||||
|
#ifdef ASSERT
|
||||||
|
assert(isHyperNetRootNetOccurrence(hypernet));
|
||||||
|
#endif
|
||||||
|
hypernets.insert(hypernet);
|
||||||
|
map_hypernet2hyperequi[hypernet].insert((*equi));
|
||||||
|
|
||||||
|
} //end of forEach occurrence
|
||||||
|
|
||||||
|
|
||||||
|
// ShortCircuits Detection
|
||||||
|
//*************************
|
||||||
|
if(hypernets.size() > 1) {
|
||||||
|
cmess1 << "[BUG] ShortCircuit Detection with " << hypernets.size() << " nets on same Equi" << endl;
|
||||||
|
for (set<Occurrence>::iterator i = hypernets.begin() ; i!= hypernets.end();i++)
|
||||||
|
cmess1 << " - Net " << (*i).getEntity()->_getString() << endl;
|
||||||
|
detectShortCircuit((*equi));
|
||||||
|
}
|
||||||
|
|
||||||
|
hypernets.clear();
|
||||||
|
|
||||||
|
} //end of forEach equi
|
||||||
|
|
||||||
|
|
||||||
|
// Disconnects Detection
|
||||||
|
//***********************
|
||||||
|
for (map<Occurrence, set<Equi*> >::iterator i = map_hypernet2hyperequi.begin();
|
||||||
|
i != map_hypernet2hyperequi.end();
|
||||||
|
i++)
|
||||||
|
{
|
||||||
|
if( (*i).second.size()>1 ) {
|
||||||
|
cmess1 << "[BUG] Disconnection Detection with " << (*i).second.size() << " equi for net " << (*i).first.getEntity()->_getString() << endl;
|
||||||
|
|
||||||
|
for (set<Equi*>::iterator j = (*i).second.begin();
|
||||||
|
j != (*i).second.end();
|
||||||
|
j++)
|
||||||
|
{
|
||||||
|
cmess1 << " - " << (*j) << endl ;
|
||||||
|
forEach(Occurrence,k,(*j)->getAllOccurrences()) {
|
||||||
|
cmess1 << " - " << (*k) << endl ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this->_routingErrors->insert(DisconnectError::create(getCell(),Occurrence((*i).first),(*i).second.size()));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
map_hypernet2hyperequi.clear();
|
||||||
|
setIsComparedTrue(_cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Occurrence SolsticeEngine::getTopNetOccurrence(Occurrence occurrence)
|
||||||
|
{
|
||||||
|
Path path = occurrence.getPath();
|
||||||
|
|
||||||
|
if( path.isEmpty() ) {
|
||||||
|
Net * net = dynamic_cast<Net*>(occurrence.getEntity());
|
||||||
|
if(net) {
|
||||||
|
return occurrence;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Component * component = dynamic_cast<Component*>(occurrence.getEntity());
|
||||||
|
if(!component)
|
||||||
|
throw Error("Unknow occurrence in EQUINOX::GetUpperNetOccurrence()");
|
||||||
|
return Occurrence(component->getNet());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Net * net = dynamic_cast<Net*>(occurrence.getEntity());
|
||||||
|
|
||||||
|
if(net) {
|
||||||
|
if( !(net->isExternal()) )
|
||||||
|
return occurrence;
|
||||||
|
Instance * tailinstance = path.getTailInstance();
|
||||||
|
Plug * plug = tailinstance->getPlug(net);
|
||||||
|
|
||||||
|
if( !(plug->isConnected()) )
|
||||||
|
return occurrence;
|
||||||
|
|
||||||
|
|
||||||
|
Net * uppernet = plug->getNet();
|
||||||
|
return getTopNetOccurrence(Occurrence(uppernet, path.getHeadPath()));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Component* component = dynamic_cast<Component*>(occurrence.getEntity());
|
||||||
|
return getTopNetOccurrence(Occurrence(component->getNet(), occurrence.getPath()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void SolsticeEngine::detectShortCircuit(Equi* equi)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Create Bricks for all component occurrences in this hyper-equi.
|
||||||
|
// ***************************************************************
|
||||||
|
vector<Brick*>* BricksByXmin = new vector<Brick*> ;
|
||||||
|
vector<Brick*>* BricksByXmax = new vector<Brick*> ;
|
||||||
|
|
||||||
|
forEach(Occurrence,occurrence, equi->getEquiComponentOccurrences()) {
|
||||||
|
Occurrence hypernet = getTopNetOccurrence((*occurrence));
|
||||||
|
Component* component = dynamic_cast<Component*>((*occurrence).getEntity());
|
||||||
|
|
||||||
|
Box box = (*occurrence).getBoundingBox();
|
||||||
|
|
||||||
|
forEach ( BasicLayer*, i, component->getLayer()->getBasicLayers() )
|
||||||
|
if (Strategy::isExtractableLayer(*i))
|
||||||
|
{
|
||||||
|
|
||||||
|
Brick * brick = Brick::create(hypernet, (*occurrence), box, *i);
|
||||||
|
BricksByXmin->push_back(brick);
|
||||||
|
BricksByXmax->push_back(brick);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Sort these two tables.
|
||||||
|
// *********************
|
||||||
|
sort< vector<Brick*>::iterator , CompByXmin<Brick*> > ( BricksByXmin->begin(), BricksByXmin->end(), CompByXmin<Brick*>() );
|
||||||
|
sort< vector<Brick*>::iterator , CompByXmax<Brick*> > ( (BricksByXmax->begin()), BricksByXmax->end(), CompByXmax<Brick*>() );
|
||||||
|
|
||||||
|
|
||||||
|
BrickSweepLine* sweepLine = BrickSweepLine::create(this,getStrategy());
|
||||||
|
|
||||||
|
sweepLine->run(BricksByXmin,BricksByXmax,false,0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void SolsticeEngine::setIsComparedTrue(Cell * cell)
|
||||||
|
{
|
||||||
|
SolsticeEngine * solstice = get(cell);
|
||||||
|
solstice->setIsCompared(true);
|
||||||
|
|
||||||
|
forEach(Instance*,instance, cell->getInstances())
|
||||||
|
{
|
||||||
|
Cell * subcell = (*instance)->getMasterCell();
|
||||||
|
SolsticeEngine * solstice = get(subcell);
|
||||||
|
if( (!(subcell->isLeaf())) && (!(solstice->isCompared())) )
|
||||||
|
setIsComparedTrue(subcell);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SolsticeEngine::getAllSolstices(Cell* cell, set<SolsticeEngine*>& solstices)
|
||||||
|
{
|
||||||
|
SolsticeEngine* solstice = get(cell);
|
||||||
|
solstices.insert(solstice);
|
||||||
|
forEach(Instance*,instance, cell->getInstances())
|
||||||
|
{
|
||||||
|
Cell * subcell = (*instance)->getMasterCell();
|
||||||
|
if( (!(subcell->isLeaf())) )
|
||||||
|
getAllSolstices(subcell, solstices);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void SolsticeEngine::insertInterval ( Brick*brick ,stack <Equinox::Interval*>* enumResultStack)
|
||||||
|
{
|
||||||
|
while( !(enumResultStack->empty()) ) {
|
||||||
|
Brick* findedbrick = dynamic_cast<Brick*>(enumResultStack->top());
|
||||||
|
enumResultStack->pop();
|
||||||
|
if(findedbrick->getHyperNet()!=brick->getHyperNet()) { // Shorts-Circuits
|
||||||
|
Occurrence occurrence1 = brick->getComponentOccurrence();
|
||||||
|
Occurrence occurrence2 = findedbrick->getComponentOccurrence();
|
||||||
|
Path newpath1;
|
||||||
|
Path newpath2;
|
||||||
|
|
||||||
|
Cell * errorcell = getCommonPath(occurrence1.getPath(), occurrence2.getPath(), newpath1, newpath2);
|
||||||
|
SolsticeEngine * solstice = NULL;
|
||||||
|
|
||||||
|
if(errorcell) {
|
||||||
|
solstice = get(errorcell);
|
||||||
|
|
||||||
|
if(!solstice) {
|
||||||
|
cout << getString(errorcell) <<endl;
|
||||||
|
throw Error("Can't get CEngine solstice in function SolsticeEngine::insertInterval");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else { // If errorcell is Null, the top-model is current model.
|
||||||
|
solstice = this;
|
||||||
|
errorcell = _cell;
|
||||||
|
}
|
||||||
|
|
||||||
|
ShortCircuitError* error = ShortCircuitError::create(
|
||||||
|
errorcell,
|
||||||
|
Occurrence(occurrence1.getEntity(), newpath1),
|
||||||
|
Occurrence(occurrence2.getEntity(), newpath2)
|
||||||
|
);
|
||||||
|
|
||||||
|
solstice->_routingErrors->insert(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void SolsticeEngine::removeInterval (Brick* item)
|
||||||
|
{
|
||||||
|
item->destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SolsticeEngine::clearErrors() {
|
||||||
|
for(set<RoutingError*>::iterator e = _routingErrors->begin();
|
||||||
|
e != _routingErrors->end() ;
|
||||||
|
e++)
|
||||||
|
(*e)->destroy();
|
||||||
|
_routingErrors->clear();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
void SolsticeEngine::flushErrors()
|
||||||
|
{
|
||||||
|
forEach(Instance*,instance, _cell->getInstances())
|
||||||
|
{
|
||||||
|
Cell * cell = (*instance)->getMasterCell();
|
||||||
|
SolsticeEngine * solstice = get(cell);
|
||||||
|
if( (!(cell->isLeaf())) && (solstice->isCompared()) ) {
|
||||||
|
solstice->flushErrors();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
clearErrors();
|
||||||
|
setIsCompared(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}// End of namespace Solstice
|
|
@ -0,0 +1,184 @@
|
||||||
|
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul CHAPUT |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Module : "./TabRoutingError.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include <QFrame>
|
||||||
|
#include <QHBoxLayout>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QCheckBox>
|
||||||
|
#include <QComboBox>
|
||||||
|
|
||||||
|
#include <hurricane/DataBase.h>
|
||||||
|
#include <hurricane/Cell.h>
|
||||||
|
#include <hurricane/Occurrence.h>
|
||||||
|
#include <hurricane/viewer/Graphics.h>
|
||||||
|
#include <hurricane/viewer/CellWidget.h>
|
||||||
|
#include <hurricane/viewer/ControllerWidget.h>
|
||||||
|
#include "hurricane/viewer/NetInformations.h"
|
||||||
|
#include <solstice/RoutingError.h>
|
||||||
|
#include <solstice/RoutingErrorListWidget.h>
|
||||||
|
#include <solstice/TabRoutingError.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Hurricane::TabRoutingError".
|
||||||
|
|
||||||
|
void TabRoutingError::select ( const RoutingError* error)
|
||||||
|
{
|
||||||
|
// cout << " TabRoutingError::SELECT" << flush;
|
||||||
|
forEach(Occurrence,occurrence,getCollection(error->getOccurrenceToSel())) {
|
||||||
|
// cout << " + 1" << flush;
|
||||||
|
getCellWidget()->select((*occurrence));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void TabRoutingError::unselect ( const RoutingError* error)
|
||||||
|
{
|
||||||
|
// cout << " TabRoutingError::UNSELECT" << flush;
|
||||||
|
forEach(Occurrence,occurrence,getCollection(error->getOccurrenceToSel())) {
|
||||||
|
// cout << " - 1" << flush;
|
||||||
|
getCellWidget()->unselect((*occurrence));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TabRoutingError::TabRoutingError ( QWidget* parent )
|
||||||
|
: ControllerTab (parent)
|
||||||
|
, _routingErrorBrowser (new RoutingErrorListWidget())
|
||||||
|
, _syncRoutingError (new QCheckBox())
|
||||||
|
, _syncSelection (new QCheckBox())
|
||||||
|
, _cwCumulativeSelection (false)
|
||||||
|
{
|
||||||
|
_routingErrorBrowser->setObjectName ( "controller.tabRoutingError.routingErrorBrowser" );
|
||||||
|
|
||||||
|
QVBoxLayout* wLayout = new QVBoxLayout ();
|
||||||
|
wLayout->setContentsMargins ( 10, 0, 10, 0 );
|
||||||
|
wLayout->setSpacing ( 0 );
|
||||||
|
|
||||||
|
_syncRoutingError->setText ( tr("Sync RoutingError") );
|
||||||
|
_syncRoutingError->setChecked ( false );
|
||||||
|
_syncRoutingError->setFont ( Graphics::getFixedFont(QFont::Bold,false,false) );
|
||||||
|
connect ( _syncRoutingError, SIGNAL(toggled(bool)), this, SLOT(setSyncRoutingError(bool)) );
|
||||||
|
|
||||||
|
_syncSelection->setText ( tr("Sync Selection") );
|
||||||
|
_syncSelection->setChecked ( false );
|
||||||
|
_syncSelection->setFont ( Graphics::getFixedFont(QFont::Bold,false,false) );
|
||||||
|
connect ( _syncSelection, SIGNAL(toggled(bool)), this, SLOT(setSyncSelection(bool)) );
|
||||||
|
|
||||||
|
QHBoxLayout* commands = new QHBoxLayout ();
|
||||||
|
commands->setContentsMargins ( 0, 0, 0, 0 );
|
||||||
|
commands->addStretch ();
|
||||||
|
commands->addWidget ( _syncRoutingError );
|
||||||
|
commands->addStretch ();
|
||||||
|
commands->addWidget ( _syncSelection );
|
||||||
|
commands->addStretch ();
|
||||||
|
wLayout->addLayout ( commands );
|
||||||
|
|
||||||
|
QFrame* separator = new QFrame ();
|
||||||
|
separator->setFrameShape ( QFrame::HLine );
|
||||||
|
separator->setFrameShadow ( QFrame::Sunken );
|
||||||
|
wLayout->addWidget ( separator );
|
||||||
|
wLayout->addWidget ( _routingErrorBrowser );
|
||||||
|
|
||||||
|
setLayout ( wLayout );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TabRoutingError::setSyncRoutingError ( bool state )
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( state && getCellWidget() ) {
|
||||||
|
_routingErrorBrowser->setCell<SimpleNetInformations> ( getCellWidget()->getCell() );
|
||||||
|
} else {
|
||||||
|
_routingErrorBrowser->setCell<SimpleNetInformations> ( NULL );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TabRoutingError::setSyncSelection ( bool state )
|
||||||
|
{
|
||||||
|
if ( state && getCellWidget() && _syncRoutingError->isChecked() ) {
|
||||||
|
_cwCumulativeSelection = getCellWidget()->cumulativeSelection();
|
||||||
|
if ( !_cwCumulativeSelection ) {
|
||||||
|
getCellWidget()->openRefreshSession ();
|
||||||
|
getCellWidget()->unselectAll ();
|
||||||
|
getCellWidget()->closeRefreshSession ();
|
||||||
|
}
|
||||||
|
getCellWidget()->setShowSelection ( true );
|
||||||
|
|
||||||
|
connect ( _routingErrorBrowser,
|
||||||
|
SIGNAL(routingErrorSelected (const RoutingError*)),
|
||||||
|
this,
|
||||||
|
SLOT(select (const RoutingError*)) );
|
||||||
|
|
||||||
|
connect ( _routingErrorBrowser,
|
||||||
|
SIGNAL(routingErrorUnselected(const RoutingError*)),
|
||||||
|
this,
|
||||||
|
SLOT(unselect(const RoutingError*)) );
|
||||||
|
|
||||||
|
_routingErrorBrowser->updateSelecteds ();
|
||||||
|
} else {
|
||||||
|
getCellWidget()->setShowSelection ( false );
|
||||||
|
getCellWidget()->setCumulativeSelection ( _cwCumulativeSelection );
|
||||||
|
_routingErrorBrowser->disconnect ( this, SLOT(select (const RoutingError*)) );
|
||||||
|
_routingErrorBrowser->disconnect ( this, SLOT(unselect(const RoutingError*)) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TabRoutingError::setCell ( Cell* cell )
|
||||||
|
{
|
||||||
|
setSyncRoutingError ( _syncRoutingError->isChecked() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TabRoutingError::setCellWidget ( CellWidget* cellWidget )
|
||||||
|
{
|
||||||
|
if ( getCellWidget() != cellWidget ) {
|
||||||
|
ControllerTab::setCellWidget ( cellWidget );
|
||||||
|
_routingErrorBrowser->setCellWidget<SimpleNetInformations> ( cellWidget );
|
||||||
|
if ( getCellWidget() ) {
|
||||||
|
connect ( getCellWidget(), SIGNAL(cellChanged(Cell*)), this, SLOT(setCell(Cell*)) );
|
||||||
|
}
|
||||||
|
setSyncRoutingError ( _syncRoutingError->isChecked() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TabRoutingError::cellPreModificate ()
|
||||||
|
{
|
||||||
|
_routingErrorBrowser->setCell<SimpleNetInformations> ( NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TabRoutingError::cellPostModificate ()
|
||||||
|
{
|
||||||
|
setSyncRoutingError ( _syncRoutingError->isChecked() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Solstice namespace.
|
|
@ -0,0 +1,143 @@
|
||||||
|
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul CHAPUT |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Module : "./TabRoutingErrorList.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
#include <QHBoxLayout>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QCheckBox>
|
||||||
|
|
||||||
|
#include <solstice/TabRoutingErrorList.h>
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Hurricane::TabRoutingErrorList".
|
||||||
|
|
||||||
|
|
||||||
|
TabRoutingErrorList::TabRoutingErrorList ( QWidget* parent )
|
||||||
|
: ControllerTab (parent)
|
||||||
|
, _routingErrorListBrowser (new RoutingErrorListWidget())
|
||||||
|
, _syncRoutingErrorList (new QCheckBox())
|
||||||
|
, _syncSelection (new QCheckBox())
|
||||||
|
, _cwCumulativeSelection(false)
|
||||||
|
{
|
||||||
|
_routingErrorListBrowser->setObjectName ( "controller.tabRoutingErrorList.routingErrorListBrowser" );
|
||||||
|
|
||||||
|
QVBoxLayout* wLayout = new QVBoxLayout ();
|
||||||
|
wLayout->setContentsMargins ( 10, 0, 10, 0 );
|
||||||
|
wLayout->setSpacing ( 0 );
|
||||||
|
|
||||||
|
_syncRoutingErrorList->setText ( tr("Sync RoutingErrorList") );
|
||||||
|
_syncRoutingErrorList->setChecked ( false );
|
||||||
|
_syncRoutingErrorList->setFont ( Graphics::getFixedFont(QFont::Bold,false,false) );
|
||||||
|
connect ( _syncRoutingErrorList, SIGNAL(toggled(bool)), this, SLOT(setSyncRoutingErrorList(bool)) );
|
||||||
|
|
||||||
|
_syncSelection->setText ( tr("Sync Selection") );
|
||||||
|
_syncSelection->setChecked ( false );
|
||||||
|
_syncSelection->setFont ( Graphics::getFixedFont(QFont::Bold,false,false) );
|
||||||
|
connect ( _syncSelection, SIGNAL(toggled(bool)), this, SLOT(setSyncSelection(bool)) );
|
||||||
|
|
||||||
|
QHBoxLayout* commands = new QHBoxLayout ();
|
||||||
|
commands->setContentsMargins ( 0, 0, 0, 0 );
|
||||||
|
commands->addStretch ();
|
||||||
|
commands->addWidget ( _syncRoutingErrorList );
|
||||||
|
commands->addStretch ();
|
||||||
|
commands->addWidget ( _syncSelection );
|
||||||
|
commands->addStretch ();
|
||||||
|
wLayout->addLayout ( commands );
|
||||||
|
|
||||||
|
QFrame* separator = new QFrame ();
|
||||||
|
separator->setFrameShape ( QFrame::HLine );
|
||||||
|
separator->setFrameShadow ( QFrame::Sunken );
|
||||||
|
wLayout->addWidget ( separator );
|
||||||
|
wLayout->addWidget ( _routingErrorListBrowser );
|
||||||
|
|
||||||
|
setLayout ( wLayout );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TabRoutingErrorList::setSyncRoutingErrorList ( bool state )
|
||||||
|
{
|
||||||
|
if ( state && getCellWidget() ) {
|
||||||
|
_routingErrorListBrowser->setCell<SimpleRoutingErrorInformations> ( getCellWidget()->getCell() );
|
||||||
|
} else {
|
||||||
|
_routingErrorListBrowser->setCell<SimpleRoutingErrorInformations> ( NULL );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TabRoutingErrorList::setSyncSelection ( bool state )
|
||||||
|
{
|
||||||
|
if ( state && getCellWidget() && _syncRoutingErrorList->isChecked() ) {
|
||||||
|
_cwCumulativeSelection = getCellWidget()->cumulativeSelection();
|
||||||
|
if ( !_cwCumulativeSelection ) {
|
||||||
|
getCellWidget()->openRefreshSession ();
|
||||||
|
getCellWidget()->unselectAll ();
|
||||||
|
getCellWidget()->closeRefreshSession ();
|
||||||
|
}
|
||||||
|
getCellWidget()->setShowSelection ( true );
|
||||||
|
connect ( _routingErrorListBrowser, SIGNAL(occurrenceSelected (const Occurrence)), getCellWidget(), SLOT(select (const Occurrence)) );
|
||||||
|
connect ( _routingErrorListBrowser, SIGNAL(occurrenceUnselected(const Occurrence)), getCellWidget(), SLOT(unselect(const Occurrence)) );
|
||||||
|
_routingErrorListBrowser->updateSelecteds ();
|
||||||
|
} else {
|
||||||
|
getCellWidget()->setShowSelection ( false );
|
||||||
|
getCellWidget()->setCumulativeSelection ( _cwCumulativeSelection );
|
||||||
|
_routingErrorListBrowser->disconnect ( getCellWidget(), SLOT(select (const Occurrence)) );
|
||||||
|
_routingErrorListBrowser->disconnect ( getCellWidget(), SLOT(unselect(const Occurrence)) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TabRoutingErrorList::setCell ( Cell* cell )
|
||||||
|
{
|
||||||
|
setSyncRoutingErrorList ( _syncRoutingErrorList->isChecked() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TabRoutingErrorList::setCellWidget ( CellWidget* cellWidget )
|
||||||
|
{
|
||||||
|
if ( getCellWidget() != cellWidget ) {
|
||||||
|
ControllerTab::setCellWidget ( cellWidget );
|
||||||
|
_routingErrorListBrowser->setCellWidget<SimpleRoutingErrorInformations> ( cellWidget );
|
||||||
|
if ( getCellWidget() ) {
|
||||||
|
connect ( getCellWidget(), SIGNAL(cellChanged(Cell*)), this, SLOT(setCell(Cell*)) );
|
||||||
|
}
|
||||||
|
setSyncRoutingErrorList ( _syncRoutingErrorList->isChecked() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TabRoutingErrorList::cellPreModificate ()
|
||||||
|
{
|
||||||
|
_routingErrorListBrowser->setCell<SimpleRoutingErrorInformations> ( NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TabRoutingErrorList::cellPostModificate ()
|
||||||
|
{
|
||||||
|
setSyncRoutingErrorList ( _syncRoutingErrorList->isChecked() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Solstice namespace.
|
|
@ -0,0 +1,131 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./GraphicSolsticeEngine.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "hurricane/Name.h"
|
||||||
|
#include "hurricane/Net.h"
|
||||||
|
#include "hurricane/Cell.h"
|
||||||
|
#include "solstice/RoutingErrorInformations.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "RoutingErrorInformations"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
RoutingErrorInformations::RoutingErrorInformations ( const RoutingError* error )
|
||||||
|
: _error(error)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
RoutingErrorInformations::~RoutingErrorInformations ()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "SimpleRoutingErrorInformations"
|
||||||
|
|
||||||
|
|
||||||
|
int RoutingErrorInformations::getColumnCount ()
|
||||||
|
{ return 3; }
|
||||||
|
|
||||||
|
|
||||||
|
QVariant RoutingErrorInformations::getColumnName ( int column )
|
||||||
|
{
|
||||||
|
switch ( column ) {
|
||||||
|
case 0: return QVariant(QObject::tr("Cell"));
|
||||||
|
case 1: return QVariant(QObject::tr("Type"));
|
||||||
|
case 2: return QVariant(QObject::tr("Description"));
|
||||||
|
}
|
||||||
|
return QVariant(QObject::tr("Column Out of Bound"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QVariant RoutingErrorInformations::getColumn ( int column )
|
||||||
|
{
|
||||||
|
switch ( column ) {
|
||||||
|
case 0: return QVariant(getString(getCell()->getName()).c_str());
|
||||||
|
case 1: return QVariant(getString(getName()).c_str());
|
||||||
|
case 2: return QVariant(getString(getDescription()).c_str());
|
||||||
|
}
|
||||||
|
return QVariant(QObject::tr("Column Out of Bound"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
RoutingErrorInformationsVector::~RoutingErrorInformationsVector ()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void RoutingErrorInformationsVector::addRoutingError ( const RoutingError* error )
|
||||||
|
{
|
||||||
|
_errorlist.push_back ( (error) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
RoutingErrorInformations* RoutingErrorInformationsVector::getRow ( int row )
|
||||||
|
{
|
||||||
|
if ( row >= (int)_errorlist.size() ) return NULL;
|
||||||
|
|
||||||
|
return &_errorlist[row];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int RoutingErrorInformationsVector::getColumnCount () const
|
||||||
|
{
|
||||||
|
return RoutingErrorInformations::getColumnCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
QVariant RoutingErrorInformationsVector::getColumnName ( int column ) const
|
||||||
|
{
|
||||||
|
return RoutingErrorInformations::getColumnName ( column );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int RoutingErrorInformationsVector::size () const
|
||||||
|
{
|
||||||
|
return _errorlist.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Solstice namespace.
|
|
@ -0,0 +1,145 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul CHAPUT |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Module : "./RoutingErrorModel.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#include <QFont>
|
||||||
|
#include <QApplication>
|
||||||
|
|
||||||
|
#include "hurricane/Name.h"
|
||||||
|
#include "hurricane/Net.h"
|
||||||
|
#include "hurricane/Cell.h"
|
||||||
|
#include "hurricane/viewer/Graphics.h"
|
||||||
|
#include "hurricane/viewer/NetInformations.h"
|
||||||
|
|
||||||
|
#include "solstice/RoutingErrorModel.h"
|
||||||
|
#include "solstice/RoutingError.h"
|
||||||
|
#include "solstice/ShortCircuitError.h"
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
|
||||||
|
RoutingErrorModel::RoutingErrorModel ( QObject* parent )
|
||||||
|
: QAbstractTableModel(parent)
|
||||||
|
, _cell(NULL)
|
||||||
|
, _routingError(NULL)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
RoutingErrorModel::~RoutingErrorModel ()
|
||||||
|
{
|
||||||
|
if ( _routingError ) delete _routingError;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QVariant RoutingErrorModel::data ( const QModelIndex& index, int role ) const
|
||||||
|
{
|
||||||
|
static QFont nameFont = Graphics::getFixedFont ( QFont::Bold );
|
||||||
|
static QFont valueFont = Graphics::getFixedFont ( QFont::Normal, true );
|
||||||
|
|
||||||
|
if ( role == Qt::SizeHintRole ) {
|
||||||
|
switch (index.column()) {
|
||||||
|
case 0: return 200;
|
||||||
|
default: return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( role == Qt::FontRole ) {
|
||||||
|
switch (index.column()) {
|
||||||
|
case 0: return nameFont;
|
||||||
|
default: return valueFont;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !index.isValid() ) return QVariant ();
|
||||||
|
|
||||||
|
if ( role == Qt::DisplayRole ) {
|
||||||
|
int row = index.row ();
|
||||||
|
return _routingError->getRow(row)->getColumn(index.column());
|
||||||
|
}
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QVariant RoutingErrorModel::headerData ( int section
|
||||||
|
, Qt::Orientation orientation
|
||||||
|
, int role ) const
|
||||||
|
{
|
||||||
|
if ( ( orientation == Qt::Vertical ) || (role != Qt::DisplayRole) )
|
||||||
|
return QVariant();
|
||||||
|
|
||||||
|
if ( !_routingError ) {
|
||||||
|
if ( section == 0 ) return QVariant("RoutingError");
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( section < _routingError->getColumnCount() )
|
||||||
|
return _routingError->getColumnName(section);
|
||||||
|
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int RoutingErrorModel::rowCount ( const QModelIndex& parent ) const
|
||||||
|
{
|
||||||
|
return (_routingError) ? _routingError->size() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int RoutingErrorModel::columnCount ( const QModelIndex& parent ) const
|
||||||
|
{
|
||||||
|
return (_routingError) ? _routingError->getColumnCount() : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const RoutingError* RoutingErrorModel::getRoutingError ( int row )
|
||||||
|
{
|
||||||
|
if ( !_routingError || ( row >= (int)_routingError->size() ) ) return NULL;
|
||||||
|
|
||||||
|
return _routingError->getRow(row)->getRoutingError();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RoutingErrorModel::setCell ( Cell* cell )
|
||||||
|
{
|
||||||
|
if ( _cell != cell ) {
|
||||||
|
if ( _cell )
|
||||||
|
delete _routingError;
|
||||||
|
|
||||||
|
_cell = cell;
|
||||||
|
_routingError = new RoutingErrorInformationsVector();
|
||||||
|
if ( _cell ) {
|
||||||
|
SolsticeEngine* solstice = SolsticeEngine::get(_cell);
|
||||||
|
if (solstice) {
|
||||||
|
forEach(RoutingError*, sce ,getCollection(solstice->getRoutingErrorSet()))
|
||||||
|
{
|
||||||
|
_routingError->addRoutingError((*sce));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
emit layoutChanged ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // End of Solstice namespace.
|
|
@ -0,0 +1,247 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | H U R R I C A N E |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul CHAPUT |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Module : "./RoutingErrorWidget.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#include <QFontMetrics>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QLineEdit>
|
||||||
|
#include <QHeaderView>
|
||||||
|
#include <QKeyEvent>
|
||||||
|
#include <QGroupBox>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QAction>
|
||||||
|
|
||||||
|
#include "hurricane/Commons.h"
|
||||||
|
#include "hurricane/Net.h"
|
||||||
|
|
||||||
|
#include "hurricane/viewer/Graphics.h"
|
||||||
|
#include "solstice/RoutingErrorModel.h"
|
||||||
|
#include "solstice/RoutingErrorWidget.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
|
||||||
|
using namespace Hurricane;
|
||||||
|
|
||||||
|
|
||||||
|
} // End of anonymous namespace.
|
||||||
|
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
|
||||||
|
RoutingErrorWidget::RoutingErrorWidget ( QWidget* parent )
|
||||||
|
: QWidget (parent)
|
||||||
|
, _cellWidget (NULL)
|
||||||
|
, _cell (NULL)
|
||||||
|
, _baseModel (new RoutingErrorModel(this))
|
||||||
|
, _sortModel (new QSortFilterProxyModel(this))
|
||||||
|
, _view (new QTableView(this))
|
||||||
|
, _rowHeight (20)
|
||||||
|
, _selecteds ()
|
||||||
|
, _forceReselect(false)
|
||||||
|
{
|
||||||
|
setAttribute ( Qt::WA_DeleteOnClose );
|
||||||
|
setAttribute ( Qt::WA_QuitOnClose, false );
|
||||||
|
setContextMenuPolicy ( Qt::ActionsContextMenu );
|
||||||
|
|
||||||
|
_rowHeight = QFontMetrics(Graphics::getFixedFont()).height() + 4;
|
||||||
|
|
||||||
|
_sortModel->setSourceModel ( _baseModel );
|
||||||
|
_sortModel->setDynamicSortFilter ( true );
|
||||||
|
_sortModel->setFilterKeyColumn ( 0 );
|
||||||
|
|
||||||
|
_view->setShowGrid(false);
|
||||||
|
_view->setAlternatingRowColors(true);
|
||||||
|
_view->setSelectionBehavior(QAbstractItemView::SelectRows);
|
||||||
|
_view->setSortingEnabled(true);
|
||||||
|
_view->setModel ( _sortModel );
|
||||||
|
_view->horizontalHeader()->setStretchLastSection ( true );
|
||||||
|
|
||||||
|
QHeaderView* horizontalHeader = _view->horizontalHeader ();
|
||||||
|
horizontalHeader->setStretchLastSection ( true );
|
||||||
|
horizontalHeader->setMinimumSectionSize ( 200 );
|
||||||
|
|
||||||
|
QHeaderView* verticalHeader = _view->verticalHeader ();
|
||||||
|
verticalHeader->setVisible ( false );
|
||||||
|
|
||||||
|
_filterPatternLineEdit = new QLineEdit(this);
|
||||||
|
QLabel* filterPatternLabel = new QLabel(tr("&Filter pattern:"), this);
|
||||||
|
filterPatternLabel->setBuddy(_filterPatternLineEdit);
|
||||||
|
|
||||||
|
QGridLayout* gLayout = new QGridLayout();
|
||||||
|
gLayout->addWidget(_view , 1, 0, 1, 2);
|
||||||
|
gLayout->addWidget(filterPatternLabel , 2, 0);
|
||||||
|
gLayout->addWidget(_filterPatternLineEdit, 2, 1);
|
||||||
|
|
||||||
|
setLayout ( gLayout );
|
||||||
|
|
||||||
|
QAction* fitAction = new QAction ( tr("&Fit to Error"), this );
|
||||||
|
fitAction->setShortcut ( QKeySequence(tr("CTRL+F")) );
|
||||||
|
fitAction->setStatusTip ( tr("Fit the view to the Error's bounding box") );
|
||||||
|
addAction ( fitAction );
|
||||||
|
|
||||||
|
connect ( _filterPatternLineEdit , SIGNAL(textChanged(const QString &))
|
||||||
|
, this , SLOT (textFilterChanged()) );
|
||||||
|
connect ( _view->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&,const QItemSelection&))
|
||||||
|
, this , SLOT (updateSelecteds (const QItemSelection&,const QItemSelection&)) );
|
||||||
|
connect ( _baseModel, SIGNAL(layoutChanged()), this, SLOT(forceRowHeight ()) );
|
||||||
|
connect ( fitAction , SIGNAL(triggered ()), this, SLOT(fitToRoutingError ()) );
|
||||||
|
|
||||||
|
resize(300, 300);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RoutingErrorWidget::forceRowHeight ()
|
||||||
|
{
|
||||||
|
for ( int rows=_sortModel->rowCount()-1; rows >= 0 ; rows-- )
|
||||||
|
_view->setRowHeight ( rows, _rowHeight );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RoutingErrorWidget::goTo ( int delta )
|
||||||
|
{
|
||||||
|
if ( delta == 0 ) return;
|
||||||
|
|
||||||
|
QModelIndex newIndex = _sortModel->index ( _view->currentIndex().row()+delta, 0, QModelIndex() );
|
||||||
|
|
||||||
|
if ( newIndex.isValid() )
|
||||||
|
_view->selectRow ( newIndex.row() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RoutingErrorWidget::updateSelecteds ()
|
||||||
|
{
|
||||||
|
_forceReselect = true;
|
||||||
|
|
||||||
|
QItemSelection dummy;
|
||||||
|
updateSelecteds ( dummy, dummy );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RoutingErrorWidget::updateSelecteds ( const QItemSelection& , const QItemSelection& )
|
||||||
|
{
|
||||||
|
if ( _cellWidget ) _cellWidget->openRefreshSession ();
|
||||||
|
|
||||||
|
_selecteds.resetAccesses ();
|
||||||
|
|
||||||
|
const RoutingError* error;
|
||||||
|
QModelIndexList iList = _view->selectionModel()->selectedRows();
|
||||||
|
for ( int i=0 ; i<iList.size() ; i++ ) {
|
||||||
|
cout << "yuvhchgc" <<flush;
|
||||||
|
error = _baseModel->getRoutingError ( _sortModel->mapToSource(iList[i]).row() );
|
||||||
|
cout << error->getName();
|
||||||
|
if ( error ) {
|
||||||
|
_selecteds.insert ( error );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( _forceReselect ) {
|
||||||
|
_selecteds.forceInserteds();
|
||||||
|
_forceReselect = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
SelectedRoutingErrorSet::iterator remove;
|
||||||
|
SelectedRoutingErrorSet::iterator isel = _selecteds.begin ();
|
||||||
|
while ( isel != _selecteds.end() ) {
|
||||||
|
switch ( isel->getAccesses() ) {
|
||||||
|
case 1:
|
||||||
|
emit routingErrorSelected ( isel->getRoutingError() );
|
||||||
|
cout << "EMIT NONE" << flush; break;
|
||||||
|
case 64:
|
||||||
|
cout << "EMIT SELECT" << flush;
|
||||||
|
emit routingErrorSelected ( isel->getRoutingError() );
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
cout << "EMIT UNSELECT" << flush;
|
||||||
|
emit routingErrorUnselected ( isel->getRoutingError() );
|
||||||
|
remove = isel;
|
||||||
|
++isel;
|
||||||
|
_selecteds.erase ( remove );
|
||||||
|
continue;
|
||||||
|
default:
|
||||||
|
cerr << Bug("RoutingErrorWidget::updateSelecteds(): invalid code %d"
|
||||||
|
,isel->getAccesses()) << endl;
|
||||||
|
}
|
||||||
|
++isel;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( _cellWidget ) _cellWidget->closeRefreshSession ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RoutingErrorWidget::textFilterChanged ()
|
||||||
|
{
|
||||||
|
_sortModel->setFilterRegExp ( _filterPatternLineEdit->text() );
|
||||||
|
forceRowHeight ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RoutingErrorWidget::fitToRoutingError ()
|
||||||
|
{
|
||||||
|
const RoutingError* routingError = _baseModel->getRoutingError ( _sortModel->mapToSource(_view->currentIndex()).row() );
|
||||||
|
if ( routingError ) emit routingErrorFitted ( routingError );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void RoutingErrorWidget::setCellWidget ( CellWidget* cw )
|
||||||
|
{
|
||||||
|
if ( _cellWidget ) {
|
||||||
|
disconnect ( this, 0, _cellWidget, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
_cellWidget = cw;
|
||||||
|
if ( _cellWidget ) {
|
||||||
|
setCell ( _cellWidget->getCell() );
|
||||||
|
/*TODO*/
|
||||||
|
// connect ( this, SIGNAL(routingErrorFitted(const RoutingError*)), _cellWidget, SLOT(fitToNet (const Net*)) );
|
||||||
|
} else
|
||||||
|
|
||||||
|
setCell ( NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RoutingErrorWidget::setCell ( Cell* cell )
|
||||||
|
{
|
||||||
|
_cell = cell;
|
||||||
|
_view->selectionModel()->clear ();
|
||||||
|
_baseModel->setCell ( cell );
|
||||||
|
|
||||||
|
string windowTitle = "RoutingError" + getString(cell);
|
||||||
|
setWindowTitle ( tr(windowTitle.c_str()) );
|
||||||
|
|
||||||
|
int rows = _sortModel->rowCount ();
|
||||||
|
for ( rows-- ; rows >= 0 ; rows-- )
|
||||||
|
_view->setRowHeight ( rows, _rowHeight );
|
||||||
|
_view->selectRow ( 0 );
|
||||||
|
_view->resizeColumnToContents ( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Solstice namespace.
|
|
@ -0,0 +1,184 @@
|
||||||
|
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul CHAPUT |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Module : "./TabRoutingError.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include <QFrame>
|
||||||
|
#include <QHBoxLayout>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QCheckBox>
|
||||||
|
#include <QComboBox>
|
||||||
|
|
||||||
|
#include <hurricane/DataBase.h>
|
||||||
|
#include <hurricane/Cell.h>
|
||||||
|
#include <hurricane/Occurrence.h>
|
||||||
|
#include <hurricane/viewer/Graphics.h>
|
||||||
|
#include <hurricane/viewer/CellWidget.h>
|
||||||
|
#include <hurricane/viewer/ControllerWidget.h>
|
||||||
|
#include "hurricane/viewer/NetInformations.h"
|
||||||
|
#include <solstice/RoutingError.h>
|
||||||
|
#include <solstice/RoutingErrorListWidget.h>
|
||||||
|
#include <solstice/TabRoutingError.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Hurricane::TabRoutingError".
|
||||||
|
|
||||||
|
void TabRoutingError::select ( const RoutingError* error)
|
||||||
|
{
|
||||||
|
cout << " TabRoutingError::SELECT" << flush;
|
||||||
|
forEach(Occurrence,occurrence,getCollection(error->getOccurrenceToSel())) {
|
||||||
|
cout << " + 1" << flush;
|
||||||
|
getCellWidget()->select((*occurrence));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void TabRoutingError::unselect ( const RoutingError* error)
|
||||||
|
{
|
||||||
|
cout << " TabRoutingError::UNSELECT" << flush;
|
||||||
|
forEach(Occurrence,occurrence,getCollection(error->getOccurrenceToSel())) {
|
||||||
|
cout << " - 1" << flush;
|
||||||
|
getCellWidget()->unselect((*occurrence));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TabRoutingError::TabRoutingError ( QWidget* parent )
|
||||||
|
: ControllerTab (parent)
|
||||||
|
, _routingErrorBrowser (new RoutingErrorListWidget())
|
||||||
|
, _syncRoutingError (new QCheckBox())
|
||||||
|
, _syncSelection (new QCheckBox())
|
||||||
|
, _cwCumulativeSelection (false)
|
||||||
|
{
|
||||||
|
_routingErrorBrowser->setObjectName ( "controller.tabRoutingError.routingErrorBrowser" );
|
||||||
|
|
||||||
|
QVBoxLayout* wLayout = new QVBoxLayout ();
|
||||||
|
wLayout->setContentsMargins ( 10, 0, 10, 0 );
|
||||||
|
wLayout->setSpacing ( 0 );
|
||||||
|
|
||||||
|
_syncRoutingError->setText ( tr("Sync RoutingError") );
|
||||||
|
_syncRoutingError->setChecked ( false );
|
||||||
|
_syncRoutingError->setFont ( Graphics::getFixedFont(QFont::Bold,false,false) );
|
||||||
|
connect ( _syncRoutingError, SIGNAL(toggled(bool)), this, SLOT(setSyncRoutingError(bool)) );
|
||||||
|
|
||||||
|
_syncSelection->setText ( tr("Sync Selection") );
|
||||||
|
_syncSelection->setChecked ( false );
|
||||||
|
_syncSelection->setFont ( Graphics::getFixedFont(QFont::Bold,false,false) );
|
||||||
|
connect ( _syncSelection, SIGNAL(toggled(bool)), this, SLOT(setSyncSelection(bool)) );
|
||||||
|
|
||||||
|
QHBoxLayout* commands = new QHBoxLayout ();
|
||||||
|
commands->setContentsMargins ( 0, 0, 0, 0 );
|
||||||
|
commands->addStretch ();
|
||||||
|
commands->addWidget ( _syncRoutingError );
|
||||||
|
commands->addStretch ();
|
||||||
|
commands->addWidget ( _syncSelection );
|
||||||
|
commands->addStretch ();
|
||||||
|
wLayout->addLayout ( commands );
|
||||||
|
|
||||||
|
QFrame* separator = new QFrame ();
|
||||||
|
separator->setFrameShape ( QFrame::HLine );
|
||||||
|
separator->setFrameShadow ( QFrame::Sunken );
|
||||||
|
wLayout->addWidget ( separator );
|
||||||
|
wLayout->addWidget ( _routingErrorBrowser );
|
||||||
|
|
||||||
|
setLayout ( wLayout );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TabRoutingError::setSyncRoutingError ( bool state )
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( state && getCellWidget() ) {
|
||||||
|
_routingErrorBrowser->setCell<SimpleNetInformations> ( getCellWidget()->getCell() );
|
||||||
|
} else {
|
||||||
|
_routingErrorBrowser->setCell<SimpleNetInformations> ( NULL );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TabRoutingError::setSyncSelection ( bool state )
|
||||||
|
{
|
||||||
|
if ( state && getCellWidget() && _syncRoutingError->isChecked() ) {
|
||||||
|
_cwCumulativeSelection = getCellWidget()->cumulativeSelection();
|
||||||
|
if ( !_cwCumulativeSelection ) {
|
||||||
|
getCellWidget()->openRefreshSession ();
|
||||||
|
getCellWidget()->unselectAll ();
|
||||||
|
getCellWidget()->closeRefreshSession ();
|
||||||
|
}
|
||||||
|
getCellWidget()->setShowSelection ( true );
|
||||||
|
|
||||||
|
connect ( _routingErrorBrowser,
|
||||||
|
SIGNAL(routingErrorSelected (const RoutingError*)),
|
||||||
|
this,
|
||||||
|
SLOT(select (const RoutingError*)) );
|
||||||
|
|
||||||
|
connect ( _routingErrorBrowser,
|
||||||
|
SIGNAL(routingErrorUnselected(const RoutingError*)),
|
||||||
|
this,
|
||||||
|
SLOT(unselect(const RoutingError*)) );
|
||||||
|
|
||||||
|
_routingErrorBrowser->updateSelecteds ();
|
||||||
|
} else {
|
||||||
|
getCellWidget()->setShowSelection ( false );
|
||||||
|
getCellWidget()->setCumulativeSelection ( _cwCumulativeSelection );
|
||||||
|
_routingErrorBrowser->disconnect ( this, SLOT(select (const RoutingError*)) );
|
||||||
|
_routingErrorBrowser->disconnect ( this, SLOT(unselect(const RoutingError*)) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TabRoutingError::setCell ( Cell* cell )
|
||||||
|
{
|
||||||
|
setSyncRoutingError ( _syncRoutingError->isChecked() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TabRoutingError::setCellWidget ( CellWidget* cellWidget )
|
||||||
|
{
|
||||||
|
if ( getCellWidget() != cellWidget ) {
|
||||||
|
ControllerTab::setCellWidget ( cellWidget );
|
||||||
|
_routingErrorBrowser->setCellWidget<SimpleNetInformations> ( cellWidget );
|
||||||
|
if ( getCellWidget() ) {
|
||||||
|
connect ( getCellWidget(), SIGNAL(cellChanged(Cell*)), this, SLOT(setCell(Cell*)) );
|
||||||
|
}
|
||||||
|
setSyncRoutingError ( _syncRoutingError->isChecked() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TabRoutingError::cellPreModificate ()
|
||||||
|
{
|
||||||
|
_routingErrorBrowser->setCell<SimpleNetInformations> ( NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TabRoutingError::cellPostModificate ()
|
||||||
|
{
|
||||||
|
setSyncRoutingError ( _syncRoutingError->isChecked() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Solstice namespace.
|
|
@ -0,0 +1,110 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./Brick.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __SOLSTICE_BRICK__
|
||||||
|
#define __SOLSTICE_BRICK__
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Occurrence;
|
||||||
|
class Box;
|
||||||
|
class BasicLayer;
|
||||||
|
class Unit;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Equinox {
|
||||||
|
class Interval;
|
||||||
|
}
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using Equinox::Interval;
|
||||||
|
using Hurricane::Occurrence;
|
||||||
|
using Hurricane::Box;
|
||||||
|
using Hurricane::BasicLayer;
|
||||||
|
using Hurricane::DbU;
|
||||||
|
class Brick : public Interval
|
||||||
|
{
|
||||||
|
|
||||||
|
public :
|
||||||
|
static Brick* create(const Occurrence&, const Occurrence&, const Box&, BasicLayer*);
|
||||||
|
void destroy();
|
||||||
|
|
||||||
|
|
||||||
|
public :
|
||||||
|
|
||||||
|
/**/ bool isEmpty () const;
|
||||||
|
/**/ string _getString() const;
|
||||||
|
|
||||||
|
/**/ const DbU::Unit& getXmin() const;
|
||||||
|
/**/ const DbU::Unit& getYmin() const;
|
||||||
|
/**/ const DbU::Unit& getXmax() const;
|
||||||
|
/**/ const DbU::Unit& getYmax() const;
|
||||||
|
inline const Box& getBoundingBox();
|
||||||
|
inline const Occurrence& getHyperNet();
|
||||||
|
inline const Occurrence& getComponentOccurrence() const;
|
||||||
|
inline BasicLayer* getBasicLayer();
|
||||||
|
virtual long GetLowPoint() const;
|
||||||
|
virtual long GetHighPoint() const;
|
||||||
|
|
||||||
|
|
||||||
|
private :
|
||||||
|
Occurrence _hypernet;
|
||||||
|
Occurrence _componentoccurrence;
|
||||||
|
Box _box;
|
||||||
|
BasicLayer* _basicLayer;
|
||||||
|
|
||||||
|
protected :
|
||||||
|
Brick(const Occurrence& ,const Occurrence&, const Box&, BasicLayer*);
|
||||||
|
virtual ~Brick();
|
||||||
|
|
||||||
|
private :
|
||||||
|
Brick(const Brick&);
|
||||||
|
Brick& operator=(const Brick&);
|
||||||
|
|
||||||
|
}; // End of class Brick
|
||||||
|
|
||||||
|
|
||||||
|
// Inline Functions.
|
||||||
|
inline const Box& Brick::getBoundingBox() { return _box; };
|
||||||
|
inline const Occurrence& Brick::getHyperNet() { return _hypernet; };
|
||||||
|
inline const Occurrence& Brick::getComponentOccurrence() const { return _componentoccurrence; };
|
||||||
|
inline BasicLayer* Brick::getBasicLayer(){ return _basicLayer; };
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Equinox namespace.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __SOLSTICE_BRICK__
|
|
@ -0,0 +1,45 @@
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./BrickSweepLine.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
#ifndef _SOLSTICE_BRICKSWEEPLINE_H
|
||||||
|
#define _SOLSTICE_BRICKSWEEPLINE_H
|
||||||
|
|
||||||
|
#include "equinox/SweepLine.h"
|
||||||
|
namespace Equinox {
|
||||||
|
|
||||||
|
template<typename ITEM,typename ENGINE>
|
||||||
|
class SweepLine;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
class Brick;
|
||||||
|
class SolsticeEngine;
|
||||||
|
|
||||||
|
|
||||||
|
typedef Equinox::SweepLine<Brick*,SolsticeEngine*> BrickSweepLine;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //_SOLSTICE_BRICKSWEEPLINE_H
|
|
@ -0,0 +1,76 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | |
|
||||||
|
// | Updater : Bodin bruno |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./solstice/DisconnectError.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
#ifndef __SOLSTICE_DISCONNECT_ERROR__
|
||||||
|
#define __SOLSTICE_DISCONNECT_ERROR__
|
||||||
|
|
||||||
|
#include <solstice/RoutingError.h>
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class DisconnectError : public RoutingError
|
||||||
|
{
|
||||||
|
|
||||||
|
public :
|
||||||
|
inline static DisconnectError* create (Cell* cell,
|
||||||
|
const Occurrence& occurrence,
|
||||||
|
int count);
|
||||||
|
|
||||||
|
public :
|
||||||
|
//Champs ListBox
|
||||||
|
|
||||||
|
inline virtual const Name& getName () const ;
|
||||||
|
inline virtual string getErrorName () const ;
|
||||||
|
/**/ virtual string getErrorDescription () const ;
|
||||||
|
inline virtual set<Occurrence>* getErrorOccurrences () const ;
|
||||||
|
|
||||||
|
|
||||||
|
private :
|
||||||
|
/**/ DisconnectError (Cell* cell,
|
||||||
|
const Occurrence& occurrence,
|
||||||
|
int count);
|
||||||
|
/**/ virtual ~DisconnectError () ;
|
||||||
|
private :
|
||||||
|
/**/ Occurrence _occurrence;
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
//inlines
|
||||||
|
|
||||||
|
inline set<Occurrence>* DisconnectError::getErrorOccurrences () const {return _occurrences;};
|
||||||
|
inline const Name& DisconnectError::getName () const {return _extensionName;} ;
|
||||||
|
inline string DisconnectError::getErrorName () const {return "Deconnexion";};
|
||||||
|
inline DisconnectError* DisconnectError::create (Cell* cell, const Occurrence& occurrence, int count) { DisconnectError* de = new DisconnectError (cell,occurrence,count); de->_postCreate(); return de;};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Solstice namespace.
|
||||||
|
|
||||||
|
#endif // __SOLSTICE_DISCONNECT_ERROR__
|
|
@ -0,0 +1,112 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./GraphicSolsticeEngine.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __SOLSTICE_GRAPHIC_SOLSTICE_ENGINE__
|
||||||
|
#define __SOLSTICE_GRAPHIC_SOLSTICE_ENGINE__
|
||||||
|
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "crlcore/GraphicToolEngine.h"
|
||||||
|
// #include "solstice/TabRoutingError.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
class Go;
|
||||||
|
class BasicLayer;
|
||||||
|
class Transformation;
|
||||||
|
class CellWidget;
|
||||||
|
class CellViewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
|
||||||
|
using Hurricane::Cell;
|
||||||
|
using Hurricane::Go;
|
||||||
|
using Hurricane::Box;
|
||||||
|
using Hurricane::BasicLayer;
|
||||||
|
using Hurricane::Transformation;
|
||||||
|
using Hurricane::CellWidget;
|
||||||
|
using Hurricane::CellViewer;
|
||||||
|
using CRL::GraphicTool;
|
||||||
|
using CRL::Name;
|
||||||
|
|
||||||
|
class SolsticeEngine;
|
||||||
|
class TabRoutingErrorList;
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Solstice::GraphicSolsticeEngine".
|
||||||
|
|
||||||
|
|
||||||
|
class GraphicSolsticeEngine : public GraphicTool {
|
||||||
|
Q_OBJECT;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**/ static void initSolsticeRoutingError ( CellWidget* );
|
||||||
|
/**/ static void drawSolsticeRoutingError ( CellWidget*
|
||||||
|
, const Go*
|
||||||
|
, const BasicLayer*
|
||||||
|
, const Box&
|
||||||
|
, const Transformation&
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**/ SolsticeEngine* createEngine ();
|
||||||
|
/**/ static GraphicSolsticeEngine* grab ();
|
||||||
|
/**/ virtual const Name& getName () const;
|
||||||
|
/**/ Cell* getCell ();
|
||||||
|
/**/ virtual size_t release ();
|
||||||
|
/**/ virtual void addToMenu ( CellViewer* );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
/**/ void test ();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
static size_t _references;
|
||||||
|
static GraphicSolsticeEngine*_singleton;
|
||||||
|
/**/ CellViewer* _viewer;
|
||||||
|
/**/ TabRoutingErrorList* _tabRoutingErrorList;
|
||||||
|
protected:
|
||||||
|
/**/ GraphicSolsticeEngine ();
|
||||||
|
virtual ~GraphicSolsticeEngine ();
|
||||||
|
|
||||||
|
}; //end of class GraphicSolsticeEngine
|
||||||
|
|
||||||
|
} // End of Solstice namespace.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _SOLSTICE__GRAPHIC_SOLSTICE_ENGINE__
|
|
@ -0,0 +1,104 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | |
|
||||||
|
// | Updater : Bodin bruno |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./solstice/RoutingError.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
#ifndef __SOLSTICE_ROUTING_ERROR__
|
||||||
|
#define __SOLSTICE_ROUTING_ERROR__
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <set>
|
||||||
|
|
||||||
|
#include <hurricane/DbU.h>
|
||||||
|
#include <hurricane/Occurrence.h>
|
||||||
|
#include <hurricane/ExtensionGo.h>
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
class Box;
|
||||||
|
class Net;
|
||||||
|
class Cell;
|
||||||
|
class Name;
|
||||||
|
class Occurrence;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace Hurricane;
|
||||||
|
|
||||||
|
class RoutingError : public ExtensionGo
|
||||||
|
{
|
||||||
|
|
||||||
|
public :
|
||||||
|
inline Cell * getCell () const ;
|
||||||
|
inline Box getBoundingBox () const ;
|
||||||
|
inline int getCount () const ;
|
||||||
|
inline set<Occurrence>* getAllOccurrences () const ;
|
||||||
|
/**/ virtual set<Occurrence>* getErrorOccurrences () const = 0;
|
||||||
|
inline void destroy ();
|
||||||
|
|
||||||
|
//Champs ListBox
|
||||||
|
/**/ virtual const Name& getName () const = 0;
|
||||||
|
/**/ virtual string getErrorName () const = 0;
|
||||||
|
/**/ virtual string getErrorDescription () const = 0;
|
||||||
|
|
||||||
|
//ExtensionGO inherited
|
||||||
|
/**/ void translate ( const DbU::Unit& dx,
|
||||||
|
const DbU::Unit& dy );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
inline void _postCreate ();
|
||||||
|
inline void _preDestroy ();
|
||||||
|
/**/ RoutingError (Cell * cell,
|
||||||
|
int count);
|
||||||
|
virtual ~RoutingError ();
|
||||||
|
|
||||||
|
|
||||||
|
public :
|
||||||
|
static const Name _extensionName;
|
||||||
|
|
||||||
|
protected :
|
||||||
|
|
||||||
|
/**/ Cell * _cell;
|
||||||
|
/**/ Box _area;
|
||||||
|
/**/ int _count;
|
||||||
|
/**/ set<Occurrence>* _occurrences;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
inline Cell * RoutingError::getCell () const { return _cell;};
|
||||||
|
inline Box RoutingError::getBoundingBox () const { return _area;};
|
||||||
|
inline set<Occurrence>* RoutingError::getAllOccurrences () const { return _occurrences;};
|
||||||
|
inline int RoutingError::getCount () const { return _count;};
|
||||||
|
|
||||||
|
inline void RoutingError::_postCreate () { ExtensionGo::_postCreate();};
|
||||||
|
inline void RoutingError::_preDestroy () { ExtensionGo::_preDestroy(); _occurrences->clear(); };
|
||||||
|
inline void RoutingError::destroy () { _preDestroy(); delete this; };
|
||||||
|
} // End of Solstice namespace.
|
||||||
|
|
||||||
|
INSPECTOR_P_SUPPORT(Solstice::RoutingError);
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __SOLSTICE_ROUTING_ERROR__
|
|
@ -0,0 +1,205 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Project.
|
||||||
|
// Copyright (C) Laboratoire LIP6 - Departement ASIM
|
||||||
|
// Universite Pierre et Marie Curie
|
||||||
|
//
|
||||||
|
// Main contributors :
|
||||||
|
// Christophe Alexandre <Christophe.Alexandre@lip6.fr>
|
||||||
|
// Sophie Belloeil <Sophie.Belloeil@lip6.fr>
|
||||||
|
// Hugo Clément <Hugo.Clement@lip6.fr>
|
||||||
|
// Jean-Paul Chaput <Jean-Paul.Chaput@lip6.fr>
|
||||||
|
// Damien Dupuis <Damien.Dupuis@lip6.fr>
|
||||||
|
// Christian Masson <Christian.Masson@lip6.fr>
|
||||||
|
// Marek Sroka <Marek.Sroka@lip6.fr>
|
||||||
|
//
|
||||||
|
// The Coriolis Project is free software; you can redistribute it
|
||||||
|
// and/or modify it under the terms of the GNU General Public License
|
||||||
|
// as published by the Free Software Foundation; either version 2 of
|
||||||
|
// the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// The Coriolis Project is distributed in the hope that it will be
|
||||||
|
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||||
|
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with the Coriolis Project; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||||
|
// USA
|
||||||
|
//
|
||||||
|
// License-Tag
|
||||||
|
// Authors-Tag
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | H U R R I C A N E |
|
||||||
|
// | V L S I B a c k e n d D a t a - B a s e |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul CHAPUT |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./RoutingErrorInformations.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __ROUTINGERROR_INFORMATIONS_H__
|
||||||
|
#define __ROUTINGERROR_INFORMATIONS_H__
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <QVariant>
|
||||||
|
|
||||||
|
#include "hurricane/Commons.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Cell;
|
||||||
|
class Name;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
using Hurricane::Name;
|
||||||
|
|
||||||
|
class RoutingError;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "RoutingErrorInformations"
|
||||||
|
|
||||||
|
|
||||||
|
class RoutingErrorInformations {
|
||||||
|
public:
|
||||||
|
RoutingErrorInformations ( const RoutingError* routingError );
|
||||||
|
virtual ~RoutingErrorInformations ();
|
||||||
|
static int getColumnCount ();
|
||||||
|
static QVariant getColumnName ( int column );
|
||||||
|
virtual QVariant getColumn ( int column );
|
||||||
|
inline const RoutingError* getRoutingError () const;
|
||||||
|
inline const Name getName () const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
const RoutingError* _routingError;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline const RoutingError* RoutingErrorInformations::getRoutingError () const
|
||||||
|
{ return _routingError; }
|
||||||
|
|
||||||
|
|
||||||
|
inline const Name RoutingErrorInformations::getName () const
|
||||||
|
{ return _routingError->getErrorName(); }
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "SimpleRoutingErrorInformations"
|
||||||
|
|
||||||
|
|
||||||
|
class SimpleRoutingErrorInformations : public RoutingErrorInformations {
|
||||||
|
public:
|
||||||
|
SimpleRoutingErrorInformations ( const RoutingError* routingError );
|
||||||
|
virtual ~SimpleRoutingErrorInformations ();
|
||||||
|
static int getColumnCount ();
|
||||||
|
static QVariant getColumnName ( int column );
|
||||||
|
virtual QVariant getColumn ( int column );
|
||||||
|
inline size_t getPlugsCount () const;
|
||||||
|
/**/ string getDescription () const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
size_t _plugsCount;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline size_t SimpleRoutingErrorInformations::getPlugsCount () const
|
||||||
|
{ return _plugsCount; }
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "AbstractRoutingErrorInformationsVector"
|
||||||
|
|
||||||
|
|
||||||
|
class AbstractRoutingErrorInformationsVector {
|
||||||
|
public:
|
||||||
|
virtual ~AbstractRoutingErrorInformationsVector ();
|
||||||
|
virtual void addRoutingError ( const RoutingError* routingError ) = 0;
|
||||||
|
virtual RoutingErrorInformations* getRow ( int row ) = 0;
|
||||||
|
virtual int getColumnCount () const = 0;
|
||||||
|
virtual QVariant getColumnName ( int column ) const = 0;
|
||||||
|
virtual int size () const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Template Class : "RoutingErrorInformationsVector"
|
||||||
|
|
||||||
|
|
||||||
|
template<typename InformationType>
|
||||||
|
class RoutingErrorInformationsVector : public AbstractRoutingErrorInformationsVector {
|
||||||
|
public:
|
||||||
|
virtual ~RoutingErrorInformationsVector ();
|
||||||
|
virtual void addRoutingError ( const RoutingError* routingError );
|
||||||
|
virtual InformationType* getRow ( int row );
|
||||||
|
virtual int getColumnCount () const;
|
||||||
|
virtual QVariant getColumnName ( int column ) const;
|
||||||
|
virtual int size () const;
|
||||||
|
protected:
|
||||||
|
vector<InformationType> _routingErrorlist;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template<typename InformationType>
|
||||||
|
RoutingErrorInformationsVector<InformationType>::~RoutingErrorInformationsVector ()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
template<typename InformationType>
|
||||||
|
void RoutingErrorInformationsVector<InformationType>::addRoutingError ( const RoutingError* routingError )
|
||||||
|
{
|
||||||
|
_routingErrorlist.push_back ( InformationType(routingError) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename InformationType>
|
||||||
|
InformationType* RoutingErrorInformationsVector<InformationType>::getRow ( int row )
|
||||||
|
{
|
||||||
|
if ( row >= (int)_routingErrorlist.size() ) return NULL;
|
||||||
|
|
||||||
|
return &_routingErrorlist[row];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename InformationType>
|
||||||
|
int RoutingErrorInformationsVector<InformationType>::getColumnCount () const
|
||||||
|
{
|
||||||
|
return InformationType::getColumnCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename InformationType>
|
||||||
|
QVariant RoutingErrorInformationsVector<InformationType>::getColumnName ( int column ) const
|
||||||
|
{
|
||||||
|
return InformationType::getColumnName ( column );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename InformationType>
|
||||||
|
int RoutingErrorInformationsVector<InformationType>::size () const
|
||||||
|
{
|
||||||
|
return _routingErrorlist.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __ROUTINGERROR_INFORMATIONS_H__
|
|
@ -0,0 +1,110 @@
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./RoutingErrorListModel.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __HURRICANE_ROUTINGERRORLIST_MODEL__
|
||||||
|
#define __HURRICANE_ROUTINGERRORLIST_MODEL__
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <QFont>
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QAbstractTableModel>
|
||||||
|
|
||||||
|
#include "hurricane/Commons.h"
|
||||||
|
#include "hurricane/Name.h"
|
||||||
|
|
||||||
|
#include "hurricane/Cell.h"
|
||||||
|
#include "hurricane/viewer/Graphics.h"
|
||||||
|
|
||||||
|
#include "solstice/RoutingError.h"
|
||||||
|
#include "solstice/SolsticeEngine.h"
|
||||||
|
#include "solstice/RoutingErrorInformations.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Cell;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class RoutingErrorListModel : public QAbstractTableModel {
|
||||||
|
Q_OBJECT;
|
||||||
|
|
||||||
|
public:
|
||||||
|
RoutingErrorListModel ( QObject* parent=NULL );
|
||||||
|
~RoutingErrorListModel ();
|
||||||
|
template<typename InformationType>
|
||||||
|
void setCell ( Cell* cell );
|
||||||
|
int rowCount ( const QModelIndex& parent=QModelIndex() ) const;
|
||||||
|
int columnCount ( const QModelIndex& parent=QModelIndex() ) const;
|
||||||
|
QVariant data ( const QModelIndex& index, int role=Qt::DisplayRole ) const;
|
||||||
|
QVariant headerData ( int section, Qt::Orientation orientation, int role=Qt::DisplayRole ) const;
|
||||||
|
inline Cell* getCell ();
|
||||||
|
const RoutingError* getRoutingError ( int row );
|
||||||
|
|
||||||
|
private:
|
||||||
|
Cell* _cell;
|
||||||
|
AbstractRoutingErrorInformationsVector* _routingErrorList;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Inline Functions.
|
||||||
|
|
||||||
|
inline Cell* RoutingErrorListModel::getCell () { return _cell; }
|
||||||
|
|
||||||
|
|
||||||
|
// Template Functions.
|
||||||
|
|
||||||
|
template<typename InformationType>
|
||||||
|
void RoutingErrorListModel::setCell ( Cell* cell )
|
||||||
|
{
|
||||||
|
if ( _cell != cell ) {
|
||||||
|
if ( _cell )
|
||||||
|
delete _routingErrorList;
|
||||||
|
|
||||||
|
_cell = cell;
|
||||||
|
_routingErrorList = new RoutingErrorInformationsVector<InformationType>();
|
||||||
|
|
||||||
|
if ( _cell ) {
|
||||||
|
SolsticeEngine* solstice = SolsticeEngine::get(_cell);
|
||||||
|
forEach(RoutingError*, routingError ,getCollection(solstice->getRoutingErrorSet()))
|
||||||
|
{
|
||||||
|
_routingErrorList->addRoutingError ( *routingError );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
emit layoutChanged ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __ROUTINGERRORLIST_MODEL_H__
|
|
@ -0,0 +1,221 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./solstice/RoutingErrorListWidget.h.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __HURRICANE_ROUTINGERRORLIST_WIDGET__
|
||||||
|
#define __HURRICANE_ROUTINGERRORLIST_WIDGET__
|
||||||
|
|
||||||
|
|
||||||
|
#include <set>
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include <QTableView>
|
||||||
|
#include <QSortFilterProxyModel>
|
||||||
|
|
||||||
|
#include "hurricane/Commons.h"
|
||||||
|
#include "hurricane/Bug.h"
|
||||||
|
#include "hurricane/viewer/CellWidget.h"
|
||||||
|
#include "solstice/RoutingErrorListModel.h"
|
||||||
|
#include "hurricane/viewer/CellWidget.h"
|
||||||
|
|
||||||
|
|
||||||
|
class QSortFilterProxyModel;
|
||||||
|
class QModelIndex;
|
||||||
|
class QTableView;
|
||||||
|
class QLineEdit;
|
||||||
|
class QComboBox;
|
||||||
|
class QHeaderView;
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Cell;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
|
||||||
|
using std::set;
|
||||||
|
class RoutingError;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "SelectedRoutingError".
|
||||||
|
|
||||||
|
|
||||||
|
class SelectedRoutingError {
|
||||||
|
public:
|
||||||
|
inline SelectedRoutingError ();
|
||||||
|
inline SelectedRoutingError ( const RoutingError*, size_t access=0 );
|
||||||
|
inline const RoutingError* getRoutingError () const;
|
||||||
|
inline size_t getAccesses () const;
|
||||||
|
inline void incAccesses () const;
|
||||||
|
inline void setInserted () const;
|
||||||
|
inline void resetAccesses () const;
|
||||||
|
private:
|
||||||
|
const RoutingError* _routingError;
|
||||||
|
mutable size_t _accesses;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline SelectedRoutingError::SelectedRoutingError () : _routingError(NULL), _accesses(0) { }
|
||||||
|
inline SelectedRoutingError::SelectedRoutingError ( const RoutingError* routingError, size_t accesses ) : _routingError(routingError), _accesses(accesses) { }
|
||||||
|
inline const RoutingError* SelectedRoutingError::getRoutingError () const { return _routingError; }
|
||||||
|
inline void SelectedRoutingError::setInserted () const { _accesses = 64; }
|
||||||
|
inline size_t SelectedRoutingError::getAccesses () const { return _accesses; }
|
||||||
|
inline void SelectedRoutingError::incAccesses () const { ++_accesses; }
|
||||||
|
inline void SelectedRoutingError::resetAccesses () const { _accesses = 0; }
|
||||||
|
|
||||||
|
|
||||||
|
struct SelectedRoutingErrorCompare {
|
||||||
|
inline bool operator() ( const SelectedRoutingError& lhs, const SelectedRoutingError& rhs );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline bool SelectedRoutingErrorCompare::operator() ( const SelectedRoutingError& lhs, const SelectedRoutingError& rhs )
|
||||||
|
{
|
||||||
|
return lhs.getRoutingError() < rhs.getRoutingError();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "SelectedRoutingErrorSet".
|
||||||
|
|
||||||
|
|
||||||
|
class SelectedRoutingErrorSet : public set<SelectedRoutingError,SelectedRoutingErrorCompare>{
|
||||||
|
public:
|
||||||
|
void insert ( const RoutingError* );
|
||||||
|
void forceInserteds ();
|
||||||
|
void resetAccesses ();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline void SelectedRoutingErrorSet::insert ( const RoutingError* routingError )
|
||||||
|
{
|
||||||
|
iterator iselected = find(SelectedRoutingError(routingError));
|
||||||
|
if ( iselected != end() ) {
|
||||||
|
iselected->incAccesses ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
set<SelectedRoutingError,SelectedRoutingErrorCompare>::insert ( SelectedRoutingError(routingError,64) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void SelectedRoutingErrorSet::forceInserteds ()
|
||||||
|
{
|
||||||
|
for ( iterator iselected=begin() ; iselected != end() ; ++iselected )
|
||||||
|
iselected->setInserted ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void SelectedRoutingErrorSet::resetAccesses ()
|
||||||
|
{
|
||||||
|
for ( iterator iselected=begin() ; iselected != end() ; ++iselected )
|
||||||
|
iselected->resetAccesses ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "RoutingErrorListWidget".
|
||||||
|
|
||||||
|
|
||||||
|
class RoutingErrorListWidget : public QWidget {
|
||||||
|
Q_OBJECT;
|
||||||
|
|
||||||
|
public:
|
||||||
|
RoutingErrorListWidget ( QWidget* parent=NULL );
|
||||||
|
inline Cell* getCell ();
|
||||||
|
template<typename InformationType>
|
||||||
|
void setCellWidget ( CellWidget* );
|
||||||
|
template<typename InformationType>
|
||||||
|
void setCell ( Cell* );
|
||||||
|
void goTo ( int );
|
||||||
|
void updateSelecteds ();
|
||||||
|
signals:
|
||||||
|
/**/ void occurrenceSelected ( const Occurrence );
|
||||||
|
/**/ void occurrenceUnselected ( const Occurrence );
|
||||||
|
/**/ void routingErrorFitted ( const RoutingError* );
|
||||||
|
public slots:
|
||||||
|
void forceRowHeight ();
|
||||||
|
private slots:
|
||||||
|
/**/ void fitToError ();
|
||||||
|
void textFilterChanged ();
|
||||||
|
void updateSelecteds ( const QItemSelection& , const QItemSelection& );
|
||||||
|
|
||||||
|
private:
|
||||||
|
CellWidget* _cellWidget;
|
||||||
|
Cell* _cell;
|
||||||
|
RoutingErrorListModel* _baseModel;
|
||||||
|
QSortFilterProxyModel* _sortModel;
|
||||||
|
QTableView* _view;
|
||||||
|
QLineEdit* _filterPatternLineEdit;
|
||||||
|
int _rowHeight;
|
||||||
|
SelectedRoutingErrorSet _selecteds;
|
||||||
|
bool _forceReselect;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template<typename InformationType>
|
||||||
|
void RoutingErrorListWidget::setCellWidget ( CellWidget* cw )
|
||||||
|
{
|
||||||
|
if ( _cellWidget ) {
|
||||||
|
disconnect ( this, 0, _cellWidget, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
_cellWidget = cw;
|
||||||
|
if ( _cellWidget ) {
|
||||||
|
setCell<InformationType> ( _cellWidget->getCell() );
|
||||||
|
/*TODO*/
|
||||||
|
//connect ( this, SIGNAL(routingErrorFitted(const RoutingError*)), _cellWidget, SLOT(fitToRoutingError (const RoutingError*)) );
|
||||||
|
} else
|
||||||
|
setCell<InformationType> ( NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename InformationType>
|
||||||
|
void RoutingErrorListWidget::setCell ( Cell* cell )
|
||||||
|
{
|
||||||
|
_cell = cell;
|
||||||
|
_view->selectionModel()->clear ();
|
||||||
|
_baseModel->setCell<InformationType> ( cell );
|
||||||
|
|
||||||
|
string windowTitle = "RoutingErrorList" + getString(cell);
|
||||||
|
setWindowTitle ( tr(windowTitle.c_str()) );
|
||||||
|
|
||||||
|
int rows = _sortModel->rowCount ();
|
||||||
|
for ( rows-- ; rows >= 0 ; rows-- )
|
||||||
|
_view->setRowHeight ( rows, _rowHeight );
|
||||||
|
_view->selectRow ( 0 );
|
||||||
|
_view->resizeColumnToContents ( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Cell* RoutingErrorListWidget::getCell () { return _cell; }
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __HURRICANE_ROUTINGERRORLIST_WIDGET_H__
|
|
@ -0,0 +1,117 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | |
|
||||||
|
// | Updater : Bodin bruno |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./solstice/ShortCircuitError.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __SOLSTICE_SHORT_CIRCUIT_ERROR__
|
||||||
|
#define __SOLSTICE_SHORT_CIRCUIT_ERROR__
|
||||||
|
|
||||||
|
#include <hurricane/Box.h>
|
||||||
|
#include <hurricane/Occurrence.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include <solstice/RoutingError.h>
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Point;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
namespace Equinox {
|
||||||
|
class Equi;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
|
||||||
|
using Hurricane::Occurrence;
|
||||||
|
using Hurricane::Point;
|
||||||
|
using Hurricane::Box;
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class ShortCircuitError : public RoutingError {
|
||||||
|
|
||||||
|
public :
|
||||||
|
inline static ShortCircuitError* create (Cell*,
|
||||||
|
const Occurrence&,
|
||||||
|
const Occurrence&);
|
||||||
|
// Accessors
|
||||||
|
public:
|
||||||
|
/**/ virtual const Name& getName () const ;
|
||||||
|
inline virtual string getErrorName () const ;
|
||||||
|
/**/ string getErrorDescription () const ;
|
||||||
|
inline virtual int getCount () const ;
|
||||||
|
inline virtual set<Occurrence>* getErrorOccurrences () const ;
|
||||||
|
inline const Occurrence& getOccurrence1 () const;
|
||||||
|
inline const Occurrence& getOccurrence2 () const;
|
||||||
|
inline const Box& getShortCircuitArea () const;
|
||||||
|
inline const Occurrence& getHyperNet1 () const;
|
||||||
|
inline const Occurrence& getHyperNet2 () const;
|
||||||
|
inline void setOccurrence1 (const Occurrence occurrence);
|
||||||
|
inline void setOccurrence2 (const Occurrence occurrence);
|
||||||
|
/**/ string _getString () const;
|
||||||
|
/**/ const Point getShortCircuitAreaCenter() const;
|
||||||
|
private :
|
||||||
|
/**/ ShortCircuitError (Cell*,
|
||||||
|
const Occurrence&,
|
||||||
|
const Occurrence&);
|
||||||
|
inline ~ShortCircuitError ();
|
||||||
|
|
||||||
|
// Attributs
|
||||||
|
private :
|
||||||
|
/**/ Occurrence _occurrence1;
|
||||||
|
/**/ Occurrence _occurrence2;
|
||||||
|
/**/ Occurrence _hypernet1;
|
||||||
|
/**/ Occurrence _hypernet2;
|
||||||
|
/**/ Box _shortcircuitarea;
|
||||||
|
/**/ set<Occurrence>* _errorOccurrences;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}; // End of class ShortCircuitError
|
||||||
|
|
||||||
|
|
||||||
|
//inline functions
|
||||||
|
inline string ShortCircuitError::getErrorName () const {return "Court-circuit";};
|
||||||
|
inline const Occurrence& ShortCircuitError::getOccurrence1 () const { return _occurrence1; };
|
||||||
|
inline const Occurrence& ShortCircuitError::getOccurrence2 () const { return _occurrence2; };
|
||||||
|
inline const Box& ShortCircuitError::getShortCircuitArea () const { return _shortcircuitarea; };
|
||||||
|
inline const Occurrence& ShortCircuitError::getHyperNet1 () const { return _hypernet1; };
|
||||||
|
inline const Occurrence& ShortCircuitError::getHyperNet2 () const { return _hypernet2; };
|
||||||
|
inline void ShortCircuitError::setOccurrence1 (const Occurrence occurrence) { _occurrence1 = occurrence; };
|
||||||
|
inline void ShortCircuitError::setOccurrence2 (const Occurrence occurrence) { _occurrence2 = occurrence; };
|
||||||
|
inline ShortCircuitError::~ShortCircuitError () {};
|
||||||
|
inline ShortCircuitError*ShortCircuitError::create (Cell* cell, const Occurrence& o1,const Occurrence& o2) { ShortCircuitError* de = new ShortCircuitError (cell,o1,o2); de->_postCreate(); return de;};
|
||||||
|
|
||||||
|
} // End of Solstice namespace.
|
||||||
|
|
||||||
|
#endif // __SOLSTICE_SHORT_CIRCUIT_ERROR__
|
|
@ -0,0 +1,137 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./solstice/SolsticeEngine.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __SOLSTICE_SOLSTICE_ENGINE__
|
||||||
|
#define __SOLSTICE_SOLSTICE_ENGINE__
|
||||||
|
|
||||||
|
#include "crlcore/ToolEngine.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
class Occurrence;
|
||||||
|
class Cell;
|
||||||
|
class Path;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Equinox {
|
||||||
|
class Equi;
|
||||||
|
class Interval;
|
||||||
|
class Strategy;
|
||||||
|
|
||||||
|
}
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace Hurricane;
|
||||||
|
|
||||||
|
using CRL::ToolEngine;
|
||||||
|
|
||||||
|
using Equinox::Equi;
|
||||||
|
using Equinox::Strategy;
|
||||||
|
|
||||||
|
class Brick;
|
||||||
|
class ShortCircuitError;
|
||||||
|
class RoutingError;
|
||||||
|
|
||||||
|
|
||||||
|
class SolsticeEngine : public ToolEngine {
|
||||||
|
|
||||||
|
public:
|
||||||
|
static SolsticeEngine* create (Cell*);
|
||||||
|
static SolsticeEngine* get (const Cell* );
|
||||||
|
static inline Name& getStaticName ();
|
||||||
|
static Occurrence getTopNetOccurrence (Occurrence occurrence);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static Strategy * getStrategy ();
|
||||||
|
static void setStrategy (Strategy *);
|
||||||
|
|
||||||
|
static void _depthCreate ( Cell*);
|
||||||
|
static Cell* getCommonPath (Path path1,
|
||||||
|
Path path2,
|
||||||
|
Path& newpath1,
|
||||||
|
Path& newpath2);
|
||||||
|
static void setIsComparedTrue (Cell * cell);
|
||||||
|
static void getAllSolstices (Cell* cell,
|
||||||
|
set<SolsticeEngine*>& solstices);
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual inline const Name& getName () const;
|
||||||
|
virtual Record* _getRecord () const;
|
||||||
|
virtual inline string _getString () const;
|
||||||
|
virtual inline string _getTypeName () const;
|
||||||
|
|
||||||
|
public :
|
||||||
|
/**/ inline void destroy ();
|
||||||
|
/**/ void flushErrors ();
|
||||||
|
/**/ void compare ();
|
||||||
|
/**/ void insertInterval (Brick*,
|
||||||
|
stack <Equinox::Interval*>*enumResultStack);
|
||||||
|
/**/ void removeInterval (Brick* item);
|
||||||
|
inline const set<RoutingError*>* getRoutingErrorSet ();
|
||||||
|
|
||||||
|
protected :
|
||||||
|
/**/ void clearErrors ();
|
||||||
|
inline void setIsCompared (const bool flag);
|
||||||
|
/**/ void runComparison ();
|
||||||
|
/**/ void detectShortCircuit (Equi* equi);
|
||||||
|
inline bool isCompared () const;
|
||||||
|
private:
|
||||||
|
// Attributes.
|
||||||
|
static Strategy * _strategy;
|
||||||
|
static Name _toolName;
|
||||||
|
/**/ bool _isCompared;
|
||||||
|
/**/ set<RoutingError*>* _routingErrors;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// Constructors & Destructors.
|
||||||
|
/**/ SolsticeEngine (Cell*);
|
||||||
|
virtual ~SolsticeEngine ();
|
||||||
|
virtual inline void _postCreate ();
|
||||||
|
virtual inline void _preDestroy ();
|
||||||
|
/**/ void _depthDestroy ();
|
||||||
|
|
||||||
|
private:
|
||||||
|
/**/ SolsticeEngine (const SolsticeEngine&);
|
||||||
|
/**/ SolsticeEngine& operator= (const SolsticeEngine&);
|
||||||
|
|
||||||
|
}; // End of class SolsticeEngine
|
||||||
|
|
||||||
|
//inline functions
|
||||||
|
inline Name& SolsticeEngine::getStaticName () { return _toolName;};
|
||||||
|
inline bool SolsticeEngine::isCompared () const { return _isCompared; };
|
||||||
|
inline void SolsticeEngine::setIsCompared (const bool flag) { _isCompared = flag; };
|
||||||
|
inline const set<RoutingError*>* SolsticeEngine::getRoutingErrorSet () { return _routingErrors;};
|
||||||
|
inline const Name& SolsticeEngine::getName () const { return _toolName;};
|
||||||
|
inline string SolsticeEngine::_getString () const { return "<Solstice>";};
|
||||||
|
inline string SolsticeEngine::_getTypeName () const { return "Solstice";};
|
||||||
|
inline void SolsticeEngine::_postCreate () { ToolEngine::_postCreate ();};
|
||||||
|
inline void SolsticeEngine::_preDestroy () { ToolEngine::_preDestroy ();flushErrors();};
|
||||||
|
inline void SolsticeEngine::destroy () { _preDestroy(); delete this;};
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Solstice namespace.
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __SOLSTICE_SOLSTICE_ENGINE__
|
|
@ -0,0 +1,86 @@
|
||||||
|
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul CHAPUT |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Module : "./solstice/TabRoutingError.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __SOLSTICE_TAB_ROUTINGERROR__
|
||||||
|
#define __SOLSTICE_TAB_ROUTINGERROR__
|
||||||
|
|
||||||
|
|
||||||
|
#include <QTabWidget>
|
||||||
|
|
||||||
|
#include <hurricane/viewer/ControllerWidget.h>
|
||||||
|
|
||||||
|
class QCheckBox;
|
||||||
|
class QComboBox;
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
class Cell;
|
||||||
|
class Occurrence;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
using Hurricane::Cell;
|
||||||
|
using Hurricane::CellWidget;
|
||||||
|
using Hurricane::ControllerTab;
|
||||||
|
|
||||||
|
class RoutingError;
|
||||||
|
class RoutingErrorListWidget;
|
||||||
|
|
||||||
|
class TabRoutingError : public ControllerTab {
|
||||||
|
Q_OBJECT;
|
||||||
|
|
||||||
|
public:
|
||||||
|
TabRoutingError ( QWidget* parent=NULL );
|
||||||
|
inline RoutingErrorListWidget* getRoutingErrorBrowser ();
|
||||||
|
inline QCheckBox* getSyncRoutingError ();
|
||||||
|
inline QCheckBox* getSyncSelection ();
|
||||||
|
virtual void cellPreModificate ();
|
||||||
|
virtual void cellPostModificate ();
|
||||||
|
public slots:
|
||||||
|
virtual void setCell ( Cell* );
|
||||||
|
virtual void setCellWidget ( CellWidget* );
|
||||||
|
virtual void setSyncRoutingError ( bool );
|
||||||
|
virtual void setSyncSelection ( bool );
|
||||||
|
void select ( const RoutingError* );
|
||||||
|
void unselect ( const RoutingError* );
|
||||||
|
protected:
|
||||||
|
RoutingErrorListWidget* _routingErrorBrowser;
|
||||||
|
QCheckBox* _syncRoutingError;
|
||||||
|
QCheckBox* _syncSelection;
|
||||||
|
bool _cwCumulativeSelection;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline RoutingErrorListWidget* TabRoutingError::getRoutingErrorBrowser () { return _routingErrorBrowser; }
|
||||||
|
inline QCheckBox* TabRoutingError::getSyncRoutingError () { return _syncRoutingError; }
|
||||||
|
inline QCheckBox* TabRoutingError::getSyncSelection () { return _syncSelection; }
|
||||||
|
|
||||||
|
|
||||||
|
}//end of namespace solstice
|
||||||
|
|
||||||
|
#endif //TAB_ROUTINGERROR
|
|
@ -0,0 +1,65 @@
|
||||||
|
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul CHAPUT |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Module : "./TabRoutingErrorList.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
#include <hurricane/viewer/ControllerWidget.h>
|
||||||
|
#include <solstice/RoutingErrorListWidget.h>
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
|
||||||
|
using Hurricane::ControllerTab;
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Hurricane::TabRoutingErrorList".
|
||||||
|
|
||||||
|
|
||||||
|
class TabRoutingErrorList : public ControllerTab {
|
||||||
|
Q_OBJECT;
|
||||||
|
|
||||||
|
public:
|
||||||
|
TabRoutingErrorList ( QWidget* parent=NULL );
|
||||||
|
inline RoutingErrorListWidget* getRoutingErrorListBrowser ();
|
||||||
|
inline QCheckBox* getSyncRoutingErrorList ();
|
||||||
|
inline QCheckBox* getSyncSelection ();
|
||||||
|
virtual void cellPreModificate ();
|
||||||
|
virtual void cellPostModificate ();
|
||||||
|
public slots:
|
||||||
|
virtual void setCell ( Cell* );
|
||||||
|
virtual void setCellWidget ( CellWidget* );
|
||||||
|
virtual void setSyncRoutingErrorList ( bool );
|
||||||
|
virtual void setSyncSelection ( bool );
|
||||||
|
protected:
|
||||||
|
RoutingErrorListWidget* _routingErrorListBrowser;
|
||||||
|
QCheckBox* _syncRoutingErrorList;
|
||||||
|
QCheckBox* _syncSelection;
|
||||||
|
bool _cwCumulativeSelection;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline RoutingErrorListWidget* TabRoutingErrorList::getRoutingErrorListBrowser () { return _routingErrorListBrowser; }
|
||||||
|
inline QCheckBox* TabRoutingErrorList::getSyncRoutingErrorList () { return _syncRoutingErrorList; }
|
||||||
|
inline QCheckBox* TabRoutingErrorList::getSyncSelection () { return _syncSelection; }
|
||||||
|
|
||||||
|
} // End of Solstice namespace.
|
|
@ -0,0 +1,110 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Wu Yife |
|
||||||
|
// | E-mail : Wu.Yifei@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./RoutingErrorInformations.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
#ifndef __SOLSTICE_ROUTINGERROR_INFORMATIONS__
|
||||||
|
#define __SOLSTICE_ROUTINGERROR_INFORMATIONS__
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <QVariant>
|
||||||
|
|
||||||
|
#include "hurricane/Commons.h"
|
||||||
|
|
||||||
|
#include "solstice/RoutingError.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
using Hurricane::Name;
|
||||||
|
using std::vector;
|
||||||
|
class Cell;
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "RoutingErrorInformations"
|
||||||
|
|
||||||
|
|
||||||
|
class RoutingErrorInformations {
|
||||||
|
public:
|
||||||
|
RoutingErrorInformations ( const RoutingError* error );
|
||||||
|
virtual ~RoutingErrorInformations ();
|
||||||
|
static int getColumnCount ();
|
||||||
|
static QVariant getColumnName ( int column );
|
||||||
|
virtual QVariant getColumn ( int column );
|
||||||
|
inline const RoutingError* getRoutingError () const;
|
||||||
|
inline const Name getName () const;
|
||||||
|
inline const string getDescription () const;
|
||||||
|
inline const Cell* getCell () const;
|
||||||
|
protected:
|
||||||
|
const RoutingError* _error;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline const RoutingError* RoutingErrorInformations::getRoutingError () const
|
||||||
|
{ return _error; }
|
||||||
|
|
||||||
|
|
||||||
|
inline const Name RoutingErrorInformations::getName () const
|
||||||
|
{
|
||||||
|
return _error->getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const string RoutingErrorInformations::getDescription () const
|
||||||
|
{
|
||||||
|
return _error->getDescription();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const Cell* RoutingErrorInformations::getCell () const
|
||||||
|
{
|
||||||
|
return _error->getCell();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "RoutingErrorInformationsVector"
|
||||||
|
|
||||||
|
|
||||||
|
class RoutingErrorInformationsVector {
|
||||||
|
public:
|
||||||
|
virtual ~RoutingErrorInformationsVector ();
|
||||||
|
virtual void addRoutingError ( const RoutingError* error );
|
||||||
|
virtual RoutingErrorInformations* getRow ( int row );
|
||||||
|
virtual int getColumnCount () const ;
|
||||||
|
virtual QVariant getColumnName ( int column ) const ;
|
||||||
|
virtual int size () const ;
|
||||||
|
|
||||||
|
|
||||||
|
vector<RoutingErrorInformations> _errorlist;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Solstice namespace.
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __ROUTING_ERROR_INFORMATIONS_H__
|
|
@ -0,0 +1,80 @@
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | H U R R I C A N E |
|
||||||
|
// | V L S I B a c k e n d D a t a - B a s e |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul CHAPUT |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./RoutingErrorModel.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __SOLSTICE_ROUTINGERROR_MODEL__
|
||||||
|
#define __SOLSTICE_ROUTINGERROR_MODEL__
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <QFont>
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QAbstractTableModel>
|
||||||
|
|
||||||
|
#include "hurricane/Commons.h"
|
||||||
|
#include "hurricane/Name.h"
|
||||||
|
#include "hurricane/Net.h"
|
||||||
|
#include "hurricane/Cell.h"
|
||||||
|
#include "hurricane/viewer/Graphics.h"
|
||||||
|
#include "solstice/RoutingErrorInformations.h"
|
||||||
|
#include "solstice/SolsticeEngine.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
|
||||||
|
using namespace Hurricane;
|
||||||
|
|
||||||
|
|
||||||
|
} // End of anonymous namespace.
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
|
||||||
|
class RoutingErrorModel : public QAbstractTableModel {
|
||||||
|
Q_OBJECT;
|
||||||
|
|
||||||
|
public:
|
||||||
|
RoutingErrorModel ( QObject* parent=NULL );
|
||||||
|
~RoutingErrorModel ();
|
||||||
|
void setCell ( Cell* cell );
|
||||||
|
int rowCount ( const QModelIndex& parent=QModelIndex() ) const;
|
||||||
|
int columnCount ( const QModelIndex& parent=QModelIndex() ) const;
|
||||||
|
QVariant data ( const QModelIndex& index, int role=Qt::DisplayRole ) const;
|
||||||
|
QVariant headerData ( int section, Qt::Orientation orientation, int role=Qt::DisplayRole ) const;
|
||||||
|
inline Cell* getCell ();
|
||||||
|
const RoutingError* getRoutingError ( int row );
|
||||||
|
|
||||||
|
private:
|
||||||
|
Cell* _cell;
|
||||||
|
RoutingErrorInformationsVector* _routingError;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Inline Functions.
|
||||||
|
|
||||||
|
inline Cell* RoutingErrorModel::getCell () { return _cell; }
|
||||||
|
|
||||||
|
} // End of Solstice namespace.
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _SOLSTICE_ROUTINGERROR_MODEL__
|
|
@ -0,0 +1,173 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Coriolis Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | S O L S T I C E - C o m p a r a t o r |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul CHAPUT |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./solstice/RoutingErrorWidget.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __SOLSTICE_ROUTINGERROR_WIDGET__
|
||||||
|
#define __SOLSTICE_ROUTINGERROR_WIDGET__
|
||||||
|
|
||||||
|
|
||||||
|
#include <set>
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include <QTableView>
|
||||||
|
#include <QSortFilterProxyModel>
|
||||||
|
|
||||||
|
#include "hurricane/Commons.h"
|
||||||
|
#include "hurricane/Bug.h"
|
||||||
|
#include "hurricane/viewer/CellWidget.h"
|
||||||
|
|
||||||
|
#include "solstice/RoutingErrorModel.h"
|
||||||
|
|
||||||
|
class QSortFilterProxyModel;
|
||||||
|
class QModelIndex;
|
||||||
|
class QTableView;
|
||||||
|
class QLineEdit;
|
||||||
|
class QComboBox;
|
||||||
|
class QHeaderView;
|
||||||
|
|
||||||
|
|
||||||
|
namespace Solstice {
|
||||||
|
|
||||||
|
|
||||||
|
using std::set;
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "SelectedRoutingError".
|
||||||
|
|
||||||
|
|
||||||
|
class SelectedRoutingError {
|
||||||
|
public:
|
||||||
|
inline SelectedRoutingError ();
|
||||||
|
inline SelectedRoutingError ( const RoutingError*,
|
||||||
|
size_t access=0 );
|
||||||
|
inline const RoutingError* getRoutingError () const;
|
||||||
|
inline size_t getAccesses () const;
|
||||||
|
inline void incAccesses () const;
|
||||||
|
inline void setInserted () const;
|
||||||
|
inline void resetAccesses () const;
|
||||||
|
private:
|
||||||
|
const RoutingError* _routingError;
|
||||||
|
mutable size_t _accesses;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline SelectedRoutingError::SelectedRoutingError () : _routingError(NULL), _accesses(0) { }
|
||||||
|
inline SelectedRoutingError::SelectedRoutingError ( const RoutingError* RoutingError, size_t accesses ) : _routingError(RoutingError), _accesses(accesses) { }
|
||||||
|
inline const RoutingError* SelectedRoutingError::getRoutingError () const { return _routingError; }
|
||||||
|
inline void SelectedRoutingError::setInserted () const { _accesses = 64; }
|
||||||
|
inline size_t SelectedRoutingError::getAccesses () const { return _accesses; }
|
||||||
|
inline void SelectedRoutingError::incAccesses () const { ++_accesses; }
|
||||||
|
inline void SelectedRoutingError::resetAccesses () const { _accesses = 0; }
|
||||||
|
|
||||||
|
|
||||||
|
struct SelectedRoutingErrorCompare {
|
||||||
|
inline bool operator() ( const SelectedRoutingError& lhs, const SelectedRoutingError& rhs );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline bool SelectedRoutingErrorCompare::operator() ( const SelectedRoutingError& lhs, const SelectedRoutingError& rhs )
|
||||||
|
{
|
||||||
|
return lhs.getRoutingError()->getName() < rhs.getRoutingError()->getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "SelectedRoutingErrorSet".
|
||||||
|
|
||||||
|
|
||||||
|
class SelectedRoutingErrorSet : public set<SelectedRoutingError,SelectedRoutingErrorCompare>{
|
||||||
|
public:
|
||||||
|
void insert ( const RoutingError* );
|
||||||
|
void forceInserteds ();
|
||||||
|
void resetAccesses ();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline void SelectedRoutingErrorSet::insert ( const RoutingError* RoutingError )
|
||||||
|
{
|
||||||
|
iterator iselected = find(SelectedRoutingError(RoutingError));
|
||||||
|
if ( iselected != end() )
|
||||||
|
iselected->incAccesses ();
|
||||||
|
else
|
||||||
|
set<SelectedRoutingError,SelectedRoutingErrorCompare>::insert ( SelectedRoutingError(RoutingError,64) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void SelectedRoutingErrorSet::forceInserteds ()
|
||||||
|
{
|
||||||
|
for ( iterator iselected=begin() ; iselected != end() ; ++iselected )
|
||||||
|
iselected->setInserted ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void SelectedRoutingErrorSet::resetAccesses ()
|
||||||
|
{
|
||||||
|
for ( iterator iselected=begin() ; iselected != end() ; ++iselected )
|
||||||
|
iselected->resetAccesses ();
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "RoutingErrorWidget".
|
||||||
|
|
||||||
|
|
||||||
|
class RoutingErrorWidget : public QWidget {
|
||||||
|
Q_OBJECT;
|
||||||
|
|
||||||
|
public:
|
||||||
|
RoutingErrorWidget ( QWidget* parent=NULL );
|
||||||
|
inline Cell* getCell ();
|
||||||
|
/**/ void setCellWidget ( CellWidget* );
|
||||||
|
/**/ void setCell ( Cell* );
|
||||||
|
/**/ void goTo ( int );
|
||||||
|
/**/ void updateSelecteds ();
|
||||||
|
signals:
|
||||||
|
/**/ void routingErrorSelected ( const RoutingError* );
|
||||||
|
/**/ void routingErrorUnselected ( const RoutingError* );
|
||||||
|
/**/ void routingErrorFitted ( const RoutingError* );
|
||||||
|
public slots:
|
||||||
|
/**/ void forceRowHeight ();
|
||||||
|
private slots:
|
||||||
|
/**/ void textFilterChanged ();
|
||||||
|
/**/ void updateSelecteds ( const QItemSelection& , const QItemSelection& );
|
||||||
|
/**/ void fitToRoutingError ();
|
||||||
|
|
||||||
|
private:
|
||||||
|
/**/ CellWidget* _cellWidget;
|
||||||
|
/**/ Cell* _cell;
|
||||||
|
/**/ RoutingErrorModel* _baseModel;
|
||||||
|
/**/ QSortFilterProxyModel* _sortModel;
|
||||||
|
/**/ QTableView* _view;
|
||||||
|
/**/ QLineEdit* _filterPatternLineEdit;
|
||||||
|
/**/ int _rowHeight;
|
||||||
|
/**/ SelectedRoutingErrorSet _selecteds;
|
||||||
|
/**/ bool _forceReselect;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline Cell* RoutingErrorWidget::getCell () { return _cell; }
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __SOLSTICE_ROUTINGERROR_WIDGET_H__
|
Loading…
Reference in New Issue