summaryrefslogtreecommitdiff
path: root/utils/regtools/qeditor/regtab.cpp
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2014-02-09 02:13:53 +0100
committerAmaury Pouly <amaury.pouly@gmail.com>2014-02-10 23:14:26 +0100
commit3d07706c05c46878533f55f26bbe02d7904efd75 (patch)
treef1b549c275f7a27f9e7038e5fc4eccb94bf8be45 /utils/regtools/qeditor/regtab.cpp
parent8358707d8276dd297655395b922560e3c65631e1 (diff)
downloadrockbox-3d07706c05c46878533f55f26bbe02d7904efd75.tar.gz
rockbox-3d07706c05c46878533f55f26bbe02d7904efd75.zip
regtools/qeditor: rewrite soc handling
The code was a mess with respect to soc handling: some code just plain copied the SoC descriptor which are big objects, some was using indexes. The new soc factor out everything in a few classes which hide these ugly details so that descriptors are never copied. Change-Id: I17af8b47f997a528b58221621389d42d24fded93
Diffstat (limited to 'utils/regtools/qeditor/regtab.cpp')
-rw-r--r--utils/regtools/qeditor/regtab.cpp69
1 files changed, 33 insertions, 36 deletions
diff --git a/utils/regtools/qeditor/regtab.cpp b/utils/regtools/qeditor/regtab.cpp
index b97ceafdc8..e4adecf203 100644
--- a/utils/regtools/qeditor/regtab.cpp
+++ b/utils/regtools/qeditor/regtab.cpp
@@ -203,17 +203,11 @@ void RegTab::OnRegItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previou
203void RegTab::OnRegItemClicked(QTreeWidgetItem *current, int col) 203void RegTab::OnRegItemClicked(QTreeWidgetItem *current, int col)
204{ 204{
205 (void) col; 205 (void) col;
206 if(current == 0) 206 if(current == 0 || current->type() != RegTreeRegType)
207 return; 207 return;
208 RegTreeItem *item = dynamic_cast< RegTreeItem * >(current); 208 RegTreeItem *item = dynamic_cast< RegTreeItem * >(current);
209 if(item->type() != RegTreeRegType)
210 return;
211 soc_dev_t& dev = m_cur_soc.dev[item->GetDevIndex()];
212 soc_dev_addr_t& dev_addr = dev.addr[item->GetDevAddrIndex()];
213 soc_reg_t& reg = dev.reg[item->GetRegIndex()];
214 soc_reg_addr_t& reg_addr = reg.addr[item->GetRegAddrIndex()];
215 209
216 DisplayRegister(dev, dev_addr, reg, reg_addr); 210 DisplayRegister(item->GetRef());
217} 211}
218 212
219void RegTab::OnAnalyserChanged(QListWidgetItem *current, QListWidgetItem *previous) 213void RegTab::OnAnalyserChanged(QListWidgetItem *current, QListWidgetItem *previous)
@@ -232,14 +226,16 @@ void RegTab::OnAnalyserClicked(QListWidgetItem *current)
232 m_right_panel->addWidget(m_right_content, 1); 226 m_right_panel->addWidget(m_right_content, 1);
233} 227}
234 228
235void RegTab::DisplayRegister(soc_dev_t& dev, soc_dev_addr_t& dev_addr, 229void RegTab::DisplayRegister(const SocRegRef& ref)
236 soc_reg_t& reg, soc_reg_addr_t& reg_addr)
237{ 230{
238 (void) dev;
239 delete m_right_content; 231 delete m_right_content;
240 232
241 QVBoxLayout *right_layout = new QVBoxLayout; 233 QVBoxLayout *right_layout = new QVBoxLayout;
242 234
235 const soc_dev_addr_t& dev_addr = ref.GetDevAddr();
236 const soc_reg_t& reg = ref.GetReg();
237 const soc_reg_addr_t& reg_addr = ref.GetRegAddr();
238
243 QString reg_name; 239 QString reg_name;
244 reg_name.sprintf("HW_%s_%s", dev_addr.name.c_str(), reg_addr.name.c_str()); 240 reg_name.sprintf("HW_%s_%s", dev_addr.name.c_str(), reg_addr.name.c_str());
245 QStringList names; 241 QStringList names;
@@ -303,29 +299,29 @@ void RegTab::DisplayRegister(soc_dev_t& dev, soc_dev_addr_t& dev_addr,
303 QTableWidget *value_table = new QTableWidget; 299 QTableWidget *value_table = new QTableWidget;
304 value_table->setRowCount(reg.field.size()); 300 value_table->setRowCount(reg.field.size());
305 value_table->setColumnCount(4); 301 value_table->setColumnCount(4);
306 for(size_t i = 0; i < reg.field.size(); i++) 302 int row = 0;
303 foreach(const soc_reg_field_t& field, reg.field)
307 { 304 {
308 QString bits_str; 305 QString bits_str;
309 if(reg.field[i].first_bit == reg.field[i].last_bit) 306 if(field.first_bit == field.last_bit)
310 bits_str.sprintf("%d", reg.field[i].first_bit); 307 bits_str.sprintf("%d", field.first_bit);
311 else 308 else
312 bits_str.sprintf("%d:%d", reg.field[i].last_bit, reg.field[i].first_bit); 309 bits_str.sprintf("%d:%d", field.last_bit, field.first_bit);
313 QTableWidgetItem *item = new QTableWidgetItem(bits_str); 310 QTableWidgetItem *item = new QTableWidgetItem(bits_str);
314 item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter); 311 item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
315 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); 312 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
316 value_table->setItem(i, 0, item); 313 value_table->setItem(row, 0, item);
317 item = new QTableWidgetItem(QString(reg.field[i].name.c_str())); 314 item = new QTableWidgetItem(QString(field.name.c_str()));
318 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); 315 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
319 value_table->setItem(i, 1, item); 316 value_table->setItem(row, 1, item);
320 item = new QTableWidgetItem(); 317 item = new QTableWidgetItem();
321 if(has_value) 318 if(has_value)
322 { 319 {
323 const soc_reg_field_t& field = reg.field[i];
324 soc_word_t v = (value & field.bitmask()) >> field.first_bit; 320 soc_word_t v = (value & field.bitmask()) >> field.first_bit;
325 QString value_name; 321 QString value_name;
326 for(size_t j = 0; j < field.value.size(); j++) 322 foreach(const soc_reg_field_value_t& rval, field.value)
327 if(v == field.value[j].value) 323 if(v == rval.value)
328 value_name = field.value[j].name.c_str(); 324 value_name = rval.name.c_str();
329 const char *fmt = "%lu"; 325 const char *fmt = "%lu";
330 // heuristic 326 // heuristic
331 if((field.last_bit - field.first_bit + 1) > 16) 327 if((field.last_bit - field.first_bit + 1) > 16)
@@ -338,11 +334,12 @@ void RegTab::DisplayRegister(soc_dev_t& dev, soc_dev_addr_t& dev_addr,
338 QTableWidgetItem *t = new QTableWidgetItem(value_name); 334 QTableWidgetItem *t = new QTableWidgetItem(value_name);
339 t->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter); 335 t->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
340 t->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); 336 t->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
341 value_table->setItem(i, 3, t); 337 value_table->setItem(row, 3, t);
342 } 338 }
343 } 339 }
344 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); 340 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
345 value_table->setItem(i, 2, item); 341 value_table->setItem(row, 2, item);
342 row++;
346 } 343 }
347 value_table->setHorizontalHeaderItem(0, new QTableWidgetItem("Bits")); 344 value_table->setHorizontalHeaderItem(0, new QTableWidgetItem("Bits"));
348 value_table->setHorizontalHeaderItem(1, new QTableWidgetItem("Name")); 345 value_table->setHorizontalHeaderItem(1, new QTableWidgetItem("Name"));
@@ -404,16 +401,16 @@ void RegTab::OnDevChanged(int index)
404} 401}
405#endif 402#endif
406 403
407void RegTab::FillDevSubTree(RegTreeItem *item) 404void RegTab::FillDevSubTree(DevTreeItem *item)
408{ 405{
409 soc_dev_t& sd = m_cur_soc.dev[item->GetDevIndex()]; 406 const soc_dev_t& dev = item->GetRef().GetDev();
410 for(size_t i = 0; i < sd.reg.size(); i++) 407 for(size_t i = 0; i < dev.reg.size(); i++)
411 { 408 {
412 soc_reg_t& reg = sd.reg[i]; 409 const soc_reg_t& reg = dev.reg[i];
413 for(size_t j = 0; j < reg.addr.size(); j++) 410 for(size_t j = 0; j < reg.addr.size(); j++)
414 { 411 {
415 RegTreeItem *reg_item = new RegTreeItem(reg.addr[j].name.c_str(), RegTreeRegType); 412 RegTreeItem *reg_item = new RegTreeItem(reg.addr[j].name.c_str(),
416 reg_item->SetPath(item->GetDevIndex(), item->GetDevAddrIndex(), i, j); 413 SocRegRef(item->GetRef(), i, j));
417 item->addChild(reg_item); 414 item->addChild(reg_item);
418 } 415 }
419 } 416 }
@@ -421,13 +418,13 @@ void RegTab::FillDevSubTree(RegTreeItem *item)
421 418
422void RegTab::FillRegTree() 419void RegTab::FillRegTree()
423{ 420{
424 for(size_t i = 0; i < m_cur_soc.dev.size(); i++) 421 for(size_t i = 0; i < m_cur_soc.GetSoc().dev.size(); i++)
425 { 422 {
426 soc_dev_t& sd = m_cur_soc.dev[i]; 423 const soc_dev_t& dev = m_cur_soc.GetSoc().dev[i];
427 for(size_t j = 0; j < sd.addr.size(); j++) 424 for(size_t j = 0; j < dev.addr.size(); j++)
428 { 425 {
429 RegTreeItem *dev_item = new RegTreeItem(sd.addr[j].name.c_str(), RegTreeDevType); 426 DevTreeItem *dev_item = new DevTreeItem(dev.addr[j].name.c_str(),
430 dev_item->SetPath(i, j); 427 SocDevRef(m_cur_soc, i, j));
431 FillDevSubTree(dev_item); 428 FillDevSubTree(dev_item);
432 m_reg_tree->addTopLevelItem(dev_item); 429 m_reg_tree->addTopLevelItem(dev_item);
433 } 430 }
@@ -437,7 +434,7 @@ void RegTab::FillRegTree()
437void RegTab::FillAnalyserList() 434void RegTab::FillAnalyserList()
438{ 435{
439 m_analysers_list->clear(); 436 m_analysers_list->clear();
440 m_analysers_list->addItems(AnalyserFactory::GetAnalysersForSoc(m_cur_soc.name.c_str())); 437 m_analysers_list->addItems(AnalyserFactory::GetAnalysersForSoc(m_cur_soc.GetSoc().name.c_str()));
441} 438}
442 439
443void RegTab::OnSocChanged(const QString& soc) 440void RegTab::OnSocChanged(const QString& soc)