Browse Source

add test fixtures, update kyupy

main
stefan 2 weeks ago
parent
commit
13d847b833
  1. 2
      kyupy
  2. 21
      tests/c17.bench
  3. 34
      tests/conftest.py
  4. 31
      tests/s27.bench
  5. 41
      tests/test_fault_set.py
  6. 37
      tests/test_line_roles.py

2
kyupy

@ -1 +1 @@
Subproject commit 53309f9e597c91bf630886f7e125995bf48c6f53 Subproject commit f5af7ec3d9554c35f72ed42be6719f49438201c2

21
tests/c17.bench

@ -0,0 +1,21 @@
# c17
# 5 inputs
# 2 outputs
# 0 inverter
# 6 gates ( 6 NANDs )
INPUT(1)
INPUT(2)
INPUT(3)
INPUT(6)
INPUT(7)
OUTPUT(22)
OUTPUT(23)
10 = NAND(1, 3)
11 = NAND(3, 6)
16 = NAND(2, 11)
19 = NAND(11, 7)
22 = NAND(10, 16)
23 = NAND(16, 19)

34
tests/conftest.py

@ -0,0 +1,34 @@
import pytest
@pytest.fixture(scope='session')
def mydir():
import os
from pathlib import Path
return Path(os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__))))
@pytest.fixture(scope='session')
def s27_bench(mydir):
from kyupy import bench
# bench parser does not add any clock or set/reset logic.
return bench.load(mydir / 's27.bench')
@pytest.fixture(scope='session')
def c17_bench(mydir):
from kyupy import bench
# bench parser does not add any clock or set/reset logic.
return bench.load(mydir / 'c17.bench')
def _resolved(c):
from kyupy.techlib import KYUPY
cr = c.copy()
cr.resolve_tlib_cells(KYUPY)
return cr
@pytest.fixture(scope='session')
def c17_resolved(c17_bench):
# tlib-resolved copy, ready for LogicSim2V / the SAF simulators.
return _resolved(c17_bench)
@pytest.fixture(scope='session')
def s27_resolved(s27_bench):
return _resolved(s27_bench)

31
tests/s27.bench

@ -0,0 +1,31 @@
# 4 inputs
# 1 outputs
# 3 D-type flipflops
# 2 inverters
# 8 gates (1 ANDs + 1 NANDs + 2 ORs + 4 NORs)
INPUT(G0)
INPUT(G1)
INPUT(G2)
INPUT(G3)
OUTPUT(G17)
G5 = DFF(G10)
G6 = DFF(G11)
G7 = DFF(G13)
G14 = NOT(G0)
G17 = NOT(G11)
G8 = AND(G14, G6)
G15 = OR(G12, G8)
G16 = OR(G3, G8)
G9 = NAND(G16, G15)
G10 = NOR(G14, G11)
G11 = NOR(G5, G9)
G12 = NOR(G1, G7)
G13 = NOR(G2, G12)

41
tests/test_fault_set.py

@ -72,48 +72,15 @@ def test_aoi_oai_complex():
# The two-term variants do not collapse onto any single input. # The two-term variants do not collapse onto any single input.
assert _class_sizes('input(i0,i1,i2,i3) output(o) o=AO22(i0,i1,i2,i3)') == (1, 1) assert _class_sizes('input(i0,i1,i2,i3) output(o) o=AO22(i0,i1,i2,i3)') == (1, 1)
def test_s27(): def test_s27(s27_bench):
# bench parser does not add any clock or set/reset logic. fs = FaultSet(s27_bench, KYUPY, s27_bench)
c = bench.parse('''
# 1 outputs
# 3 D-type flipflops
# 2 inverters
# 8 gates (1 ANDs + 1 NANDs + 2 ORs + 4 NORs)
INPUT(G0)
INPUT(G1)
INPUT(G2)
INPUT(G3)
OUTPUT(G17)
G5 = DFF(G10)
G6 = DFF(G11)
G7 = DFF(G13)
G14 = NOT(G0)
G17 = NOT(G11)
G8 = AND(G14, G6)
G15 = OR(G12, G8)
G16 = OR(G3, G8)
G9 = NAND(G16, G15)
G10 = NOR(G14, G11)
G11 = NOR(G5, G9)
G12 = NOR(G1, G7)
G13 = NOR(G2, G12)
''')
fs = FaultSet(c, KYUPY, c)
assert len(fs.saf_set) == 52 assert len(fs.saf_set) == 52
assert len(fs.saf_equiv_classes) == 32 assert len(fs.saf_equiv_classes) == 32
g11_line = c.cells['G11'].outs[0] g11_line = s27_bench.cells['G11'].outs[0]
g11_sa_0 = g11_line.index*2 g11_sa_0 = g11_line.index*2
assert g11_sa_0 in fs.saf_equiv_classes assert g11_sa_0 in fs.saf_equiv_classes
assert len(fs.saf_equiv_classes[g11_sa_0]) == 5 # collapse via G9 assert len(fs.saf_equiv_classes[g11_sa_0]) == 5 # collapse via G9
g15_line = c.cells['G15'].outs[0] g15_line = s27_bench.cells['G15'].outs[0]
g15_sa_0 = g15_line.index*2 g15_sa_0 = g15_line.index*2
assert g15_sa_0 in fs.saf_equiv_classes[g11_sa_0] assert g15_sa_0 in fs.saf_equiv_classes[g11_sa_0]

37
tests/test_line_roles.py

@ -20,41 +20,8 @@ def test_fanout():
assert len(lr.line2roles) == 6 assert len(lr.line2roles) == 6
assert len(lr.roles2lines[LineRoles.LOGIC_OUT]) == 6 assert len(lr.roles2lines[LineRoles.LOGIC_OUT]) == 6
def test_s27(): def test_s27(s27_bench):
# bench parser does not add any clock or set/reset logic. lr = LineRoles(s27_bench, KYUPY)
c = bench.parse('''
# 1 outputs
# 3 D-type flipflops
# 2 inverters
# 8 gates (1 ANDs + 1 NANDs + 2 ORs + 4 NORs)
INPUT(G0)
INPUT(G1)
INPUT(G2)
INPUT(G3)
OUTPUT(G17)
G5 = DFF(G10)
G6 = DFF(G11)
G7 = DFF(G13)
G14 = NOT(G0)
G17 = NOT(G11)
G8 = AND(G14, G6)
G15 = OR(G12, G8)
G16 = OR(G3, G8)
G9 = NAND(G16, G15)
G10 = NOR(G14, G11)
G11 = NOR(G5, G9)
G12 = NOR(G1, G7)
G13 = NOR(G2, G12)
''')
lr = LineRoles(c, KYUPY)
assert len(lr.line2roles) == 34 # total number of signal lines in circuit assert len(lr.line2roles) == 34 # total number of signal lines in circuit
# 2 + 9 + 23 = 34 # 2 + 9 + 23 = 34
assert len(lr.roles2lines[LineRoles.LOGIC_OUT]) == 2 assert len(lr.roles2lines[LineRoles.LOGIC_OUT]) == 2

Loading…
Cancel
Save