From 353a3385056a9637d31a9c9d125bc284c811a876 Mon Sep 17 00:00:00 2001 From: Tim 'mithro' Ansell Date: Wed, 30 May 2018 12:41:51 -0700 Subject: Support both `abc/123` and `123` forms of specifying tracks. Kind of fixes #145. --- icebox/icebox_hlc2asc.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'icebox') diff --git a/icebox/icebox_hlc2asc.py b/icebox/icebox_hlc2asc.py index 0982942..a8b7a30 100755 --- a/icebox/icebox_hlc2asc.py +++ b/icebox/icebox_hlc2asc.py @@ -805,6 +805,13 @@ class LogicCell: self.seq_bits[3] = '1' 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_'): @@ -955,6 +962,13 @@ class IOBlock: self.tile.ic.extra_bits.add(bit[0]) 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', -- cgit v1.2.3 From f7e9fec63a3f88bee8c27e858da319ea03d68d14 Mon Sep 17 00:00:00 2001 From: Tim 'mithro' Ansell Date: Wed, 30 May 2018 13:05:20 -0700 Subject: Allow prefixes in multiple chained statements. IE ``` lutff_1 { lutff_1/out -> local_g2_1 -> lutff_1/in_0 local_g2_2 -> lutff_1/in_3 local_g2_7 -> lutff_1/in_2 } ``` --- icebox/icebox_hlc2asc.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'icebox') diff --git a/icebox/icebox_hlc2asc.py b/icebox/icebox_hlc2asc.py index a8b7a30..97a0386 100755 --- a/icebox/icebox_hlc2asc.py +++ b/icebox/icebox_hlc2asc.py @@ -803,7 +803,11 @@ 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 @@ -960,7 +964,10 @@ 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 -- cgit v1.2.3 From dd5565826677a0b36e6147aca6c6600dfbb704ce Mon Sep 17 00:00:00 2001 From: Tim 'mithro' Ansell Date: Wed, 30 May 2018 13:11:18 -0700 Subject: Better error message when bit pattern is missing. Previously; ``` self.apply_directive('buffer', src, dst) File "/usr/local/google/home/tansell/work/catx/vtr/env/conda/bin/icebox_hlc2asc", line 698, in apply_directive bits, = [entry[0] for entry in self.db if entry[1:] == fields] ValueError: not enough values to unpack (expected 1, got 0) ``` Now: ``` Parse error in line 2108: span12_y4_g14_0 -> span4_y4_g11_7 <-> span4_x7_g4_0 No bit pattern for ['buffer', 'sp12_h_r_11', 'sp4_h_r_7'] in LogicTile(1k, 7, 4) ``` --- icebox/icebox_hlc2asc.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'icebox') diff --git a/icebox/icebox_hlc2asc.py b/icebox/icebox_hlc2asc.py index 97a0386..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() @@ -1010,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") -- cgit v1.2.3