97 else if (row != inx.row())
105 row = firstIndex.
row();
110 qDebug() <<
"cannot cast" << indexes.at(0);
131 stream << item->
getType() <<
id << row << (quintptr) parentItem;
133 retval->
setData(
"modulemodel/item", encodedData);
156 return mModuleItemMaps[(int)
type]->value(
id);
161 return mModuleItemMaps[(int)
type]->values(
id);
182 for (
const Gate* g : gates)
184 Module* parentModule = g->get_module();
186 bool insertToRoot =
true;
189 while (parentModule && insertToRoot)
191 parentItem = parentMap.
value(parentModule);
195 parentMap.
insert(parentModule, parentItem);
199 insertToRoot =
false;
203 childItem = parentItem;
219 mResetInProgress =
true;
229 for(
u32 id : gateIds)
235 for(
auto item : newRootList)
237 mResetInProgress =
false;
247 for (
auto it = mModuleMap.lowerBound(parentId); it != mModuleMap.upperBound(parentId); ++it)
260 for (
auto it = mModuleMap.lowerBound(parentId); it != mModuleMap.upperBound(parentId); ++it)
271 for (
auto it = mModuleMap.lowerBound(parentId); it != mModuleMap.upperBound(parentId); ++it)
281 Q_ASSERT(moduleItem);
293 for (
auto it = mModuleMap.lowerBound(
id); it != mModuleMap.upperBound(
id); ++it)
294 trashcan.
append(it.value());
307 for (
auto it = mGateMap.lowerBound(
id); it != mGateMap.upperBound(
id); ++it)
308 trashcan.
append(it.value());
321 for (
auto it = mNetMap.lowerBound(
id); it != mNetMap.upperBound(
id); ++it)
322 trashcan.
append(it.value());
337 if (mResetInProgress)
347 const bool wasModifying = mIsModifying;
352 mIsModifying = wasModifying;
359 Q_ASSERT(itemToRemove);
360 Q_ASSERT(parentItem);
368 if (mResetInProgress)
380 const bool wasModifying = mIsModifying;
385 mIsModifying = wasModifying;
390 void ModuleModel::handleModuleNameChanged(
Module* mod)
395 void ModuleModel::handleModuleTypeChanged(Module* mod)
400 void ModuleModel::handleModuleRemoved(Module* mod)
405 void ModuleModel::handleModuleCreated(Module* mod)
407 if (mod->get_parent_module() ==
nullptr)
return;
408 addModule(mod->get_id(), mod->get_parent_module()->get_id());
411 void ModuleModel::handleModuleGateAssigned(Module* mod,
u32 gateId)
413 if (mTempGateAssignment.isAccumulate())
414 mTempGateAssignment.assignGateToModule(gateId,mod);
422 void ModuleModel::handleModuleGateRemoved(Module* mod,
u32 gateId)
426 if (mTempGateAssignment.isAccumulate())
427 mTempGateAssignment.removeGateFromModule(gateId,mod);
430 for (
auto it = mGateMap.lowerBound(gateId); it != mGateMap.upperBound(gateId); ++it)
433 if (item->isToplevelItem())
continue;;
436 if (parentItem->id() == mod->get_id())
445 void ModuleModel::handleModuleGatesAssignBegin(Module* mod,
u32 numberGates)
448 Q_UNUSED(numberGates);
449 mTempGateAssignment.beginAccumulate();
452 void ModuleModel::handleModuleGatesAssignEnd(Module* mod,
u32 numberGates)
455 Q_UNUSED(numberGates);
456 mTempGateAssignment.endAccumulate();
457 if (!mTempGateAssignment.isAccumulate())
459 for (
auto it = mTempGateAssignment.mGateAssign.begin(); it != mTempGateAssignment.mGateAssign.end(); ++it)
464 mTempGateAssignment.mGateAssign.clear();
465 mTempGateAssignment.mGateRemove.clear();
469 void ModuleModel::handleGateRemoved(Gate* gat)
474 void ModuleModel::handleGateCreated(Gate* gat)
476 Module* mod = gat->get_module();
480 void ModuleModel::handleGateNameChanged(Gate* gat)
485 void ModuleModel::handleNetCreated(Net*
net)
490 void ModuleModel::handleNetRemoved(Net*
net)
495 void ModuleModel::handleNetNameChanged(Net*
net)
500 void ModuleModel::handleNetUpdated(Net*
net,
u32 data)
506 void ModuleModel::handleModuleParentChanged(
const Module* mod)
512 std::unordered_set<Net*> assignedNets;
513 findNetParentRecursion(
mRootItem, parentAssignment, assignedNets);
515 for(Net*
net : mod->get_nets())
519 void ModuleModel::handleModuleSubmoduleAdded(Module* mod,
u32 submodId)
525 void ModuleModel::handleModuleSubmoduleRemoved(Module* mod,
u32 submodId)
531 void ModuleModel::findNetParentRecursion(BaseTreeItem* parent,
QHash<const Net *, ModuleItem *> &parentAssignment, std::unordered_set<Net*>& assignedNets)
const
533 for (BaseTreeItem* bti :
parent->getChildren())
537 findNetParentRecursion(item, parentAssignment, assignedNets);
540 std::unordered_set<Net*> internalNets = m->get_nets();
541 if (!internalNets.empty())
543 for (Net* n : assignedNets)
544 internalNets.erase(n);
545 for (Net* n : m->get_input_nets())
546 internalNets.erase(n);
547 for (Net* n : m->get_output_nets())
548 internalNets.erase(n);
550 for (Net* n : internalNets)
552 parentAssignment[n] = item;
558 Module* ModuleModel::findNetParent(
const Net *
net)
const
561 if (
net->is_global_input_net() ||
net->is_global_output_net())
return nullptr;
564 for (
const Endpoint* ep :
net->get_sources())
566 Module* m = ep->get_gate()->get_module();
568 int depth = m->get_submodule_depth();
569 if (depth > maxDepth) maxDepth = depth;
573 for (
const Endpoint* ep :
net->get_destinations())
575 Module* m = ep->get_gate()->get_module();
577 int depth = m->get_submodule_depth();
578 if (depth > maxDepth) maxDepth = depth;
582 while (modHash.
size() > 1 && maxDepth > 0)
584 auto it = modHash.
begin();
585 while (it != modHash.
end())
587 if (it.value() == maxDepth)
589 Module* parentMod = it.key()->get_parent_module();
591 if (parentMod) modHash.
insert(parentMod,maxDepth-1);
596 if (it == modHash.
end())
599 if (modHash.
empty())
return nullptr;
612 for (
auto itGat = mGateMap.lowerBound(gateId); itGat != mGateMap.upperBound(gateId); ++itGat)
617 Q_ASSERT(oldParentItem);
619 if (oldParentItem->
id() != moduleId)
625 parentsHandled.
insert(oldParentItem);
631 if (!moduleId)
return;
632 for (
auto itMod = mModuleMap.lowerBound(moduleId); itMod != mModuleMap.upperBound(moduleId); ++itMod)
635 if (parentsHandled.
contains(parentItem))
continue;
644 std::unordered_set<Net*> assignedNets;
645 findNetParentRecursion(
mRootItem, parentAssignment, assignedNets);
650 netsToAssign = QtCompat::listToSet<const Net*>(parentAssignment.
keys());
654 for (
u32 id : gateIds)
658 netsToAssign.
insert(in_net);
660 netsToAssign.
insert(out_net);
664 for (
const Net* n: netsToAssign)
671 u32 netId =
net->get_id();
675 if (parentAssignment)
679 newParentId = modItem->
id();
683 Module* newParentModule = findNetParent(
net);
685 newParentId = newParentModule->
get_id();
690 for (
auto itNet = mNetMap.lowerBound(netId); itNet != mNetMap.upperBound(netId); ++itNet)
692 if (itNet.value()->isToplevelItem())
continue;
696 Q_ASSERT(oldParentItem);
698 if (newParentId == 0 || newParentId != oldParentItem->
id())
705 parentsHandled.
insert(oldParentItem);
712 if (!newParentId)
return;
713 for (
auto itMod = mModuleMap.lowerBound(newParentId); itMod != mModuleMap.upperBound(newParentId); ++itMod)
716 if (parentsHandled.
contains(parentItem))
continue;
724 bool moduleItemReassigned =
false;
732 Q_ASSERT(parentId > 0);
736 for (
auto itSubm = mModuleMap.lowerBound(
id); itSubm != mModuleMap.upperBound(
id); ++itSubm)
742 Q_ASSERT(oldParentItem);
744 if (oldParentItem->
id() != parentId)
746 if (moduleItemToBeMoved)
754 moduleItemToBeMoved = submItem;
763 mIsModifying =
false;
768 parentsHandled.
insert(oldParentItem);
774 if (!parentId)
return;
775 for (
auto itMod = mModuleMap.lowerBound(parentId); itMod != mModuleMap.upperBound(parentId); ++itMod)
778 if (parentsHandled.
contains(parentItem))
continue;
779 if (moduleItemToBeMoved && !moduleItemReassigned)
787 mIsModifying =
false;
788 moduleItemReassigned =
true;
796 if (moduleItemToBeMoved && !moduleItemReassigned)
807 for (
auto it = mModuleMap.lowerBound(
id); it != mModuleMap.upperBound(
id); ++it)
823 for (
auto it = mModuleMap.lowerBound(
id); it != mModuleMap.upperBound(
id); ++it)
839 for (
auto it = mGateMap.lowerBound(
id); it != mGateMap.upperBound(
id); ++it)
856 for (
auto it = mNetMap.lowerBound(
id); it != mNetMap.upperBound(
id); ++it)
875 mIsModifying = pIsModifying;
(Future) Base class for all tree models related to the details widget.
virtual QList< BaseTreeItem * > getChildren() const
virtual bool removeChild(BaseTreeItem *child)
virtual BaseTreeItem * getParent() const
virtual int getChildCount() const
virtual void appendChild(BaseTreeItem *child)
The BaseTreeModel implements generic standard functions of a tree model.
QModelIndex getIndexFromItem(BaseTreeItem *item) const
virtual QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
void setHeaderLabels(const QStringList &label)
BaseTreeItem * getItemFromIndex(QModelIndex index) const
const std::vector< Net * > & get_fan_in_nets() const
const std::string & get_name() const
const std::vector< Net * > & get_fan_out_nets() const
Module * get_parent_module() const
const std::vector< Gate * > & get_gates() const
std::string get_name() const
std::vector< Module * > get_submodules(const std::function< bool(Module *)> &filter=nullptr, bool recursive=false) const
std::string get_type() const
An item in the ModuleModel.
QVariant getData(int column) const override
bool isToplevelItem() const
void setName(const QString &name)
TreeItemType getType() const
void setModuleType(const QString &moduleType)
void updateModuleParent(const Module *module)
Qt::ItemFlags flags(const QModelIndex &index) const override
void updateNetName(const u32 id)
void updateModuleType(const u32 id)
void addRecursively(const Module *module, BaseTreeItem *parentItem=nullptr)
void addNet(const u32 id, const u32 parentId)
void removeGate(const u32 id)
void moduleAssignNets(const QList< u32 > &gateIds=QList< u32 >())
void removeModule(const u32 id)
QList< ModuleItem * > getItems(const u32 id, ModuleItem::TreeItemType type=ModuleItem::TreeItemType::Module) const
void addGate(const u32 id, const u32 parentId)
ModuleItem * getItem(const QModelIndex &index) const
void populateFromGatelist(const std::vector< Gate * > &gates)
ModuleItem * createChildItem(u32 id, ModuleItem::TreeItemType itemType, BaseTreeItem *parentItem=nullptr)
void updateGateName(const u32 id)
void addModule(const u32 id, const u32 parentId)
QVariant data(const QModelIndex &index, int role) const override
void updateNetParent(const Net *net, const QHash< const Net *, ModuleItem * > *parentAssignment=nullptr)
void setIsModifying(bool pIsModifying)
ModuleModel(QObject *parent=nullptr)
void removeNet(const u32 id)
QMimeData * mimeData(const QModelIndexList &indexes) const override
void updateModuleName(const u32 id)
void removeChildItem(ModuleItem *itemToRemove, BaseTreeItem *parentItem)
void populateTree(const QVector< u32 > &modIds={}, const QVector< u32 > &gatIds={}, const QVector< u32 > &netIds={})
void moduleAssignGate(const u32 moduleId, const u32 gateId)
const std::string & get_name() const
Module * get_top_module() const
Gate * get_gate_by_id(const u32 gate_id) const
Module * get_module_by_id(u32 module_id) const
Net * get_net_by_id(u32 net_id) const
void netDestinationRemoved(Net *n, const u32 dst_gate_id) const
void moduleGatesAssignEnd(Module *m, u32 number_gates) const
void moduleTypeChanged(Module *m) const
void netCreated(Net *n) const
void netSourceAdded(Net *n, const u32 src_gate_id) const
void moduleGateRemoved(Module *m, const u32 removed_gate) const
void moduleGateAssigned(Module *m, const u32 assigned_gate) const
void netSourceRemoved(Net *n, const u32 src_gate_id) const
void netRemoved(Net *n) const
void netDestinationAdded(Net *n, const u32 dst_gate_id) const
void moduleSubmoduleRemoved(Module *m, const u32 removed_module) const
void moduleNameChanged(Module *m) const
void gateNameChanged(Gate *g) const
void moduleRemoved(Module *m) const
void moduleParentChanged(Module *m) const
void moduleSubmoduleAdded(Module *m, const u32 added_module) const
void moduleCreated(Module *m) const
void moduleGatesAssignBegin(Module *m, u32 number_gates) const
void netNameChanged(Net *n) const
static QString pyCodeModule(u32 moduleId)
static QString pyCodeNet(u32 netId)
static QString pyCodeGate(u32 gateId)
static SelectionDetailsIconProvider * instance()
const Module * module(const Gate *g, const NodeBoxes &boxes)
NetlistRelay * gNetlistRelay
void beginInsertRows(const QModelIndex &parent, int first, int last)
void beginRemoveRows(const QModelIndex &parent, int first, int last)
void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector< int > &roles)
virtual Qt::ItemFlags flags(const QModelIndex &index) const const
const Key & key() const const
QHash::iterator erase(QHash::iterator pos)
QHash::iterator insert(const Key &key, const T &value)
QList< Key > keys() const const
const T value(const Key &key) const const
void append(const T &value)
bool isEmpty() const const
QMap::iterator insert(const Key &key, const T &value)
const T value(const Key &key, const T &defaultValue) const const
void setData(const QString &mimeType, const QByteArray &data)
void setText(const QString &text)
void * internalPointer() const const
bool isValid() const const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject * parent() const const
bool contains(const T &value) const const
QSet::iterator insert(const T &value)
QString fromStdString(const std::string &str)