106 else if (row != inx.row())
114 row = firstIndex.
row();
119 qDebug() <<
"cannot cast" << indexes.at(0);
140 stream << item->
getType() <<
id << row << (quintptr) parentItem;
142 retval->
setData(
"modulemodel/item", encodedData);
165 return mModuleItemMaps[(int)
type]->value(
id);
170 return mModuleItemMaps[(int)
type]->values(
id);
191 for (
const Gate* g : gates)
193 Module* parentModule = g->get_module();
195 bool insertToRoot =
true;
198 while (parentModule && insertToRoot)
200 parentItem = parentMap.
value(parentModule);
204 parentMap.
insert(parentModule, parentItem);
208 insertToRoot =
false;
212 childItem = parentItem;
228 mResetInProgress =
true;
238 for(
u32 id : gateIds)
244 if (mShowNetsOutsideModules)
249 if (!mNetMap.contains(
net->get_id()))
254 for(
auto item : newRootList)
256 mResetInProgress =
false;
263 mShowNetsOutsideModules =
enable;
268 return mShowNetsOutsideModules;
276 for (
auto it = mModuleMap.lowerBound(parentId); it != mModuleMap.upperBound(parentId); ++it)
289 for (
auto it = mModuleMap.lowerBound(parentId); it != mModuleMap.upperBound(parentId); ++it)
300 for (
auto it = mModuleMap.lowerBound(parentId); it != mModuleMap.upperBound(parentId); ++it)
310 Q_ASSERT(moduleItem);
322 for (
auto it = mModuleMap.lowerBound(
id); it != mModuleMap.upperBound(
id); ++it)
323 trashcan.
append(it.value());
336 for (
auto it = mGateMap.lowerBound(
id); it != mGateMap.upperBound(
id); ++it)
337 trashcan.
append(it.value());
350 for (
auto it = mNetMap.lowerBound(
id); it != mNetMap.upperBound(
id); ++it)
351 trashcan.
append(it.value());
366 if (mResetInProgress)
376 const bool wasModifying = mIsModifying;
381 mIsModifying = wasModifying;
388 Q_ASSERT(itemToRemove);
389 Q_ASSERT(parentItem);
397 if (mResetInProgress)
409 const bool wasModifying = mIsModifying;
414 mIsModifying = wasModifying;
419 void ModuleModel::handleModuleNameChanged(
Module* mod)
424 void ModuleModel::handleModuleTypeChanged(Module* mod)
429 void ModuleModel::handleModuleRemoved(Module* mod)
434 void ModuleModel::handleModuleCreated(Module* mod)
436 if (mod->get_parent_module() ==
nullptr)
return;
437 addModule(mod->get_id(), mod->get_parent_module()->get_id());
440 void ModuleModel::handleModuleGateAssigned(Module* mod,
u32 gateId)
442 if (mTempGateAssignment.isAccumulate())
443 mTempGateAssignment.assignGateToModule(gateId,mod);
451 void ModuleModel::handleModuleGateRemoved(Module* mod,
u32 gateId)
455 if (mTempGateAssignment.isAccumulate())
456 mTempGateAssignment.removeGateFromModule(gateId,mod);
459 for (
auto it = mGateMap.lowerBound(gateId); it != mGateMap.upperBound(gateId); ++it)
462 if (item->isToplevelItem())
continue;;
465 if (parentItem->id() == mod->get_id())
474 void ModuleModel::handleModuleGatesAssignBegin(Module* mod,
u32 numberGates)
477 Q_UNUSED(numberGates);
478 mTempGateAssignment.beginAccumulate();
481 void ModuleModel::handleModuleGatesAssignEnd(Module* mod,
u32 numberGates)
484 Q_UNUSED(numberGates);
485 mTempGateAssignment.endAccumulate();
486 if (!mTempGateAssignment.isAccumulate())
488 for (
auto it = mTempGateAssignment.mGateAssign.begin(); it != mTempGateAssignment.mGateAssign.end(); ++it)
493 mTempGateAssignment.mGateAssign.clear();
494 mTempGateAssignment.mGateRemove.clear();
498 void ModuleModel::handleGateRemoved(Gate* gat)
503 void ModuleModel::handleGateCreated(Gate* gat)
505 Module* mod = gat->get_module();
509 void ModuleModel::handleGateNameChanged(Gate* gat)
514 void ModuleModel::handleNetCreated(Net*
net)
516 if (mShowNetsOutsideModules)
525 void ModuleModel::handleNetRemoved(Net*
net)
530 void ModuleModel::handleNetNameChanged(Net*
net)
535 void ModuleModel::handleNetUpdated(Net*
net,
u32 data)
541 void ModuleModel::handleNetGlobalStateChanged(Netlist* netlist,
u32 netId)
548 void ModuleModel::handleModuleParentChanged(
const Module* mod)
554 std::unordered_set<Net*> assignedNets;
555 findNetParentRecursion(
mRootItem, parentAssignment, assignedNets);
557 for(Net*
net : mod->get_nets())
561 void ModuleModel::handleModuleSubmoduleAdded(Module* mod,
u32 submodId)
567 void ModuleModel::handleModuleSubmoduleRemoved(Module* mod,
u32 submodId)
573 void ModuleModel::findNetParentRecursion(BaseTreeItem* parent,
QHash<const Net *, ModuleItem *> &parentAssignment, std::unordered_set<Net*>& assignedNets)
const
575 for (BaseTreeItem* bti :
parent->getChildren())
579 findNetParentRecursion(item, parentAssignment, assignedNets);
582 std::unordered_set<Net*> internalNets = m->get_nets();
583 if (!internalNets.empty())
585 for (Net* n : assignedNets)
586 internalNets.erase(n);
587 for (Net* n : m->get_input_nets())
588 internalNets.erase(n);
589 for (Net* n : m->get_output_nets())
590 internalNets.erase(n);
592 for (Net* n : internalNets)
594 parentAssignment[n] = item;
600 Module* ModuleModel::findNetParent(
const Net *
net)
const
603 if (
net->is_global_input_net() ||
net->is_global_output_net())
return nullptr;
606 for (
const Endpoint* ep :
net->get_sources())
608 Module* m = ep->get_gate()->get_module();
610 int depth = m->get_submodule_depth();
611 if (depth > maxDepth) maxDepth = depth;
615 for (
const Endpoint* ep :
net->get_destinations())
617 Module* m = ep->get_gate()->get_module();
619 int depth = m->get_submodule_depth();
620 if (depth > maxDepth) maxDepth = depth;
624 while (modHash.
size() > 1 && maxDepth > 0)
626 auto it = modHash.
begin();
627 while (it != modHash.
end())
629 if (it.value() == maxDepth)
631 Module* parentMod = it.key()->get_parent_module();
633 if (parentMod) modHash.
insert(parentMod,maxDepth-1);
638 if (it == modHash.
end())
641 if (modHash.
empty())
return nullptr;
654 for (
auto itGat = mGateMap.lowerBound(gateId); itGat != mGateMap.upperBound(gateId); ++itGat)
659 Q_ASSERT(oldParentItem);
661 if (oldParentItem->
id() != moduleId)
667 parentsHandled.
insert(oldParentItem);
673 if (!moduleId)
return;
674 for (
auto itMod = mModuleMap.lowerBound(moduleId); itMod != mModuleMap.upperBound(moduleId); ++itMod)
677 if (parentsHandled.
contains(parentItem))
continue;
686 std::unordered_set<Net*> assignedNets;
687 findNetParentRecursion(
mRootItem, parentAssignment, assignedNets);
692 netsToAssign = QtCompat::listToSet<const Net*>(parentAssignment.
keys());
696 for (
u32 id : gateIds)
700 netsToAssign.
insert(in_net);
702 netsToAssign.
insert(out_net);
706 for (
const Net* n: netsToAssign)
713 u32 netId =
net->get_id();
717 if (parentAssignment)
721 newParentId = modItem->
id();
725 Module* newParentModule = findNetParent(
net);
727 newParentId = newParentModule->
get_id();
732 for (
auto itNet = mNetMap.lowerBound(netId); itNet != mNetMap.upperBound(netId); ++itNet)
734 if (itNet.value()->isToplevelItem())
continue;
738 Q_ASSERT(oldParentItem);
740 if (newParentId == 0 || newParentId != oldParentItem->
id())
747 parentsHandled.
insert(oldParentItem);
754 if (mShowNetsOutsideModules)
755 updateNetOutsideModules(netId, newParentId == 0);
757 if (!newParentId)
return;
758 for (
auto itMod = mModuleMap.lowerBound(newParentId); itMod != mModuleMap.upperBound(newParentId); ++itMod)
761 if (parentsHandled.
contains(parentItem))
continue;
766 void ModuleModel::updateNetOutsideModules(
u32 netId,
bool outside)
769 for (
auto it = mNetMap.lowerBound(netId); it != mNetMap.upperBound(netId); ++it)
771 if (it.value()->isToplevelItem())
773 toplevelItem = it.value();
778 if (outside && !toplevelItem)
780 else if (!outside && toplevelItem)
787 bool moduleItemReassigned =
false;
795 Q_ASSERT(parentId > 0);
799 for (
auto itSubm = mModuleMap.lowerBound(
id); itSubm != mModuleMap.upperBound(
id); ++itSubm)
805 Q_ASSERT(oldParentItem);
807 if (oldParentItem->
id() != parentId)
809 if (moduleItemToBeMoved)
817 moduleItemToBeMoved = submItem;
826 mIsModifying =
false;
831 parentsHandled.
insert(oldParentItem);
837 if (!parentId)
return;
838 for (
auto itMod = mModuleMap.lowerBound(parentId); itMod != mModuleMap.upperBound(parentId); ++itMod)
841 if (parentsHandled.
contains(parentItem))
continue;
842 if (moduleItemToBeMoved && !moduleItemReassigned)
850 mIsModifying =
false;
851 moduleItemReassigned =
true;
859 if (moduleItemToBeMoved && !moduleItemReassigned)
870 for (
auto it = mModuleMap.lowerBound(
id); it != mModuleMap.upperBound(
id); ++it)
886 for (
auto it = mModuleMap.lowerBound(
id); it != mModuleMap.upperBound(
id); ++it)
902 for (
auto it = mGateMap.lowerBound(
id); it != mGateMap.upperBound(
id); ++it)
919 for (
auto it = mNetMap.lowerBound(
id); it != mNetMap.upperBound(
id); ++it)
938 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 setShowNetsOutsideModules(bool enable)
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 >())
bool showNetsOutsideModules() const
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
const std::vector< Net * > & get_nets() const
void netDestinationRemoved(Net *n, const u32 dst_gate_id) const
void moduleGatesAssignEnd(Module *m, u32 number_gates) const
void netlistUnmarkedGlobalOutput(Netlist *n, const u32 associated_data) const
void netlistUnmarkedGlobalInput(Netlist *n, const u32 associated_data) 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 netlistMarkedGlobalInput(Netlist *n, const u32 associated_data) const
void netRemoved(Net *n) const
void netlistMarkedGlobalOutput(Netlist *n, const u32 associated_data) 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)