aboutsummaryrefslogtreecommitdiffstats
path: root/icebox
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2018-05-31 15:56:34 +0200
committerGitHub <noreply@github.com>2018-05-31 15:56:34 +0200
commitd00a8578f02f444d2759b3d074efe5986e281326 (patch)
tree690e5e16333634d51138840a6a615672bbab2461 /icebox
parentea9553a215955c094fea786c4046ae25a40108f1 (diff)
parentdd5565826677a0b36e6147aca6c6600dfbb704ce (diff)
downloadicestorm-d00a8578f02f444d2759b3d074efe5986e281326.tar.gz
icestorm-d00a8578f02f444d2759b3d074efe5986e281326.tar.bz2
icestorm-d00a8578f02f444d2759b3d074efe5986e281326.zip
Merge pull request #146 from mithro/hlc-fixes
Support both `abc/123` and `123` forms of specifying tracks.
Diffstat (limited to 'icebox')
-rwxr-xr-xicebox/icebox_hlc2asc.py39
1 files changed, 34 insertions, 5 deletions
diff --git a/icebox/icebox_hlc2asc.py b/icebox/icebox_hlc2asc.py
index 0982942..c1c778c 100755
--- a/icebox/icebox_hlc2asc.py
+++ b/icebox/icebox_hlc2asc.py
@@ -692,10 +692,15 @@ class Tile:
self.bits_set = set()
self.bits_cleared = set()
+ def __str__(self):
+ return "{}({}, {}, {})".format(self.__class__.__name__, self.ic.device, self.x, self.y)
+
def apply_directive(self, *fields):
fields = list(fields)
- bits, = [entry[0] for entry in self.db if entry[1:] == fields]
- self.set_bits(bits)
+ bits = [entry[0] for entry in self.db if entry[1:] == fields]
+ if len(bits) == 0:
+ raise ParseError("No bit pattern for {} in {}".format(fields, self))
+ self.set_bits(bits[0])
def set_bits(self, bits):
bits_set = set()
@@ -803,8 +808,19 @@ class LogicCell:
self.seq_bits[2] = '1'
elif fields == ['async_setreset']:
self.seq_bits[3] = '1'
- elif len(fields) >= 3 and (fields[1] == '->' or fields[1] == '<->'):
+ elif len(fields) > 3 and (fields[1] == '->' or fields[1] == '<->'):
+ self.read(fields[:3])
+ self.read(fields[2:])
+ return
+ elif len(fields) == 3 and (fields[1] == '->' or fields[1] == '<->'):
prefix = 'lutff_%d/' % self.index
+
+ # Strip prefix if it is given
+ if fields[0].startswith(prefix):
+ fields[0] = fields[0][len(prefix):]
+ if fields[-1].startswith(prefix):
+ fields[-1] = fields[-1][len(prefix):]
+
if fields[0] == 'out':
self.tile.read([prefix + fields[0]] + fields[1:])
elif fields[-1].startswith('in_'):
@@ -953,8 +969,18 @@ class IOBlock:
== ("padin_glb_netwk", fields[2][10:])]
assert len(bit) == 1
self.tile.ic.extra_bits.add(bit[0])
- elif len(fields) >= 3 and (fields[1] == '->' or fields[1] == '<->'):
+ elif len(fields) > 3 and (fields[1] == '->' or fields[1] == '<->'):
+ self.read(fields[:3])
+ self.read(fields[2:])
+ elif len(fields) == 3 and (fields[1] == '->' or fields[1] == '<->'):
prefix = 'io_%d/' % self.index
+
+ # Strip prefix if it is given
+ if fields[0].startswith(prefix):
+ fields[0] = fields[0][len(prefix):]
+ if fields[-1].startswith(prefix):
+ fields[-1] = fields[-1][len(prefix):]
+
if fields[0] in ('D_IN_0', 'D_IN_1'):
self.tile.read([prefix + fields[0]] + fields[1:])
elif fields[-1] in ('cen',
@@ -989,9 +1015,12 @@ def main1(path):
stack.append(stack[-1].new_block(fields[:-1]))
else:
stack[-1].read(fields)
- except ParseError:
+ except ParseError as e:
sys.stderr.write("Parse error in line %d:\n" % (i + 1))
sys.stderr.write(line)
+ if e.args:
+ sys.stderr.write("\n")
+ print(*e.args, file=sys.stderr)
sys.exit(1)
if len(stack) != 1:
sys.stderr.write("Parse error: unexpected end of file")