96 else if (row != inx.row())
104 row = firstIndex.
row();
109 qDebug() <<
"cannot cast" << indexes.at(0);
130 stream << item->
getType() <<
id << row << (quintptr) parentItem;
132 retval->
setData(
"modulemodel/item", encodedData);
155 return mModuleItemMaps[(int)
type]->value(
id);
160 return mModuleItemMaps[(int)
type]->values(
id);
181 for (
const Gate* g : gates)
183 Module* parentModule = g->get_module();
185 bool insertToRoot =
true;
188 while (parentModule && insertToRoot)
190 parentItem = parentMap.
value(parentModule);
194 parentMap.
insert(parentModule, parentItem);
198 insertToRoot =
false;
202 childItem = parentItem;
218 mResetInProgress =
true;
228 for(
u32 id : gateIds)
234 for(
auto item : newRootList)
236 mResetInProgress =
false;
246 for (
auto it = mModuleMap.lowerBound(parentId); it != mModuleMap.upperBound(parentId); ++it)
259 for (
auto it = mModuleMap.lowerBound(parentId); it != mModuleMap.upperBound(parentId); ++it)
270 for (
auto it = mModuleMap.lowerBound(parentId); it != mModuleMap.upperBound(parentId); ++it)
280 Q_ASSERT(moduleItem);
292 for (
auto it = mModuleMap.lowerBound(
id); it != mModuleMap.upperBound(
id); ++it)
293 trashcan.
append(it.value());
306 for (
auto it = mGateMap.lowerBound(
id); it != mGateMap.upperBound(
id); ++it)
307 trashcan.
append(it.value());
320 for (
auto it = mNetMap.lowerBound(
id); it != mNetMap.upperBound(
id); ++it)
321 trashcan.
append(it.value());
336 if (mResetInProgress)
346 const bool wasModifying = mIsModifying;
351 mIsModifying = wasModifying;
358 Q_ASSERT(itemToRemove);
359 Q_ASSERT(parentItem);
367 if (mResetInProgress)
379 const bool wasModifying = mIsModifying;
384 mIsModifying = wasModifying;
389 void ModuleModel::handleModuleNameChanged(
Module* mod)
394 void ModuleModel::handleModuleTypeChanged(Module* mod)
399 void ModuleModel::handleModuleRemoved(Module* mod)
404 void ModuleModel::handleModuleCreated(Module* mod)
406 if (mod->get_parent_module() ==
nullptr)
return;
407 addModule(mod->get_id(), mod->get_parent_module()->get_id());
410 void ModuleModel::handleModuleGateAssigned(Module* mod,
u32 gateId)
412 if (mTempGateAssignment.isAccumulate())
413 mTempGateAssignment.assignGateToModule(gateId,mod);
421 void ModuleModel::handleModuleGateRemoved(Module* mod,
u32 gateId)
425 if (mTempGateAssignment.isAccumulate())
426 mTempGateAssignment.removeGateFromModule(gateId,mod);
429 for (
auto it = mGateMap.lowerBound(gateId); it != mGateMap.upperBound(gateId); ++it)
432 if (item->isToplevelItem())
continue;;
435 if (parentItem->id() == mod->get_id())
444 void ModuleModel::handleModuleGatesAssignBegin(Module* mod,
u32 numberGates)
447 Q_UNUSED(numberGates);
448 mTempGateAssignment.beginAccumulate();
451 void ModuleModel::handleModuleGatesAssignEnd(Module* mod,
u32 numberGates)
454 Q_UNUSED(numberGates);
455 mTempGateAssignment.endAccumulate();
456 if (!mTempGateAssignment.isAccumulate())
458 for (
auto it = mTempGateAssignment.mGateAssign.begin(); it != mTempGateAssignment.mGateAssign.end(); ++it)
463 mTempGateAssignment.mGateAssign.clear();
464 mTempGateAssignment.mGateRemove.clear();
468 void ModuleModel::handleGateRemoved(Gate* gat)
473 void ModuleModel::handleGateCreated(Gate* gat)
475 Module* mod = gat->get_module();
479 void ModuleModel::handleGateNameChanged(Gate* gat)
484 void ModuleModel::handleNetCreated(Net*
net)
489 void ModuleModel::handleNetRemoved(Net*
net)
494 void ModuleModel::handleNetNameChanged(Net*
net)
499 void ModuleModel::handleNetUpdated(Net*
net,
u32 data)
505 void ModuleModel::handleModuleParentChanged(
const Module* mod)
511 std::unordered_set<Net*> assignedNets;
512 findNetParentRecursion(
mRootItem, parentAssignment, assignedNets);
514 for(Net*
net : mod->get_nets())
518 void ModuleModel::handleModuleSubmoduleAdded(Module* mod,
u32 submodId)
524 void ModuleModel::handleModuleSubmoduleRemoved(Module* mod,
u32 submodId)
530 void ModuleModel::findNetParentRecursion(BaseTreeItem* parent,
QHash<const Net *, ModuleItem *> &parentAssignment, std::unordered_set<Net*>& assignedNets)
const
532 for (BaseTreeItem* bti :
parent->getChildren())
536 findNetParentRecursion(item, parentAssignment, assignedNets);
539 std::unordered_set<Net*> internalNets = m->get_nets();
540 if (!internalNets.empty())
542 for (Net* n : assignedNets)
543 internalNets.erase(n);
544 for (Net* n : m->get_input_nets())
545 internalNets.erase(n);
546 for (Net* n : m->get_output_nets())
547 internalNets.erase(n);
549 for (Net* n : internalNets)
551 parentAssignment[n] = item;
557 Module* ModuleModel::findNetParent(
const Net *
net)
const
560 if (
net->is_global_input_net() ||
net->is_global_output_net())
return nullptr;
563 for (
const Endpoint* ep :
net->get_sources())
565 Module* m = ep->get_gate()->get_module();
567 int depth = m->get_submodule_depth();
568 if (depth > maxDepth) maxDepth = depth;
572 for (
const Endpoint* ep :
net->get_destinations())
574 Module* m = ep->get_gate()->get_module();
576 int depth = m->get_submodule_depth();
577 if (depth > maxDepth) maxDepth = depth;
581 while (modHash.
size() > 1 && maxDepth > 0)
583 auto it = modHash.
begin();
584 while (it != modHash.
end())
586 if (it.value() == maxDepth)
588 Module* parentMod = it.key()->get_parent_module();
590 if (parentMod) modHash.
insert(parentMod,maxDepth-1);
595 if (it == modHash.
end())
598 if (modHash.
empty())
return nullptr;
611 for (
auto itGat = mGateMap.lowerBound(gateId); itGat != mGateMap.upperBound(gateId); ++itGat)
616 Q_ASSERT(oldParentItem);
618 if (oldParentItem->
id() != moduleId)
624 parentsHandled.
insert(oldParentItem);
630 if (!moduleId)
return;
631 for (
auto itMod = mModuleMap.lowerBound(moduleId); itMod != mModuleMap.upperBound(moduleId); ++itMod)
634 if (parentsHandled.
contains(parentItem))
continue;
643 std::unordered_set<Net*> assignedNets;
644 findNetParentRecursion(
mRootItem, parentAssignment, assignedNets);
649 #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
653 netsToAssign = parentAssignment.
keys().toSet();
658 for (
u32 id : gateIds)
662 netsToAssign.
insert(in_net);
664 netsToAssign.
insert(out_net);
668 for (
const Net* n: netsToAssign)
675 u32 netId =
net->get_id();
679 if (parentAssignment)
683 newParentId = modItem->
id();
687 Module* newParentModule = findNetParent(
net);
689 newParentId = newParentModule->
get_id();
694 for (
auto itNet = mNetMap.lowerBound(netId); itNet != mNetMap.upperBound(netId); ++itNet)
696 if (itNet.value()->isToplevelItem())
continue;
700 Q_ASSERT(oldParentItem);
702 if (newParentId == 0 || newParentId != oldParentItem->
id())
709 parentsHandled.
insert(oldParentItem);
716 if (!newParentId)
return;
717 for (
auto itMod = mModuleMap.lowerBound(newParentId); itMod != mModuleMap.upperBound(newParentId); ++itMod)
720 if (parentsHandled.
contains(parentItem))
continue;
728 bool moduleItemReassigned =
false;
736 Q_ASSERT(parentId > 0);
740 for (
auto itSubm = mModuleMap.lowerBound(
id); itSubm != mModuleMap.upperBound(
id); ++itSubm)
746 Q_ASSERT(oldParentItem);
748 if (oldParentItem->
id() != parentId)
750 if (moduleItemToBeMoved)
758 moduleItemToBeMoved = submItem;
767 mIsModifying =
false;
772 parentsHandled.
insert(oldParentItem);
778 if (!parentId)
return;
779 for (
auto itMod = mModuleMap.lowerBound(parentId); itMod != mModuleMap.upperBound(parentId); ++itMod)
782 if (parentsHandled.
contains(parentItem))
continue;
783 if (moduleItemToBeMoved && !moduleItemReassigned)
791 mIsModifying =
false;
792 moduleItemReassigned =
true;
800 if (moduleItemToBeMoved && !moduleItemReassigned)
811 for (
auto it = mModuleMap.lowerBound(
id); it != mModuleMap.upperBound(
id); ++it)
827 for (
auto it = mModuleMap.lowerBound(
id); it != mModuleMap.upperBound(
id); ++it)
843 for (
auto it = mGateMap.lowerBound(
id); it != mGateMap.upperBound(
id); ++it)
860 for (
auto it = mNetMap.lowerBound(
id); it != mNetMap.upperBound(
id); ++it)
879 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)