diff options
author | Clifford Wolf <clifford@clifford.at> | 2018-06-20 20:03:12 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-20 20:03:12 +0200 |
commit | 16a9962fb16d50683a7b69835194703c48bc1759 (patch) | |
tree | 02ddc328f5cdf364462542c4aa23e2e2e14acc6d /icebox | |
parent | f0299751529d72b1ed1504439b55502f9630f100 (diff) | |
parent | ac47e8e13c54deace46c84816361240b5d688285 (diff) | |
download | icestorm-16a9962fb16d50683a7b69835194703c48bc1759.tar.gz icestorm-16a9962fb16d50683a7b69835194703c48bc1759.tar.bz2 icestorm-16a9962fb16d50683a7b69835194703c48bc1759.zip |
Merge pull request #162 from elmsfu/hcl2asc/error_messages_and_device_class
icebox_hcl2asc: select device class
Diffstat (limited to 'icebox')
-rwxr-xr-x | icebox/icebox_hlc2asc.py | 57 |
1 files changed, 30 insertions, 27 deletions
diff --git a/icebox/icebox_hlc2asc.py b/icebox/icebox_hlc2asc.py index 58164d5..c26b173 100755 --- a/icebox/icebox_hlc2asc.py +++ b/icebox/icebox_hlc2asc.py @@ -293,7 +293,7 @@ def revert_to_fabout(x, y, net): for i, xy in enumerate(GLB_NETWK_INTERNAL_TILES): if net == 'glb_netwk_%d' % i and (x, y) == xy: return 'fabout' - raise ParseError + raise ParseError("{} is a global netowrk, but not at an expectd location {} {}".format(net, x, y)) return net @@ -517,7 +517,7 @@ def parse_bool(s): return True if s == 'off': return False - raise ParseError + raise ParseError("Unable to parse '{}' as boolean".format(s)) class Main: def __init__(self): @@ -535,17 +535,18 @@ class Main: self.device = fields[1][1:-1].lower() if self.device.startswith('lp') or self.device.startswith('hx'): self.device = self.device[2:] - if self.device == '1k': + if self.device.startswith('1k'): self.ic = icebox.iceconfig() self.ic.setup_empty_1k() - elif self.device == '8k': + elif self.device.startswith('8k'): self.ic = icebox.iceconfig() self.ic.setup_empty_8k() - elif self.device == '384': + elif self.device.startswith('384'): self.ic = icebox.iceconfig() self.ic.setup_empty_384() else: - raise ParseError + raise ParseError("Unknown device {}".format(self.device)) + #elif fields[0] == 'coldboot' and fields[1] == '=' \ # and self.coldboot is None: # # parsed but ignored (can't be represented in IceStorm .asc format) @@ -555,39 +556,39 @@ class Main: # parsed but ignored (can't be represented in IceStorm .asc format) self.warmboot = parse_bool(fields[2]) else: - raise ParseError + raise ParseError("Unknown preamble directive {}".format(fields[0])) def new_block(self, fields): if len(fields) != 3: - raise ParseError + raise ParseError("Expect 3 fields for top block. Received: {}".format(fields)) x = int(fields[1]) y = int(fields[2]) if (x, y) in self.tiles: return self.tiles[x, y] if fields[0] == 'logic_tile': if (x, y) not in self.ic.logic_tiles: - raise ParseError + raise ParseError("{} position({},{}) not in defined list for device".format(fields[0], x, y)) tile = LogicTile(self.ic, x, y) elif fields[0] == 'ramb_tile': if (x, y) not in self.ic.ramb_tiles: - raise ParseError + raise ParseError("{} position({},{}) not in defined list for device".format(fields[0], x, y)) tile = RAMBTile(self.ic, x, y) elif fields[0] == 'ramt_tile': if (x, y) not in self.ic.ramt_tiles: - raise ParseError + raise ParseError("{} position({},{}) not in defined list for device".format(fields[0], x, y)) tile = RAMTTile(self.ic, x, y) elif fields[0] == 'io_tile': if (x, y) not in self.ic.io_tiles: - raise ParseError + raise ParseError("{} position({},{}) not in defined list for device".format(fields[0], x, y)) tile = IOTile(self.ic, x, y) else: - raise ParseError + raise ParseError("Unknown tile type {}".format(fields[0])) self.tiles[x, y] = tile return tile def writeout(self): if self.ic is None: - raise ParseError + raise ParseError("iceconfig not set") # fix up IE/REN bits unused_ieren = set() @@ -792,10 +793,10 @@ clearing:{:<30} - current set :{}""".format( self.read(fields[:3]) self.read(fields[2:]) else: - raise ParseError + raise ParseError("Unknown Tile specification format") def new_block(self, fields): - raise ParseError + raise ParseError("Unepxected new block in {}".format(type(self).__name__)) class LogicTile(Tile): def __init__(self, ic, x, y): @@ -819,7 +820,7 @@ class LogicTile(Tile): if fields == ['lutff_%d' % i] and self.cells[i] is None: self.cells[i] = LogicCell(self, i) return self.cells[i] - raise ParseError + raise ParseError("Unepxected new block in {}".format(type(self).__name__)) class LogicCell: def __init__(self, tile, index): @@ -836,7 +837,8 @@ class LogicCell: if m: lut_bits = m.group(2) if len(lut_bits) != int(m.group(1)): - raise ParseError + raise ParseError("Number of bits({}) given don't match expected ({})" + .format(len(lut_bits), int(m.group(1)))) m = len(lut_bits) if m < 16: lut_bits = (16-m) * "0" + lut_bits @@ -894,7 +896,7 @@ class LogicCell: self.tile.data[self.index * 2 + 1][46:] def new_block(self, fields): - raise ParseError + raise ParseError("Unepxected new block in {}".format(type(self).__name__)) class RAMData: def __init__(self, data): @@ -904,10 +906,10 @@ class RAMData: if len(fields) == 1: self.data.append(fields[0]) else: - raise ParseError + raise ParseError("Unepxected format in {}".format(type(self).__name__)) def new_block(self, fields): - raise ParseError + raise ParseError("Unepxected new block in {}".format(type(self).__name__)) class RAMBTile(Tile): def __init__(self, ic, x, y): @@ -924,7 +926,7 @@ class RAMBTile(Tile): if fields == ['data'] and (self.x, self.y) not in self.ic.ram_data: self.ic.ram_data[self.x, self.y] = data = [] return RAMData(data) - raise ParseError + raise ParseError("Unepxected new block in {}".format(type(self).__name__)) class RAMTTile(Tile): def __init__(self, ic, x, y): @@ -954,7 +956,7 @@ class IOTile(Tile): if fields == ['io_1'] and self.blocks[1] is None: self.blocks[1] = IOBlock(self, 1) return self.blocks[1] - raise ParseError + raise ParseError("Unepxected new block in {}".format(type(self).__name__)) class IOBlock: def __init__(self, tile, index): @@ -1008,7 +1010,7 @@ class IOBlock: and fields[2].startswith('glb_netwk_'): if GLB_NETWK_EXTERNAL_BLOCKS[int(fields[2][10:])] \ != (self.tile.x, self.tile.y, self.index): - raise ParseError + raise ParseError("GLOBAL_BUFFER_OUTPUT not valid") bit = [bit for bit in self.tile.ic.extra_bits_db() if self.tile.ic.extra_bits_db()[bit] == ("padin_glb_netwk", fields[2][10:])] @@ -1039,10 +1041,11 @@ class IOBlock: else: self.tile.read(fields) else: - raise ParseError + raise ParseError("Unknown IOBlock specification format: {}".format(fields)) + def new_block(self, fields): - raise ParseError + raise ParseError("Unepxected new block in {}".format(type(self).__name__)) def main1(path): f = open(path, 'r') @@ -1055,7 +1058,7 @@ def main1(path): elif fields == ['}']: stack.pop() if not stack: - raise ParseError + raise ParseError("Parsing stack empty before expected") elif fields[-1] == '{': stack.append(stack[-1].new_block(fields[:-1])) else: |