115 lines
3.1 KiB
Python
115 lines
3.1 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import sys
|
|
|
|
dev_name = None
|
|
dev_width = None
|
|
dev_height = None
|
|
num_wires = None
|
|
|
|
wire_uphill = dict()
|
|
wire_downhill = dict()
|
|
wire_bidir = dict()
|
|
|
|
with open(sys.argv[1], "r") as f:
|
|
mode = None
|
|
|
|
for line in f:
|
|
line = line.split()
|
|
|
|
if len(line) == 0 or line[0] == "#":
|
|
continue
|
|
|
|
if line[0] == ".device":
|
|
dev_name = line[1]
|
|
dev_width = int(line[2])
|
|
dev_height = int(line[3])
|
|
num_wires = int(line[4])
|
|
continue
|
|
|
|
if line[0] == ".net":
|
|
mode = ("net", int(line[1]))
|
|
continue
|
|
|
|
if line[0] == ".buffer":
|
|
mode = ("buffer", int(line[3]))
|
|
continue
|
|
|
|
if line[0] == ".routing":
|
|
mode = ("routing", int(line[3]))
|
|
continue
|
|
|
|
if (line[0][0] == ".") or (mode is None):
|
|
mode = None
|
|
continue
|
|
|
|
if mode[0] == "net":
|
|
continue
|
|
|
|
if mode[0] == "buffer":
|
|
wire_a = int(line[1])
|
|
wire_b = mode[1]
|
|
if wire_a not in wire_downhill:
|
|
wire_downhill[wire_a] = set()
|
|
if wire_b not in wire_uphill:
|
|
wire_uphill[wire_b] = set()
|
|
wire_downhill[wire_a].add(wire_b)
|
|
wire_uphill[wire_b].add(wire_a)
|
|
continue
|
|
|
|
if mode[0] == "routing":
|
|
wire_a = int(line[1])
|
|
wire_b = mode[1]
|
|
if wire_a not in wire_bidir:
|
|
wire_bidir[wire_a] = set()
|
|
if wire_b not in wire_bidir:
|
|
wire_bidir[wire_b] = set()
|
|
wire_bidir[wire_a].add(wire_b)
|
|
wire_bidir[wire_b].add(wire_b)
|
|
continue
|
|
|
|
print('#include "chip.h"')
|
|
|
|
wireinfo = list()
|
|
|
|
for wire in range(num_wires):
|
|
num_uphill = 0
|
|
num_downhill = 0
|
|
num_bidir = 0
|
|
|
|
has_bel_uphill = False
|
|
num_bels_downhill = 0
|
|
|
|
if wire in wire_uphill:
|
|
num_uphill = len(wire_uphill[wire])
|
|
print("static WireDelayPOD wire%d_uphill[] = {" % wire)
|
|
print(",\n".join([" {%d, 1.0}" % other_wire for other_wire in wire_uphill[wire]]))
|
|
print("};")
|
|
|
|
if wire in wire_downhill:
|
|
num_downhill = len(wire_downhill[wire])
|
|
print("static WireDelayPOD wire%d_downhill[] = {" % wire)
|
|
print(",\n".join([" {%d, 1.0}" % other_wire for other_wire in wire_downhill[wire]]))
|
|
print("};")
|
|
|
|
if wire in wire_bidir:
|
|
num_bidir = len(wire_bidir[wire])
|
|
print("static WireDelayPOD wire%d_bidir[] = {" % wire)
|
|
print(",\n".join([" {%d, 1.0}" % other_wire for other_wire in wire_bidir[wire]]))
|
|
print("};")
|
|
|
|
info = " {"
|
|
info += "\"wire%d\", " % wire
|
|
info += "%d, %d, %d, " % (num_uphill, num_downhill, num_bidir)
|
|
info += ("wire%d_uphill, " % wire) if num_uphill > 0 else "nullptr, "
|
|
info += ("wire%d_downhill, " % wire) if num_downhill > 0 else "nullptr, "
|
|
info += ("wire%d_bidir, " % wire) if num_bidir > 0 else "nullptr, "
|
|
info += "}"
|
|
|
|
wireinfo.append(info)
|
|
|
|
print("int num_wires_%s = %d;" % (dev_name, num_wires))
|
|
print("WireInfoPOD wire_data_%s[%d] = {" % (dev_name, num_wires))
|
|
print(",\n".join(wireinfo))
|
|
print("};")
|