summaryrefslogtreecommitdiffstats
path: root/utils/regtools/qeditor/backend.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/regtools/qeditor/backend.cpp')
-rw-r--r--utils/regtools/qeditor/backend.cpp156
1 files changed, 156 insertions, 0 deletions
diff --git a/utils/regtools/qeditor/backend.cpp b/utils/regtools/qeditor/backend.cpp
new file mode 100644
index 0000000000..e011965bd2
--- /dev/null
+++ b/utils/regtools/qeditor/backend.cpp
@@ -0,0 +1,156 @@
+#include <QFile>
+#include <QTextStream>
+#include <QDebug>
+#include "backend.h"
+
+Backend::Backend()
+{
+}
+
+QStringList Backend::GetSocNameList()
+{
+ QStringList sl;
+ for(size_t i = 0; i < m_socs.size(); i++)
+ sl.append(QString(m_socs[i].name.c_str()));
+ return sl;
+}
+
+bool Backend::GetSocByName(const QString& name, soc_t& s)
+{
+ for(size_t i = 0; i < m_socs.size(); i++)
+ if(m_socs[i].name == name.toStdString())
+ {
+ s = m_socs[i];
+ return true;
+ }
+ return false;
+}
+
+bool Backend::LoadSocDesc(const QString& filename)
+{
+ bool ret = soc_desc_parse_xml(filename.toStdString(), m_socs);
+ emit OnSocListChanged();
+ return ret;
+}
+
+IoBackend *Backend::CreateFileIoBackend(const QString& filename)
+{
+ return new FileIoBackend(filename);
+}
+
+IoBackend *Backend::CreateDummyIoBackend()
+{
+ return new DummyIoBackend();
+}
+
+IoBackend::IoBackend()
+{
+}
+
+FileIoBackend::FileIoBackend(const QString& filename)
+{
+ m_filename = filename;
+ Reload();
+}
+
+QString FileIoBackend::GetSocName()
+{
+ return m_soc;
+}
+
+bool FileIoBackend::ReadRegister(const QString& name, soc_word_t& value)
+{
+ if(m_map.find(name) == m_map.end())
+ return false;
+ value = m_map[name];
+ return true;
+}
+
+bool FileIoBackend::Reload()
+{
+ QFile file(m_filename);
+ if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
+ return false;
+ m_map.clear();
+
+ QTextStream in(&file);
+ while(!in.atEnd())
+ {
+ QString line = in.readLine();
+ int idx = line.indexOf('=');
+ if(idx == -1)
+ continue;
+ QString key = line.left(idx).trimmed();
+ bool ok;
+ soc_word_t val = line.mid(idx + 1).trimmed().toULong(&ok, 0);
+ if(key == "HW")
+ m_soc = line.mid(idx + 1).trimmed();
+ else if(ok)
+ m_map[key] = val;
+ }
+ return true;
+}
+
+DummyIoBackend::DummyIoBackend()
+{
+}
+
+QString DummyIoBackend::GetSocName()
+{
+ return "";
+}
+
+bool DummyIoBackend::ReadRegister(const QString& name, soc_word_t& value)
+{
+ (void) name;
+ (void) value;
+ return false;
+}
+
+bool DummyIoBackend::Reload()
+{
+ return true;
+}
+
+BackendHelper::BackendHelper(IoBackend *io_backend, const soc_t& soc)
+ :m_io_backend(io_backend), m_soc(soc)
+{
+}
+
+bool BackendHelper::ReadRegister(const QString& dev, const QString& reg, soc_word_t& v)
+{
+ return m_io_backend->ReadRegister("HW." + dev + "." + reg, v);
+}
+
+bool BackendHelper::ReadRegisterField(const QString& dev, const QString& reg,
+ const QString& field, soc_word_t& v)
+{
+ soc_dev_t *sdev = 0;
+ for(size_t i = 0; i < m_soc.dev.size(); i++)
+ {
+ for(size_t j = 0; j < m_soc.dev[i].addr.size(); j++)
+ if(m_soc.dev[i].addr[j].name.c_str() == dev)
+ sdev = &m_soc.dev[i];
+ }
+ if(sdev == 0)
+ return false;
+ soc_reg_t *sreg = 0;
+ for(size_t i = 0; i < sdev->reg.size(); i++)
+ {
+ for(size_t j = 0; j < sdev->reg[i].addr.size(); j++)
+ if(sdev->reg[i].addr[j].name.c_str() == reg)
+ sreg = &sdev->reg[i];
+ }
+ if(sreg == 0)
+ return false;
+ soc_reg_field_t *sfield = 0;
+ for(size_t i = 0; i < sreg->field.size(); i++)
+ if(sreg->field[i].name.c_str() == field)
+ sfield = &sreg->field[i];
+ if(sfield == 0)
+ return false;
+ if(!ReadRegister(dev, reg, v))
+ return false;
+ v = (v & sfield->bitmask()) >> sfield->first_bit;
+ return true;
+} \ No newline at end of file