nextpnr/ice40/chipdb.py
Clifford Wolf 757786f134 Progress in ice40 chipdb
Signed-off-by: Clifford Wolf <clifford@clifford.at>
2018-05-26 14:56:30 +02:00

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("};")