class Snapshot: def __init__(self): self.taken = Signal(reset=0) self.pre = Registers() self.post = Registers() self.addresses_written = Signal(3, reset=0) self.write_addr = Array([Signal(16) for _ in range(8)]) self.write_data = Array([Signal(8) for _ in range(8)]) self.addresses_read = Signal(3, reset=0) self.read_addr = Array([Signal(16) for _ in range(8)]) self.read_data = Array([Signal(8) for _ in range(8)]) def read(self, m: Module, addr: Value, data: Value): with m.If(self.addresses_read != 7): m.d.sync += self.addresses_read.eq(self.addresses_read + 1) m.d.sync += self.read_addr[self.addresses_read].eq(addr) m.d.sync += self.read_data[self.addresses_read].eq(data) def write(self, m: Module, addr: Value, data: Value): with m.If(self.addresses_written != 7): m.d.sync += self.addresses_written.eq(self.addresses_written + 1) m.d.sync += self.write_addr[self.addresses_written].eq(addr) m.d.sync += self.write_data[self.addresses_written].eq(data) def pre_snapshot(self, m: Module, addr: Value, data: Value, reg: Registers): """take a synchronous snapshot including addr and data read from ram""" m.d.sync += [ self.taken.eq(1), self.pre.eq(reg), self.read_addr[0].eq(addr), self.read_data[0].eq(data), self.addresses_read.eq(1), self.addresses_written.eq(0), ] def no_snapshot(self, m: Module): m.d.sync += self.taken.eq(0) def post_snapshot(self, m: Module, reg: Registers): m.d.comb += self.post.eq(reg)