mirror of https://github.com/openXC7/prjxray.git
python3, formatting
Signed-off-by: John McMaster <johndmcmaster@gmail.com>
This commit is contained in:
parent
98300b801e
commit
d5fd573d30
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue