#!/usr/bin/env python3

import re

print("// auto-generated by timings.py from ../icefuzz/timings_*.txt")

def timings_to_c(chip, f):
    print("")
    print("double get_delay_%s(std::string cell_type, std::string in_port, std::string out_port)" % chip)
    print("{")

    in_cell = False
    last_cell = ""
    for line in f:
        fields = line.split()
        if len(fields) == 0:
            continue

        if fields[0] == "CELL":
            if in_cell:
                if last_cell.startswith("SB_MAC16"):
                    # DSPs have incomplete timing specification, as some paths
                    # don't mathematically exist - e.g. there is no path from
                    # A[1] to O[0]
                    print("    if (in_port != \"*clkedge*\" && out_port != \"*setup*\") return 0.0;")
                print("  }")
            print("  if (cell_type == \"%s\") {" % fields[1])
            last_cell = fields[1]
            in_cell = True

        if fields[0] == "SETUP":
            inport = fields[1].split(":")[1]
            delay = max([0 if s == "*" else float(s) / 1000 for s in fields[3].split(":")])
            print("    if (in_port == \"%s\" && out_port == \"*setup*\") return %.5f;" % (inport, delay))

        if fields[0] == "IOPATH":
            if fields[1].startswith("posedge:") or fields[1].startswith("negedge:"):
                fields[1] = "*clkedge*"
            delay = max([0 if s == "*" else float(s) / 1000 for s in fields[3].split(":") + fields[4].split(":")])
            print("    if (in_port == \"%s\" && out_port == \"%s\") return %.5f;" % (fields[1], fields[2], delay))


    if in_cell:
        print("  }")
    print("  if (in_port == \"*clkedge*\"|| out_port == \"*setup*\") return 0;")
    print("  fprintf(stderr, \"Unable to resolve delay for path %s -> %s in cell type %s!\\n\", in_port.c_str(), out_port.c_str(), cell_type.c_str());")
    print("  exit(1);")
    print("}")

for db in "lp384 lp1k lp8k hx1k hx8k up5k".split():
    with open("../icefuzz/timings_%s.txt" % db, "r") as f:
        timings_to_c(db, f);
