summaryrefslogtreecommitdiff
path: root/utils/regtools/qeditor/regtab.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/regtools/qeditor/regtab.cpp')
-rw-r--r--utils/regtools/qeditor/regtab.cpp152
1 files changed, 47 insertions, 105 deletions
diff --git a/utils/regtools/qeditor/regtab.cpp b/utils/regtools/qeditor/regtab.cpp
index a82070e3f8..2653908d41 100644
--- a/utils/regtools/qeditor/regtab.cpp
+++ b/utils/regtools/qeditor/regtab.cpp
@@ -35,42 +35,7 @@ namespace
35 35
36enum 36enum
37{ 37{
38 RegTreeDevType = QTreeWidgetItem::UserType, 38 NodeInstRole = Qt::UserRole,
39 RegTreeRegType,
40 RegTreeSocType
41};
42
43class SocTreeItem : public QTreeWidgetItem
44{
45public:
46 SocTreeItem(const QString& string, const SocRef& ref)
47 :QTreeWidgetItem(QStringList(string), RegTreeSocType), m_ref(ref) {}
48
49 const SocRef& GetRef() { return m_ref; }
50private:
51 SocRef m_ref;
52};
53
54class DevTreeItem : public QTreeWidgetItem
55{
56public:
57 DevTreeItem(const QString& string, const SocDevRef& ref)
58 :QTreeWidgetItem(QStringList(string), RegTreeDevType), m_ref(ref) {}
59
60 const SocDevRef& GetRef() { return m_ref; }
61private:
62 SocDevRef m_ref;
63};
64
65class RegTreeItem : public QTreeWidgetItem
66{
67public:
68 RegTreeItem(const QString& string, const SocRegRef& ref)
69 :QTreeWidgetItem(QStringList(string), RegTreeRegType), m_ref(ref) {}
70
71 const SocRegRef& GetRef() { return m_ref; }
72private:
73 SocRegRef m_ref;
74}; 39};
75 40
76} 41}
@@ -165,7 +130,8 @@ RegTab::RegTab(Backend *backend, QWidget *parent)
165 130
166 connect(m_soc_selector, SIGNAL(currentIndexChanged(int)), 131 connect(m_soc_selector, SIGNAL(currentIndexChanged(int)),
167 this, SLOT(OnSocChanged(int))); 132 this, SLOT(OnSocChanged(int)));
168 connect(m_backend, SIGNAL(OnSocListChanged()), this, SLOT(OnSocListChanged())); 133 connect(m_backend, SIGNAL(OnSocAdded(const SocFileRef&)), this,
134 SLOT(OnSocAdded(const SocFileRef&)));
169 connect(m_reg_tree, SIGNAL(itemClicked(QTreeWidgetItem*, int)), 135 connect(m_reg_tree, SIGNAL(itemClicked(QTreeWidgetItem*, int)),
170 this, SLOT(OnRegItemClicked(QTreeWidgetItem*, int))); 136 this, SLOT(OnRegItemClicked(QTreeWidgetItem*, int)));
171 connect(m_data_soc_label, SIGNAL(linkActivated(const QString&)), this, 137 connect(m_data_soc_label, SIGNAL(linkActivated(const QString&)), this,
@@ -183,7 +149,9 @@ RegTab::RegTab(Backend *backend, QWidget *parent)
183 "You can browse the registers. Select a data source to analyse the values."); 149 "You can browse the registers. Select a data source to analyse the values.");
184 m_msg_error_id = 0; 150 m_msg_error_id = 0;
185 151
186 OnSocListChanged(); 152 QList< SocFileRef > socs = m_backend->GetSocFileList();
153 for(int i = 0; i < socs.size(); i++)
154 OnSocAdded(socs[i]);
187 SetDataSocName(""); 155 SetDataSocName("");
188 UpdateTabName(); 156 UpdateTabName();
189} 157}
@@ -286,21 +254,7 @@ void RegTab::OnRegItemClicked(QTreeWidgetItem *current, int col)
286 Q_UNUSED(col); 254 Q_UNUSED(col);
287 if(current == 0) 255 if(current == 0)
288 return; 256 return;
289 if(current->type() == RegTreeSocType) 257 DisplayNode(NodeInst(current));
290 {
291 SocTreeItem *item = dynamic_cast< SocTreeItem * >(current);
292 DisplaySoc(item->GetRef());
293 }
294 if(current->type() == RegTreeRegType)
295 {
296 RegTreeItem *item = dynamic_cast< RegTreeItem * >(current);
297 DisplayRegister(item->GetRef());
298 }
299 else if(current->type() == RegTreeDevType)
300 {
301 DevTreeItem *item = dynamic_cast< DevTreeItem * >(current);
302 DisplayDevice(item->GetRef());
303 }
304} 258}
305 259
306void RegTab::OnAnalyserClicked(QListWidgetItem *current) 260void RegTab::OnAnalyserClicked(QListWidgetItem *current)
@@ -311,19 +265,14 @@ void RegTab::OnAnalyserClicked(QListWidgetItem *current)
311 SetPanel(ana->Create(m_cur_soc, m_io_backend)); 265 SetPanel(ana->Create(m_cur_soc, m_io_backend));
312} 266}
313 267
314void RegTab::DisplayRegister(const SocRegRef& ref) 268void RegTab::DisplayNode(const soc_desc::node_inst_t& ref)
315{
316 SetPanel(new RegDisplayPanel(this, m_io_backend, ref));
317}
318
319void RegTab::DisplayDevice(const SocDevRef& ref)
320{ 269{
321 SetPanel(new DevDisplayPanel(this, ref)); 270 if(ref.node().is_root())
322} 271 SetPanel(new SocDisplayPanel(this, m_io_backend, ref.soc()));
323 272 else if(ref.node().reg().valid())
324void RegTab::DisplaySoc(const SocRef& ref) 273 SetPanel(new RegDisplayPanel(this, m_io_backend, ref));
325{ 274 else
326 SetPanel(new SocDisplayPanel(this, ref)); 275 SetPanel(new NodeDisplayPanel(this, m_io_backend, ref));
327} 276}
328 277
329int RegTab::SetMessage(MessageWidget::MessageType type, const QString& msg) 278int RegTab::SetMessage(MessageWidget::MessageType type, const QString& msg)
@@ -344,56 +293,45 @@ void RegTab::SetPanel(RegTabPanel *panel)
344 m_right_panel->addWidget(m_right_content->GetWidget(), 1); 293 m_right_panel->addWidget(m_right_content->GetWidget(), 1);
345} 294}
346 295
347void RegTab::OnSocListChanged() 296void RegTab::OnSocAdded(const SocFileRef& ref)
348{ 297{
349 m_soc_selector->clear(); 298 soc_desc::soc_ref_t soc = ref.GetSocFile()->GetSocRef();
350 QList< SocRef > socs = m_backend->GetSocList(); 299 QVariant v;
351 for(int i = 0; i < socs.size(); i++) 300 v.setValue(soc);
352 { 301 m_soc_selector->addItem(QString::fromStdString(soc.get()->name), v);
353 QVariant v;
354 v.setValue(socs[i]);
355 m_soc_selector->addItem(QString::fromStdString(socs[i].GetSoc().name), v);
356 }
357} 302}
358 303
359void RegTab::FillDevSubTree(QTreeWidgetItem *_item) 304QTreeWidgetItem *RegTab::MakeNode(const soc_desc::node_inst_t& inst, const QString& s)
360{ 305{
361 DevTreeItem *item = dynamic_cast< DevTreeItem* >(_item); 306 QTreeWidgetItem *item = new QTreeWidgetItem(QStringList(s));
362 const soc_dev_t& dev = item->GetRef().GetDev(); 307 item->setData(0, NodeInstRole, QVariant::fromValue(inst));
363 for(size_t i = 0; i < dev.reg.size(); i++) 308 return item;
364 { 309}
365 const soc_reg_t& reg = dev.reg[i]; 310
366 for(size_t j = 0; j < reg.addr.size(); j++) 311soc_desc::node_inst_t RegTab::NodeInst(QTreeWidgetItem *item)
367 { 312{
368 RegTreeItem *reg_item = new RegTreeItem(reg.addr[j].name.c_str(), 313 return item->data(0, NodeInstRole).value< soc_desc::node_inst_t >();
369 SocRegRef(item->GetRef(), i, j));
370 item->addChild(reg_item);
371 }
372 }
373} 314}
374 315
375void RegTab::FillSocSubTree(QTreeWidgetItem *_item) 316void RegTab::FillSubTree(QTreeWidgetItem *item)
376{ 317{
377 SocTreeItem *item = dynamic_cast< SocTreeItem* >(_item); 318 std::vector< soc_desc::node_inst_t > list = NodeInst(item).children();
378 const soc_t& soc = item->GetRef().GetSoc(); 319 for(size_t i = 0; i < list.size(); i++)
379 for(size_t i = 0; i < soc.dev.size(); i++)
380 { 320 {
381 const soc_dev_t& dev = soc.dev[i]; 321 QString name = QString::fromStdString(list[i].name());
382 for(size_t j = 0; j < dev.addr.size(); j++) 322 if(list[i].is_indexed())
383 { 323 name = QString("%1[%2]").arg(name).arg(list[i].index());
384 DevTreeItem *dev_item = new DevTreeItem(dev.addr[j].name.c_str(), 324 QTreeWidgetItem *child = MakeNode(list[i], name);
385 SocDevRef(m_cur_soc, i, j)); 325 FillSubTree(child);
386 FillDevSubTree(dev_item); 326 item->addChild(child);
387 item->addChild(dev_item);
388 }
389 } 327 }
390} 328}
391 329
392void RegTab::FillRegTree() 330void RegTab::FillRegTree()
393{ 331{
394 SocTreeItem *soc_item = new SocTreeItem(m_cur_soc.GetSoc().name.c_str(), 332 QTreeWidgetItem *soc_item = MakeNode(m_cur_soc.root_inst(),
395 m_cur_soc); 333 QString::fromStdString(m_cur_soc.get()->name));
396 FillSocSubTree(soc_item); 334 FillSubTree(soc_item);
397 m_reg_tree->addTopLevelItem(soc_item); 335 m_reg_tree->addTopLevelItem(soc_item);
398 m_reg_tree->expandItem(soc_item); 336 m_reg_tree->expandItem(soc_item);
399} 337}
@@ -401,7 +339,8 @@ void RegTab::FillRegTree()
401void RegTab::FillAnalyserList() 339void RegTab::FillAnalyserList()
402{ 340{
403 m_analysers_list->clear(); 341 m_analysers_list->clear();
404 m_analysers_list->addItems(AnalyserFactory::GetAnalysersForSoc(m_cur_soc.GetSoc().name.c_str())); 342 m_analysers_list->addItems(AnalyserFactory::GetAnalysersForSoc(
343 QString::fromStdString(m_cur_soc.get()->name)));
405} 344}
406 345
407void RegTab::OnSocChanged(int index) 346void RegTab::OnSocChanged(int index)
@@ -409,7 +348,7 @@ void RegTab::OnSocChanged(int index)
409 if(index == -1) 348 if(index == -1)
410 return; 349 return;
411 m_reg_tree->clear(); 350 m_reg_tree->clear();
412 m_cur_soc = m_soc_selector->itemData(index).value< SocRef >(); 351 m_cur_soc = m_soc_selector->itemData(index).value< soc_desc::soc_ref_t >();
413 FillRegTree(); 352 FillRegTree();
414 FillAnalyserList(); 353 FillAnalyserList();
415} 354}
@@ -426,7 +365,10 @@ void RegTab::OnDumpRegs(bool c)
426 Q_UNUSED(c); 365 Q_UNUSED(c);
427 QFileDialog *fd = new QFileDialog(this); 366 QFileDialog *fd = new QFileDialog(this);
428 fd->setAcceptMode(QFileDialog::AcceptSave); 367 fd->setAcceptMode(QFileDialog::AcceptSave);
429 fd->setFilter("Textual files (*.txt);;All files (*)"); 368 QStringList filters;
369 filters << "Textual files (*.txt)";
370 filters << "All files (*)";
371 fd->setNameFilters(filters);
430 fd->setDirectory(Settings::Get()->value("regtab/loaddatadir", QDir::currentPath()).toString()); 372 fd->setDirectory(Settings::Get()->value("regtab/loaddatadir", QDir::currentPath()).toString());
431 if(!fd->exec()) 373 if(!fd->exec())
432 return; 374 return;