95 else if (row != inx.row())
103 row = firstIndex.
row();
108 qDebug() <<
"cannot cast" << indexes.at(0);
129 stream << item->
getType() <<
id << row << (quintptr) parentItem;
131 retval->
setData(
"modulemodel/item", encodedData);
154 return mModuleItemMaps[(int)
type]->value(
id);
159 return mModuleItemMaps[(int)
type]->values(
id);
180 for (
const Gate*
g : gates)
182 Module* parentModule =
g->get_module();
184 bool insertToRoot =
true;
187 while (parentModule && insertToRoot)
189 parentItem = parentMap.
value(parentModule);
193 parentMap.
insert(parentModule, parentItem);
197 insertToRoot =
false;
201 childItem = parentItem;
226 for(
u32 id : gateIds)
232 for(
auto item : newRootList)
243 for (
auto it = mModuleMap.lowerBound(parentId); it != mModuleMap.upperBound(parentId); ++it)
256 for (
auto it = mModuleMap.lowerBound(parentId); it != mModuleMap.upperBound(parentId); ++it)
267 for (
auto it = mModuleMap.lowerBound(parentId); it != mModuleMap.upperBound(parentId); ++it)
277 Q_ASSERT(moduleItem);
289 for (
auto it = mModuleMap.lowerBound(
id); it != mModuleMap.upperBound(
id); ++it)
290 trashcan.
append(it.value());
303 for (
auto it = mGateMap.lowerBound(
id); it != mGateMap.upperBound(
id); ++it)
304 trashcan.
append(it.value());
317 for (
auto it = mNetMap.lowerBound(
id); it != mNetMap.upperBound(
id); ++it)
318 trashcan.
append(it.value());
338 mIsModifying =
false;
345 Q_ASSERT(itemToRemove);
346 Q_ASSERT(parentItem);
362 mIsModifying =
false;
367 void ModuleModel::handleModuleNameChanged(
Module* mod)
372 void ModuleModel::handleModuleRemoved(Module* mod)
377 void ModuleModel::handleModuleCreated(Module* mod)
379 if (mod->get_parent_module() ==
nullptr)
return;
380 addModule(mod->get_id(), mod->get_parent_module()->get_id());
383 void ModuleModel::handleModuleGateAssigned(Module* mod,
u32 gateId)
385 if (mTempGateAssignment.isAccumulate())
386 mTempGateAssignment.assignGateToModule(gateId,mod);
394 void ModuleModel::handleModuleGateRemoved(Module* mod,
u32 gateId)
398 if (mTempGateAssignment.isAccumulate())
399 mTempGateAssignment.removeGateFromModule(gateId,mod);
402 for (
auto it = mGateMap.lowerBound(gateId); it != mGateMap.upperBound(gateId); ++it)
405 if (item->isToplevelItem())
continue;;
408 if (parentItem->id() == mod->get_id())
417 void ModuleModel::handleModuleGatesAssignBegin(Module* mod,
u32 numberGates)
420 Q_UNUSED(numberGates);
421 mTempGateAssignment.beginAccumulate();
424 void ModuleModel::handleModuleGatesAssignEnd(Module* mod,
u32 numberGates)
427 Q_UNUSED(numberGates);
428 mTempGateAssignment.endAccumulate();
429 if (!mTempGateAssignment.isAccumulate())
431 for (
auto it = mTempGateAssignment.mGateAssign.begin(); it != mTempGateAssignment.mGateAssign.end(); ++it)
436 mTempGateAssignment.mGateAssign.clear();
437 mTempGateAssignment.mGateRemove.clear();
441 void ModuleModel::handleGateRemoved(Gate* gat)
446 void ModuleModel::handleGateCreated(Gate* gat)
448 Module* mod = gat->get_module();
452 void ModuleModel::handleGateNameChanged(Gate* gat)
457 void ModuleModel::handleNetCreated(Net*
net)
462 void ModuleModel::handleNetRemoved(Net*
net)
467 void ModuleModel::handleNetNameChanged(Net*
net)
472 void ModuleModel::handleNetUpdated(Net*
net,
u32 data)
478 void ModuleModel::handleModuleParentChanged(
const Module* mod)
484 std::unordered_set<Net*> assignedNets;
485 findNetParentRecursion(
mRootItem, parentAssignment, assignedNets);
487 for(Net*
net : mod->get_nets())
491 void ModuleModel::handleModuleSubmoduleAdded(Module* mod,
u32 submodId)
497 void ModuleModel::handleModuleSubmoduleRemoved(Module* mod,
u32 submodId)
503 void ModuleModel::findNetParentRecursion(BaseTreeItem* parent,
QHash<const Net *, ModuleItem *> &parentAssignment, std::unordered_set<Net*>& assignedNets)
const
505 for (BaseTreeItem* bti :
parent->getChildren())
509 findNetParentRecursion(item, parentAssignment, assignedNets);
512 std::unordered_set<Net*> internalNets = m->get_nets();
513 if (!internalNets.empty())
515 for (Net*
n : assignedNets)
516 internalNets.erase(
n);
517 for (Net*
n : m->get_input_nets())
518 internalNets.erase(
n);
519 for (Net*
n : m->get_output_nets())
520 internalNets.erase(
n);
522 for (Net*
n : internalNets)
524 parentAssignment[
n] = item;
530 Module* ModuleModel::findNetParent(
const Net *
net)
const
533 if (
net->is_global_input_net() ||
net->is_global_output_net())
return nullptr;
536 for (
const Endpoint* ep :
net->get_sources())
538 Module* m = ep->get_gate()->get_module();
540 int depth = m->get_submodule_depth();
541 if (depth > maxDepth) maxDepth = depth;
545 for (
const Endpoint* ep :
net->get_destinations())
547 Module* m = ep->get_gate()->get_module();
549 int depth = m->get_submodule_depth();
550 if (depth > maxDepth) maxDepth = depth;
554 while (modHash.
size() > 1 && maxDepth > 0)
556 auto it = modHash.
begin();
557 while (it != modHash.
end())
559 if (it.value() == maxDepth)
561 Module* parentMod = it.key()->get_parent_module();
563 if (parentMod) modHash.
insert(parentMod,maxDepth-1);
568 if (it == modHash.
end())
571 if (modHash.
empty())
return nullptr;
584 for (
auto itGat = mGateMap.lowerBound(gateId); itGat != mGateMap.upperBound(gateId); ++itGat)
589 Q_ASSERT(oldParentItem);
591 if (oldParentItem->
id() != moduleId)
597 parentsHandled.
insert(oldParentItem);
603 if (!moduleId)
return;
604 for (
auto itMod = mModuleMap.lowerBound(moduleId); itMod != mModuleMap.upperBound(moduleId); ++itMod)
607 if (parentsHandled.
contains(parentItem))
continue;
616 std::unordered_set<Net*> assignedNets;
617 findNetParentRecursion(
mRootItem, parentAssignment, assignedNets);
622 #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
626 netsToAssign = parentAssignment.
keys().toSet();
631 for (
u32 id : gateIds)
635 netsToAssign.
insert(in_net);
637 netsToAssign.
insert(out_net);
641 for (
const Net*
n: netsToAssign)
648 u32 netId =
net->get_id();
652 if (parentAssignment)
656 newParentId = modItem->
id();
660 Module* newParentModule = findNetParent(
net);
662 newParentId = newParentModule->
get_id();
667 for (
auto itNet = mNetMap.lowerBound(netId); itNet != mNetMap.upperBound(netId); ++itNet)
669 if (itNet.value()->isToplevelItem())
continue;
673 Q_ASSERT(oldParentItem);
675 if (newParentId == 0 || newParentId != oldParentItem->
id())
682 parentsHandled.
insert(oldParentItem);
689 if (!newParentId)
return;
690 for (
auto itMod = mModuleMap.lowerBound(newParentId); itMod != mModuleMap.upperBound(newParentId); ++itMod)
693 if (parentsHandled.
contains(parentItem))
continue;
701 bool moduleItemReassigned =
false;
709 Q_ASSERT(parentId > 0);
713 for (
auto itSubm = mModuleMap.lowerBound(
id); itSubm != mModuleMap.upperBound(
id); ++itSubm)
719 Q_ASSERT(oldParentItem);
721 if (oldParentItem->
id() != parentId)
723 if (moduleItemToBeMoved)
731 moduleItemToBeMoved = submItem;
740 mIsModifying =
false;
745 parentsHandled.
insert(oldParentItem);
751 if (!parentId)
return;
752 for (
auto itMod = mModuleMap.lowerBound(parentId); itMod != mModuleMap.upperBound(parentId); ++itMod)
755 if (parentsHandled.
contains(parentItem))
continue;
756 if (moduleItemToBeMoved && !moduleItemReassigned)
764 mIsModifying =
false;
765 moduleItemReassigned =
true;
773 if (moduleItemToBeMoved && !moduleItemReassigned)
784 for (
auto it = mModuleMap.lowerBound(
id); it != mModuleMap.upperBound(
id); ++it)
800 for (
auto it = mGateMap.lowerBound(
id); it != mGateMap.upperBound(
id); ++it)
817 for (
auto it = mNetMap.lowerBound(
id); it != mNetMap.upperBound(
id); ++it)
836 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
An item in the ModuleModel.
QVariant getData(int column) const override
bool isToplevelItem() const
void setName(const QString &name)
TreeItemType getType() const
void updateModuleParent(const Module *module)
Qt::ItemFlags flags(const QModelIndex &index) const override
void updateNetName(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 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)