From e19463d24909cfcde54663030e7e20026d4845d3 Mon Sep 17 00:00:00 2001 From: stefan Date: Fri, 3 Jul 2026 10:32:06 +0900 Subject: [PATCH] fix LogicSim for 2v, deterministic sim schedule, towards sub-sims for partitions --- src/kyupy/logic_sim.py | 3 ++- src/kyupy/sim.py | 11 ++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/kyupy/logic_sim.py b/src/kyupy/logic_sim.py index 0e6ec36..3fa3714 100644 --- a/src/kyupy/logic_sim.py +++ b/src/kyupy/logic_sim.py @@ -51,6 +51,7 @@ class LogicSim(sim.SimOps): nbytes = cdiv(sims, 8) self.c = np.zeros((self.c_len, self.mdim, nbytes), dtype=np.uint8) + self.c_dirty = np.full(self.c_len, 1, dtype=np.uint8) self.s = np.zeros((2, self.s_len, 3, nbytes), dtype=np.uint8) """Logic values of the sequential elements (flip-flops) and ports. @@ -97,7 +98,7 @@ class LogicSim(sim.SimOps): t1 = self.c_locs[self.tmp2_idx] if self.m == 2: if inject_cb is None: - c_prop_2v_cpu(self.ops, self.c_locs, self.c, int(fault_line), fault_mask, int(fault_model)) + c_prop_2v_cpu(self.ops, self.c_locs, self.c, self.c_dirty, int(fault_line), fault_mask, int(fault_model)) else: for op, o0l, i0l, i1l, i2l, i3l in self.ops[:,:6]: o0, i0, i1, i2, i3 = [self.c_locs[x] for x in (o0l, i0l, i1l, i2l, i3l)] diff --git a/src/kyupy/sim.py b/src/kyupy/sim.py index bc2926f..fd95fa1 100644 --- a/src/kyupy/sim.py +++ b/src/kyupy/sim.py @@ -192,7 +192,7 @@ class SimOps: root_nodes = set([n for n in circuit.s_nodes(KYUPY) if len(n.ins) > 0] + [n for n in circuit.nodes if len(n.outs) == 0]) # start from POs, PPOs, and any dangling nodes readers = np.array([1 if l.reader in root_nodes else len(l.reader.outs) for l in circuit.lines], dtype=np.int32) # for ref-counting forks - level_lines = [n.ins[0] for n in root_nodes if len(n.ins) > 0 ] + level_lines = [n.ins[0] for n in sorted(root_nodes, key=lambda n: n.index) if len(n.ins) > 0 ] # FIXME: Should probably instanciate buffers for PPOs and attach DFF clocks while len(level_lines) > 0: # traverse the circuit level-wise back towards (P)PIs @@ -346,3 +346,12 @@ class SimOps: self.pippi_c_locs = np.concatenate([self.pi_c_locs, self.ppi_c_locs]) self.poppo_c_locs = np.concatenate([self.po_c_locs, self.ppo_c_locs]) + + def cone_ops(self, origin_lines: set[int]): + active_lines = {l for l in origin_lines} + ops = [] + for kind, out0, in0, in1, in2, in3, *params in self.ops: + if in0 in active_lines or in1 in active_lines or in2 in active_lines or in3 in active_lines or out0 in origin_lines: + ops.append((kind, out0, in0, in1, in2, in3, *params)) + active_lines.add(out0) + return np.asarray(ops, dtype=np.int32)