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
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):

View File

@ -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)