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;
227 for(
u32 id : gateIds)
233 for(
auto item : newRootList)
244 for (
auto it = mModuleMap.lowerBound(parentId); it != mModuleMap.upperBound(parentId); ++it)
257 for (
auto it = mModuleMap.lowerBound(parentId); it != mModuleMap.upperBound(parentId); ++it)
268 for (
auto it = mModuleMap.lowerBound(parentId); it != mModuleMap.upperBound(parentId); ++it)
278 Q_ASSERT(moduleItem);
290 for (
auto it = mModuleMap.lowerBound(
id); it != mModuleMap.upperBound(
id); ++it)
291 trashcan.
append(it.value());
304 for (
auto it = mGateMap.lowerBound(
id); it != mGateMap.upperBound(
id); ++it)
305 trashcan.
append(it.value());
318 for (
auto it = mNetMap.lowerBound(
id); it != mNetMap.upperBound(
id); ++it)
319 trashcan.
append(it.value());
339 mIsModifying =
false;
346 Q_ASSERT(itemToRemove);
347 Q_ASSERT(parentItem);
363 mIsModifying =
false;
368 void ModuleModel::handleModuleNameChanged(
Module* mod)
373 void ModuleModel::handleModuleTypeChanged(Module* mod)
378 void ModuleModel::handleModuleRemoved(Module* mod)
383 void ModuleModel::handleModuleCreated(Module* mod)
385 if (mod->get_parent_module() ==
nullptr)
return;
386 addModule(mod->get_id(), mod->get_parent_module()->get_id());
389 void ModuleModel::handleModuleGateAssigned(Module* mod,
u32 gateId)
391 if (mTempGateAssignment.isAccumulate())
392 mTempGateAssignment.assignGateToModule(gateId,mod);
400 void ModuleModel::handleModuleGateRemoved(Module* mod,
u32 gateId)
404 if (mTempGateAssignment.isAccumulate())
405 mTempGateAssignment.removeGateFromModule(gateId,mod);
408 for (
auto it = mGateMap.lowerBound(gateId); it != mGateMap.upperBound(gateId); ++it)
411 if (item->isToplevelItem())
continue;;
414 if (parentItem->id() == mod->get_id())
423 void ModuleModel::handleModuleGatesAssignBegin(Module* mod,
u32 numberGates)
426 Q_UNUSED(numberGates);
427 mTempGateAssignment.beginAccumulate();
430 void ModuleModel::handleModuleGatesAssignEnd(Module* mod,
u32 numberGates)
433 Q_UNUSED(numberGates);
434 mTempGateAssignment.endAccumulate();
435 if (!mTempGateAssignment.isAccumulate())
437 for (
auto it = mTempGateAssignment.mGateAssign.begin(); it != mTempGateAssignment.mGateAssign.end(); ++it)
442 mTempGateAssignment.mGateAssign.clear();
443 mTempGateAssignment.mGateRemove.clear();
447 void ModuleModel::handleGateRemoved(Gate* gat)
452 void ModuleModel::handleGateCreated(Gate* gat)
454 Module* mod = gat->get_module();
458 void ModuleModel::handleGateNameChanged(Gate* gat)
463 void ModuleModel::handleNetCreated(Net*
net)
468 void ModuleModel::handleNetRemoved(Net*
net)
473 void ModuleModel::handleNetNameChanged(Net*
net)
478 void ModuleModel::handleNetUpdated(Net*
net,
u32 data)
484 void ModuleModel::handleModuleParentChanged(
const Module* mod)
490 std::unordered_set<Net*> assignedNets;
491 findNetParentRecursion(
mRootItem, parentAssignment, assignedNets);
493 for(Net*
net : mod->get_nets())
497 void ModuleModel::handleModuleSubmoduleAdded(Module* mod,
u32 submodId)
503 void ModuleModel::handleModuleSubmoduleRemoved(Module* mod,
u32 submodId)
509 void ModuleModel::findNetParentRecursion(BaseTreeItem* parent,
QHash<const Net *, ModuleItem *> &parentAssignment, std::unordered_set<Net*>& assignedNets)
const
511 for (BaseTreeItem* bti :
parent->getChildren())
515 findNetParentRecursion(item, parentAssignment, assignedNets);
518 std::unordered_set<Net*> internalNets = m->get_nets();
519 if (!internalNets.empty())
521 for (Net*
n : assignedNets)
522 internalNets.erase(
n);
523 for (Net*
n : m->get_input_nets())
524 internalNets.erase(
n);
525 for (Net*
n : m->get_output_nets())
526 internalNets.erase(
n);
528 for (Net*
n : internalNets)
530 parentAssignment[
n] = item;
536 Module* ModuleModel::findNetParent(
const Net *
net)
const
539 if (
net->is_global_input_net() ||
net->is_global_output_net())
return nullptr;
542 for (
const Endpoint* ep :
net->get_sources())
544 Module* m = ep->get_gate()->get_module();
546 int depth = m->get_submodule_depth();
547 if (depth > maxDepth) maxDepth = depth;
551 for (
const Endpoint* ep :
net->get_destinations())
553 Module* m = ep->get_gate()->get_module();
555 int depth = m->get_submodule_depth();
556 if (depth > maxDepth) maxDepth = depth;
560 while (modHash.
size() > 1 && maxDepth > 0)
562 auto it = modHash.
begin();
563 while (it != modHash.
end())
565 if (it.value() == maxDepth)
567 Module* parentMod = it.key()->get_parent_module();
569 if (parentMod) modHash.
insert(parentMod,maxDepth-1);
574 if (it == modHash.
end())
577 if (modHash.
empty())
return nullptr;
590 for (
auto itGat = mGateMap.lowerBound(gateId); itGat != mGateMap.upperBound(gateId); ++itGat)
595 Q_ASSERT(oldParentItem);
597 if (oldParentItem->
id() != moduleId)
603 parentsHandled.
insert(oldParentItem);
609 if (!moduleId)
return;
610 for (
auto itMod = mModuleMap.lowerBound(moduleId); itMod != mModuleMap.upperBound(moduleId); ++itMod)
613 if (parentsHandled.
contains(parentItem))
continue;
622 std::unordered_set<Net*> assignedNets;
623 findNetParentRecursion(
mRootItem, parentAssignment, assignedNets);
628 #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
632 netsToAssign = parentAssignment.
keys().toSet();
637 for (
u32 id : gateIds)
641 netsToAssign.
insert(in_net);
643 netsToAssign.
insert(out_net);
647 for (
const Net*
n: netsToAssign)
654 u32 netId =
net->get_id();
658 if (parentAssignment)
662 newParentId = modItem->
id();
666 Module* newParentModule = findNetParent(
net);
668 newParentId = newParentModule->
get_id();
673 for (
auto itNet = mNetMap.lowerBound(netId); itNet != mNetMap.upperBound(netId); ++itNet)
675 if (itNet.value()->isToplevelItem())
continue;
679 Q_ASSERT(oldParentItem);
681 if (newParentId == 0 || newParentId != oldParentItem->
id())
688 parentsHandled.
insert(oldParentItem);
695 if (!newParentId)
return;
696 for (
auto itMod = mModuleMap.lowerBound(newParentId); itMod != mModuleMap.upperBound(newParentId); ++itMod)
699 if (parentsHandled.
contains(parentItem))
continue;
707 bool moduleItemReassigned =
false;
715 Q_ASSERT(parentId > 0);
719 for (
auto itSubm = mModuleMap.lowerBound(
id); itSubm != mModuleMap.upperBound(
id); ++itSubm)
725 Q_ASSERT(oldParentItem);
727 if (oldParentItem->
id() != parentId)
729 if (moduleItemToBeMoved)
737 moduleItemToBeMoved = submItem;
746 mIsModifying =
false;
751 parentsHandled.
insert(oldParentItem);
757 if (!parentId)
return;
758 for (
auto itMod = mModuleMap.lowerBound(parentId); itMod != mModuleMap.upperBound(parentId); ++itMod)
761 if (parentsHandled.
contains(parentItem))
continue;
762 if (moduleItemToBeMoved && !moduleItemReassigned)
770 mIsModifying =
false;
771 moduleItemReassigned =
true;
779 if (moduleItemToBeMoved && !moduleItemReassigned)
790 for (
auto it = mModuleMap.lowerBound(
id); it != mModuleMap.upperBound(
id); ++it)
806 for (
auto it = mModuleMap.lowerBound(
id); it != mModuleMap.upperBound(
id); ++it)
822 for (
auto it = mGateMap.lowerBound(
id); it != mGateMap.upperBound(
id); ++it)
839 for (
auto it = mNetMap.lowerBound(
id); it != mNetMap.upperBound(
id); ++it)
858 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)