add test fixtures, update kyupy
This commit is contained in:
1 parent
a0763d6124
commit
13d847b833
6 files changed
+93
-73
No files matched your search
+1
-1
Submodule kyupy updated: 53309f9e59...f5af7ec3d9.
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
+4
-37
@@ -72,48 +72,15 @@ def test_aoi_oai_complex():
|
||||
# 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)
|
||||
|
||||
def test_s27():
|
||||
# bench parser does not add any clock or set/reset logic.
|
||||
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)
|
||||
def test_s27(s27_bench):
|
||||
fs = FaultSet(s27_bench, KYUPY, s27_bench)
|
||||
assert len(fs.saf_set) == 52
|
||||
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
|
||||
assert g11_sa_0 in fs.saf_equiv_classes
|
||||
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
|
||||
assert g15_sa_0 in fs.saf_equiv_classes[g11_sa_0]
|
||||
|
||||
@@ -20,41 +20,8 @@ def test_fanout():
|
||||
assert len(lr.line2roles) == 6
|
||||
assert len(lr.roles2lines[LineRoles.LOGIC_OUT]) == 6
|
||||
|
||||
def test_s27():
|
||||
# bench parser does not add any clock or set/reset logic.
|
||||
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)
|
||||
def test_s27(s27_bench):
|
||||
lr = LineRoles(s27_bench, KYUPY)
|
||||
assert len(lr.line2roles) == 34 # total number of signal lines in circuit
|
||||
# 2 + 9 + 23 = 34
|
||||
assert len(lr.roles2lines[LineRoles.LOGIC_OUT]) == 2
|
||||
|
||||
Reference in new issue
Block a user