diff --git a/utils/fasm2frames.py b/utils/fasm2frames.py index 6744f7a7..72cab3ed 100755 --- a/utils/fasm2frames.py +++ b/utils/fasm2frames.py @@ -163,11 +163,13 @@ def mk_grid(): } return grid + def frame_init(frames, addr): '''Set given frame to 0''' if not addr in frames: frames[addr] = [0 for _i in range(101)] + def frames_init(frames, grid): '''Set all frames to 0''' for segj in grid['segments'].values(): @@ -176,10 +178,12 @@ def frames_init(frames, grid): for coli in range(segj['frames']): frame_init(frames, seg_baseaddr + coli) + def frame_set(frames, frame_addr, word_addr, bit_index): '''Set given bit in given frame address and word''' frames[frame_addr][word_addr] |= 1 << bit_index + def frame_clear(frames, frame_addr, word_addr, bit_index): '''Set given bit in given frame address and word''' frames[frame_addr][word_addr] &= 0xFFFFFFFF ^ (1 << bit_index) @@ -209,6 +213,7 @@ def parse_line(l): return tile, name, value + def check_duplicate(used_names, tile, name, l, line_number): '''Throw an exception if a conflicting FASM directive was given''' used_name = (tile, name) @@ -219,7 +224,10 @@ def check_duplicate(used_names, tile, name, l, line_number): (old_line_number, line_number, l)) used_names[used_name] = line_number -def update_segbit(frames, seg_word_column, word_bit_n, isset, seg_baseaddr, seg_word_base): + +def update_segbit( + frames, seg_word_column, word_bit_n, isset, seg_baseaddr, + seg_word_base): '''Set or clear a single bit in a segment at the given word column and word bit position''' # Now we have the word column and word bit index # Combine with the segments relative frame position to fully get the position @@ -232,6 +240,7 @@ def update_segbit(frames, seg_word_column, word_bit_n, isset, seg_baseaddr, seg_ else: frame_clear(frames, frame_addr, word_addr, bit_index) + def default_value(db_vals, name): # If its binary, allow omitted value default to 1 if tuple(sorted(db_vals.keys())) == ('0', '1'): @@ -256,15 +265,15 @@ def process_line(line_number, l, grid, frames, used_names): segj = grid['segments'][segname] seg_baseaddr, seg_word_base = segj['baseaddr'] seg_baseaddr = int(seg_baseaddr, 0) - + # Ensure that all frames exist for this segment # FIXME: type dependent for coli in range(segj['frames']): frame_init(frames, seg_baseaddr + coli) - + # Now lets look up the bits we need frames for segdb = get_database(segj['type']) - + db_k = '%s.%s' % (tilej['type'], name) try: db_vals = segdb[db_k] @@ -272,10 +281,10 @@ def process_line(line_number, l, grid, frames, used_names): raise FASMSyntaxError( "Segment DB %s, key %s not found from line '%s'" % (segj['type'], db_k, l)) from None - + if not value: value = default_value(db_vals, name) - + # Get the specific entry we need try: db_vals = db_vals[value] @@ -283,9 +292,11 @@ def process_line(line_number, l, grid, frames, used_names): raise FASMSyntaxError( "Invalid entry %s. Valid entries are %s" % (value, db_vals.keys())) - + for seg_word_column, word_bit_n, isset in db_vals: - update_segbit(frames, seg_word_column, word_bit_n, isset, seg_baseaddr, seg_word_base) + update_segbit( + frames, seg_word_column, word_bit_n, isset, seg_baseaddr, + seg_word_base) def run(f_in, f_out, sparse=False, debug=False): diff --git a/utils/test_fasm2frames.py b/utils/test_fasm2frames.py index e0f35f61..9dd547e8 100644 --- a/utils/test_fasm2frames.py +++ b/utils/test_fasm2frames.py @@ -1,9 +1,10 @@ +#!/usr/bin/env python3 # TODO: need better coverage for different tile types import fasm2frames import unittest -import StringIO +from io import StringIO import re @@ -23,7 +24,7 @@ def frm2bits(txt): assert (101 == len(words)) for wordi, word in enumerate(words): word = int(word, 0) - for biti in xrange(32): + for biti in range(32): val = word & (1 << biti) if val: bits_out.add((addr, wordi, biti)) @@ -51,11 +52,11 @@ def bitread2bits(txt): class TestStringMethods(unittest.TestCase): def test_lut(self): '''Simple smoke test on just the LUTs''' - fout = StringIO.StringIO() + fout = StringIO() fasm2frames.run(open('test_data/lut.fasm', 'r'), fout) def bitread_frm_equals(self, frm_fn, bitread_fn): - fout = StringIO.StringIO() + fout = StringIO() fasm2frames.run(open(frm_fn, 'r'), fout) # Build a list of output used bits @@ -84,20 +85,20 @@ class TestStringMethods(unittest.TestCase): # Same check as above, but isolated test case def test_opkey_01_default(self): '''Optional key with binary omitted value should produce valid result''' - fin = StringIO.StringIO("CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX") - fout = StringIO.StringIO() + fin = StringIO("CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX") + fout = StringIO() fasm2frames.run(fin, fout) def test_opkey_01_1(self): - fin = StringIO.StringIO("CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX 1") - fout = StringIO.StringIO() + fin = StringIO("CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX 1") + fout = StringIO() fasm2frames.run(fin, fout) def test_opkey_enum(self): '''Optional key with enumerated value should produce syntax error''' # CLBLM_L.SLICEM_X0.AMUX.O6 !30_06 !30_07 !30_08 30_11 - fin = StringIO.StringIO("CLBLM_L_X10Y102.SLICEM_X0.AMUX.O6") - fout = StringIO.StringIO() + fin = StringIO("CLBLM_L_X10Y102.SLICEM_X0.AMUX.O6") + fout = StringIO() try: fasm2frames.run(fin, fout) self.fail("Expected syntax error") @@ -111,8 +112,8 @@ class TestStringMethods(unittest.TestCase): def test_badkey(self): '''Bad key should throw syntax error''' - fin = StringIO.StringIO("CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX 2") - fout = StringIO.StringIO() + fin = StringIO("CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX 2") + fout = StringIO() try: fasm2frames.run(fin, fout) self.fail("Expected syntax error") @@ -121,12 +122,12 @@ class TestStringMethods(unittest.TestCase): def test_dupkey(self): '''Duplicate key should throw syntax error''' - fin = StringIO.StringIO( + fin = StringIO( """\ CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX 0 CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX 1 """) - fout = StringIO.StringIO() + fout = StringIO() try: fasm2frames.run(fin, fout) self.fail("Expected syntax error") @@ -137,12 +138,12 @@ CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX 1 '''Verify sparse equivilent to normal encoding''' frm_fn = 'test_data/lut_int.fasm' - fout_sparse = StringIO.StringIO() + fout_sparse = StringIO() fasm2frames.run(open(frm_fn, 'r'), fout_sparse, sparse=True) fout_sparse_txt = fout_sparse.getvalue() bits_sparse = frm2bits(fout_sparse_txt) - fout_full = StringIO.StringIO() + fout_full = StringIO() fasm2frames.run(open(frm_fn, 'r'), fout_full, sparse=False) fout_full_txt = fout_full.getvalue() bits_full = frm2bits(fout_full_txt)