summaryrefslogtreecommitdiff
path: root/tb/gfx_shader_bind/testbench/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'tb/gfx_shader_bind/testbench/models.py')
-rw-r--r--tb/gfx_shader_bind/testbench/models.py18
1 files changed, 15 insertions, 3 deletions
diff --git a/tb/gfx_shader_bind/testbench/models.py b/tb/gfx_shader_bind/testbench/models.py
index 928f07b..e65b053 100644
--- a/tb/gfx_shader_bind/testbench/models.py
+++ b/tb/gfx_shader_bind/testbench/models.py
@@ -31,7 +31,7 @@ class Memory:
f'{word_size} is not a power of two'
self._data = {}
- self._dirty = set()
+ self._dirty = {}
self._observed = set()
self._start = start
@@ -83,9 +83,12 @@ class Memory:
)
def _write_word(word_num, data):
if self._expect_in_range(word_num):
- self._data[word_num] = data
if word_num in self._observed:
- self._dirty.add(word_num)
+ dirty = self._dirty.setdefault(word_num, set())
+ dirty.add(self._data.get(word_num, self._all_ones))
+ dirty.add(data)
+
+ self._data[word_num] = data
self._read_word = _read_word
self._write_word = _write_word
@@ -93,6 +96,15 @@ class Memory:
def read(self, addr):
return self._data[addr >> 2]
+ def read_cached(self, addr):
+ addr = addr >> 2
+
+ data = self._data[addr]
+ if dirty := self._dirty.get(addr):
+ data = tuple(dirty.union({data}))
+
+ return data
+
def randomize_line(self, addr):
first_word = (addr >> 2) & ~15
for word_num in range(first_word, first_word + 16):