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 @@
         #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 @@
                     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 @@
                 continue
             add_entry(entry, bits)
 
+        self.symbols = {}
         self.buffers = []
         self.routings = []
         self.bits_set = set()
@@ -830,6 +831,12 @@
         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 @@
             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 @@
                 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))
 
