Browse Source

add docs and fix suprious detects in incremental

main
stefan 2 weeks ago
parent
commit
3d25b50a13
  1. 5
      README.md
  2. 9
      src/fsim/incremental.py
  3. 4
      src/fsim/simple.py

5
README.md

@ -40,13 +40,14 @@ Choose `uv-env` as kernel in Jupyter Lab.
Numbers are given in `gfs/s` = `gates * faults * patterns / second`. Numbers are given in `gfs/s` = `gates * faults * patterns / second`.
`SAFSimSimple` on 1024 patterns (baseline): Single-core `SAFSimSimple` on 1024 patterns (baseline):
| OS, CPU, RAM | `tests/c6288.bench` | `polito-itc99-b15-sky130` | | OS, CPU, RAM | `tests/c6288.bench` | `polito-itc99-b15-sky130` |
|--------------|---------------------|---------------------------| |--------------|---------------------|---------------------------|
| MacOS, M3 Max, 32GiB (Stefan) | 1.52G | 1.97G | | MacOS, M3 Max, 32GiB (Stefan) | 1.52G | 1.97G |
| WSL, i7-14650HX, 15GiB (Zhang) | 1.68G | 2.03G | | WSL, i7-14650HX, 15GiB (Zhang) | 1.68G | 2.03G |
| Ubuntu, Xeon E5-1650, 251GiB (Nosaka) | 0.94G | 1.18G |
| WSL2, ?, ? (Kawachi) | 0.82G | ? |
## Notes ## Notes

9
src/fsim/incremental.py

@ -8,6 +8,10 @@ from kyupy.circuit import Circuit
from kyupy.logic_sim import LogicSim2V from kyupy.logic_sim import LogicSim2V
class SAFSimIncremental: class SAFSimIncremental:
"""A stuck-at fault simulator that uses incremental simulation.
After priming the circuit with a batch of patterns, faults are injected and only the gates in its fan-out cone are re-simulated.
"""
def __init__(self, circuit_resolved: Circuit, batch_size: int): def __init__(self, circuit_resolved: Circuit, batch_size: int):
self.sim = LogicSim2V(circuit_resolved, sims=batch_size) self.sim = LogicSim2V(circuit_resolved, sims=batch_size)
@ -21,6 +25,7 @@ class SAFSimIncremental:
fclass_DS = set() fclass_DS = set()
nbatches = cdiv(patterns.shape[1], self.sim.sims) nbatches = cdiv(patterns.shape[1], self.sim.sims)
nfaults = len(faults) nfaults = len(faults)
obs_mask = np.packbits(np.full(patterns.shape[1], 1, dtype=np.uint8), bitorder='little')[np.newaxis, np.newaxis]
with self.timers['sim'], log.progress() as p: with self.timers['sim'], log.progress() as p:
for bidx, (bo, bs) in enumerate(batchrange(patterns.shape[1], self.sim.sims)): for bidx, (bo, bs) in enumerate(batchrange(patterns.shape[1], self.sim.sims)):
@ -30,7 +35,7 @@ class SAFSimIncremental:
with self.timers['sim_full_prop']: with self.timers['sim_full_prop']:
self.sim.c_prop() self.sim.c_prop()
c_golden[...] = self.sim.c c_golden[...] = self.sim.c
c_golden_poppo = c_golden[self.sim.poppo_c_locs] c_golden_poppo = c_golden[self.sim.poppo_c_locs] & obs_mask
for fidx, fault in enumerate(faults): for fidx, fault in enumerate(faults):
fault_site = fault//2 fault_site = fault//2
fault_polarity = fault&1 fault_polarity = fault&1
@ -38,7 +43,7 @@ class SAFSimIncremental:
with self.timers['sim_incr_prop']: with self.timers['sim_incr_prop']:
self.sim.c_prop(fault_line=fault_site, fault_model=fault_polarity) self.sim.c_prop(fault_line=fault_site, fault_model=fault_polarity)
with self.timers['sim_incr_eval']: with self.timers['sim_incr_eval']:
if not np.all(c_golden_poppo == self.sim.c[self.sim.poppo_c_locs]): if not np.all(c_golden_poppo == (self.sim.c[self.sim.poppo_c_locs] & obs_mask)):
fclass_DS.add(fault) fclass_DS.add(fault)
with self.timers['sim_incr_reset']: with self.timers['sim_incr_reset']:
self.sim.c[...] = c_golden # clear fault self.sim.c[...] = c_golden # clear fault

4
src/fsim/simple.py

@ -8,6 +8,10 @@ from kyupy.circuit import Circuit
from kyupy.logic_sim import LogicSim2V from kyupy.logic_sim import LogicSim2V
class SAFSimSimple: class SAFSimSimple:
"""A simple stuck-at fault simulator.
Simplest brute-force simulation of all given stuck-at faults.
"""
def __init__(self, circuit_resolved: Circuit, batch_size: int): def __init__(self, circuit_resolved: Circuit, batch_size: int):
self.sim = LogicSim2V(circuit_resolved, sims=batch_size) self.sim = LogicSim2V(circuit_resolved, sims=batch_size)

Loading…
Cancel
Save