From 9cebbcce8fb52b6d9dfc23f1d41f14584465645d Mon Sep 17 00:00:00 2001 From: Stefan Holst Date: Tue, 11 Nov 2025 18:13:08 +0900 Subject: [PATCH] support for storing responses separately --- src/kyupy/logic_sim.py | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/kyupy/logic_sim.py b/src/kyupy/logic_sim.py index 3957d14..42798d2 100644 --- a/src/kyupy/logic_sim.py +++ b/src/kyupy/logic_sim.py @@ -388,7 +388,7 @@ class LogicSim2V(sim.SimOps): """ return np.full((self.s_len, self.sims), logic.ZERO, dtype=np.uint8) - def simulate(self, patterns, cycles:int = 1, fault_line=-1, fault_model=2, fault_mask=None): + def simulate(self, patterns, responses = None, cycles:int = 1, fault_line=-1, fault_model=2, fault_mask=None): assert cycles >= 1 for bo, bs in batchrange(patterns.shape[-1], self.sims): self.s_assign[self.pippi_s_locs, :bs] = patterns[self.pippi_s_locs, bo:bo+bs] @@ -397,8 +397,11 @@ class LogicSim2V(sim.SimOps): self.c_prop(fault_line=fault_line, fault_model=fault_model, fault_mask=fault_mask) if cycle < (cycles-1): self.c_ppo_to_ppi() self.c_to_s() - patterns[self.poppo_s_locs, bo:bo+bs] = self.s_result[self.poppo_s_locs, :bs] - return patterns + if responses is None: + patterns[self.poppo_s_locs, bo:bo+bs] = self.s_result[self.poppo_s_locs, :bs] + else: + responses[self.poppo_s_locs, bo:bo+bs] = self.s_result[self.poppo_s_locs, :bs] + return patterns if responses is None else responses @numba.njit @@ -521,7 +524,7 @@ class LogicSim4V(sim.SimOps): """ return np.full((self.s_len, self.sims), logic.ZERO, dtype=np.uint8) - def simulate(self, patterns, cycles:int = 1, fault_line=-1, fault_model=2, fault_mask=None): + def simulate(self, patterns, responses = None, cycles:int = 1, fault_line=-1, fault_model=2, fault_mask=None): assert cycles >= 1 for bo, bs in batchrange(patterns.shape[-1], self.sims): self.s_assign[self.pippi_s_locs, :bs] = patterns[self.pippi_s_locs, bo:bo+bs] @@ -530,8 +533,11 @@ class LogicSim4V(sim.SimOps): self.c_prop(fault_line=fault_line, fault_model=fault_model, fault_mask=fault_mask) if cycle < (cycles-1): self.c_ppo_to_ppi() self.c_to_s() - patterns[self.poppo_s_locs, bo:bo+bs] = self.s_result[self.poppo_s_locs, :bs] - return patterns + if responses is None: + patterns[self.poppo_s_locs, bo:bo+bs] = self.s_result[self.poppo_s_locs, :bs] + else: + responses[self.poppo_s_locs, bo:bo+bs] = self.s_result[self.poppo_s_locs, :bs] + return patterns if responses is None else responses @numba.njit @@ -780,7 +786,7 @@ class LogicSim6V(sim.SimOps): """ return np.full((self.s_len, self.sims), logic.ZERO, dtype=np.uint8) - def simulate(self, patterns, cycles:int = 1, fault_line=-1, fault_model=2, fault_mask=None): + def simulate(self, patterns, responses = None, cycles:int = 1, fault_line=-1, fault_model=2, fault_mask=None): assert cycles >= 1 for bo, bs in batchrange(patterns.shape[-1], self.sims): self.s_assign[self.pippi_s_locs, :bs] = patterns[self.pippi_s_locs, bo:bo+bs] @@ -789,7 +795,10 @@ class LogicSim6V(sim.SimOps): self.c_prop(fault_line=fault_line, fault_model=fault_model, fault_mask=fault_mask) if cycle < (cycles-1): self.c_ppo_to_ppi() self.c_to_s() - patterns[self.poppo_s_locs, bo:bo+bs] = self.s_result[self.poppo_s_locs, :bs] + if responses is None: + patterns[self.poppo_s_locs, bo:bo+bs] = self.s_result[self.poppo_s_locs, :bs] + else: + responses[self.poppo_s_locs, bo:bo+bs] = self.s_result[self.poppo_s_locs, :bs] return patterns