* ./hurricane/src/hurricane :

- New feature : geometrical Query with callback fonctions "a la" OpenAccess.

 * ./hurricane/src/hviewer :
   - Uses Query to draw display.
   - Bug : when drawing segments as lines (width inferior to 1 pixel)
       uses an alternate Pen which is one pixel wide and SolidLine styled,
       avoiding strange orange lines... Mechanism implemented in sub-class
       DrawingPlanes.
   - Make selection always visible regardless the zoom level.
   - CellWidget names it's most importants childs QWidget (mostly menus)
       for later retrieval in customized sub-classes.
This commit is contained in:
Jean-Paul Chaput 2008-08-27 14:06:06 +00:00
parent 0e6f383a8c
commit dfdb2ec2d5
40 changed files with 961 additions and 372 deletions

View File

@ -51,6 +51,7 @@
hurricane/Properties.h hurricane/Property.h
hurricane/QuadTree.h
hurricane/Quark.h hurricane/Quarks.h
hurricane/Query.h
hurricane/Record.h
hurricane/Reference.h hurricane/References.h
hurricane/Region.h
@ -137,6 +138,7 @@
Slice.cpp
UpdateSession.cpp
Region.cpp
Query.cpp
DisplaySlot.cpp
Marker.cpp
Timer.cpp

View File

@ -0,0 +1,165 @@
// -*- 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 |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== |
// | C++ Module : "./Query.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include <climits>
#include "hurricane/BasicLayer.h"
#include "hurricane/Slice.h"
#include "hurricane/Cell.h"
#include "hurricane/Instance.h"
#include "hurricane/Query.h"
namespace Hurricane {
// -------------------------------------------------------------------
// Slave Class : "QueryState".
// -------------------------------------------------------------------
// Class : "QueryStack".
QueryStack::QueryStack ()
: vector<QueryState*>()
//, _tab(" ")
, _topCell(NULL)
, _topArea()
, _topTransformation()
, _startLevel(0)
, _stopLevel(UINT_MAX)
{ }
QueryStack::~QueryStack ()
{
for ( size_t i=0 ; i<size() ; i++ ) delete operator[](i);
}
// -------------------------------------------------------------------
// Class : "Query".
Query::Query ()
: _stack()
, _basicLayer(NULL)
, _filter(DoAll)
{ }
Query::~Query ()
{ }
void Query::setQuery ( Cell* cell
, const Box& area
, const Transformation& transformation
, const BasicLayer* basicLayer
, unsigned int filter
)
{
_basicLayer = basicLayer;
_filter = filter;
_stack.setTopCell ( cell );
_stack.setTopArea ( area );
_stack.setTopTransformation ( transformation );
}
void Query::doQuery ()
{
if ( _stack.getTopArea().isEmpty() || !_stack.getTopCell() ) return;
//cerr << "Query::doQuery() - " << _stack.getTopCell() << " " << _stack.getTopArea() << " " << _basicLayer << endl;
_stack.init ();
while ( !_stack.empty() ) {
// Process the Components of the current instance.
if ( hasGoCallback() && _basicLayer && (_filter & DoComponents) ) {
//if ( getInstance() )
// cerr << getTab() << getInstance() << " " << getTransformation() << endl;
//else
// cerr << " TopCell: " << getMasterCell() << " " << getTransformation() << endl;
forEach ( Slice*, islice, getMasterCell()->getSlices() ) {
if ( !(*islice)->getLayer()->contains(getBasicLayer()) ) continue;
if ( !(*islice)->getBoundingBox().intersect(getArea()) ) continue;
forEach ( Go*, igo, (*islice)->getGosUnder(_stack.getArea()) )
goCallback ( *igo );
}
}
if ( (_filter & DoMasterCells) && hasMasterCellCallback() )
masterCellCallback ();
_stack.progress ();
} // End of while.
}
bool Query::hasGoCallback () const
{
return false;
}
bool Query::hasMasterCellCallback () const
{
return false;
}
} // End of Hurricane namespace.

View File

