aboutsummaryrefslogtreecommitdiff
path: root/qtmips_machine/memory.h
diff options
context:
space:
mode:
authorKarel Kočí <cynerd@email.cz>2017-11-21 19:48:51 +0100
committerKarel Kočí <cynerd@email.cz>2017-11-21 19:48:51 +0100
commit499a88621d12ff0cdcba1f8c796b7031d6adc649 (patch)
treec050b5224c896b3e14d74866473aef9c2a5e9b69 /qtmips_machine/memory.h
parent68f2af6801756980ec53347c0acb7fcc292f7939 (diff)
downloadqtmips-499a88621d12ff0cdcba1f8c796b7031d6adc649.tar.gz
qtmips-499a88621d12ff0cdcba1f8c796b7031d6adc649.tar.bz2
qtmips-499a88621d12ff0cdcba1f8c796b7031d6adc649.zip
Add possibility to compare memory and registers state
For core testing we want to compare whole memory and registers. Registers are pretty simple but in case of memory it is some what more complicated and required its own tests to be sure that it works.
Diffstat (limited to 'qtmips_machine/memory.h')
-rw-r--r--qtmips_machine/memory.h33
1 files changed, 28 insertions, 5 deletions
diff --git a/qtmips_machine/memory.h b/qtmips_machine/memory.h
index 1df23ae..1b56d7c 100644
--- a/qtmips_machine/memory.h
+++ b/qtmips_machine/memory.h
@@ -14,7 +14,7 @@ public:
void write_hword(std::uint32_t offset, std::uint16_t value);
void write_word(std::uint32_t offset, std::uint32_t value);
- virtual std::uint8_t read_byte(std::uint32_t offset) = 0;
+ virtual std::uint8_t read_byte(std::uint32_t offset) const = 0;
std::uint16_t read_hword(std::uint32_t offset);
std::uint32_t read_word(std::uint32_t offset);
@@ -26,11 +26,20 @@ signals:
class MemorySection : public MemoryAccess {
public:
MemorySection(std::uint32_t length);
+ MemorySection(const MemorySection&);
~MemorySection();
+
void write_byte(std::uint32_t offset, std::uint8_t value);
- std::uint8_t read_byte(std::uint32_t offset);
+ std::uint8_t read_byte(std::uint32_t offset) const;
+
+ std::uint32_t length() const;
+ const std::uint8_t* data() const;
+
+ bool operator==(const MemorySection&) const;
+ bool operator!=(const MemorySection&) const;
+
private:
- std::uint32_t length;
+ std::uint32_t len;
std::uint8_t *dt;
};
@@ -48,13 +57,27 @@ class Memory : public MemoryAccess {
Q_OBJECT
public:
Memory();
+ Memory(const Memory&);
~Memory();
- MemorySection *get_section(std::uint32_t address, bool create); // returns section containing given address
+
+ MemorySection *get_section(std::uint32_t address, bool create) const; // returns section containing given address
void write_byte(std::uint32_t address, std::uint8_t value);
- std::uint8_t read_byte(std::uint32_t address);
+ std::uint8_t read_byte(std::uint32_t address) const;
+
+ bool operator==(const Memory&) const;
+ bool operator!=(const Memory&) const;
+
+ const union MemoryTree *get_memorytree_root() const;
+
private:
union MemoryTree *mt_root;
static union MemoryTree *allocate_section_tree();
+ static void free_section_tree(union MemoryTree*, size_t depth);
+ static bool compare_section_tree(const union MemoryTree*, const union MemoryTree*, size_t depth);
+ static bool is_zero_section_tree(const union MemoryTree*, size_t depth);
+ static union MemoryTree *copy_section_tree(const union MemoryTree*, size_t depth);
};
+Q_DECLARE_METATYPE(Memory)
+
#endif // MEMORY_H