#!/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)
