Circuit pickle, STIL/SDF/techlib fixes, sdata
- fix pin indices for various SC lib variants - SDF annotation improvements - STIL loading improvements - Support for per-simulation parameters in WaveSim - Circuit is now pickleable and comparable
This commit is contained in:
1 parent
b17ab2d148
commit
840b816804
16 files changed
+371
-110
No files matched your search
+12
-1
@@ -1,5 +1,7 @@
|
||||
from kyupy.circuit import Circuit, Node, Line
|
||||
import pickle
|
||||
|
||||
from kyupy.circuit import Circuit, Node, Line
|
||||
from kyupy import verilog
|
||||
|
||||
def test_lines():
|
||||
c = Circuit()
|
||||
@@ -99,3 +101,12 @@ def test_circuit():
|
||||
|
||||
for n in c.topological_order():
|
||||
repr(n)
|
||||
|
||||
|
||||
def test_pickle(mydir):
|
||||
c = verilog.load(mydir / 'b14.v.gz')
|
||||
assert c is not None
|
||||
cs = pickle.dumps(c)
|
||||
assert cs is not None
|
||||
c2 = pickle.loads(cs)
|
||||
assert c == c2
|
||||
@@ -145,6 +145,20 @@ def test_mv_operations():
|
||||
assert lg.mv_xor(x1_4v, x2_4v)[0] == '0XX1XXXXXXXX1XX0'
|
||||
assert lg.mv_xor(x1_8v, x2_8v)[0] == '0XX1PRFNXXXXXXXXXXXXXXXX1XX0NFRPPXXNPRFNRXXFRPNFFXXRFNPRNXXPNFRP'
|
||||
|
||||
x30_2v = lg.MVArray("0000", m=2)
|
||||
x31_2v = lg.MVArray("1111", m=2)
|
||||
x30_4v = lg.MVArray("0000000000000000", m=4)
|
||||
x31_4v = lg.MVArray("1111111111111111", m=4)
|
||||
x30_8v = lg.MVArray("0000000000000000000000000000000000000000000000000000000000000000", m=8)
|
||||
x31_8v = lg.MVArray("1111111111111111111111111111111111111111111111111111111111111111", m=8)
|
||||
|
||||
assert lg.mv_latch(x1_2v, x2_2v, x30_2v)[0] == '0001'
|
||||
assert lg.mv_latch(x1_2v, x2_2v, x31_2v)[0] == '1011'
|
||||
assert lg.mv_latch(x1_4v, x2_4v, x30_4v)[0] == '0XX00XXX0XXX0XX1'
|
||||
assert lg.mv_latch(x1_4v, x2_4v, x31_4v)[0] == '1XX01XXX1XXX1XX1'
|
||||
assert lg.mv_latch(x1_8v, x2_8v, x30_8v)[0] == '0XX000000XXXXXXX0XXXXXXX0XX10R110XX000000XXR0R0R0XXF001F0XX10R11'
|
||||
assert lg.mv_latch(x1_8v, x2_8v, x31_8v)[0] == '1XX01F001XXXXXXX1XXXXXXX1XX111111XX01F001XXR110R1XXF1F1F1XX11111'
|
||||
|
||||
|
||||
def test_bparray():
|
||||
|
||||
@@ -212,3 +226,27 @@ def test_bparray():
|
||||
assert lg.MVArray(out_2v)[0] == '0110'
|
||||
assert lg.MVArray(out_4v)[0] == '0XX1XXXXXXXX1XX0'
|
||||
assert lg.MVArray(out_8v)[0] == '0XX1PRFNXXXXXXXXXXXXXXXX1XX0NFRPPXXNPRFNRXXFRPNFFXXRFNPRNXXPNFRP'
|
||||
|
||||
x30_2v = lg.BPArray("0000", m=2)
|
||||
x30_4v = lg.BPArray("0000000000000000", m=4)
|
||||
x30_8v = lg.BPArray("0000000000000000000000000000000000000000000000000000000000000000", m=8)
|
||||
|
||||
lg.bp_latch(out_2v.data, x1_2v.data, x2_2v.data, x30_2v.data)
|
||||
lg.bp_latch(out_4v.data, x1_4v.data, x2_4v.data, x30_4v.data)
|
||||
lg.bp_latch(out_8v.data, x1_8v.data, x2_8v.data, x30_8v.data)
|
||||
|
||||
assert lg.MVArray(out_2v)[0] == '0001'
|
||||
assert lg.MVArray(out_4v)[0] == '0XX00XXX0XXX0XX1'
|
||||
assert lg.MVArray(out_8v)[0] == '0XX000000XXXXXXX0XXXXXXX0XX10R110XX000000XXR0R0R0XXF001F0XX10R11'
|
||||
|
||||
x31_2v = lg.BPArray("1111", m=2)
|
||||
x31_4v = lg.BPArray("1111111111111111", m=4)
|
||||
x31_8v = lg.BPArray("1111111111111111111111111111111111111111111111111111111111111111", m=8)
|
||||
|
||||
lg.bp_latch(out_2v.data, x1_2v.data, x2_2v.data, x31_2v.data)
|
||||
lg.bp_latch(out_4v.data, x1_4v.data, x2_4v.data, x31_4v.data)
|
||||
lg.bp_latch(out_8v.data, x1_8v.data, x2_8v.data, x31_8v.data)
|
||||
|
||||
assert lg.MVArray(out_2v)[0] == '1011'
|
||||
assert lg.MVArray(out_4v)[0] == '1XX01XXX1XXX1XX1'
|
||||
assert lg.MVArray(out_8v)[0] == '1XX01F001XXXXXXX1XXXXXXX1XX111111XX01F001XXR110R1XXF1F1F1XX11111'
|
||||
@@ -73,6 +73,45 @@ def test_8v():
|
||||
assert resp[i] == mva[i]
|
||||
|
||||
|
||||
def test_loop():
|
||||
c = bench.parse('q=dff(d) d=not(q)')
|
||||
s = LogicSim(c, 4, m=8)
|
||||
assert len(s.interface) == 1
|
||||
mva = MVArray([['0'], ['1'], ['R'], ['F']], m=8)
|
||||
|
||||
s.assign(BPArray(mva))
|
||||
s.propagate()
|
||||
resp_bp = BPArray((len(s.interface), s.sims))
|
||||
s.capture(resp_bp)
|
||||
resp = MVArray(resp_bp)
|
||||
|
||||
assert resp[0] == '1'
|
||||
assert resp[1] == '0'
|
||||
assert resp[2] == 'F'
|
||||
assert resp[3] == 'R'
|
||||
|
||||
resp_bp = s.cycle(resp_bp)
|
||||
resp = MVArray(resp_bp)
|
||||
|
||||
assert resp[0] == '0'
|
||||
assert resp[1] == '1'
|
||||
assert resp[2] == 'R'
|
||||
assert resp[3] == 'F'
|
||||
|
||||
|
||||
def test_latch():
|
||||
c = bench.parse('input(d, t) output(q) q=latch(d, t)')
|
||||
s = LogicSim(c, 8, m=8)
|
||||
assert len(s.interface) == 4
|
||||
mva = MVArray(['00-0', '00-1', '01-0', '01-1', '10-0', '10-1', '11-0', '11-1'], m=8)
|
||||
exp = MVArray(['0000', '0011', '0100', '0100', '1000', '1011', '1111', '1111'], m=8)
|
||||
|
||||
resp = MVArray(s.cycle(BPArray(mva)))
|
||||
|
||||
for i in range(len(mva)):
|
||||
assert resp[i] == exp[i]
|
||||
|
||||
|
||||
def test_b01(mydir):
|
||||
c = bench.load(mydir / 'b01.bench')
|
||||
|
||||
|
||||
+14
-1
@@ -1,8 +1,21 @@
|
||||
from kyupy import stil
|
||||
from kyupy import stil, verilog
|
||||
|
||||
|
||||
def test_b14(mydir):
|
||||
b14 = verilog.load(mydir / 'b14.v.gz')
|
||||
|
||||
s = stil.load(mydir / 'b14.stuck.stil.gz')
|
||||
assert len(s.signal_groups) == 10
|
||||
assert len(s.scan_chains) == 1
|
||||
assert len(s.calls) == 2163
|
||||
tests = s.tests(b14)
|
||||
resp = s.responses(b14)
|
||||
assert len(tests) > 0
|
||||
assert len(resp) > 0
|
||||
|
||||
s2 = stil.load(mydir / 'b14.transition.stil.gz')
|
||||
tests = s2.tests_loc(b14)
|
||||
resp = s2.responses(b14)
|
||||
assert len(tests) > 0
|
||||
assert len(resp) > 0
|
||||
|
||||
+11
-9
@@ -29,20 +29,22 @@ def test_wave_eval():
|
||||
sat[1] = 16, 16, 0
|
||||
sat[2] = 32, 16, 0
|
||||
|
||||
wave_eval((0b0111, 2, 0, 1), state, sat, 0, line_times)
|
||||
sdata = np.asarray([1, -1, 0, 0], dtype='float32')
|
||||
|
||||
wave_eval((0b0111, 2, 0, 1), state, sat, 0, line_times, sdata)
|
||||
assert z[0] == TMIN
|
||||
|
||||
a[0] = TMIN
|
||||
wave_eval((0b0111, 2, 0, 1), state, sat, 0, line_times)
|
||||
wave_eval((0b0111, 2, 0, 1), state, sat, 0, line_times, sdata)
|
||||
assert z[0] == TMIN
|
||||
|
||||
b[0] = TMIN
|
||||
wave_eval((0b0111, 2, 0, 1), state, sat, 0, line_times)
|
||||
wave_eval((0b0111, 2, 0, 1), state, sat, 0, line_times, sdata)
|
||||
assert z[0] == TMAX
|
||||
|
||||
a[0] = 1 # A _/^^^
|
||||
b[0] = 2 # B __/^^
|
||||
wave_eval((0b0111, 2, 0, 1), state, sat, 0, line_times)
|
||||
wave_eval((0b0111, 2, 0, 1), state, sat, 0, line_times, sdata)
|
||||
assert z[0] == TMIN # ^^^\___ B -> Z fall delay
|
||||
assert z[1] == 2.4
|
||||
assert z[2] == TMAX
|
||||
@@ -50,7 +52,7 @@ def test_wave_eval():
|
||||
a[0] = TMIN # A ^^^^^^
|
||||
b[0] = TMIN # B ^^^\__
|
||||
b[1] = 2
|
||||
wave_eval((0b0111, 2, 0, 1), state, sat, 0, line_times)
|
||||
wave_eval((0b0111, 2, 0, 1), state, sat, 0, line_times, sdata)
|
||||
assert z[0] == 2.3 # ___/^^^ B -> Z rise delay
|
||||
assert z[1] == TMAX
|
||||
|
||||
@@ -59,7 +61,7 @@ def test_wave_eval():
|
||||
b[0] = TMIN
|
||||
b[1] = 2 # B ^^\__/^^
|
||||
b[2] = 2.35
|
||||
wave_eval((0b0111, 2, 0, 1), state, sat, 0, line_times)
|
||||
wave_eval((0b0111, 2, 0, 1), state, sat, 0, line_times, sdata)
|
||||
assert z[0] == 2.3 # __/^^\__
|
||||
assert z[1] == 2.75
|
||||
assert z[2] == TMAX
|
||||
@@ -69,7 +71,7 @@ def test_wave_eval():
|
||||
b[0] = 2 # B __/^^\__
|
||||
b[1] = 2.45
|
||||
b[2] = TMAX
|
||||
wave_eval((0b0111, 2, 0, 1), state, sat, 0, line_times)
|
||||
wave_eval((0b0111, 2, 0, 1), state, sat, 0, line_times, sdata)
|
||||
assert z[0] == TMIN # ^^\__/^^
|
||||
assert z[1] == 2.4
|
||||
assert z[2] == 2.75
|
||||
@@ -80,7 +82,7 @@ def test_wave_eval():
|
||||
b[0] = 2 # B __/^^\__
|
||||
b[1] = 2.35
|
||||
b[2] = TMAX
|
||||
wave_eval((0b0111, 2, 0, 1), state, sat, 0, line_times)
|
||||
wave_eval((0b0111, 2, 0, 1), state, sat, 0, line_times, sdata)
|
||||
assert z[0] == TMIN # ^^^^^^
|
||||
assert z[1] == TMAX
|
||||
|
||||
@@ -89,7 +91,7 @@ def test_wave_eval():
|
||||
b[0] = TMIN
|
||||
b[1] = 2 # B ^^\__/^^
|
||||
b[2] = 2.25
|
||||
wave_eval((0b0111, 2, 0, 1), state, sat, 0, line_times)
|
||||
wave_eval((0b0111, 2, 0, 1), state, sat, 0, line_times, sdata)
|
||||
assert z[0] == TMAX # ______
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user