python3, formatting

Signed-off-by: John McMaster <johndmcmaster@gmail.com>
This commit is contained in:
John McMaster 2018-10-16 23:47:19 -07:00
parent 98300b801e
commit d5fd573d30
2 changed files with 36 additions and 24 deletions

View File

@ -163,11 +163,13 @@ def mk_grid():
} }
return grid return grid
def frame_init(frames, addr): def frame_init(frames, addr):
'''Set given frame to 0''' '''Set given frame to 0'''
if not addr in frames: if not addr in frames:
frames[addr] = [0 for _i in range(101)] frames[addr] = [0 for _i in range(101)]
def frames_init(frames, grid): def frames_init(frames, grid):
'''Set all frames to 0''' '''Set all frames to 0'''
for segj in grid['segments'].values(): for segj in grid['segments'].values():
@ -176,10 +178,12 @@ def frames_init(frames, grid):
for coli in range(segj['frames']): for coli in range(segj['frames']):
frame_init(frames, seg_baseaddr + coli) frame_init(frames, seg_baseaddr + coli)
def frame_set(frames, frame_addr, word_addr, bit_index): def frame_set(frames, frame_addr, word_addr, bit_index):
'''Set given bit in given frame address and word''' '''Set given bit in given frame address and word'''
frames[frame_addr][word_addr] |= 1 << bit_index frames[frame_addr][word_addr] |= 1 << bit_index
def frame_clear(frames, frame_addr, word_addr, bit_index): def frame_clear(frames, frame_addr, word_addr, bit_index):
'''Set given bit in given frame address and word''' '''Set given bit in given frame address and word'''
frames[frame_addr][word_addr] &= 0xFFFFFFFF ^ (1 << bit_index) frames[frame_addr][word_addr] &= 0xFFFFFFFF ^ (1 << bit_index)
@ -209,6 +213,7 @@ def parse_line(l):
return tile, name, value return tile, name, value
def check_duplicate(used_names, tile, name, l, line_number): def check_duplicate(used_names, tile, name, l, line_number):
'''Throw an exception if a conflicting FASM directive was given''' '''Throw an exception if a conflicting FASM directive was given'''
used_name = (tile, name) used_name = (tile, name)
@ -219,7 +224,10 @@ def check_duplicate(used_names, tile, name, l, line_number):
(old_line_number, line_number, l)) (old_line_number, line_number, l))
used_names[used_name] = line_number 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''' '''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 # Now we have the word column and word bit index
# Combine with the segments relative frame position to fully get the position # 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: else:
frame_clear(frames, frame_addr, word_addr, bit_index) frame_clear(frames, frame_addr, word_addr, bit_index)
def default_value(db_vals, name): def default_value(db_vals, name):
# If its binary, allow omitted value default to 1 # If its binary, allow omitted value default to 1
if tuple(sorted(db_vals.keys())) == ('0', '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] segj = grid['segments'][segname]
seg_baseaddr, seg_word_base = segj['baseaddr'] seg_baseaddr, seg_word_base = segj['baseaddr']
seg_baseaddr = int(seg_baseaddr, 0) seg_baseaddr = int(seg_baseaddr, 0)
# Ensure that all frames exist for this segment # Ensure that all frames exist for this segment
# FIXME: type dependent # FIXME: type dependent
for coli in range(segj['frames']): for coli in range(segj['frames']):
frame_init(frames, seg_baseaddr + coli) frame_init(frames, seg_baseaddr + coli)
# Now lets look up the bits we need frames for # Now lets look up the bits we need frames for
segdb = get_database(segj['type']) segdb = get_database(segj['type'])
db_k = '%s.%s' % (tilej['type'], name) db_k = '%s.%s' % (tilej['type'], name)
try: try:
db_vals = segdb[db_k] db_vals = segdb[db_k]
@ -272,10 +281,10 @@ def process_line(line_number, l, grid, frames, used_names):
raise FASMSyntaxError( raise FASMSyntaxError(
"Segment DB %s, key %s not found from line '%s'" % "Segment DB %s, key %s not found from line '%s'" %
(segj['type'], db_k, l)) from None (segj['type'], db_k, l)) from None
if not value: if not value:
value = default_value(db_vals, name) value = default_value(db_vals, name)
# Get the specific entry we need # Get the specific entry we need
try: try:
db_vals = db_vals[value] db_vals = db_vals[value]
@ -283,9 +292,11 @@ def process_line(line_number, l, grid, frames, used_names):
raise FASMSyntaxError( raise FASMSyntaxError(
"Invalid entry %s. Valid entries are %s" % "Invalid entry %s. Valid entries are %s" %
(value, db_vals.keys())) (value, db_vals.keys()))
for seg_word_column, word_bit_n, isset in db_vals: 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): def run(f_in, f_out, sparse=False, debug=False):

View File

