From 3d07706c05c46878533f55f26bbe02d7904efd75 Mon Sep 17 00:00:00 2001 From: Amaury Pouly Date: Sun, 9 Feb 2014 02:13:53 +0100 Subject: 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 --- utils/regtools/qeditor/regtab.cpp | 69 +++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 36 deletions(-) (limited to 'utils/regtools/qeditor/regtab.cpp') 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 void RegTab::OnRegItemClicked(QTreeWidgetItem *current, int col) { (void) col; - if(current == 0) + if(current == 0 || current->type() != RegTreeRegType) return; RegTreeItem *item = dynamic_cast< RegTreeItem * >(current); - if(item->type() != RegTreeRegType) - return; - soc_dev_t& dev = m_cur_soc.dev[item->GetDevIndex()]; - soc_dev_addr_t& dev_addr = dev.addr[item->GetDevAddrIndex()]; - soc_reg_t& reg = dev.reg[item->GetRegIndex()]; - soc_reg_addr_t& reg_addr = reg.addr[item->GetRegAddrIndex()]; - DisplayRegister(dev, dev_addr, reg, reg_addr); + DisplayRegister(item->GetRef()); } void RegTab::OnAnalyserChanged(QListWidgetItem *current, QListWidgetItem *previous) @@ -232,14 +226,16 @@ void RegTab::OnAnalyserClicked(QListWidgetItem *current) m_right_panel->addWidget(m_right_content, 1); } -void RegTab::DisplayRegister(soc_dev_t& dev, soc_dev_addr_t& dev_addr, - soc_reg_t& reg, soc_reg_addr_t& reg_addr) +void RegTab::DisplayRegister(const SocRegRef& ref) { - (void) dev; delete m_right_content; QVBoxLayout *right_layout = new QVBoxLayout; + const soc_dev_addr_t& dev_addr = ref.GetDevAddr(); + const soc_reg_t& reg = ref.GetReg(); + const soc_reg_addr_t& reg_addr = ref.GetRegAddr(); + QString reg_name; reg_name.sprintf("HW_%s_%s", dev_addr.name.c_str(), reg_addr.name.c_str()); QStringList names; @@ -303,29 +299,29 @@ void RegTab::DisplayRegister(soc_dev_t& dev, soc_dev_addr_t& dev_addr, QTableWidget *value_table = new QTableWidget; value_table->setRowCount(reg.field.size()); value_table->setColumnCount(4); - for(size_t i = 0; i < reg.field.size(); i++) + int row = 0; + foreach(const soc_reg_field_t& field, reg.field) { QString bits_str; - if(reg.field[i].first_bit == reg.field[i].last_bit) - bits_str.sprintf("%d", reg.field[i].first_bit); + if(field.first_bit == field.last_bit) + bits_str.sprintf("%d", field.first_bit); else - bits_str.sprintf("%d:%d", reg.field[i].last_bit, reg.field[i].first_bit); + bits_str.sprintf("%d:%d", field.last_bit, field.first_bit); QTableWidgetItem *item = new QTableWidgetItem(bits_str); item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); - value_table->setItem(i, 0, item); - item = new QTableWidgetItem(QString(reg.field[i].name.c_str())); + value_table->setItem(row, 0, item); + item = new QTableWidgetItem(QString(field.name.c_str())); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); - value_table->setItem(i, 1, item); + value_table->setItem(row, 1, item); item = new QTableWidgetItem(); if(has_value) { - const soc_reg_field_t& field = reg.field[i]; soc_word_t v = (value & field.bitmask()) >> field.first_bit; QString value_name; - for(size_t j = 0; j < field.value.size(); j++) - if(v == field.value[j].value) - value_name = field.value[j].name.c_str(); + foreach(const soc_reg_field_value_t& rval, field.value) + if(v == rval.value) + value_name = rval.name.c_str(); const char *fmt = "%lu"; // heuristic 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, QTableWidgetItem *t = new QTableWidgetItem(value_name); t->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter); t->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); - value_table->setItem(i, 3, t); + value_table->setItem(row, 3, t); } } item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); - value_table->setItem(i, 2, item); + value_table->setItem(row, 2, item); + row++; } value_table->setHorizontalHeaderItem(0, new QTableWidgetItem("Bits")); value_table->setHorizontalHeaderItem(1, new QTableWidgetItem("Name")); @@ -404,16 +401,16 @@ void RegTab::OnDevChanged(int index) } #endif -void RegTab::FillDevSubTree(RegTreeItem *item) +void RegTab::FillDevSubTree(DevTreeItem *item) { - soc_dev_t& sd = m_cur_soc.dev[item->GetDevIndex()]; - for(size_t i = 0; i < sd.reg.size(); i++) + const soc_dev_t& dev = item->GetRef().GetDev(); + for(size_t i = 0; i < dev.reg.size(); i++) { - soc_reg_t& reg = sd.reg[i]; + const soc_reg_t& reg = dev.reg[i]; for(size_t j = 0; j < reg.addr.size(); j++) { - RegTreeItem *reg_item = new RegTreeItem(reg.addr[j].name.c_str(), RegTreeRegType); - reg_item->SetPath(item->GetDevIndex(), item->GetDevAddrIndex(), i, j); + RegTreeItem *reg_item = new RegTreeItem(reg.addr[j].name.c_str(), + SocRegRef(item->GetRef(), i, j)); item->addChild(reg_item); } } @@ -421,13 +418,13 @@ void RegTab::FillDevSubTree(RegTreeItem *item) void RegTab::FillRegTree() { - for(size_t i = 0; i < m_cur_soc.dev.size(); i++) + for(size_t i = 0; i < m_cur_soc.GetSoc().dev.size(); i++) { - soc_dev_t& sd = m_cur_soc.dev[i]; - for(size_t j = 0; j < sd.addr.size(); j++) + const soc_dev_t& dev = m_cur_soc.GetSoc().dev[i]; + for(size_t j = 0; j < dev.addr.size(); j++) { - RegTreeItem *dev_item = new RegTreeItem(sd.addr[j].name.c_str(), RegTreeDevType); - dev_item->SetPath(i, j); + DevTreeItem *dev_item = new DevTreeItem(dev.addr[j].name.c_str(), + SocDevRef(m_cur_soc, i, j)); FillDevSubTree(dev_item); m_reg_tree->addTopLevelItem(dev_item); } @@ -437,7 +434,7 @@ void RegTab::FillRegTree() void RegTab::FillAnalyserList() { m_analysers_list->clear(); - m_analysers_list->addItems(AnalyserFactory::GetAnalysersForSoc(m_cur_soc.name.c_str())); + m_analysers_list->addItems(AnalyserFactory::GetAnalysersForSoc(m_cur_soc.GetSoc().name.c_str())); } void RegTab::OnSocChanged(const QString& soc) -- cgit v1.2.3