From 139f7e0903b6c299b7c85bebfd7674933e952a50 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Mon, 23 Jul 2018 19:53:56 +0200 Subject: [PATCH] make update of tree for nets and cells partial --- gui/designwidget.cc | 80 +++++++++++++++++++++++++++++++-------------- gui/ice40/worker.cc | 4 +-- 2 files changed, 57 insertions(+), 27 deletions(-) diff --git a/gui/designwidget.cc b/gui/designwidget.cc index 7c40f16a..e63ee937 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -338,48 +338,78 @@ void DesignWidget::newContext(Context *ctx) for (auto pip : nameToItem[2].toStdMap()) { pip_root->addChild(pip.second); } + + nets_root = new QTreeWidgetItem(treeWidget); + nets_root->setText(0, "Nets"); + treeWidget->insertTopLevelItem(0, nets_root); + + cells_root = new QTreeWidgetItem(treeWidget); + cells_root->setText(0, "Cells"); + treeWidget->insertTopLevelItem(0, cells_root); + updateTree(); } void DesignWidget::updateTree() { - clearProperties(); - delete nets_root; - delete cells_root; - nameToItem[3].clear(); - nameToItem[4].clear(); + if (!ctx) + return; + clearProperties(); + + // treeWidget->setSortingEnabled(false); + + // Remove nets not existing any more + QMap::iterator i = nameToItem[3].begin(); + while (i != nameToItem[3].end()) { + QMap::iterator prev = i; + ++i; + if (ctx->nets.find(ctx->id(prev.key().toStdString())) == ctx->nets.end()) { + if (treeWidget->currentItem() == prev.value()) + treeWidget->setCurrentItem(nets_root); + if (highlightSelected.contains(prev.value())) + highlightSelected.remove(prev.value()); + delete prev.value(); + nameToItem[3].erase(prev); + } + } // Add nets to tree - nets_root = new QTreeWidgetItem(treeWidget); - nets_root->setText(0, "Nets"); - treeWidget->insertTopLevelItem(0, nets_root); - if (ctx) { - for (auto &item : ctx->nets) { - auto id = item.first; - QString name = QString(id.c_str(ctx)); + for (auto &item : ctx->nets) { + auto id = item.first; + QString name = QString(id.c_str(ctx)); + if (!nameToItem[3].contains(name)) { IdStringTreeItem *newItem = new IdStringTreeItem(id, ElementType::NET, name, nullptr); + nets_root->addChild(newItem); nameToItem[3].insert(name, newItem); } } - for (auto item : nameToItem[3].toStdMap()) { - nets_root->addChild(item.second); - } + // Remove cells not existing any more + i = nameToItem[4].begin(); + while (i != nameToItem[4].end()) { + QMap::iterator prev = i; + ++i; + if (ctx->cells.find(ctx->id(prev.key().toStdString())) == ctx->cells.end()) { + if (treeWidget->currentItem() == prev.value()) + treeWidget->setCurrentItem(cells_root); + if (highlightSelected.contains(prev.value())) + highlightSelected.remove(prev.value()); + delete prev.value(); + nameToItem[4].erase(prev); + } + } // Add cells to tree - cells_root = new QTreeWidgetItem(treeWidget); - cells_root->setText(0, "Cells"); - treeWidget->insertTopLevelItem(0, cells_root); - if (ctx) { - for (auto &item : ctx->cells) { - auto id = item.first; - QString name = QString(id.c_str(ctx)); + for (auto &item : ctx->cells) { + auto id = item.first; + QString name = QString(id.c_str(ctx)); + if (!nameToItem[4].contains(name)) { IdStringTreeItem *newItem = new IdStringTreeItem(id, ElementType::CELL, name, nullptr); + cells_root->addChild(newItem); nameToItem[4].insert(name, newItem); } } - for (auto item : nameToItem[4].toStdMap()) { - cells_root->addChild(item.second); - } + // treeWidget->sortByColumn(0, Qt::AscendingOrder); + // treeWidget->setSortingEnabled(true); } QtProperty *DesignWidget::addTopLevelProperty(const QString &id) { diff --git a/gui/ice40/worker.cc b/gui/ice40/worker.cc index d339d652..fd46ecad 100644 --- a/gui/ice40/worker.cc +++ b/gui/ice40/worker.cc @@ -108,7 +108,7 @@ void Worker::budget(double freq) { Q_EMIT taskStarted(); try { - ctx->target_freq = freq; + ctx->target_freq = freq; Q_EMIT budget_finish(true); } catch (WorkerInterruptionRequested) { Q_EMIT taskCanceled(); @@ -120,7 +120,7 @@ void Worker::place(bool timing_driven) Q_EMIT taskStarted(); try { ctx->timing_driven = timing_driven; - log_info("Assigned budget %0.2f MHz",ctx->target_freq / 1e6); + log_info("Assigned budget %0.2f MHz", ctx->target_freq / 1e6); assign_budget(ctx); Q_EMIT place_finished(ctx->place()); } catch (WorkerInterruptionRequested) {