|
|
|
|
@ -8,6 +8,10 @@ from kyupy.circuit import Circuit
@@ -8,6 +8,10 @@ from kyupy.circuit import Circuit
|
|
|
|
|
from kyupy.logic_sim import LogicSim2V |
|
|
|
|
|
|
|
|
|
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): |
|
|
|
|
self.sim = LogicSim2V(circuit_resolved, sims=batch_size) |
|
|
|
|
@ -21,6 +25,7 @@ class SAFSimIncremental:
@@ -21,6 +25,7 @@ class SAFSimIncremental:
|
|
|
|
|
fclass_DS = set() |
|
|
|
|
nbatches = cdiv(patterns.shape[1], self.sim.sims) |
|
|
|
|
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: |
|
|
|
|
for bidx, (bo, bs) in enumerate(batchrange(patterns.shape[1], self.sim.sims)): |
|
|
|
|
@ -30,7 +35,7 @@ class SAFSimIncremental:
@@ -30,7 +35,7 @@ class SAFSimIncremental:
|
|
|
|
|
with self.timers['sim_full_prop']: |
|
|
|
|
self.sim.c_prop() |
|
|
|
|
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): |
|
|
|
|
fault_site = fault//2 |
|
|
|
|
fault_polarity = fault&1 |
|
|
|
|
@ -38,7 +43,7 @@ class SAFSimIncremental:
@@ -38,7 +43,7 @@ class SAFSimIncremental:
|
|
|
|
|
with self.timers['sim_incr_prop']: |
|
|
|
|
self.sim.c_prop(fault_line=fault_site, fault_model=fault_polarity) |
|
|
|
|
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) |
|
|
|
|
with self.timers['sim_incr_reset']: |
|
|
|
|
self.sim.c[...] = c_golden # clear fault |
|
|
|
|
|