diff options
-rw-r--r-- | docs/index.html | 2 | ||||
-rw-r--r-- | icebox/icebox.py | 24 | ||||
-rwxr-xr-x | icebox/icebox_hlc2asc.py | 20 | ||||
-rw-r--r-- | icetime/icetime.cc | 2 |
4 files changed, 45 insertions, 3 deletions
diff --git a/docs/index.html b/docs/index.html index 919122e..a8ab14b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -301,7 +301,7 @@ If you have a bug report please file an issue on github. (<a href="https://githu <p> Recommended reading: <a href="http://www.latticesemi.com/~/media/LatticeSemi/Documents/DataSheets/iCE/iCE40LPHXFamilyDataSheet.pdf">Lattice iCE40 LP/HX Family Datasheet</a>, -<a href="http://www.latticesemi.com/~/media/LatticeSemi/Documents/TechnicalBriefs/SBTICETechnologyLibrary201504.pdf">Lattice iCE Technology Library</a> +<a href="http://www.latticesemi.com/~/media/LatticeSemi/Documents/TechnicalBriefs/SBTICETechnologyLibrary201608.pdf">Lattice iCE Technology Library</a> (Especially the three pages on "Architecture Overview", "PLB Blocks", "Routing", and "Clock/Control Distribution Network" in the Lattice iCE40 LP/HX Family Datasheet. Read that first, then come back here.) </p> diff --git a/icebox/icebox.py b/icebox/icebox.py index 41d6bac..f49d7ed 100644 --- a/icebox/icebox.py +++ b/icebox/icebox.py @@ -704,6 +704,26 @@ class iceconfig: #print('\tafter directions', neighbours) return neighbours + def get_net_number(self, segment): + if not hasattr(self, 'net_map') or self.net_map is None: + self.net_map = {} + for netidx, group in enumerate(sorted(self.all_group_segments())): + for seg in group: + self.net_map[seg] = netidx + + return self.net_map[segment] + + def all_group_segments(self): + if not hasattr(self, 'all_groups') or self.all_groups is None: + all_tiles = set() + for x in range(self.max_x + 1): + for y in range(self.max_y + 1): + if self.tile(x, y) is not None: + all_tiles.add((x, y)) + + self.all_groups = self.group_segments(all_tiles, connect_gb=False) + return self.all_groups + def group_segments(self, all_from_tiles=set(), extra_connections=list(), extra_segments=list(), connect_gb=True): seed_segments = set() seen_segments = set() @@ -957,7 +977,9 @@ class iceconfig: print(line, file=f) for extra_bit in sorted(self.extra_bits): print(".extra_bit %d %d %d" % extra_bit, file=f) - + for net in sorted(self.symbols.keys()): + for sym_key in self.symbols[net]: + print(".sym %s %s" % (net, sym_key), file=f) class tileconfig: def __init__(self, tile): self.bits = set() diff --git a/icebox/icebox_hlc2asc.py b/icebox/icebox_hlc2asc.py index 6fe9d1c..8b82132 100755 --- a/icebox/icebox_hlc2asc.py +++ b/icebox/icebox_hlc2asc.py @@ -742,6 +742,7 @@ class Tile: continue add_entry(entry, bits) + self.symbols = {} self.buffers = [] self.routings = [] self.bits_set = set() @@ -830,6 +831,12 @@ clearing:{:<30} - current set :{}""".format( elif len(fields) >= 5 and (fields[1] == '->' or fields[1] == '~>'): self.read(fields[:3]) self.read(fields[2:]) + elif len(fields) == 3 and fields[1] == '.sym>': + nn = untranslate_netname(self.x, self.y, + self.ic.max_x - 1, + self.ic.max_y - 1, fields[0]) + net = self.ic.get_net_number( (self.x, self.y, nn) ) + self.ic.symbols.setdefault(net, set()).add(fields[2]) else: raise ParseError("Unknown Tile specification format") @@ -907,6 +914,13 @@ class LogicCell: else: self.tile.read(fields) return + elif len(fields) == 3 and fields[1] == '.sym>': + nn = untranslate_netname(self.tile.x, self.tile.y, + self.tile.ic.max_x - 1, + self.tile.ic.max_y - 1, fields[0]) + net = self.tile.ic.get_net_number( (self.tile.x, self.tile.y, nn) ) + self.tile.ic.symbols.setdefault(net, set()).add(fields[2]) + bits = ''.join([ self.lut_bits[15], self.lut_bits[12], @@ -1081,6 +1095,12 @@ Should be at io_tile {},{} io{} self.tile.read(fields[:-1] + [prefix + fields[-1]]) else: self.tile.read(fields) + elif len(fields) == 3 and fields[1] == '.sym>': + nn = untranslate_netname(self.tile.x, self.tile.y, + self.tile.ic.max_x - 1, + self.tile.ic.max_y - 1, fields[0]) + net = self.tile.ic.get_net_number( (self.tile.x, self.tile.y, nn) ) + self.tile.ic.symbols.setdefault(net, set()).add(fields[2]) else: raise ParseError("Unknown IOBlock specification format: {}".format(fields)) diff --git a/icetime/icetime.cc b/icetime/icetime.cc index 16ad142..a5a27a0 100644 --- a/icetime/icetime.cc +++ b/icetime/icetime.cc @@ -1305,7 +1305,7 @@ std::string ecnetname_to_vlog(std::string ec_name) } else { return ec_name; } - } catch(std::invalid_argument e) { // Not numeric and stoi throws exception + } catch(std::invalid_argument &e) { // Not numeric and stoi throws exception return ec_name; } |