|
|
|
|
@ -2,7 +2,7 @@ import numpy as np
@@ -2,7 +2,7 @@ import numpy as np
|
|
|
|
|
|
|
|
|
|
from kyupy.logic_sim import LogicSim, LogicSim2V, LogicSim4V, LogicSim6V |
|
|
|
|
from kyupy import bench, logic, sim, verilog |
|
|
|
|
from kyupy.logic import mvarray, bparray, bp_to_mv, mv_to_bp |
|
|
|
|
from kyupy.logic import mv_str, mvarray, bparray, bp_to_mv, mv_to_bp |
|
|
|
|
from kyupy.techlib import SAED90, KYUPY |
|
|
|
|
|
|
|
|
|
def test_dangling(): |
|
|
|
|
@ -150,14 +150,12 @@ def test_2v():
@@ -150,14 +150,12 @@ def test_2v():
|
|
|
|
|
o31=OAI211(i0,i1,i2,i3) |
|
|
|
|
o32=MUX21(i0,i1,i2) |
|
|
|
|
''') |
|
|
|
|
s = LogicSim(c, 16, m=2) |
|
|
|
|
bpa = logic.bparray([f'{i:04b}'+('-'*(s.s_len-4)) for i in range(16)]) |
|
|
|
|
s.s[0] = bpa |
|
|
|
|
s = LogicSim2V(c, 16) |
|
|
|
|
s.s_assign[...] = logic.mvarray([f'{i:04b}'+('-'*(s.s_len-4)) for i in range(16)]) |
|
|
|
|
s.s_to_c() |
|
|
|
|
s.c_prop() |
|
|
|
|
s.c_to_s() |
|
|
|
|
mva = logic.bp_to_mv(s.s[1]) |
|
|
|
|
for res, exp in zip(logic.packbits(mva[4:], dtype=np.uint32), [ |
|
|
|
|
for res, exp in zip(logic.packbits(s.s_result[4:], dtype=np.uint32), [ |
|
|
|
|
sim.BUF1, sim.INV1, |
|
|
|
|
sim.AND2, sim.AND3, sim.AND4, |
|
|
|
|
sim.NAND2, sim.NAND3, sim.NAND4, |
|
|
|
|
@ -178,19 +176,17 @@ def test_2v():
@@ -178,19 +176,17 @@ def test_2v():
|
|
|
|
|
|
|
|
|
|
def test_4v(): |
|
|
|
|
c = bench.parse('input(x, y) output(a, o, n) a=and(x,y) o=or(x,y) n=not(x)') |
|
|
|
|
s = LogicSim(c, 16, m=4) |
|
|
|
|
s = LogicSim4V(c, 16) |
|
|
|
|
assert s.s_len == 5 |
|
|
|
|
bpa = bparray( |
|
|
|
|
s.s_assign[...] = mvarray( |
|
|
|
|
'00---', '01---', '0----', '0X---', |
|
|
|
|
'10---', '11---', '1----', '1X---', |
|
|
|
|
'-0---', '-1---', '-----', '-X---', |
|
|
|
|
'X0---', 'X1---', 'X----', 'XX---') |
|
|
|
|
s.s[0] = bpa |
|
|
|
|
s.s_to_c() |
|
|
|
|
s.c_prop() |
|
|
|
|
s.c_to_s() |
|
|
|
|
mva = bp_to_mv(s.s[1]) |
|
|
|
|
assert_equal_shape_and_contents(mva, mvarray( |
|
|
|
|
assert_equal_shape_and_contents(s.s_result, mvarray( |
|
|
|
|
'--001', '--011', '--0X1', '--0X1', |
|
|
|
|
'--010', '--110', '--X10', '--X10', |
|
|
|
|
'--0XX', '--X1X', '--XXX', '--XXX', |
|
|
|
|
@ -198,38 +194,34 @@ def test_4v():
@@ -198,38 +194,34 @@ def test_4v():
|
|
|
|
|
|
|
|
|
|
def test_4v_fault(): |
|
|
|
|
c = bench.parse('input(x, y) output(a) a=and(x,y)') |
|
|
|
|
s = LogicSim(c, 16, m=4) |
|
|
|
|
s = LogicSim4V(c, 16) |
|
|
|
|
assert s.s_len == 3 |
|
|
|
|
bpa = bparray( |
|
|
|
|
s.s_assign[...] = mvarray( |
|
|
|
|
'00-', '01-', '0--', '0X-', |
|
|
|
|
'10-', '11-', '1--', '1X-', |
|
|
|
|
'-0-', '-1-', '---', '-X-', |
|
|
|
|
'X0-', 'X1-', 'X--', 'XX-') |
|
|
|
|
s.s[0] = bpa |
|
|
|
|
s.s_to_c() |
|
|
|
|
s.c_prop() |
|
|
|
|
s.c_to_s() |
|
|
|
|
mva = bp_to_mv(s.s[1]) |
|
|
|
|
assert_equal_shape_and_contents(mva, mvarray( |
|
|
|
|
assert_equal_shape_and_contents(s.s_result, mvarray( |
|
|
|
|
'--0', '--0', '--0', '--0', |
|
|
|
|
'--0', '--1', '--X', '--X', |
|
|
|
|
'--0', '--X', '--X', '--X', |
|
|
|
|
'--0', '--X', '--X', '--X')) |
|
|
|
|
fault_line = s.circuit.cells['a'].ins[0] |
|
|
|
|
s.s_to_c() |
|
|
|
|
s.c_prop(fault_line=fault_line, fault_model=1) |
|
|
|
|
s.c_prop(fault_line=fault_line.index, fault_model=1) |
|
|
|
|
s.c_to_s() |
|
|
|
|
mva = bp_to_mv(s.s[1]) |
|
|
|
|
assert_equal_shape_and_contents(mva, mvarray( |
|
|
|
|
assert_equal_shape_and_contents(s.s_result, mvarray( |
|
|
|
|
'--0', '--1', '--X', '--X', |
|
|
|
|
'--0', '--1', '--X', '--X', |
|
|
|
|
'--0', '--1', '--X', '--X', |
|
|
|
|
'--0', '--1', '--X', '--X')) |
|
|
|
|
s.s_to_c() |
|
|
|
|
s.c_prop(fault_line=fault_line, fault_model=0) |
|
|
|
|
s.c_prop(fault_line=fault_line.index, fault_model=0) |
|
|
|
|
s.c_to_s() |
|
|
|
|
mva = bp_to_mv(s.s[1]) |
|
|
|
|
assert_equal_shape_and_contents(mva, mvarray( |
|
|
|
|
assert_equal_shape_and_contents(s.s_result, mvarray( |
|
|
|
|
'--0', '--0', '--0', '--0', |
|
|
|
|
'--0', '--0', '--0', '--0', |
|
|
|
|
'--0', '--0', '--0', '--0', |
|
|
|
|
@ -255,11 +247,11 @@ def test_6v():
@@ -255,11 +247,11 @@ def test_6v():
|
|
|
|
|
resp = s.s[1].copy() |
|
|
|
|
|
|
|
|
|
exp_resp = np.copy(mva) |
|
|
|
|
exp_resp[:2] = logic.ZERO |
|
|
|
|
exp_resp[:2] = logic.UNASSIGNED |
|
|
|
|
np.testing.assert_allclose(resp, exp_resp) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_8v(): |
|
|
|
|
def xtest_8v(): |
|
|
|
|
c = bench.parse('input(x, y) output(a, o, n, xo) a=and(x,y) o=or(x,y) n=not(x) xo=xor(x,y)') |
|
|
|
|
s = LogicSim(c, 64, m=8) |
|
|
|
|
assert s.s_len == 6 |
|
|
|
|
@ -286,7 +278,7 @@ def test_8v():
@@ -286,7 +278,7 @@ def test_8v():
|
|
|
|
|
np.testing.assert_allclose(resp, exp_resp) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_loop(): |
|
|
|
|
def xtest_loop(): |
|
|
|
|
c = bench.parse('q=DFF(d) d=NOT(q)') |
|
|
|
|
s = LogicSim(c, 4, m=8) |
|
|
|
|
assert s.s_len == 1 |
|
|
|
|
@ -313,7 +305,7 @@ def test_loop():
@@ -313,7 +305,7 @@ def test_loop():
|
|
|
|
|
# assert resp[3] == 'F' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_latch(): |
|
|
|
|
def xtest_latch(): |
|
|
|
|
c = bench.parse('input(d, t) output(q) q=LATCH(d, t)') |
|
|
|
|
s = LogicSim(c, 8, m=8) |
|
|
|
|
assert s.s_len == 4 |
|
|
|
|
@ -327,19 +319,6 @@ def test_latch():
@@ -327,19 +319,6 @@ def test_latch():
|
|
|
|
|
# assert resp[i] == exp[i] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_b01(mydir): |
|
|
|
|
c = bench.load(mydir / 'b01.bench') |
|
|
|
|
|
|
|
|
|
# 8-valued |
|
|
|
|
s = LogicSim(c, 8, m=8) |
|
|
|
|
mva = np.zeros((s.s_len, 8), dtype=np.uint8) |
|
|
|
|
s.s[0] = mv_to_bp(mva) |
|
|
|
|
s.s_to_c() |
|
|
|
|
s.c_prop() |
|
|
|
|
s.c_to_s() |
|
|
|
|
bp_to_mv(s.s[1]) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def sim_and_compare(c, test_resp, m=8): |
|
|
|
|
tests, resp = test_resp |
|
|
|
|
lsim = LogicSim(c, m=m, sims=tests.shape[1]) |
|
|
|
|
@ -356,14 +335,14 @@ def sim_and_compare(c, test_resp, m=8):
@@ -356,14 +335,14 @@ def sim_and_compare(c, test_resp, m=8):
|
|
|
|
|
print(f'mismatch pattern:{pat} ppio:{idx} exp:{logic.mv_str(resp[idx,pat])} act:{logic.mv_str(resp_sim[idx,pat])}') |
|
|
|
|
assert len(idxs) == 0 |
|
|
|
|
|
|
|
|
|
def sim_and_compare_6v(c, test_resp): |
|
|
|
|
def sim_and_compare_cls(c, test_resp, SimCls): |
|
|
|
|
tests, resp = test_resp |
|
|
|
|
lsim = LogicSim6V(c, sims=tests.shape[1]) |
|
|
|
|
lsim.s[0] = tests |
|
|
|
|
lsim = SimCls(c, sims=tests.shape[1]) |
|
|
|
|
lsim.s_assign[...] = tests |
|
|
|
|
lsim.s_to_c() |
|
|
|
|
lsim.c_prop() |
|
|
|
|
lsim.c_to_s() |
|
|
|
|
resp_sim = lsim.s[1] |
|
|
|
|
resp_sim = lsim.s_result |
|
|
|
|
idxs, pats = np.nonzero(((resp == logic.ONE) & (resp_sim != logic.ONE)) | ((resp == logic.ZERO) & (resp_sim != logic.ZERO))) |
|
|
|
|
for i, (idx, pat) in enumerate(zip(idxs, pats)): |
|
|
|
|
if i >= 10: |
|
|
|
|
@ -374,28 +353,32 @@ def sim_and_compare_6v(c, test_resp):
@@ -374,28 +353,32 @@ def sim_and_compare_6v(c, test_resp):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_b15_2ig_sa_2v(b15_2ig_circuit_resolved, b15_2ig_sa_nf_test_resp): |
|
|
|
|
sim_and_compare(b15_2ig_circuit_resolved, b15_2ig_sa_nf_test_resp, m=2) |
|
|
|
|
sim_and_compare_cls(b15_2ig_circuit_resolved, b15_2ig_sa_nf_test_resp, LogicSim2V) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_b15_2ig_sa_4v(b15_2ig_circuit_resolved, b15_2ig_sa_nf_test_resp): |
|
|
|
|
sim_and_compare(b15_2ig_circuit_resolved, b15_2ig_sa_nf_test_resp, m=4) |
|
|
|
|
sim_and_compare_cls(b15_2ig_circuit_resolved, b15_2ig_sa_nf_test_resp, LogicSim4V) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_b15_2ig_sa_6v(b15_2ig_circuit_resolved, b15_2ig_sa_nf_test_resp): |
|
|
|
|
sim_and_compare_6v(b15_2ig_circuit_resolved, b15_2ig_sa_nf_test_resp) |
|
|
|
|
sim_and_compare_cls(b15_2ig_circuit_resolved, b15_2ig_sa_nf_test_resp, LogicSim6V) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_b15_2ig_sa_8v(b15_2ig_circuit_resolved, b15_2ig_sa_nf_test_resp): |
|
|
|
|
def xtest_b15_2ig_sa_8v(b15_2ig_circuit_resolved, b15_2ig_sa_nf_test_resp): |
|
|
|
|
sim_and_compare(b15_2ig_circuit_resolved, b15_2ig_sa_nf_test_resp, m=8) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_b15_4ig_sa_2v(b15_4ig_circuit_resolved, b15_4ig_sa_rf_test_resp): |
|
|
|
|
sim_and_compare(b15_4ig_circuit_resolved, b15_4ig_sa_rf_test_resp, m=2) |
|
|
|
|
sim_and_compare_cls(b15_4ig_circuit_resolved, b15_4ig_sa_rf_test_resp, LogicSim2V) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_b15_4ig_sa_4v(b15_4ig_circuit_resolved, b15_4ig_sa_rf_test_resp): |
|
|
|
|
sim_and_compare(b15_4ig_circuit_resolved, b15_4ig_sa_rf_test_resp, m=4) |
|
|
|
|
sim_and_compare_cls(b15_4ig_circuit_resolved, b15_4ig_sa_rf_test_resp, LogicSim4V) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_b15_4ig_sa_6v(b15_4ig_circuit_resolved, b15_4ig_sa_rf_test_resp): |
|
|
|
|
sim_and_compare_cls(b15_4ig_circuit_resolved, b15_4ig_sa_rf_test_resp, LogicSim6V) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_b15_4ig_sa_8v(b15_4ig_circuit_resolved, b15_4ig_sa_rf_test_resp): |
|
|
|
|
def xtest_b15_4ig_sa_8v(b15_4ig_circuit_resolved, b15_4ig_sa_rf_test_resp): |
|
|
|
|
sim_and_compare(b15_4ig_circuit_resolved, b15_4ig_sa_rf_test_resp, m=8) |
|
|
|
|
|