@ -1,9 +1,10 @@
#!/usr/bin/env python3
# TODO: need better coverage for different tile types # TODO: need better coverage for different tile types
import fasm2frames import fasm2frames
import unittest import unittest
import StringIO from io import StringIO
import re import re
@ -23,7 +24,7 @@ def frm2bits(txt):
assert (101 == len(words)) assert (101 == len(words))
for wordi, word in enumerate(words): for wordi, word in enumerate(words):
word = int(word, 0) word = int(word, 0)
for biti in xrange(32): for biti in range(32):
val = word & (1 << biti) val = word & (1 << biti)
if val: if val:
bits_out.add((addr, wordi, biti)) bits_out.add((addr, wordi, biti))
@ -51,11 +52,11 @@ def bitread2bits(txt):
class TestStringMethods(unittest.TestCase): class TestStringMethods(unittest.TestCase):
def test_lut(self): def test_lut(self):
'''Simple smoke test on just the LUTs''' '''Simple smoke test on just the LUTs'''
fout = StringIO.StringIO() fout = StringIO()
fasm2frames.run(open('test_data/lut.fasm', 'r'), fout) fasm2frames.run(open('test_data/lut.fasm', 'r'), fout)
def bitread_frm_equals(self, frm_fn, bitread_fn): def bitread_frm_equals(self, frm_fn, bitread_fn):
fout = StringIO.StringIO() fout = StringIO()
fasm2frames.run(open(frm_fn, 'r'), fout) fasm2frames.run(open(frm_fn, 'r'), fout)
# Build a list of output used bits # Build a list of output used bits
@ -84,20 +85,20 @@ class TestStringMethods(unittest.TestCase):
# Same check as above, but isolated test case # Same check as above, but isolated test case
def test_opkey_01_default(self): def test_opkey_01_default(self):
'''Optional key with binary omitted value should produce valid result''' '''Optional key with binary omitted value should produce valid result'''
fin = StringIO.StringIO("CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX") fin = StringIO("CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX")
fout = StringIO.StringIO() fout = StringIO()
fasm2frames.run(fin, fout) fasm2frames.run(fin, fout)
def test_opkey_01_1(self): def test_opkey_01_1(self):
fin = StringIO.StringIO("CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX 1") fin = StringIO("CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX 1")
fout = StringIO.StringIO() fout = StringIO()
fasm2frames.run(fin, fout) fasm2frames.run(fin, fout)
def test_opkey_enum(self): def test_opkey_enum(self):
'''Optional key with enumerated value should produce syntax error''' '''Optional key with enumerated value should produce syntax error'''
# CLBLM_L.SLICEM_X0.AMUX.O6 !30_06 !30_07 !30_08 30_11 # CLBLM_L.SLICEM_X0.AMUX.O6 !30_06 !30_07 !30_08 30_11
fin = StringIO.StringIO("CLBLM_L_X10Y102.SLICEM_X0.AMUX.O6") fin = StringIO("CLBLM_L_X10Y102.SLICEM_X0.AMUX.O6")
fout = StringIO.StringIO() fout = StringIO()
try: try:
fasm2frames.run(fin, fout) fasm2frames.run(fin, fout)
self.fail("Expected syntax error") self.fail("Expected syntax error")
@ -111,8 +112,8 @@ class TestStringMethods(unittest.TestCase):
def test_badkey(self): def test_badkey(self):
'''Bad key should throw syntax error''' '''Bad key should throw syntax error'''
fin = StringIO.StringIO("CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX 2") fin = StringIO("CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX 2")
fout = StringIO.StringIO() fout = StringIO()
try: try:
fasm2frames.run(fin, fout) fasm2frames.run(fin, fout)
self.fail("Expected syntax error") self.fail("Expected syntax error")
@ -121,12 +122,12 @@ class TestStringMethods(unittest.TestCase):
def test_dupkey(self): def test_dupkey(self):
'''Duplicate key should throw syntax error''' '''Duplicate key should throw syntax error'''
fin = StringIO.StringIO( fin = StringIO(
"""\ """\
CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX 0 CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX 0
CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX 1 CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX 1
""") """)
fout = StringIO.StringIO() fout = StringIO()
try: try:
fasm2frames.run(fin, fout) fasm2frames.run(fin, fout)
self.fail("Expected syntax error") self.fail("Expected syntax error")
@ -137,12 +138,12 @@ CLBLM_L_X10Y102.SLICEM_X0.SRUSEDMUX 1
'''Verify sparse equivilent to normal encoding''' '''Verify sparse equivilent to normal encoding'''
frm_fn = 'test_data/lut_int.fasm' frm_fn = 'test_data/lut_int.fasm'
fout_sparse = StringIO.StringIO() fout_sparse = StringIO()
fasm2frames.run(open(frm_fn, 'r'), fout_sparse, sparse=True) fasm2frames.run(open(frm_fn, 'r'), fout_sparse, sparse=True)
fout_sparse_txt = fout_sparse.getvalue() fout_sparse_txt = fout_sparse.getvalue()
bits_sparse = frm2bits(fout_sparse_txt) bits_sparse = frm2bits(fout_sparse_txt)
fout_full = StringIO.StringIO() fout_full = StringIO()
fasm2frames.run(open(frm_fn, 'r'), fout_full, sparse=False) fasm2frames.run(open(frm_fn, 'r'), fout_full, sparse=False)
fout_full_txt = fout_full.getvalue() fout_full_txt = fout_full.getvalue()
bits_full = frm2bits(fout_full_txt) bits_full = frm2bits(fout_full_txt)