def test_vcd_dump_off_time_order(capsys): with VCDWriter(sys.stdout, date='today') as vcd: v0 = vcd.register_var('scope', 'a', 'integer', 8) vcd.dump_off(1) with pytest.raises(VCDPhaseError): vcd.dump_off(0) assert v0.value == 'x' vcd.change(v0, 1, 10) expected_lines = [ '$date today $end', '$timescale 1 us $end', '$scope module scope $end', '$var integer 8 0 a $end', '$upscope $end', '$enddefinitions $end', '#0', '$dumpvars', 'bx 0', '$end', '#1', '$dumpoff', 'bx 0', '$end', ] assert expected_lines == split_lines(capsys)
def test_vcd_string_var(capsys): with VCDWriter(sys.stdout, date='today') as vcd: v0 = vcd.register_var('aaa', 'nn0', 'string') vcd.change(v0, 1, 'hello') vcd.change(v0, 2, '') vcd.change(v0, 3, 'world') with pytest.raises(ValueError): vcd.change(v0, 4, 'no string allowed') vcd.change(v0, 4, None) vcd.change(v0, 5, '!') expected = ['#0', '$dumpvars', 'sx 0', '$end', '#1', 'shello 0', '#2', 's 0', '#3', 'sworld 0', '#4', 's 0', '#5', 's! 0'] lines = split_lines(capsys) assert expected == lines[-len(expected):]
def test_execution_speed(): """Manual test for how fast we can write to a VCD file See https://github.com/SanDisk-Open-Source/pyvcd/issues/9 pytest -vvs -k test_execution_speed """ t0 = timeit.default_timer() with open(os.devnull, 'w') as f: with VCDWriter(f, timescale=(10, 'ns'), date='today') as writer: counter_var = writer.register_var('a.b.c', 'counter', 'integer', size=8) compound_var = writer.register_var( 'a.b.c', 'compound', 'integer', size=(1, 3, 4) ) for i in range(1000, 300000, 300): for timestamp, value in enumerate(range(10, 200, 2)): writer.change(counter_var, i + timestamp, value) writer.change( compound_var, i + timestamp, (timestamp & 0b1, timestamp & 0b111, timestamp & 0b1111), ) elapsed = timeit.default_timer() - t0 print('Elapsed:', elapsed)
def test_vcd_no_duplicates(capsys): with VCDWriter(sys.stdout, date='today') as vcd: var = vcd.register_var('sss', 'nnn', 'integer', 32, ident='foo') vcd.change(var, 0, 'x') vcd.change(var, 1, 10) vcd.change(var, 2, 10) vcd.change(var, 3, 10) vcd.change(var, 4, 15) vcd.change(var, 5, 15) vcd.change(var, 6, 10) assert split_lines(capsys) == [ '$date today $end', '$timescale 1 us $end', '$scope module sss $end', '$var integer 32 foo nnn $end', '$upscope $end', '$enddefinitions $end', '#0', '$dumpvars', 'bx foo', '$end', '#1', 'b1010 foo', '#4', 'b1111 foo', '#6', 'b1010 foo', ]
def test_vcd_multiple_events(capsys): with VCDWriter(sys.stdout, date='') as vcd: var = vcd.register_var('scope', 'a', 'event') vcd.change(var, 1, True) vcd.change(var, 2, True) vcd.change(var, 2, True) vcd.change(var, 2, True) vcd.change(var, 3, True) expected_lines = [ '$timescale 1 us $end', '$scope module scope $end', '$var event 1 ! a $end', '$upscope $end', '$enddefinitions $end', '#0', '$dumpvars', '$end', '#1', '1!', '#2', '1!', '1!', '1!', '#3', '1!', ] assert expected_lines == split_lines(capsys)
def test_vcd_real_var(capsys): with VCDWriter(sys.stdout, date='today') as vcd: v0 = vcd.register_var('aaa', 'nn0', 'real', 32) v1 = vcd.register_var('aaa', 'nn1', 'real', 64) vcd.change(v0, 1, 1234.5) vcd.change(v1, 1, 5432.1) vcd.change(v0, 2, 0) vcd.change(v1, 2, 1) vcd.change(v0, 3, 999.9) vcd.change(v1, 3, -999.9) with pytest.raises(ValueError): vcd.change(v0, 4, 'z') with pytest.raises(ValueError): vcd.change(v0, 4, 'x') with pytest.raises(ValueError): vcd.change(v0, 4, 'InVaLiD') lines = split_lines(capsys) expected_last = ['#1', 'r1234.5 0', 'r5432.1 1', '#2', 'r0 0', 'r1 1', '#3', 'r999.9 0', 'r-999.9 1'] assert lines[-len(expected_last):] == expected_last
def test_vcd_dump_off_early(capsys): with VCDWriter(sys.stdout, date='today') as vcd: v0 = vcd.register_var('scope', 'a', 'integer', 8, init=7) vcd.dump_off(0) vcd.change(v0, 5, 1) vcd.dump_on(10) vcd.change(v0, 15, 2) expected_lines = [ '$date today $end', '$timescale 1 us $end', '$scope module scope $end', '$var integer 8 0 a $end', '$upscope $end', '$enddefinitions $end', '#0', '$dumpvars', 'b111 0', '$end', '$dumpoff', 'bx 0', '$end', '#10', '$dumpon', 'b1 0', '$end', '#15', 'b10 0', ] assert expected_lines == split_lines(capsys)
def test_vcd_integer_var(capsys): with VCDWriter(sys.stdout, date='today') as vcd: v0 = vcd.register_var('aaa', 'nn0', 'integer', 16) v1 = vcd.register_var('aaa', 'nn1', 'integer', 8) vcd.change(v0, 1, 4) vcd.change(v1, 1, -4) vcd.change(v0, 2, 'z') vcd.change(v1, 2, 'X') vcd.change(v1, 3, None) vcd.change(v0, 3, '1010') with pytest.raises(ValueError): vcd.change(v1, 4, -129) with pytest.raises(ValueError): vcd.change(v1, 4, '111100001') # Too long with pytest.raises(ValueError): vcd.change(v1, 4, 1.234) expected_last = ['#1', 'b100 0', 'b11111100 1', '#2', 'bz 0', 'bX 1', '#3', 'bz 1', 'b1010 0'] lines = split_lines(capsys) assert lines[-len(expected_last):] == expected_last
def test_vcd_dump_off_real(capsys): with VCDWriter(sys.stdout, date='') as vcd: v0 = vcd.register_var('scope', 'a', 'real') vcd.change(v0, 1, 1.0) vcd.dump_off(2) vcd.change(v0, 3, 3.0) vcd.dump_on(4) vcd.change(v0, 5, 5.0) assert v0.ident == '0' expected_lines = [ '$timescale 1 us $end', '$scope module scope $end', '$var real 64 0 a $end', '$upscope $end', '$enddefinitions $end', '#0', '$dumpvars', 'r0 0', '$end', '#1', 'r1 0', '#2', '$dumpoff', '$end', '#4', '$dumpon', 'r3 0', '$end', '#5', 'r5 0', ] assert expected_lines == split_lines(capsys)
def test_vcd_aliases(capsys): with VCDWriter(sys.stdout, date='today') as vcd: var = vcd.register_var('sss', 'nnn', 'integer', 32) vcd.register_alias('sss', 'mmm', var) vcd.register_alias('ttt', 'nnn', var) vcd.change(var, 0, 'x') vcd.change(var, 1, 10) vcd.change(var, 2, 11) assert split_lines(capsys) == [ '$date today $end', '$timescale 1 us $end', '$scope module sss $end', '$var integer 32 ! nnn $end', '$var integer 32 ! mmm $end', '$upscope $end', '$scope module ttt $end', '$var integer 32 ! nnn $end', '$upscope $end', '$enddefinitions $end', '#0', '$dumpvars', 'bx !', '$end', '#1', 'b1010 !', '#2', 'b1011 !', ]
def test_vcd_timescales(capsys, timescale, expected): with VCDWriter(sys.stdout, date='', timescale=timescale): pass lines = split_lines(capsys) assert lines == [ '$timescale {} $end'.format(expected), '$enddefinitions $end' ]
def test_vcd_change_after_close(capsys): vcd = VCDWriter(sys.stdout, date='') var = vcd.register_var('a', 'b', 'integer') assert not split_lines(capsys) vcd.close() with pytest.raises(VCDPhaseError): vcd.change(var, 1, 1) with pytest.raises(VCDPhaseError): vcd.flush()
def test_vcd_one_var(capsys): with VCDWriter(sys.stdout, date='today') as vcd: var = vcd.register_var('sss', 'nnn', 'integer', 32, ident='foo') vcd.change(var, 0, 0) vcd.change(var, 1, 10) lines = split_lines(capsys) assert '$var integer 32 foo nnn $end' in lines assert lines[-1] == 'b1010 foo'
def test_vcd_duplicate_alias(capsys): with VCDWriter(sys.stdout, date='today') as vcd: var = vcd.register_var('aaa.bbb', 'nn0', 'integer', 8) vcd.register_alias('aaa.bbb', 'nn1', var) with pytest.raises(KeyError): vcd.register_alias('aaa.bbb', 'nn0', var) with pytest.raises(KeyError): vcd.register_alias('aaa.bbb', 'nn1', var)
def test_vcd_close(capsys): vcd = VCDWriter(sys.stdout, date='') assert not split_lines(capsys) vcd.close() lines = split_lines(capsys) assert lines == ['$timescale 1 us $end', '$enddefinitions $end'] with pytest.raises(VCDPhaseError): vcd.register_var('a', 'b', 'integer') vcd.close() # Idempotency test assert not split_lines(capsys)
def test_vcd_alias_after_close(capsys): vcd = VCDWriter(sys.stdout) var = vcd.register_var('a', 'b', 'integer') assert not split_lines(capsys) vcd.close() with pytest.raises(VCDPhaseError): vcd.register_alias('c', 'd', var)
def test_vcd_scope_tuple(capsys): with VCDWriter(sys.stdout, date='today') as vcd: vcd.register_var(('aaa', ), 'nn0', 'integer', 8) vcd.register_var(('aaa', 'bbb'), 'nn1', 'integer', 8) vcd.register_var('aaa.bbb.ccc', 'nn2', 'integer', 8) lines = split_lines(capsys) for line, expected in zip(lines, [ '$date', '$timescale', '$scope module aaa', '$var', '$scope module bbb', '$var', '$scope module ccc', '$var' ]): assert line.startswith(expected)
def test_vcd_init_timestamp(capsys): with VCDWriter(sys.stdout, date='today', init_timestamp=123) as vcd: vcd.register_var('a', 'n', 'integer', 8, init='z') expected_lines = [ '$date', '$timescale', '$scope module a', '$var integer 8 0 n $end', '$upscope', '$enddefinitions', '#123', '$dumpvars', 'bz 0', '$end' ] for line, expected in zip(split_lines(capsys), expected_lines): print(line, '|', expected) assert line.startswith(expected)
def test_vcd_late_registration(capsys): with VCDWriter(sys.stdout, date='today') as vcd: var0 = vcd.register_var('aaa.bbb', 'nn0', 'integer', 8) vcd.change(var0, 0, 123) # Still at t0, registration okay... vcd.register_var('aaa.bbb', 'nn1', 'integer', 8) vcd.change(var0, 1, 210) with pytest.raises(VCDPhaseError): vcd.register_var('aaa.bbb', 'nn2', 'integer', 8)
def test_vcd_close(capsys): vcd = VCDWriter(sys.stdout, date='') assert not split_lines(capsys) vcd.close() lines = split_lines(capsys) assert lines == ['$timescale 1 us $end', '$enddefinitions $end'] with pytest.raises(VCDPhaseError): vcd.register_var('a', 'b', 'integer') vcd.close() # Idempotency test assert not split_lines(capsys)
def test_vcd_scopes(capsys): with VCDWriter(sys.stdout, date='today') as vcd: vcd.set_scope_type('eee.fff.ggg', ScopeType.task) vcd.register_var('aaa.bbb', 'nn0', 'integer', 8, init='z') vcd.register_var('aaa.bbb', 'nn1', 'integer', 8) vcd.register_var('aaa', 'nn2', 'integer', 8) vcd.register_var('aaa.bbb.ccc', 'nn3', 'integer', 8) vcd.register_var('aaa.bbb.ddd', 'nn4', 'integer', 8) vcd.register_var('eee.fff.ggg', 'nn5', 'integer', 8) vcd.set_scope_type('aaa.bbb', 'fork') with pytest.raises(TypeError): vcd.set_scope_type({'a', 'b', 'c'}, 'module') expected_lines = [ '$date', '$timescale', '$scope module aaa', '$var', '$scope fork bbb', '$var', '$var', '$scope module ccc', '$var', '$upscope', '$scope module ddd', '$var', '$upscope', '$upscope', '$upscope', '$scope module eee', '$scope module fff', '$scope task ggg', '$var', '$upscope', '$upscope', '$upscope', '$enddefinitions', '#0', '$dumpvars', 'bz !', 'bx "', 'bx #', 'bx $', 'bx %', 'bx &', '$end', ] for line, expected in zip(split_lines(capsys), expected_lines): print(line, '|', expected) assert line.startswith(expected)
def test_vcd_no_scopes(capsys): with VCDWriter(sys.stdout, date='today', version='some\nversion', comment='hello'): pass lines = split_lines(capsys) expected_lines = [ '$comment hello $end', '$date today $end', '$timescale 1 us $end', '$version', '\tsome', '\tversion', '$end', '$enddefinitions $end', ] assert expected_lines == lines
def test_dump_off_compound_vector(capsys): with VCDWriter(sys.stdout) as vcd: v0 = vcd.register_var('aaa', 'n0', 'integer', size=(4, 4, 8), init=None) vcd.register_var('aaa', 'n1', 'integer', size=(4, 4, 8), init=('z', 'x', '-')) vcd.register_var('aaa', 'n2', 'integer', size=(1, 1), init=(True, False)) v3 = vcd.register_var('aaa', 'n3', 'integer', size=(1, 2, 3), init='xxx') with pytest.raises(ValueError): vcd.register_var('aaa', 'n4', 'integer', size=(1, 2, 3), init=(1, 2)) vcd.change(v0, 1, (0, 0, 0)) vcd.change(v0, 2, (15, 0, 0xFF)) vcd.dump_off(3) vcd.change(v3, 4, '1-1') vcd.dump_on(5) expected = [ '$var integer 16 ! n0 $end', '$var integer 16 " n1 $end', '$var integer 2 # n2 $end', '$var integer 6 $ n3 $end', '$upscope $end', '$enddefinitions $end', '#0', '$dumpvars', 'bx !', 'bzxxxx-------- "', 'b10 #', 'bx $', '$end', '#1', 'b0 !', '#2', 'b1111000011111111 !', '#3', '$dumpoff', 'bx !', 'bx "', 'bx #', 'bx $', '$end', '#5', '$dumpon', 'b1111000011111111 !', 'bzxxxx-------- "', 'b10 #', 'b1--001 $', '$end', ] lines = split_lines(capsys) assert expected == lines[-len(expected) :]
def test_vcd_string_var(capsys): with VCDWriter(sys.stdout, date='today') as vcd: v0 = vcd.register_var('aaa', 'nn0', 'string') vcd.register_var('aaa', 'nn1', 'string', init='foobar') with pytest.raises(ValueError): vcd.register_var('aaa', 'fff', 'string', init=123) vcd.change(v0, 1, 'hello') vcd.change(v0, 2, '') vcd.change(v0, 3, 'world') vcd.change(v0, 4, 'spaces are\tok') vcd.change(v0, 5, 'newlines\r\ntoo') vcd.change(v0, 6, 'slash\\slash') vcd.change(v0, 7, None) vcd.change(v0, 8, '!') with pytest.raises(ValueError) as e: vcd.change(v0, 9, 42) assert 'Invalid string value' in e.value.args[0] vcd.dump_off(8) expected = [ '#0', '$dumpvars', 's !', 'sfoobar "', '$end', '#1', 'shello !', '#2', 's !', '#3', 'sworld !', '#4', 'sspaces\\x20are\\tok !', '#5', 'snewlines\\r\\ntoo !', '#6', 'sslash\\\\slash !', '#7', 's !', '#8', 's! !', '$dumpoff', '$end', ] lines = split_lines(capsys) assert expected == lines[-len(expected):]
def test_vcd_register_event(capsys): with VCDWriter(sys.stdout, date='') as vcd: vcd.register_var('scope', 'a', 'event') vcd.register_var('scope', 'b', 'event', init=True) with pytest.raises(ValueError): vcd.register_var('scope', 'f', 'event', init='yes') expected_last = [ '$scope module scope $end', '$var event 1 ! a $end', '$var event 1 " b $end', '$upscope $end', '$enddefinitions $end', '#0', '$dumpvars', '$end', ] lines = split_lines(capsys) assert lines[-len(expected_last) :] == expected_last
def test_execution_speed(tmpdir): """Manual test for how fast we can write to a VCD file See https://github.com/SanDisk-Open-Source/pyvcd/issues/9 """ fptr = open(os.path.sep.join([str(tmpdir), 'test.vcd']), 'w+') t = pytictoc.TicToc() t.tic() with VCDWriter(fptr, timescale=(10, 'ns'), date='today') as writer: counter_var = writer.register_var('a.b.c', 'counter', 'integer', size=8) for i in range(1000, 300000, 300): for timestamp, value in enumerate(range(10, 200, 2)): writer.change(counter_var, i + timestamp, value) fptr.close() t.toc()
def test_vcd_dump_off_on(capsys): with VCDWriter(sys.stdout, date='today') as vcd: v0 = vcd.register_var('scope', 'a', 'integer', 8) v1 = vcd.register_var('scope', 'b', 'wire', 1) vcd.change(v0, 1, 10) vcd.change(v1, 2, True) vcd.dump_off(4) vcd.dump_off(5) # Idempotent vcd.change(v0, 6, 11) vcd.change(v1, 7, False) vcd.dump_on(9) vcd.dump_off(10) vcd.dump_on(10) vcd.change(v0, 11, 12) vcd.change(v1, 11, True)
def test_vcd_scalar_var(capsys): with VCDWriter(sys.stdout, date='today') as vcd: v0 = vcd.register_var('aaa', 'nn0', 'integer', 1) vcd.change(v0, 1, True) vcd.change(v0, 2, False) vcd.change(v0, 3, 'z') vcd.change(v0, 4, 'x') vcd.change(v0, 5, 0) vcd.change(v0, 6, 1) with pytest.raises(ValueError): vcd.change(v0, 7, 'bogus') vcd.change(v0, 7, None) lines = split_lines(capsys) assert lines[-13] == '10' assert lines[-11] == '00' assert lines[-9] == 'z0' assert lines[-7] == 'x0' assert lines[-5] == '00' assert lines[-3] == '10' assert lines[-1] == 'z0'
def test_vcd_scalar_var(capsys): with VCDWriter(sys.stdout, date='today') as vcd: v0 = vcd.register_var('aaa', 'nn0', 'integer', 1) vcd.register_var('aaa', 'nn1', 'integer', 1, False) with pytest.raises(ValueError): vcd.register_var('aaa', 'fff', 'integer', 1, init=1.23) vcd.change(v0, 1, True) vcd.change(v0, 2, False) vcd.change(v0, 3, 'z') vcd.change(v0, 4, 'x') vcd.change(v0, 5, 0) vcd.change(v0, 6, 1) with pytest.raises(ValueError): vcd.change(v0, 7, 'bogus') vcd.change(v0, 7, None) lines = split_lines(capsys) expected = [ '$enddefinitions $end', '#0', '$dumpvars', 'x!', '0"', '$end', '#1', '1!', '#2', '0!', '#3', 'z!', '#4', 'x!', '#5', '0!', '#6', '1!', '#7', 'z!', ] assert lines[-len(expected) :] == expected
def test_vcd_dump_on_no_op(capsys): with VCDWriter(sys.stdout, date='today') as vcd: v0 = vcd.register_var('scope', 'a', 'integer', 8) vcd.dump_on(0) # Should be a no-op vcd.change(v0, 1, 1) vcd.dump_on(2) # Also a no-op expected_lines = [ '$date today $end', '$timescale 1 us $end', '$scope module scope $end', '$var integer 8 0 a $end', '$upscope $end', '$enddefinitions $end', '#0', '$dumpvars', 'bx 0', '$end', '#1', 'b1 0', ] assert expected_lines == split_lines(capsys)
def test_vcd_register_real(capsys): with VCDWriter(sys.stdout, date='') as vcd: vcd.register_var('scope', 'a', 'real') vcd.register_var('scope', 'b', 'real', init=123) vcd.register_var('scope', 'c', 'real', init=1.23) with pytest.raises(ValueError): vcd.register_var('scope', 'f', 'real', init='real') expected_last = [ '$scope module scope $end', '$var real 64 ! a $end', '$var real 64 " b $end', '$var real 64 # c $end', '$upscope $end', '$enddefinitions $end', '#0', '$dumpvars', 'r0 !', 'r123 "', 'r1.23 #', '$end', ] lines = split_lines(capsys) assert lines[-len(expected_last) :] == expected_last
def test_vcd_string_var(capsys): with VCDWriter(sys.stdout, date='today') as vcd: v0 = vcd.register_var('aaa', 'nn0', 'string') vcd.register_var('aaa', 'nn1', 'string', init='foobar') with pytest.raises(ValueError): vcd.register_var('aaa', 'fff', 'string', init=123) vcd.change(v0, 1, 'hello') vcd.change(v0, 2, '') vcd.change(v0, 3, 'world') with pytest.raises(ValueError): vcd.change(v0, 4, 'no string allowed') vcd.change(v0, 4, None) vcd.change(v0, 5, '!') vcd.dump_off(6) expected = [ '#0', '$dumpvars', 's !', 'sfoobar "', '$end', '#1', 'shello !', '#2', 's !', '#3', 'sworld !', '#4', 's !', '#5', 's! !', '#6', '$dumpoff', '$end', ] lines = split_lines(capsys) assert expected == lines[-len(expected) :]
def test_vcd_flush(capsys): vcd = VCDWriter(sys.stdout, date='today') assert not split_lines(capsys) vcd.flush(17) lines = split_lines(capsys) assert lines[-1] == '#17'