Skip to content

Commit fff8f0b

Browse files
wanda-phiwhitequark
authored andcommitted
sim: fix memory writes with signed shapes.
1 parent be47958 commit fff8f0b

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

amaranth/sim/pysim.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,10 +392,11 @@ def __init__(self, state, addr):
392392

393393

394394
class _PyMemoryState(BaseMemoryState):
395-
__slots__ = ("memory", "data", "write_queue", "wakers", "pending")
395+
__slots__ = ("memory", "shape", "data", "write_queue", "wakers", "pending")
396396

397397
def __init__(self, memory, pending):
398398
self.memory = memory
399+
self.shape = Shape.cast(memory.shape)
399400
self.pending = pending
400401
self.wakers = list()
401402
self.reset()
@@ -419,6 +420,11 @@ def write(self, addr, value, mask=None):
419420
self.write_queue[addr] = self.data[addr]
420421
if mask is not None:
421422
value = (value & mask) | (self.write_queue[addr] & ~mask)
423+
if self.shape.signed:
424+
if value & (1 << (self.shape.width - 1)):
425+
value |= -1 << (self.shape.width)
426+
else:
427+
value &= (1 << (self.shape.width)) - 1
422428
self.write_queue[addr] = value
423429
self.pending.add(self)
424430

tests/test_sim.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1418,15 +1418,20 @@ class MyEnum(enum.Enum, shape=2):
14181418
mem1 = MemoryData(shape=8, depth=4, init=[1, 2, 3])
14191419
mem2 = MemoryData(shape=MyEnum, depth=4, init=[MyEnum.A, MyEnum.B, MyEnum.C])
14201420
mem3 = MemoryData(shape=data.StructLayout({"a": signed(3), "b": 2}), depth=4, init=[{"a": 2, "b": 1}])
1421+
mem4 = MemoryData(shape=signed(8), depth=4, init=[1, -2, 3])
14211422

14221423
async def testbench(ctx):
14231424
await ctx.delay(1e-6)
14241425
ctx.set(mem1[0], 4)
14251426
ctx.set(mem2[3], MyEnum.C)
14261427
ctx.set(mem3[2], {"a": -1, "b": 2})
1428+
ctx.set(mem4[1][4:], 0)
1429+
ctx.set(mem4[3][7], 1)
14271430
await ctx.delay(1e-6)
1431+
self.assertEqual(ctx.get(mem4[1]), 0xe)
1432+
self.assertEqual(ctx.get(mem4[3]), -128)
14281433

1429-
with self.assertSimulation(Module(), traces=[mem1, mem2, mem3]) as sim:
1434+
with self.assertSimulation(Module(), traces=[mem1, mem2, mem3, mem4]) as sim:
14301435
sim.add_testbench(testbench)
14311436

14321437
def test_multiple_modules(self):

0 commit comments

Comments
 (0)