|  | #!/usr/bin/env python3 | 
|  | import os | 
|  | import sys, re | 
|  |  | 
|  | db = set() | 
|  | text_db = dict() | 
|  | mode_8k = False | 
|  | mode_384 = False | 
|  | cur_text_db = None | 
|  | max_x, max_y = 0, 0 | 
|  |  | 
|  | device_class = os.getenv("ICEDEVICE") | 
|  |  | 
|  | for filename in sys.argv[1:]: | 
|  | with open(filename, "r") as f: | 
|  | ignore = False | 
|  | for line in f: | 
|  | if line == "\n": | 
|  | pass | 
|  | elif line.startswith("GlobalNetwork"): | 
|  | cur_text_db = set() | 
|  | ignore = False | 
|  | elif line.startswith("IO"): | 
|  | match = re.match("IO_Tile_(\d+)_(\d+)", line) | 
|  | assert match | 
|  | max_x = max(max_x, int(match.group(1))) | 
|  | max_y = max(max_y, int(match.group(2))) | 
|  | cur_text_db = text_db.setdefault("io", set()) | 
|  | ignore = False | 
|  | elif line.startswith("Logic"): | 
|  | cur_text_db = text_db.setdefault("logic", set()) | 
|  | ignore = False | 
|  | elif line.startswith("RAM"): | 
|  | match = re.match(r"RAM_Tile_\d+_(\d+)", line) | 
|  | if int(match.group(1)) % 2 == 1: | 
|  | cur_text_db = text_db.setdefault("ramb_" + device_class if device_class in ["5k", "8k"] else "ramb", set()) | 
|  | else: | 
|  | cur_text_db = text_db.setdefault("ramt_" + device_class if device_class in ["5k", "8k"] else "ramt", set()) | 
|  | ignore = False | 
|  | elif device_class == "5k" and line.startswith("IpCon"): | 
|  | cur_text_db = text_db.setdefault("ipcon_5k", set()) | 
|  | ignore = False | 
|  | elif device_class == "5k" and line.startswith("DSP"): | 
|  | match = re.match(r"DSP_Tile_\d+_(\d+)", line) | 
|  | ypos = int(match.group(1)) | 
|  | dsp_idx = None | 
|  | if ypos in [5, 10, 15, 23]: | 
|  | dsp_idx = 0 | 
|  | if ypos in [6, 11, 16, 24]: | 
|  | dsp_idx = 1 | 
|  | if ypos in [7, 12, 17, 25]: | 
|  | dsp_idx = 2 | 
|  | if ypos in [8, 13, 18, 26]: | 
|  | dsp_idx = 3 | 
|  | assert dsp_idx != None | 
|  | cur_text_db = text_db.setdefault("dsp%d_5k" % dsp_idx, set()) | 
|  | ignore = False | 
|  | elif not ignore: | 
|  | print("'" + line + "'") | 
|  | assert line.startswith(" ") | 
|  | cur_text_db.add(line) | 
|  |  | 
|  | def logic_op_prefix(match): | 
|  | x = int(match.group(1)) | 
|  | y = int(match.group(2)) | 
|  | if x == 0: return " IO_L.logic_op_" | 
|  | if y == 0: return " IO_B.logic_op_" | 
|  | if x == max_x: return " IO_R.logic_op_" | 
|  | if y == max_y: return " IO_T.logic_op_" | 
|  | assert False | 
|  |  | 
|  | for tile_type in text_db: | 
|  | for line in text_db[tile_type]: | 
|  | line = re.sub(" T_(\d+)_(\d+)\.logic_op_", logic_op_prefix, line) | 
|  | line = re.sub(" T_\d+_\d+\.", " ", line) | 
|  | m = re.match(" *(\([\d ]+\)) +\([\d ]+\) +\([\d ]+\) +(.*\S)", line) | 
|  | if m: db.add("%s %s %s" % (tile_type, m.group(1), m.group(2))) | 
|  |  | 
|  | for line in sorted(db): | 
|  | print(line) |