diff options
Diffstat (limited to 'icetime/timings.py')
-rw-r--r-- | icetime/timings.py | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/icetime/timings.py b/icetime/timings.py new file mode 100644 index 0000000..e559338 --- /dev/null +++ b/icetime/timings.py @@ -0,0 +1,49 @@ +#!/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 + + for line in f: + fields = line.split() + if len(fields) == 0: + continue + + if fields[0] == "CELL": + if in_cell: + print(" }") + print(" if (cell_type == \"%s\") {" % 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("}") + +with open("../icefuzz/timings_1k.txt", "r") as f: + timings_to_c("1k", f); + +with open("../icefuzz/timings_8k.txt", "r") as f: + timings_to_c("8k", f); + |