diff options
Diffstat (limited to 'utils/regtools/qeditor/regtab.cpp')
-rw-r--r-- | utils/regtools/qeditor/regtab.cpp | 152 |
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 | ||
36 | enum | 36 | enum |
37 | { | 37 | { |
38 | RegTreeDevType = QTreeWidgetItem::UserType, | 38 | NodeInstRole = Qt::UserRole, |
39 | RegTreeRegType, | ||
40 | RegTreeSocType | ||
41 | }; | ||
42 | |||
43 | class SocTreeItem : public QTreeWidgetItem | ||
44 | { | ||
45 | public: | ||
46 | SocTreeItem(const QString& string, const SocRef& ref) | ||
47 | :QTreeWidgetItem(QStringList(string), RegTreeSocType), m_ref(ref) {} | ||
48 | |||
49 | const SocRef& GetRef() { return m_ref; } | ||
50 | private: | ||
51 | SocRef m_ref; | ||
52 | }; | ||
53 | |||
54 | class DevTreeItem : public QTreeWidgetItem | ||
55 | { | ||
56 | public: | ||
57 | DevTreeItem(const QString& string, const SocDevRef& ref) | ||
58 | :QTreeWidgetItem(QStringList(string), RegTreeDevType), m_ref(ref) {} | ||
59 | |||
60 | const SocDevRef& GetRef() { return m_ref; } | ||
61 | private: | ||
62 | SocDevRef m_ref; | ||
63 | }; | ||
64 | |||
65 | class RegTreeItem : public QTreeWidgetItem | ||
66 | { | ||
67 | public: | ||
68 | RegTreeItem(const QString& string, const SocRegRef& ref) | ||
69 | :QTreeWidgetItem(QStringList(string), RegTreeRegType), m_ref(ref) {} | ||
70 | |||
71 | const SocRegRef& GetRef() { return m_ref; } | ||
72 | private: | ||
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 | ||
306 | void RegTab::OnAnalyserClicked(QListWidgetItem *current) | 260 | void 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 | ||
314 | void RegTab::DisplayRegister(const SocRegRef& ref) | 268 | void RegTab::DisplayNode(const soc_desc::node_inst_t& ref) |
315 | { | ||
316 | SetPanel(new RegDisplayPanel(this, m_io_backend, ref)); | ||
317 | } | ||
318 | |||
319 | void 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()) | |
324 | void 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 | ||
329 | int RegTab::SetMessage(MessageWidget::MessageType type, const QString& msg) | 278 | int 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 | ||
347 | void RegTab::OnSocListChanged() | 296 | void 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 | ||
359 | void RegTab::FillDevSubTree(QTreeWidgetItem *_item) | 304 | QTreeWidgetItem *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++) | 311 | soc_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 | ||
375 | void RegTab::FillSocSubTree(QTreeWidgetItem *_item) | 316 | void 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 | ||
392 | void RegTab::FillRegTree() | 330 | void 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() | |||
401 | void RegTab::FillAnalyserList() | 339 | void 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 | ||
407 | void RegTab::OnSocChanged(int index) | 346 | void 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; |