From 4c7cf227bec3323576babe303781afada675c674 Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Fri, 14 Apr 2023 01:07:40 +0200 Subject: [PATCH] Add ability to "filter out" buried net in TabEquipotentials. Definition: A buried net is a net that has no components at the top Cell level. Typically example is a wire internal to a standard cell. Those nets, while part of the complete design (flat) are not part of the top netlist, and we may want not to see it. A buried net is slighly different from a deep net. While a deepnet is also not reaching the top level cell, we created it at top level to be processed by the router (virtual flatten). --- tramontana/src/Equipotential.cpp | 3 + tramontana/src/EquipotentialsWidget.cpp | 49 +++++++++++++- tramontana/src/TabEquipotentials.cpp | 17 +++++ tramontana/src/tramontana/Equipotential.h | 5 +- .../src/tramontana/EquipotentialsWidget.h | 64 +++++++++++++------ tramontana/src/tramontana/TabEquipotentials.h | 8 +-- 6 files changed, 116 insertions(+), 30 deletions(-) diff --git a/tramontana/src/Equipotential.cpp b/tramontana/src/Equipotential.cpp index e92466a2..d5a49b65 100644 --- a/tramontana/src/Equipotential.cpp +++ b/tramontana/src/Equipotential.cpp @@ -202,6 +202,7 @@ namespace Tramontana { , _type (Net::Type::UNDEFINED) , _direction (Net::Direction::DirUndefined) , _netCount (0) + , _isBuried (false) , _isExternal (false) , _isGlobal (false) , _isAutomatic(false) @@ -354,6 +355,7 @@ namespace Tramontana { for ( Occurrence childEqui : _childs ) { childEqui.put( relation ); } + if (_components.empty() and _nets.empty()) _isBuried = true; // if (_name == "abc_11873_auto_rtlil_cc_2560_muxgate_11612") // show(); @@ -388,6 +390,7 @@ namespace Tramontana { sflags += ((_isExternal ) ? "e" : "-"); sflags += ((_isGlobal ) ? "g" : "-"); sflags += ((_isAutomatic) ? "a" : "-"); + sflags += ((_isBuried ) ? "B" : "-"); sflags += " [N:" + getString( _netCount - ((_hasFused) ? 1 : 0) ); sflags += "+E:" + getString( _childs.size() ); if (_hasFused) diff --git a/tramontana/src/EquipotentialsWidget.cpp b/tramontana/src/EquipotentialsWidget.cpp index 80910baf..5d7ef6b6 100644 --- a/tramontana/src/EquipotentialsWidget.cpp +++ b/tramontana/src/EquipotentialsWidget.cpp @@ -39,12 +39,42 @@ namespace Tramontana { using Hurricane::Graphics; +// ------------------------------------------------------------------- +// Class : "BuriedFilterProxymodel". + + + EquiFilterProxyModel::EquiFilterProxyModel ( QObject* parent ) + : Super (parent) + , _filter(NoFilter) + { } + + + void EquiFilterProxyModel::setFilter ( uint32_t filter ) + { _filter = filter; invalidateFilter(); } + + + bool EquiFilterProxyModel::filterAcceptsRow ( int row, const QModelIndex& index ) const + { + EquipotentialsModel* model = dynamic_cast( sourceModel() ); + if (not model) return true; + + const Equipotential* equi = model->getEqui( row ); + if (not (_filter & ShowBuried) and equi->isBuried()) return false; + return true; + } + + +// ------------------------------------------------------------------- +// Class : "EquipotentialsWidget". + + EquipotentialsWidget::EquipotentialsWidget ( QWidget* parent ) : QWidget (parent) , _cellWidget (NULL) , _cell (NULL) , _baseModel (new EquipotentialsModel(this)) , _sortModel (new QSortFilterProxyModel(this)) + , _filterModel (new EquiFilterProxyModel(this)) , _view (new QTableView(this)) , _rowHeight (20) , _selecteds () @@ -56,7 +86,9 @@ namespace Tramontana { _rowHeight = QFontMetrics( Graphics::getFixedFont() ).height() + 4; - _sortModel->setSourceModel ( _baseModel ); + _filterModel->setSourceModel ( _baseModel ); + //_filterModel->setFilter ( EquiFilterProxyModel::ShowBuried ); + _sortModel->setSourceModel ( _filterModel ); _sortModel->setDynamicSortFilter( true ); _sortModel->setFilterKeyColumn ( 0 ); @@ -110,6 +142,17 @@ namespace Tramontana { } + QModelIndex EquipotentialsWidget::mapToSource ( QModelIndex viewIndex ) const + { return _filterModel->mapToSource( _sortModel->mapToSource( viewIndex )); } + + + void EquipotentialsWidget::setShowBuried ( bool state ) + { + _filterModel->setFilter( (state) ? EquiFilterProxyModel::ShowBuried + : EquiFilterProxyModel::NoFilter ); + } + + void EquipotentialsWidget::goTo ( int delta ) { if ( delta == 0 ) return; @@ -138,7 +181,7 @@ namespace Tramontana { const Equipotential* equi = nullptr; QModelIndexList iList = _view->selectionModel()->selectedRows(); for ( int i=0 ; igetEqui( _sortModel->mapToSource(iList[i]).row() ); + equi = _baseModel->getEqui( mapToSource(iList[i]).row() ); if ( equi ) _selecteds.insert( equi ); } @@ -182,7 +225,7 @@ namespace Tramontana { void EquipotentialsWidget::fitToEqui () { - const Equipotential* equi = _baseModel->getEqui( _sortModel->mapToSource(_view->currentIndex()).row() ); + const Equipotential* equi = _baseModel->getEqui( mapToSource(_view->currentIndex()).row() ); if (equi) emit reframe ( equi->getBoundingBox() ); } diff --git a/tramontana/src/TabEquipotentials.cpp b/tramontana/src/TabEquipotentials.cpp index 13112101..9d052537 100644 --- a/tramontana/src/TabEquipotentials.cpp +++ b/tramontana/src/TabEquipotentials.cpp @@ -27,6 +27,8 @@ namespace Tramontana { + using std::cerr; + using std::endl; using Hurricane::Graphics; @@ -39,6 +41,7 @@ namespace Tramontana { , _browser (new EquipotentialsWidget()) , _syncEquipotentials (new QCheckBox()) , _syncSelection (new QCheckBox()) + , _showBuried (new QCheckBox()) , _cwCumulativeSelection(false) { _browser->setObjectName ( "controller.tabEquipotentials.browser" ); @@ -57,11 +60,18 @@ namespace Tramontana { _syncSelection->setFont ( Graphics::getFixedFont(QFont::Bold,false,false) ); connect( _syncSelection, SIGNAL(toggled(bool)), this, SLOT(setSyncSelection(bool)) ); + _showBuried->setText ( tr("Show Buried") ); + _showBuried->setChecked( false ); + _showBuried->setFont ( Graphics::getFixedFont(QFont::Bold,false,false) ); + connect( _showBuried, SIGNAL(toggled(bool)), this, SLOT(setShowBuried(bool)) ); + QHBoxLayout* commands = new QHBoxLayout (); commands->setContentsMargins( 0, 0, 0, 0 ); commands->addStretch(); commands->addWidget ( _syncEquipotentials ); commands->addStretch(); + commands->addWidget ( _showBuried ); + commands->addStretch(); commands->addWidget ( _syncSelection ); commands->addStretch(); wLayout->addLayout ( commands ); @@ -108,6 +118,13 @@ namespace Tramontana { } + void TabEquipotentials::setShowBuried ( bool state ) + { + if (not getCellWidget()) return; + _browser->setShowBuried( state ); + } + + void TabEquipotentials::setCell ( Cell* cell ) { setSyncEquipotentials( _syncEquipotentials->isChecked() ); diff --git a/tramontana/src/tramontana/Equipotential.h b/tramontana/src/tramontana/Equipotential.h index e5ced07a..fefecd6b 100644 --- a/tramontana/src/tramontana/Equipotential.h +++ b/tramontana/src/tramontana/Equipotential.h @@ -57,6 +57,7 @@ namespace Tramontana { public: static Equipotential* create ( Cell* ); inline bool isEmpty () const; + inline bool isBuried () const; virtual Cell* getCell () const; virtual Box getBoundingBox () const; inline std::string getName () const; @@ -95,6 +96,7 @@ namespace Tramontana { Net::Type _type; Net::Direction _direction; uint32_t _netCount; + bool _isBuried; bool _isExternal; bool _isGlobal; bool _isAutomatic; @@ -103,7 +105,8 @@ namespace Tramontana { - inline bool Equipotential::isEmpty () const { return _components.empty() and _childs.empty(); } + inline bool Equipotential::isEmpty () const { return _components.empty() and _childs.empty(); } + inline bool Equipotential::isBuried () const { return _isBuried; } inline const OccurrenceSet& Equipotential::getComponents () const { return _components; } inline const OccurrenceSet& Equipotential::getChilds () const { return _childs; } inline const NetSet& Equipotential::getNets () const { return _nets; } diff --git a/tramontana/src/tramontana/EquipotentialsWidget.h b/tramontana/src/tramontana/EquipotentialsWidget.h index 71e0837a..6df29cad 100644 --- a/tramontana/src/tramontana/EquipotentialsWidget.h +++ b/tramontana/src/tramontana/EquipotentialsWidget.h @@ -47,6 +47,25 @@ namespace Tramontana { using Hurricane::OccurrenceSet; +// ------------------------------------------------------------------- +// Class : EquiFilterProxyModel". + + + class EquiFilterProxyModel : public QSortFilterProxyModel { + Q_OBJECT; + public: + typedef QSortFilterProxyModel Super; + static const uint32_t NoFilter = 0; + static const uint32_t ShowBuried = (1<<0); + public: + EquiFilterProxyModel ( QObject* ); + void setFilter ( uint32_t ); + virtual bool filterAcceptsRow ( int row, const QModelIndex& ) const; + private: + uint32_t _filter; + }; + + // ------------------------------------------------------------------- // Class : "SelectedEqui". @@ -130,31 +149,34 @@ namespace Tramontana { Q_OBJECT; public: - EquipotentialsWidget ( QWidget* parent=nullptr ); - inline Cell* getCell (); - void setCellWidget ( CellWidget* ); - void setCell ( Cell* ); - void goTo ( int ); - void updateSelecteds (); + EquipotentialsWidget ( QWidget* parent=nullptr ); + inline Cell* getCell (); + void setShowBuried ( bool ); + void setCellWidget ( CellWidget* ); + void setCell ( Cell* ); + void goTo ( int ); + void updateSelecteds (); + QModelIndex mapToSource ( QModelIndex ) const; signals: - void equipotentialSelect ( Occurrences ); - void equipotentialUnselect ( Occurrences ); - void reframe ( const Box& ); + void equipotentialSelect ( Occurrences ); + void equipotentialUnselect ( Occurrences ); + void reframe ( const Box& ); private slots: - void textFilterChanged (); - void updateSelecteds ( const QItemSelection& , const QItemSelection& ); - void fitToEqui (); + void textFilterChanged (); + void updateSelecteds ( const QItemSelection& , const QItemSelection& ); + void fitToEqui (); private: - CellWidget* _cellWidget; - Cell* _cell; - EquipotentialsModel* _baseModel; - QSortFilterProxyModel* _sortModel; - QTableView* _view; - QLineEdit* _filterPatternLineEdit; - int _rowHeight; - SelectedEquiSet _selecteds; - bool _forceReselect; + CellWidget* _cellWidget; + Cell* _cell; + EquipotentialsModel* _baseModel; + QSortFilterProxyModel* _sortModel; + EquiFilterProxyModel* _filterModel; + QTableView* _view; + QLineEdit* _filterPatternLineEdit; + int _rowHeight; + SelectedEquiSet _selecteds; + bool _forceReselect; }; diff --git a/tramontana/src/tramontana/TabEquipotentials.h b/tramontana/src/tramontana/TabEquipotentials.h index 075a2783..8945c2f7 100644 --- a/tramontana/src/tramontana/TabEquipotentials.h +++ b/tramontana/src/tramontana/TabEquipotentials.h @@ -35,8 +35,6 @@ namespace Tramontana { public: TabEquipotentials ( QWidget* parent=NULL ); - inline QCheckBox* getSyncEquipotentials (); - inline QCheckBox* getSyncSelection (); inline EquipotentialsWidget* getBrowser (); virtual void cellPreModificate (); virtual void cellPostModificate (); @@ -45,18 +43,18 @@ namespace Tramontana { virtual void setCellWidget ( CellWidget* ); virtual void setSyncEquipotentials ( bool ); virtual void setSyncSelection ( bool ); + virtual void setShowBuried ( bool ); protected: EquipotentialsWidget* _browser; QCheckBox* _syncEquipotentials; QCheckBox* _syncSelection; + QCheckBox* _showBuried; bool _cwCumulativeSelection; }; - inline EquipotentialsWidget* TabEquipotentials::getBrowser () { return _browser; } - inline QCheckBox* TabEquipotentials::getSyncEquipotentials () { return _syncEquipotentials; } - inline QCheckBox* TabEquipotentials::getSyncSelection () { return _syncSelection; } + inline EquipotentialsWidget* TabEquipotentials::getBrowser () { return _browser; } }