@ -95,8 +95,6 @@ namespace Hurricane {
virtual string _getString () const;
virtual Record* _getRecord () const;
private:
// Internal: Attributes
Material _material;

View File

@ -813,6 +813,61 @@ template<class Type> class SubSetCollection : public Collection<Type> {
_locator->progress();
// -------------------------------------------------------------------
// Template Class : "ForEachIterator"
template<typename Element>
class ForEachIterator {
public:
inline ForEachIterator ( GenericCollection<Element> coll );
inline bool isValid ();
inline Element operator* ();
inline ForEachIterator& operator++ (int);
public:
GenericCollection<Element>& collection;
GenericLocator<Element> locator;
Element element;
};
template<typename Element>
inline ForEachIterator<Element>::ForEachIterator ( GenericCollection<Element> coll )
: collection(coll)
, locator(collection.getLocator())
, element()
{
if ( locator.isValid() ) element = locator.getElement();
}
template< typename Element >
inline bool ForEachIterator<Element>::isValid ()
{
if ( locator.isValid() ) element = locator.getElement();
return locator.isValid();
}
template< typename Element >
inline Element ForEachIterator<Element>::operator* ()
{
return element;
}
template< typename Element >
inline ForEachIterator<Element>& ForEachIterator<Element>::operator++ (int)
{
locator.progress ();
return *this;
}
#define forEach(type,iterator,collection) \
for ( ForEachIterator<type> iterator(collection); iterator.isValid() ; iterator++ )
} // End of Hurricane namespace.
@ -842,6 +897,9 @@ template<typename Type> inline Hurricane::Record* getRecord ( const Hurricane::C
#include "hurricane/ListCollection.h"
#include "hurricane/VectorCollection.h"
#endif // HURRICANE_COLLECTION
// ****************************************************************************************************

View File

@ -51,6 +51,9 @@ typedef GenericFilter<Net*> NetFilter;
Net* net = _locator.getElement();\
_locator.progress();
#define forEachNet(iterator,collection) forEach(Net*,iterator,collection)
} // End of Hurricane namespace.

View File

@ -0,0 +1,378 @@
// -*- 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 : "./Query.h" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#ifndef __QUERY_H__
#define __QUERY_H__
#include <vector>
#include "hurricane/Commons.h"
#include "hurricane/Box.h"
#include "hurricane/Transformation.h"
#include "hurricane/Cell.h"
#include "hurricane/Instance.h"
namespace Hurricane {
class BasicLayer;
class Go;
class QueryStack;
// -------------------------------------------------------------------
// Slave Class : "QueryState".
class QueryState {
private:
inline QueryState ( Locator<Instance*>* locator );
inline QueryState ( Locator<Instance*>* locator
, const Box& area
, const Transformation& transformation
);
QueryState ( const QueryState& );
QueryState& operator= ( const QueryState& );
inline ~QueryState ();
private:
Locator<Instance*>* _locator;
Box _area;
Transformation _transformation;
friend class QueryStack;
};
// QueryState Inline Functions.
inline QueryState::QueryState ( Locator<Instance*>* locator )
: _locator(locator)
, _area()
, _transformation()
{ }
inline QueryState::QueryState ( Locator<Instance*>* locator
, const Box& area
, const Transformation& transformation
)
: _locator(locator)
, _area(area)
, _transformation(transformation)
{ }
inline QueryState::~QueryState ()
{
if ( _locator ) delete _locator;
}
// -------------------------------------------------------------------
// Class : "QueryStack".
class QueryStack : public vector<QueryState*> {
public:
// Constructor & destructor.
QueryStack ();
~QueryStack ();
// Accessors.
inline Cell* getTopCell ();
inline const Box& getTopArea () const;
inline const Transformation& getTopTransformation () const;
inline unsigned int getStartLevel () const;
inline unsigned int getStopLevel () const;
inline Cell* getMasterCell ();
inline Instance* getInstance ();
inline const Box& getArea () const;
inline const Transformation& getTransformation () const;
//inline const Tabulation& getTab () const;
// Modifiers.
inline void setTopCell ( Cell* cell );
inline void setTopArea ( const Box& area );
inline void setTopTransformation ( const Transformation& transformation );
inline void setStartLevel ( unsigned int level );
inline void setStopLevel ( unsigned int level );
inline void init ();
inline void updateTransformation ();
inline bool levelDown ();
inline void levelUp ();
inline void levelProgress ();
inline bool levelCompleted ();
inline void progress ( bool init=false );
protected:
// Internal: Attributes.
// Tabulation _tab;
Cell* _topCell;
Box _topArea;
Transformation _topTransformation;
unsigned int _startLevel;
unsigned int _stopLevel;
private:
// Internal: Constructors.
QueryStack ( const QueryStack& );
QueryStack& operator= ( const QueryStack& );
};
// QueryStack Inline Functions.
inline Cell* QueryStack::getTopCell () { return _topCell; }
inline const Box& QueryStack::getTopArea () const { return _topArea; }
inline const Transformation& QueryStack::getTopTransformation () const { return _topTransformation; }
inline unsigned int QueryStack::getStartLevel () const { return _startLevel; }
inline unsigned int QueryStack::getStopLevel () const { return _stopLevel; }
inline const Box& QueryStack::getArea () const { return back()->_area; }
inline const Transformation& QueryStack::getTransformation () const { return back()->_transformation; }
//inline const Tabulation& QueryStack::getTab () const { return _tab; }
inline Instance* QueryStack::getInstance ()
{
if ( levelCompleted() ) return NULL;
return back()->_locator->getElement();
}
inline Cell* QueryStack::getMasterCell ()
{
if ( size() == 1 ) return _topCell;
if ( !getInstance() ) return NULL;
return getInstance()->getMasterCell();
}
inline void QueryStack::setTopCell ( Cell* cell ) { _topCell = cell; }
inline void QueryStack::setTopArea ( const Box& area ) { _topArea = area; }
inline void QueryStack::setTopTransformation ( const Transformation& transformation ) { _topTransformation = transformation; }
inline void QueryStack::setStartLevel ( unsigned int level ) { _startLevel = level; }
inline void QueryStack::setStopLevel ( unsigned int level ) { _stopLevel = level; }
inline void QueryStack::init ()
{
while ( !empty() ) levelUp();
push_back ( new QueryState(NULL,_topArea,_topTransformation) );
//_tab++;
progress ( true );
}
inline void QueryStack::updateTransformation ()
{
QueryState* child = *(rbegin() );
QueryState* parent = *(rbegin()+1);
Instance* instance = child->_locator->getElement();
child->_area = parent->_area;
child->_transformation = instance->getTransformation ();
instance->getTransformation().getInvert().applyOn ( child->_area );
parent->_transformation.applyOn ( child->_transformation );
}
inline bool QueryStack::levelDown ()
{
if ( size() > _stopLevel ) return false;
Locator<Instance*>* locator = getMasterCell()->getInstancesUnder(getArea()).getLocator();
if ( locator->isValid() ) {
push_back ( new QueryState ( locator ) );
updateTransformation ();
//_tab++;
return true;
}
return false;
}
inline void QueryStack::levelUp ()
{
delete back ();
pop_back ();
//_tab--;
}
inline bool QueryStack::levelCompleted ()
{
if ( !back()->_locator || !back()->_locator->isValid () ) return true;
return false;
}
inline void QueryStack::levelProgress ()
{
if ( levelCompleted() ) return;
back()->_locator->progress ();
if ( !back()->_locator->isValid() ) return;
updateTransformation ();
}
inline void QueryStack::progress ( bool init )
{
if ( !init ) levelProgress ();
else {
if ( !levelDown() && ( size() > _startLevel ) )
return;
}
while ( !empty() ) {
if ( levelCompleted() ) {
levelUp ();
} else {
if ( levelDown() ) continue;
}
if ( size() > _startLevel ) return;
if ( empty() ) break;
levelProgress ();
}
}
// -------------------------------------------------------------------
// Class : "Query".
class Query {
public:
// Types.
enum QueryFilter { DoMasterCells = 1
, DoComponents = 2
, DoAll = DoMasterCells || DoComponents
};
public:
// Constructors & Destructors.
Query ();
virtual ~Query ();
// Accessors.
inline unsigned int getStartLevel () const;
inline unsigned int getStopLevel () const;
inline size_t getDepth () const;
inline const Transformation& getTransformation () const;
inline const Box& getArea () const;
inline const BasicLayer* getBasicLayer () const;
inline Cell* getMasterCell ();
inline Instance* getInstance ();
//inline const Tabulation& getTab () const;
virtual bool hasGoCallback () const;
virtual bool hasMasterCellCallback () const;
virtual void goCallback ( Go* go ) = 0;
virtual void masterCellCallback () = 0;
// Modifiers.
void setQuery ( Cell* cell
, const Box& area
, const Transformation& transformation
, const BasicLayer* basicLayer
, unsigned int filter
);
inline void setCell ( Cell* cell );
inline void setArea ( const Box& area );
inline void setTransformation ( const Transformation& transformation );
inline void setBasicLayer ( const BasicLayer* basicLayer );
inline void setFilter ( unsigned int mode );
inline void setStartLevel ( unsigned int level );
inline void setStopLevel ( unsigned int level );
void doQuery ();
protected:
// Internal: Attributes.
QueryStack _stack;
const BasicLayer* _basicLayer;
unsigned int _filter;
};
// Query Inline Functions.
inline void Query::setCell ( Cell* cell ) { _stack.setTopCell(cell); }
inline void Query::setArea ( const Box& area ) { _stack.setTopArea(area); }
inline void Query::setTransformation ( const Transformation& transformation ) { _stack.setTopTransformation(transformation); }
inline void Query::setBasicLayer ( const BasicLayer* basicLayer ) { _basicLayer = basicLayer; }
inline void Query::setFilter ( unsigned int filter ) { _filter = filter; }
inline void Query::setStartLevel ( unsigned int level ) { _stack.setStartLevel(level); }
inline void Query::setStopLevel ( unsigned int level ) { _stack.setStopLevel(level); }
inline unsigned int Query::getStartLevel () const { return _stack.getStartLevel(); }
inline unsigned int Query::getStopLevel () const { return _stack.getStopLevel(); }
inline size_t Query::getDepth () const { return _stack.size(); }
inline const Box& Query::getArea () const { return _stack.getArea(); }
inline const Transformation& Query::getTransformation () const { return _stack.getTransformation(); }
inline const BasicLayer* Query::getBasicLayer () const { return _basicLayer; }
inline Cell* Query::getMasterCell () { return _stack.getMasterCell(); }
inline Instance* Query::getInstance () { return _stack.getInstance(); }
//inline const Tabulation& Query::getTab () const { return _stack.getTab(); }
} // End of Hurricane namespace.
#endif // __QUERY_H__

View File

@ -72,9 +72,8 @@ namespace Hurricane {
CellViewer::CellViewer ( QWidget* parent ) : QMainWindow(parent)
, _applicationName(tr("Viewer"))
, _openAction(NULL)
, _nextCellAction(NULL)
, _previousCellAction(NULL)
, _nextAction(NULL)
, _saveAction(NULL)
, _exitAction(NULL)
@ -91,7 +90,10 @@ namespace Hurricane {
, _palette(NULL)
, _mousePosition(NULL)
, _cellWidget(NULL)
, _cellHistory()
{
setObjectName("viewer");
createMenus ();
createLayout ();
}
@ -103,49 +105,64 @@ namespace Hurricane {
{
if ( _openAction ) return;
_openAction = new QAction ( tr("&Open Cell"), this );
_openAction->setIcon ( QIcon(":/images/stock_open.png") );
_openAction->setStatusTip ( tr("Open (load) a new Cell") );
_openAction = new QAction ( tr("&Open Cell"), this );
_openAction->setObjectName ( "viewer.file.openCell" );
_openAction->setIcon ( QIcon(":/images/stock_open.png") );
_openAction->setStatusTip ( tr("Open (load) a new Cell") );
cerr << "_openAction: " << _openAction << endl;
_nextCellAction = new QAction ( tr("Next Cell"), this );
_nextCellAction->setStatusTip ( tr("Go to the next Cell in history") );
_nextAction = new QAction ( tr("&Next Breakpoint"), this );
_nextAction->setObjectName ( "viewer.file.nextBreakpoint" );
_nextAction->setStatusTip ( tr("Proceed to the next breakpoint") );
_previousCellAction = new QAction ( tr("Previous Cell"), this );
_previousCellAction->setStatusTip ( tr("Go to the previous Cell in history") );
for ( size_t i=0 ; i<CellHistorySize ; i++ ) {
_cellHistoryAction[i] = new QAction ( this );
_cellHistoryAction[i]->setObjectName ( QString("viewer.file.cellHistory[%1]").arg(i) );
_cellHistoryAction[i]->setVisible ( false );
_cellHistoryAction[i]->setData ( i );
_cellHistoryAction[i]->setFont ( Graphics::getFixedFont(QFont::Bold,false,false) );
connect ( _cellHistoryAction[i], SIGNAL(triggered()), this, SLOT(openHistoryCell()));
}
_nextAction = new QAction ( tr("&Next Breakpoint"), this );
_nextAction->setStatusTip ( tr("Proceed to the next breakpoint") );
_saveAction = new QAction ( tr("&Save Cell"), this );
_saveAction->setObjectName ( "viewer.file.saveCell" );
_saveAction->setIcon ( QIcon(":/images/stock_save.png") );
_saveAction->setStatusTip ( tr("Save the current Cell") );
_saveAction->setVisible ( false );
_saveAction = new QAction ( tr("&Save Cell"), this );
_saveAction->setIcon ( QIcon(":/images/stock_save.png") );
_saveAction->setStatusTip ( tr("Save the current Cell") );
_exitAction = new QAction ( tr("&Exit"), this );
_exitAction->setStatusTip ( tr("Close Coriolis CellViewer") );
_exitAction->setShortcut ( QKeySequence(tr("CTRL+Q")) );
_exitAction = new QAction ( tr("&Exit"), this );
_exitAction->setObjectName ( "viewer.file.exit" );
_exitAction->setStatusTip ( tr("Close Coriolis CellViewer") );
_exitAction->setShortcut ( QKeySequence(tr("CTRL+Q")) );
connect ( _exitAction, SIGNAL(triggered()), this, SLOT(close()) );
_refreshAction = new QAction ( tr("&Refresh"), this );
_refreshAction->setStatusTip ( tr("Force full redrawing of the display") );
_refreshAction->setShortcut ( QKeySequence(tr("CTRL+L")) );
_refreshAction = new QAction ( tr("&Refresh"), this );
_refreshAction->setObjectName ( "viewer.view.refresh" );
_refreshAction->setStatusTip ( tr("Force full redrawing of the display") );
_refreshAction->setShortcut ( QKeySequence(tr("CTRL+L")) );
_fitToContentsAction = new QAction ( tr("&Fit to Contents"), this );
_fitToContentsAction->setStatusTip ( tr("Adjust zoom to fit the whole cell's contents") );
_fitToContentsAction->setShortcut ( Qt::Key_F );
_fitToContentsAction = new QAction ( tr("&Fit to Contents"), this );
_fitToContentsAction->setObjectName ( "viewer.view.fit" );
_fitToContentsAction->setStatusTip ( tr("Adjust zoom to fit the whole cell's contents") );
_fitToContentsAction->setShortcut ( Qt::Key_F );
_showSelectionAction = new QAction ( tr("&Show Selection"), this );
_showSelectionAction->setStatusTip ( tr("Highlight the selected items (darken others)") );
_showSelectionAction->setShortcut ( Qt::Key_S );
_showSelectionAction->setCheckable ( true );
_showSelectionAction = new QAction ( tr("&Show Selection"), this );
_showSelectionAction->setObjectName ( "viewer.view.showSelection" );
_showSelectionAction->setStatusTip ( tr("Highlight the selected items (darken others)") );
_showSelectionAction->setShortcut ( Qt::Key_S );
_showSelectionAction->setCheckable ( true );
_runInspectorOnDataBase= new QAction ( tr("Inspect &DataBase"), this );
_runInspectorOnDataBase->setStatusTip ( tr("Run Inspector on Hurricane DataBase") );
_runInspectorOnDataBase= new QAction ( tr("Inspect &DataBase"), this );
_runInspectorOnDataBase->setObjectName ( "viewer.tool.inspectDb" );
_runInspectorOnDataBase->setStatusTip ( tr("Run Inspector on Hurricane DataBase") );
_runInspectorOnCell= new QAction ( tr("Inspect &Cell"), this );
_runInspectorOnCell->setStatusTip ( tr("Run Inspector on the current Cell") );
_runInspectorOnCell= new QAction ( tr("Inspect &Cell"), this );
_runInspectorOnCell->setObjectName ( "viewer.tool.inspectCell" );
_runInspectorOnCell->setStatusTip ( tr("Run Inspector on the current Cell") );
_browseNetlist= new QAction ( tr("Browse &Netlist"), this );
_browseNetlist->setStatusTip ( tr("Browse netlist from the current Cell") );
_browseNetlist= new QAction ( tr("Browse &Netlist"), this );
_browseNetlist->setObjectName ( "viewer.tool.browseNetlist" );
_browseNetlist->setStatusTip ( tr("Browse netlist from the current Cell") );
}
@ -156,19 +173,25 @@ namespace Hurricane {
if ( !_openAction ) createActions ();
_fileMenu = menuBar()->addMenu ( tr("File") );
_fileMenu->setObjectName ( "viewer.file" );
_fileMenu->addAction ( _openAction );
_fileMenu->addAction ( _nextCellAction );
_fileMenu->addAction ( _previousCellAction );
_fileMenu->addAction ( _nextAction );
_fileMenu->addSeparator ();
for ( size_t i=0 ; i<CellHistorySize ; i++ ) {
_fileMenu->addAction ( _cellHistoryAction[i] );
}
_fileMenu->addSeparator ();
_fileMenu->addAction ( _saveAction );
_fileMenu->addAction ( _exitAction );
_viewMenu = menuBar()->addMenu ( tr("View") );
_viewMenu->setObjectName ( "viewer.view" );
_viewMenu->addAction ( _refreshAction );
_viewMenu->addAction ( _fitToContentsAction );
_viewMenu->addAction ( _showSelectionAction );
_toolsMenu = menuBar()->addMenu ( tr("Tool") );
_toolsMenu->setObjectName ( "viewer.tool" );
_toolsMenu->addAction ( _runInspectorOnDataBase );
_toolsMenu->addAction ( _runInspectorOnCell );
_toolsMenu->addAction ( _browseNetlist );
@ -225,9 +248,52 @@ namespace Hurricane {
}
void CellViewer::refreshHistory ()
{
Cell* activeCell = getCell();
_cellHistory.remove ( activeCell );
if ( _cellHistory.size() > CellHistorySize-1 )
_cellHistory.pop_front ();
_cellHistory.push_back ( activeCell );
list<Cell*>::iterator iname = _cellHistory.begin();
for ( size_t i=0 ; i<CellHistorySize ; i++ ) {
if ( iname != _cellHistory.end() ) {
QString entry = tr("&%1: %2").arg(i+1).arg( getString((*iname)->getName()).c_str() );
_cellHistoryAction[i]->setText ( entry );
_cellHistoryAction[i]->setVisible ( true );
iname++;
} else {
_cellHistoryAction[i]->setVisible ( false );
}
}
}
void CellViewer::setCell ( Cell* cell )
{
_cellWidget->setCell ( cell );
QString title
= QString("%1:<%2>").arg(_applicationName).arg(getString(cell->getName()).c_str());
setWindowTitle ( title );
refreshHistory ();
}
Cell* CellViewer::getCell ()
{ return getCellWidget()->getCell(); }
Cell* CellViewer::getCellFromDb ( const char* name )
{
cerr << "[ERROR] virtual function CellViewer::getCellFromDb() has not been overloaded.\n"
<< " (this will prevent \"Open Cell\" to work)"
<< endl;
return NULL;
}
@ -246,6 +312,21 @@ namespace Hurricane {
}
void CellViewer::openHistoryCell ()
{
QAction* historyAction = qobject_cast<QAction*> ( sender() );
if ( historyAction ) {
list<Cell*>::iterator icell = _cellHistory.begin();
size_t index = historyAction->data().toUInt();
for ( ; index>0 ; index--, icell++ );
cerr << "History: " << *icell << endl;
setCell ( *icell );
}
}
void CellViewer::runInspectorOnDataBase ()
{
runInspector ( getRecord(DataBase::getDB()) );

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# include <QMouseEvent>
# include <QKeyEvent>
# include <QAction>
@ -135,7 +130,10 @@ namespace Hurricane {
CellWidget::DrawingPlanes::DrawingPlanes ( const QSize& size, CellWidget* cw )
: _cellWidget(cw)
, _normalPen()
, _linePen()
, _workingPlane(0)
, _lineMode(false)
{
for ( size_t i=0 ; i<2 ; i++ )
_planes[i] = new QPixmap ( size );
@ -151,6 +149,40 @@ namespace Hurricane {
}
void CellWidget::DrawingPlanes::setPen ( const QPen& pen )
{
_normalPen = pen;
_linePen = pen;
_linePen.setStyle ( Qt::SolidLine );
_linePen.setWidth ( 1 );
if ( _lineMode ) {
_painters[0].setPen ( _linePen );
_painters[1].setPen ( _linePen );
} else {
_painters[0].setPen ( _normalPen );
_painters[1].setPen ( _normalPen );
}
}
void CellWidget::DrawingPlanes::setBrush ( const QBrush& brush )
{
_painters[0].setBrush ( brush );
_painters[1].setBrush ( brush );
}
void CellWidget::DrawingPlanes::setLineMode ( bool mode )
{
if ( _lineMode != mode ) {
_lineMode = mode;
if ( _lineMode ) painter().setPen ( _linePen );
else painter().setPen ( _normalPen );
}
}
void CellWidget::DrawingPlanes::resize ( const QSize& size )
{
for ( size_t i=0 ; i<2 ; i++ ) {
@ -230,6 +262,71 @@ namespace Hurricane {
}
// -------------------------------------------------------------------
// Class : "Hurricane::CellWidget::DrawingQuery".
CellWidget::DrawingQuery::DrawingQuery ( CellWidget* widget )
: Query()
,_cellWidget(widget)
{ }
bool CellWidget::DrawingQuery::hasMasterCellCallback () const
{
return true;
}
void CellWidget::DrawingQuery::masterCellCallback ()
{
_cellWidget->drawBox ( getTransformation().getBox(getMasterCell()->getAbutmentBox()) );
}
bool CellWidget::DrawingQuery::hasGoCallback () const
{
return true;
}
void CellWidget::DrawingQuery::goCallback ( Go* go )
{
drawGo ( go, getBasicLayer(), getArea(), getTransformation() );
}
void CellWidget::DrawingQuery::drawGo ( const Go* go
, const BasicLayer* basicLayer
, const Box& area
, const Transformation& transformation
)
{
const Segment* segment = dynamic_cast<const Segment*>(go);
if ( segment ) {
if ( 1 < _cellWidget->dbuToDisplayLength(segment->getWidth()) ) {
_cellWidget->drawBox ( transformation.getBox(segment->getBoundingBox(basicLayer)) );
} else {
_cellWidget->drawLine ( transformation.getPoint(segment->getSourcePosition())
, transformation.getPoint(segment->getTargetPosition()) );
}
return;
}
const Contact* contact = dynamic_cast<const Contact*>(go);
if ( contact ) {
_cellWidget->drawBox ( transformation.getBox(contact->getBoundingBox(basicLayer)) );
return;
}
const Pad* pad = dynamic_cast<const Pad*>(go);
if ( pad ) {
_cellWidget->drawBox ( transformation.getBox(pad->getBoundingBox(basicLayer)) );
return;
}
}
// -------------------------------------------------------------------
// Class : "Hurricane::CellWidget".
@ -245,6 +342,7 @@ namespace Hurricane {
, _scale(1.0)
, _offsetVA(_stripWidth,_stripWidth)
, _drawingPlanes(QSize(6*_stripWidth,6*_stripWidth),this)
, _drawingQuery(this)
, _lastMousePosition(0,0)
, _spot(this)
, _cell(NULL)
@ -324,7 +422,8 @@ namespace Hurricane {
void CellWidget::setShowSelection ( bool state )
{
if ( state != _showSelection ) {
_showSelection = state;
_showSelection = state;
_selectionHasChanged = false;
redraw ();
}
}
@ -332,13 +431,16 @@ namespace Hurricane {
void CellWidget::redraw ( QRect redrawArea )
{
//cerr << "CellWidget::redraw()" << endl;
cerr << "CellWidget::redraw() - " << _selectionHasChanged << endl;
//_drawingQuery.setStartLevel ( 1 );
//_drawingQuery.setStopLevel ( 2 );
_redrawRectCount = 0;
pushCursor ( Qt::BusyCursor );
if ( !_selectionHasChanged ) {
if ( ! ( _selectionHasChanged && _showSelection ) ) {
_spot.setRestore ( false );
_drawingPlanes.select ( 0 );
_drawingPlanes.painterBegin ();
@ -351,21 +453,31 @@ namespace Hurricane {
int darkening = (_showSelection) ? 200 : 100;
if ( _cell ) {
Box redrawBox = displayToDbuBox ( redrawArea );
for_each_basic_layer ( basicLayer, _technology->getBasicLayers() ) {
_drawingPlanes.painter().setPen ( Graphics::getPen (basicLayer->getName(),darkening) );
_drawingPlanes.painter().setBrush ( Graphics::getBrush(basicLayer->getName(),darkening) );
Box redrawBox = displayToDbuBox ( redrawArea );
if ( isDrawable(basicLayer->getName()) )
drawCell ( _cell, basicLayer, redrawBox, Transformation() );
end_for;
_drawingQuery.setArea ( redrawBox );
_drawingQuery.setTransformation ( Transformation() );
forEach ( BasicLayer*, iLayer, _technology->getBasicLayers() ) {
_drawingPlanes.setPen ( Graphics::getPen ((*iLayer)->getName(),darkening));
_drawingPlanes.setBrush ( Graphics::getBrush((*iLayer)->getName(),darkening) );
if ( isDrawable((*iLayer)->getName()) ) {
//drawCell ( _cell, (*iLayer), redrawBox, Transformation() );
_drawingQuery.setBasicLayer ( *iLayer );
_drawingQuery.setFilter ( Query::DoComponents );
_drawingQuery.doQuery ();
}
}
if ( isDrawable("boundaries") ) {
_drawingPlanes.painter().setPen ( Graphics::getPen ("boundaries") );
_drawingPlanes.painter().setBrush ( Graphics::getBrush("boundaries") );
_drawingPlanes.setPen ( Graphics::getPen ("boundaries") );
_drawingPlanes.setBrush ( Graphics::getBrush("boundaries") );
drawBoundaries ( _cell, redrawBox, Transformation() );
//drawBoundaries ( _cell, redrawBox, Transformation() );
_drawingQuery.setBasicLayer ( NULL );
_drawingQuery.setFilter ( Query::DoMasterCells );
_drawingQuery.doQuery ();
}
}
@ -386,8 +498,6 @@ namespace Hurricane {
void CellWidget::redrawSelection ( QRect redrawArea )
{
cerr << "CellWidget::redrawSelection()" << endl;
_drawingPlanes.copyToSelect ( redrawArea.x()
, redrawArea.y()
, redrawArea.width()
@ -404,10 +514,10 @@ namespace Hurricane {
Box redrawBox = displayToDbuBox ( redrawArea );
for_each_basic_layer ( basicLayer, _technology->getBasicLayers() ) {
if ( !isDrawable(basicLayer->getName()) ) continue;
//if ( !isDrawable(basicLayer->getName()) ) continue;
_drawingPlanes.painter().setPen ( Graphics::getPen (basicLayer->getName()) );
_drawingPlanes.painter().setBrush ( Graphics::getBrush(basicLayer->getName()) );
_drawingPlanes.setPen ( Graphics::getPen (basicLayer->getName()) );
_drawingPlanes.setBrush ( Graphics::getBrush(basicLayer->getName()) );
set<Selector*>::iterator iselector = _selectors.begin ();
for ( ; iselector != _selectors.end() ; iselector++ ) {
@ -416,11 +526,21 @@ namespace Hurricane {
Instance* instance = dynamic_cast<Instance*>(occurrence.getEntity());
if ( instance ) {
drawInstance ( instance, basicLayer, redrawBox, transformation );
// Temporary.
//drawInstance ( instance, basicLayer, redrawBox, transformation );
continue;
}
drawGo ( dynamic_cast<Go*>(occurrence.getEntity()), basicLayer, redrawBox, transformation );
Component* component = dynamic_cast<Component*>(occurrence.getEntity());
if ( !component ) continue;
if ( !component->getLayer() ) continue;
if ( !component->getLayer()->contains(basicLayer) ) continue;
_drawingQuery.drawGo ( dynamic_cast<Go*>(occurrence.getEntity())
, basicLayer
, redrawBox
, transformation
);
}
end_for;
}
@ -431,34 +551,6 @@ namespace Hurricane {
}
void CellWidget::drawBoundaries ( const Cell* cell
, const Box& redrawArea
, const Transformation& transformation
)
{
drawBox ( transformation.getBox(cell->getAbutmentBox()) );
for_each_instance ( instance, cell->getInstances() ) {
drawBoundaries ( instance, redrawArea, transformation );
end_for;
}
}
void CellWidget::drawBoundaries ( const Instance* instance
, const Box& redrawArea
, const Transformation& transformation
)
{
Box masterArea = redrawArea;
Transformation masterTransformation = instance->getTransformation();
instance->getTransformation().getInvert().applyOn ( masterArea );
transformation.applyOn ( masterTransformation );
drawBoundaries ( instance->getMasterCell(), masterArea, masterTransformation );
}
bool CellWidget::isDrawable ( const Name& entryName )
{
HPaletteEntry* entry = (_palette) ? _palette->find(entryName) : NULL;
@ -468,126 +560,17 @@ namespace Hurricane {
}
void CellWidget::drawCell ( const Cell* cell
, const BasicLayer* basicLayer
, const Box& redrawArea
, const Transformation& transformation
)
{
for_each_instance ( instance, cell->getInstancesUnder(redrawArea) ) {
drawInstance ( instance, basicLayer, redrawArea, transformation );
end_for;
}
for_each_slice ( slice, cell->getSlices() ) {
drawSlice ( slice, basicLayer, redrawArea, transformation );
end_for;
}
}
void CellWidget::drawInstance ( const Instance* instance
, const BasicLayer* basicLayer
, const Box& redrawArea
, const Transformation& transformation
)
{
Box masterArea = redrawArea;
Transformation masterTransformation = instance->getTransformation();
instance->getTransformation().getInvert().applyOn ( masterArea );
transformation.applyOn ( masterTransformation );
drawCell ( instance->getMasterCell(), basicLayer, masterArea, masterTransformation );
}
void CellWidget::drawSlice ( const Slice* slice
, const BasicLayer* basicLayer
, const Box& redrawArea
, const Transformation& transformation
)
{
if ( slice->getLayer()->contains(basicLayer) ) {
if ( slice->getBoundingBox().intersect(redrawArea) ) {
for_each_go ( go, slice->getGosUnder(redrawArea) ) {
drawGo ( go, basicLayer, redrawArea, transformation );
end_for;
}
}
}
}
void CellWidget::drawGo ( const Go* go
, const BasicLayer* basicLayer
, const Box& redrawArea
, const Transformation& transformation
)
{
const Segment* segment = dynamic_cast<const Segment*>(go);
if (segment) {
drawSegment ( segment, basicLayer, redrawArea, transformation );
return;
}
const Contact* contact = dynamic_cast<const Contact*>(go);
if (contact) {
drawContact ( contact, basicLayer, redrawArea, transformation );
return;
}
const Pad* pad = dynamic_cast<const Pad*>(go);
if (pad) {
drawPad ( pad, basicLayer, redrawArea, transformation );
return;
}
}
void CellWidget::drawSegment ( const Segment* segment
, const BasicLayer* basicLayer
, const Box& redrawArea
, const Transformation& transformation
)
{
if ( 1 < dbuToDisplayLength(segment->getWidth()) ) {
drawBox ( transformation.getBox(segment->getBoundingBox(basicLayer)) );
} else {
drawLine ( transformation.getPoint(segment->getSourcePosition()),
transformation.getPoint(segment->getTargetPosition()) );
}
}
void CellWidget::drawContact ( const Contact* contact
, const BasicLayer* basicLayer
, const Box& redrawArea
, const Transformation& transformation
)
{
drawBox ( transformation.getBox(contact->getBoundingBox(basicLayer)) );
}
void CellWidget::drawPad ( const Pad* pad
, const BasicLayer* basicLayer
, const Box& redrawArea
, const Transformation& transformation
)
{
drawBox ( transformation.getBox(pad->getBoundingBox(basicLayer)) );
}
void CellWidget::drawBox ( const Box& box )
{
_redrawRectCount++;
_drawingPlanes.setLineMode ( false );
_drawingPlanes.painter().drawRect ( dbuToDisplayRect(box) );
}
void CellWidget::drawLine ( const Point& p1, const Point& p2 )
{
_drawingPlanes.setLineMode ( true );
_drawingPlanes.painter().drawLine ( dbuToDisplayPoint(p1), dbuToDisplayPoint(p2) );
}
@ -998,6 +981,8 @@ namespace Hurricane {
void CellWidget::setCell ( Cell* cell )
{
_cell = cell;
_drawingQuery.setCell ( cell );
fitToContents ();
}

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# include <cassert>
# include "hurricane/viewer/DisplayStyle.h"
@ -99,8 +94,10 @@ namespace Hurricane {
, _threshold(threshold)
, _refcount(1)
{
if ( borderWidth )
if ( borderWidth ) {
_pen.setStyle ( Qt::SolidLine );
_pen.setWidth ( borderWidth );
}
else
_pen.setStyle ( Qt::NoPen );
}

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# include <QFontMetrics>
# include <QFont>
# include <QLabel>

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# include <assert.h>
# include <Qt>

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# include <QPushButton>
# include <QHBoxLayout>

View File

@ -50,10 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
#include <QFontMetrics>
#include <QComboBox>
#include <QLabel>
@ -192,6 +188,7 @@ namespace Hurricane {
, _history()
{
setAttribute ( Qt::WA_DeleteOnClose );
setAttribute ( Qt::WA_QuitOnClose, false );
_rowHeight = QFontMetrics(Graphics::getFixedFont()).height() + 4;

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# include <QHBoxLayout>
# include "hurricane/viewer/DynamicLabel.h"

View File

@ -38,7 +38,6 @@
// 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 |
@ -50,17 +49,13 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
#include <QFontMetrics>
#include <QLabel>
#include <QLineEdit>
#include <QHeaderView>
#include <QKeyEvent>
#include <QGroupBox>
#include <QVBoxLayout>
#include <QFontMetrics>
#include <QLabel>
#include <QLineEdit>
#include <QHeaderView>
#include <QKeyEvent>
#include <QGroupBox>
#include <QVBoxLayout>
#include "hurricane/Commons.h"
#include "hurricane/Net.h"
@ -68,6 +63,7 @@
#include "hurricane/viewer/Graphics.h"
#include "hurricane/viewer/HNetlistModel.h"
#include "hurricane/viewer/HNetlist.h"
#include "hurricane/viewer/HInspectorWidget.h"
namespace Hurricane {
@ -83,6 +79,7 @@ namespace Hurricane {
, _cellWidget(NULL)
{
setAttribute ( Qt::WA_DeleteOnClose );
setAttribute ( Qt::WA_QuitOnClose, false );
_rowHeight = QFontMetrics(Graphics::getFixedFont()).height() + 4;
@ -146,11 +143,8 @@ namespace Hurricane {
void HNetlist::keyPressEvent ( QKeyEvent* event )
{
cerr << "keyPressEvent" << endl;
if ( event->key() == Qt::Key_Left ) {
cerr << "Key Left Pressed." << endl;
} else {
if ( event->key() == Qt::Key_I ) { runInspector(_netlistView->currentIndex()); }
else {
event->ignore();
}
}
@ -162,4 +156,17 @@ namespace Hurricane {
}
void HNetlist::runInspector ( const QModelIndex& index )
{
if ( index.isValid() ) {
const Net* net = _netlistModel->getNet ( _sortModel->mapToSource(index).row() );
HInspectorWidget* inspector = new HInspectorWidget ();
inspector->setRootRecord ( getRecord(net) );
inspector->show ();
}
}
} // End of Hurricane namespace.

View File

@ -50,9 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
#include <QFont>
#include <QApplication>

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# include <vector>
# include <QHBoxLayout>

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# include <QPainter>
# include "hurricane/viewer/Graphics.h"

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# include <QCheckBox>
# include <QHBoxLayout>

View File

@ -50,9 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
#include <QObject>
#include "hurricane/Name.h"

View File

@ -50,9 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
#include <QFont>
#include <QApplication>

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# include <QBitmap>
# include "hurricane/BasicLayer.h"

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# include <QCheckBox>
# include <QHBoxLayout>

View File

@ -50,15 +50,12 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
#ifndef __CELL_VIEWER_H__
#define __CELL_VIEWER_H__
#include <list>
using namespace std;
#include <QMainWindow>
@ -69,6 +66,7 @@ class QAction;
class QMenu;
#include "hurricane/Commons.h"
#include "hurricane/Name.h"
#include "hurricane/Occurrence.h"
@ -89,21 +87,27 @@ namespace Hurricane {
public:
CellViewer ( QWidget* parent=NULL );
inline void setApplicationName ( const QString& name );
void setCell ( Cell* cell );
Cell* getCell ();
virtual Cell* getCellFromDb ( const char* name );
inline CellWidget* getCellWidget ();
void select ( Occurrence& occurence );
void unselect ( Occurrence& occurence );
void unselectAll ();
public slots:
void openHistoryCell ();
void runInspectorOnDataBase ();
void runInspectorOnCell ();
void browseNetlist ();
public:
enum { CellHistorySize = 10 };
protected:
QString _applicationName;
QAction* _openAction;
QAction* _nextCellAction;
QAction* _previousCellAction;
QAction* _nextAction;
QAction* _cellHistoryAction[CellHistorySize];
QAction* _saveAction;
QAction* _exitAction;
QAction* _refreshAction;
@ -119,18 +123,20 @@ namespace Hurricane {
HPalette* _palette;
HMousePosition* _mousePosition;
CellWidget* _cellWidget;
list<Cell*> _cellHistory;
protected:
void createActions ();
void createMenus ();
void createLayout ();
void refreshHistory ();
void runInspector ( Record* record );
};
// Inline Functions.
inline CellWidget* CellViewer::getCellWidget ()
{ return _cellWidget; }
inline CellWidget* CellViewer::getCellWidget () { return _cellWidget; }
inline void CellViewer::setApplicationName ( const QString& name ) { _applicationName = name; }

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# ifndef __CELL_WIDGET_H__
# define __CELL_WIDGET_H__
@ -79,6 +74,7 @@ class QAction;
# include "hurricane/Point.h"
# include "hurricane/Box.h"
# include "hurricane/Transformation.h"
# include "hurricane/Query.h"
# include "hurricane/viewer/DisplayStyle.h"
# include "hurricane/viewer/CellWidgets.h"
@ -131,16 +127,7 @@ namespace Hurricane {
void unselect ( Occurrence& occurence );
void unselectAll ( bool delayRedraw=true );
// Painter control & Hurricane objects drawing primitives.
void drawBoundaries ( const Cell* , const Box&, const Transformation& );
void drawBoundaries ( const Instance*, const Box&, const Transformation& );
bool isDrawable ( const Name& entryName );
void drawCell ( const Cell* , const BasicLayer*, const Box&, const Transformation& );
void drawInstance ( const Instance*, const BasicLayer*, const Box&, const Transformation& );
void drawSlice ( const Slice* , const BasicLayer*, const Box&, const Transformation& );
void drawGo ( const Go* , const BasicLayer*, const Box&, const Transformation& );
void drawSegment ( const Segment* , const BasicLayer*, const Box&, const Transformation& );
void drawContact ( const Contact* , const BasicLayer*, const Box&, const Transformation& );
void drawPad ( const Pad* , const BasicLayer*, const Box&, const Transformation& );
void drawBox ( const Box& );
void drawLine ( const Point&, const Point& );
void drawGrid ();
@ -217,6 +204,7 @@ namespace Hurricane {
public:
DrawingPlanes ( const QSize& size, CellWidget* cw );
~DrawingPlanes ();
inline bool getLineMode () const;
inline int width () const;
inline int height () const;
inline QSize size () const;
@ -231,6 +219,9 @@ namespace Hurricane {
inline void painterEnd ();
inline void painterEnd ( size_t i );
inline void paintersEnd ();
void setLineMode ( bool mode );
void setPen ( const QPen& pen );
void setBrush ( const QBrush& brush );
void resize ( const QSize& size );
void shiftLeft ( int dx );
void shiftRight ( int dx );
@ -244,12 +235,38 @@ namespace Hurricane {
CellWidget* _cellWidget;
QPixmap* _planes[2];
QPainter _painters[3];
QPen _normalPen;
QPen _linePen;
size_t _workingPlane;
bool _lineMode;
private:
DrawingPlanes ( const DrawingPlanes& );
DrawingPlanes& operator= ( const DrawingPlanes& );
};
private:
class DrawingQuery : public Query {
public:
DrawingQuery ( CellWidget* widget );
inline void setQuery ( const Box& area
, const Transformation& transformation
, const BasicLayer* basicLayer
, unsigned int filter
);
virtual bool hasMasterCellCallback () const;
virtual bool hasGoCallback () const;
virtual void masterCellCallback ();
virtual void goCallback ( Go* go );
void drawGo ( const Go* go
, const BasicLayer* basicLayer
, const Box& area
, const Transformation& transformation
);
protected:
CellWidget* _cellWidget;
};
protected:
// Internal: Attributes.
static const int _stripWidth;
@ -262,6 +279,7 @@ namespace Hurricane {
float _scale;
QPoint _offsetVA;
DrawingPlanes _drawingPlanes;
DrawingQuery _drawingQuery;
QPoint _lastMousePosition;
Spot _spot;
Cell* _cell;
@ -276,6 +294,18 @@ namespace Hurricane {
inline void CellWidget::DrawingQuery::setQuery ( const Box& area
, const Transformation& transformation
, const BasicLayer* basicLayer
, unsigned int filter
)
{ Query::setQuery ( _cellWidget->getCell(), area, transformation, basicLayer, filter ); }
inline bool CellWidget::DrawingPlanes::getLineMode () const
{ return _lineMode; }
inline int CellWidget::DrawingPlanes::width () const
{ return _planes[0]->width(); }
@ -315,7 +345,7 @@ namespace Hurricane {
inline void CellWidget::DrawingPlanes::painterBegin ( size_t i )
{
if ( i<2 ) _painters[i].begin ( _planes[i] );
else _painters[i].begin ( _cellWidget );
else _painters[i].begin ( _cellWidget );
}

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# ifndef __DISPLAYSTYLE_H__
# define __DISPLAYSTYLE_H__

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# ifndef __DYNAMIC_LABEL_H__
# define __DYNAMIC_LABEL_H__

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# ifndef __GRAPHICS_H__
# define __GRAPHICS_H__

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# ifndef __GROUP_HPALETTE_ENTRY_H__
# define __GROUP_HPALETTE_ENTRY_H__

View File

@ -50,9 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
#ifndef __HINSPECTOR_WIDGET_H__
#define __HINSPECTOR_WIDGET_H__

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# ifndef __HMOUSE_POSITION_H__
# define __HMOUSE_POSITION_H__

View File

@ -50,9 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
#ifndef __HNETLIST_WIDGET_H__
#define __HNETLIST_WIDGET_H__
@ -90,6 +87,7 @@ namespace Hurricane {
void setCell ( Cell* cell );
template<typename InformationType>
void setCellWidget ( CellWidget* cw );
void runInspector ( const QModelIndex& index );
private slots:
void textFilterChanged ();
void selectNet ( const QModelIndex& index );

View File

@ -50,9 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
#ifndef __NETLIST_MODEL_H__
#define __NETLIST_MODEL_H__

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# ifndef __HPALETTE__
# define __HPALETTE__

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# ifndef __PALETTE_ENTRY_H__
# define __PALETTE_ENTRY_H__

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# ifndef __LAYER_PALETTE_ENTRY_H__
# define __LAYER_PALETTE_ENTRY_H__

View File

@ -50,9 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
#ifndef __NET_INFORMATIONS_H__
#define __NET_INFORMATIONS_H__

View File

@ -50,9 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
#ifndef __RECORD_MODEL_H__
#define __RECORD_MODEL_H__

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# ifndef __SCREENUTILITIES_H__
# define __SCREENUTILITIES_H__

View File

@ -50,11 +50,6 @@
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
# ifndef __VIEWER_PALETTE_ENTRY_H__
# define __VIEWER_PALETTE_ENTRY_H__