Browse Source

support injection into specific sims

devel
Stefan Holst 8 months ago
parent
commit
53629c5c28
  1. 16
      src/kyupy/logic_sim.py

16
src/kyupy/logic_sim.py

@ -52,7 +52,7 @@ class LogicSim(sim.SimOps): @@ -52,7 +52,7 @@ class LogicSim(sim.SimOps):
"""
self.c[self.pippi_c_locs] = self.s[0, self.pippi_s_locs, :self.mdim]
def c_prop(self, sims=None, inject_cb=None, flip_line=-1):
def c_prop(self, sims=None, inject_cb=None, flip_line=-1, flip_mask=None):
"""Propagate the input values through the combinational circuit towards the outputs.
Performs all logic operations in topological order.
@ -68,7 +68,14 @@ class LogicSim(sim.SimOps): @@ -68,7 +68,14 @@ class LogicSim(sim.SimOps):
t1 = self.c_locs[self.tmp2_idx]
if self.m == 2:
if inject_cb is None:
_prop_cpu(self.ops, self.c_locs, self.c, int(flip_line))
if flip_mask is None:
flip_mask = np.full(self.c.shape[-1], 255, dtype=np.uint8)
else:
if len(flip_mask) < self.c.shape[-1]:
flip_mask2 = np.full(self.c.shape[-1], 0, dtype=np.uint8)
flip_mask2[:len(flip_mask)] = flip_mask
flip_mask = flip_mask2
_prop_cpu(self.ops, self.c_locs, self.c, int(flip_line), flip_mask)
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)]
@ -298,7 +305,7 @@ class LogicSim(sim.SimOps): @@ -298,7 +305,7 @@ class LogicSim(sim.SimOps):
@numba.njit
def _prop_cpu(ops, c_locs, c, flip_line):
def _prop_cpu(ops, c_locs, c, flip_line, flip_mask):
for op, o0l, i0l, i1l, i2l, i3l in ops[:,:6]:
o0, i0, i1, i2, i3 = [c_locs[x] for x in (o0l, i0l, i1l, i2l, i3l)]
if op == sim.BUF1: c[o0]=c[i0]
@ -336,7 +343,8 @@ def _prop_cpu(ops, c_locs, c, flip_line): @@ -336,7 +343,8 @@ def _prop_cpu(ops, c_locs, c, flip_line):
elif op == sim.MUX21: c[o0] = (c[i0] & ~c[i2]) | (c[i1] & c[i2])
else: print(f'unknown op {op}')
if flip_line >= 0 and o0l == flip_line:
c[o0] = ~c[o0]
#n = len(flip_mask)
c[o0] = c[o0] ^ flip_mask
class LogicSim6V(sim.SimOps):

Loading…
Cancel
Save