| import pip_classes | |
| import extract_ncl_routing | |
| import parse_sdf | |
| import sys | |
| def get_equations(ncl): | |
| signals, bels = extract_ncl_routing.parse_ncl(ncl) | |
| wire_fanout = {} # wire, pipclass -> fanout | |
| path_pip_classes = {} # (src, dest) -> [(wire, pipclass)] | |
| for name, sig in sorted(signals.items()): | |
| nd = extract_ncl_routing.net_to_dict(sig, bels) | |
| drivers, loads, route = sig | |
| if len(drivers) != 1: | |
| continue | |
| if nd is None: | |
| continue | |
| drv = drivers[0] | |
| for load in loads: | |
| path = [] | |
| if load not in nd: | |
| continue | |
| wire = nd[load] | |
| skip = False | |
| while wire != drv: | |
| path.append(wire) | |
| if wire not in nd: | |
| skip = True | |
| break | |
| wire = nd[wire] | |
| if skip: | |
| continue | |
| path.reverse() | |
| path_pip_classes[drv, load] = [] | |
| for i in range(len(path) - 1): | |
| pip_src = path[i] | |
| pip_dst = path[i+1] | |
| pip_class = pip_classes.get_pip_class(pip_src, pip_dst) | |
| if pip_class is None: | |
| skip = True | |
| break | |
| path_pip_classes[drv, load].append((pip_src, pip_class)) | |
| wire_fanout[pip_src, pip_class] = wire_fanout.get((pip_src, pip_class), 0) + 1 | |
| if skip: | |
| del path_pip_classes[drv, load] | |
| continue | |
| return path_pip_classes, wire_fanout | |
| def main(): | |
| path_pip_classes, wire_fanout = get_equations(sys.argv[1]) | |
| """ | |
| for k, v in sorted(path_pip_classes.items()): | |
| src, dst = k | |
| pname = "({}.{}, {}.{})".format(src[0], src[1], dst[0], dst[1]) | |
| print("{} = {}".format(pname, " + ".join(x[1] for x in v))) | |
| """ | |
| pip_class_count = {} | |
| for pips in path_pip_classes.values(): | |
| for pip in pips: | |
| src, pip_class = pip | |
| pip_class_count[pip_class] = pip_class_count.get(pip_class, 0) + 1 | |
| for pip_class, count in sorted(pip_class_count.items()): | |
| print("{} = {}".format(pip_class, count)) | |
| if __name__ == "__main__": | |
| main() |