summaryrefslogtreecommitdiffstats
path: root/utils/regtools
diff options
context:
space:
mode:
Diffstat (limited to 'utils/regtools')
-rw-r--r--utils/regtools/qeditor/backend.cpp60
-rw-r--r--utils/regtools/qeditor/backend.h40
2 files changed, 69 insertions, 31 deletions
diff --git a/utils/regtools/qeditor/backend.cpp b/utils/regtools/qeditor/backend.cpp
index e47df8e3a4..c2db1f2a3e 100644
--- a/utils/regtools/qeditor/backend.cpp
+++ b/utils/regtools/qeditor/backend.cpp
@@ -107,23 +107,14 @@ IoBackend *Backend::CreateHWStubIoBackend(HWStubDevice *dev)
#endif
/**
- * FileIoBackend
+ * RamIoBackend
*/
-
-FileIoBackend::FileIoBackend(const QString& filename, const QString& soc_name)
+RamIoBackend::RamIoBackend(const QString& soc_name)
{
- m_filename = filename;
m_soc = soc_name;
- m_valid = false;
- Reload();
}
-QString FileIoBackend::GetSocName()
-{
- return m_soc;
-}
-
-bool FileIoBackend::ReadRegister(const QString& name, soc_word_t& value)
+bool RamIoBackend::ReadRegister(const QString& name, soc_word_t& value)
{
if(m_map.find(name) == m_map.end())
return false;
@@ -131,13 +122,45 @@ bool FileIoBackend::ReadRegister(const QString& name, soc_word_t& value)
return true;
}
+void RamIoBackend::DeleteAll()
+{
+ m_map.clear();
+}
+
+bool RamIoBackend::WriteRegister(const QString& name, soc_word_t value, WriteMode mode)
+{
+ switch(mode)
+ {
+ case Write: m_map[name] = value; return true;
+ case Set: m_map[name] |= value; return true;
+ case Clear: m_map[name] &= ~value; return true;
+ case Toggle: m_map[name] ^= value; return true;
+ default: return false;
+ }
+}
+
+
+
+/**
+ * FileIoBackend
+ */
+
+FileIoBackend::FileIoBackend(const QString& filename, const QString& soc_name)
+ :RamIoBackend(soc_name)
+{
+ m_filename = filename;
+ m_valid = false;
+ Reload();
+}
+
+
bool FileIoBackend::Reload()
{
m_valid = false;
QFile file(m_filename);
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
return false;
- m_map.clear();
+ DeleteAll();
QTextStream in(&file);
while(!in.atEnd())
@@ -152,7 +175,7 @@ bool FileIoBackend::Reload()
if(key == "HW")
m_soc = line.mid(idx + 1).trimmed();
else if(ok)
- m_map[key] = val;
+ RamIoBackend::WriteRegister(key, val, Write);
}
m_readonly = !QFileInfo(file).isWritable();
@@ -164,14 +187,7 @@ bool FileIoBackend::Reload()
bool FileIoBackend::WriteRegister(const QString& name, soc_word_t value, WriteMode mode)
{
m_dirty = true;
- switch(mode)
- {
- case Write: m_map[name] = value; return true;
- case Set: m_map[name] |= value; return true;
- case Clear: m_map[name] &= ~value; return true;
- case Toggle: m_map[name] ^= value; return true;
- default: return false;
- }
+ return RamIoBackend::WriteRegister(name, value, mode);
}
bool FileIoBackend::Commit()
diff --git a/utils/regtools/qeditor/backend.h b/utils/regtools/qeditor/backend.h
index 2dba4e2b08..c8adbc474f 100644
--- a/utils/regtools/qeditor/backend.h
+++ b/utils/regtools/qeditor/backend.h
@@ -102,9 +102,39 @@ public:
virtual bool Commit() { return false; }
};
+/** The RAM backend doesn't have any backend storage and stores all values in
+ * an associative map */
+class RamIoBackend : public IoBackend
+{
+ Q_OBJECT
+public:
+ RamIoBackend(const QString& soc_name = "");
+
+ virtual bool IsValid() { return m_soc != ""; }
+ virtual bool SupportAccess(AccessType type) { return type == ByName; }
+ virtual QString GetSocName() { return m_soc; }
+ virtual void SetSocName(const QString& soc_name) { m_soc = soc_name; }
+ virtual bool ReadRegister(const QString& name, soc_word_t& value);
+ virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value)
+ { Q_UNUSED(addr); Q_UNUSED(value); return false; }
+ virtual bool Reload() { return false; }
+ virtual bool IsReadOnly() { return false; }
+ virtual bool WriteRegister(const QString& name, soc_word_t value, WriteMode mode);
+ virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, WriteMode mode)
+ { Q_UNUSED(addr); Q_UNUSED(value); Q_UNUSED(mode); return false; }
+ virtual bool IsDirty() { return false; }
+ virtual bool Commit() { return false; }
+ /* clear all entries of the backend */
+ virtual void DeleteAll();
+
+protected:
+ QString m_soc;
+ QMap< QString, soc_word_t > m_map;
+};
+
/** NOTE the File backend makes a difference between writes and commits:
* a write will *never* touch the underlying file unless it was committed. */
-class FileIoBackend : public IoBackend
+class FileIoBackend : public RamIoBackend
{
Q_OBJECT
public:
@@ -112,26 +142,18 @@ public:
virtual bool IsValid() { return m_valid; }
virtual bool SupportAccess(AccessType type) { return type == ByName; }
- virtual QString GetSocName();
- virtual bool ReadRegister(const QString& name, soc_word_t& value);
- virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value)
- { Q_UNUSED(addr); Q_UNUSED(value); return false; }
virtual bool Reload();
virtual bool IsReadOnly() { return m_readonly; }
virtual bool WriteRegister(const QString& name, soc_word_t value, WriteMode mode);
- virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, WriteMode mode)
- { Q_UNUSED(addr); Q_UNUSED(value); Q_UNUSED(mode); return false; }
virtual bool IsDirty() { return m_dirty; }
virtual bool Commit();
QString GetFileName() { return m_filename; }
protected:
QString m_filename;
- QString m_soc;
bool m_readonly;
bool m_dirty;
bool m_valid;
- QMap< QString, soc_word_t > m_map;
};
#ifdef HAVE_HWSTUB