#!/usr/bin/env python3

import os
import re
import sys
import json


def tag2fasm(grid, seg, tag):
    '''Given tilegrid, segment name and tag, return fasm directive'''
    segj = grid['segments'][seg]

    def clbf(seg, tile, tag_post):
        return '%s.%s 1' % (tile, tag_post)

    def intf(seg, tile, tag_post):
        # Make the selection an argument of the configruation
        m = re.match(r'(.*)[.]([A-Za-z0-9_]+)', tag_post)
        which = m.group(1)
        value = m.group(2)
        site = {
            'clbll_l': 'CENTER_INTER_L',
            'clbll_r': 'CENTER_INTER_R',
            'clblm_l': 'CENTER_INTER_L',
            'clblm_r': 'CENTER_INTER_R',
            'hclk_l': 'HCLK_L',
            'hclk_r': 'HCLK_R',
        }[segj['type']]
        return '%s.%s.%s %s' % (tile, site, which, value)

    m = re.match(r'([A-Za-z0-9_]+)[.](.*)', tag)
    tile_type = m.group(1)
    tag_post = m.group(2)

    # Find associated tile
    for tile in segj['tiles']:
        if grid['tiles'][tile]['type'] == tile_type:
            break
    else:
        raise Exception("Couldn't find tile type %s" % tile_type)

    tag2asm = {
        'CLBLL_L': clbf,
        'CLBLL_R': clbf,
        'CLBLM_L': clbf,
        'CLBLM_R': clbf,
        'INT_L': intf,
        'INT_R': intf,
        'HCLK_L': intf,
        'HCLK_R': intf,
    }
    f = tag2asm.get(tile_type, None)
    if f is None:
        raise Exception("Unhandled segment type %s" % tile_type)
    return f(seg, tile, tag_post)


def run(f_in, f_out, sparse=False):
    with open("%s/%s/tilegrid.json" % (os.getenv("XRAY_DATABASE_DIR"),
                                       os.getenv("XRAY_DATABASE")), "r") as f:
        grid = json.load(f)

    seg = None
    for l in f_in:
        l = l.strip()
        if not l:
            continue
        # seg SEG_CLBLM_L_X10Y102
        # tag CLBLM_L.SLICEM_X0.ALUT.INIT[00]
        m = re.match('(seg|tag) (.*)', l)
        if not m:
            raise Exception("Invalid line %s" % l)
        type = m.group(1)
        if type == 'seg':
            seg = m.group(2)
        elif type == 'tag':
            f_out.write(tag2fasm(grid, seg, m.group(2)) + '\n')
        else:
            raise Exception("Invalid type %s" % type)


if __name__ == '__main__':
    import argparse

    parser = argparse.ArgumentParser(
        description='Convert segprint -d output to .fasm file (FPGA assembly)')

    parser.add_argument(
        'fn_in', default='/dev/stdin', nargs='?', help='Input segment file')
    parser.add_argument(
        'fn_out', default='/dev/stdout', nargs='?', help='Output .fasm file')

    args = parser.parse_args()
    run(open(args.fn_in, 'r'), open(args.fn_out, 'w'))
