Drastically reduce number of linker symbols in chipdb

Signed-off-by: Clifford Wolf <clifford@clifford.at>
This commit is contained in:
Clifford Wolf 2018-06-13 23:55:18 +02:00
parent 342290d6bd
commit c94b8c4861

View File

@ -2,6 +2,7 @@
import sys import sys
import re import re
import textwrap
dev_name = None dev_name = None
dev_width = None dev_width = None
@ -347,11 +348,14 @@ print('#include "nextpnr.h"')
print('namespace {') print('namespace {')
print('USING_NEXTPNR_NAMESPACE') print('USING_NEXTPNR_NAMESPACE')
index = 0
print("static BelWirePOD bel_wires[] = {")
for bel in range(len(bel_name)): for bel in range(len(bel_name)):
print("static BelWirePOD bel_wires_%d[%d] = {" % (bel, len(bel_wires[bel]))) print("#define bel_wires_%d (bel_wires+%d)" % (bel, index))
for i in range(len(bel_wires[bel])): for i in range(len(bel_wires[bel])):
print(" {%d, PIN_%s}%s" % (bel_wires[bel][i] + ("," if i+1 < len(bel_wires[bel]) else "",))) print(" {%d, PIN_%s}," % bel_wires[bel][i])
print("};") index += 1
print("};")
print("static BelInfoPOD bel_data_%s[%d] = {" % (dev_name, len(bel_name))) print("static BelInfoPOD bel_data_%s[%d] = {" % (dev_name, len(bel_name)))
for bel in range(len(bel_name)): for bel in range(len(bel_name)):
@ -364,6 +368,10 @@ wireinfo = list()
pipinfo = list() pipinfo = list()
pipcache = dict() pipcache = dict()
uppips_array = list()
downpips_array = list()
downbels_array = list()
for wire in range(num_wires): for wire in range(num_wires):
if wire in wire_uphill: if wire in wire_uphill:
pips = list() pips = list()
@ -374,7 +382,8 @@ for wire in range(num_wires):
pips.append("%d" % pipcache[(src, wire)]) pips.append("%d" % pipcache[(src, wire)])
num_uphill = len(pips) num_uphill = len(pips)
list_uphill = "wire%d_uppips" % wire list_uphill = "wire%d_uppips" % wire
print("static int wire%d_uppips[] = {%s};" % (wire, ", ".join(pips))) print("#define wire%d_uppips (wire_uppips+%d)" % (wire, len(uppips_array)))
uppips_array += pips
else: else:
num_uphill = 0 num_uphill = 0
list_uphill = "nullptr" list_uphill = "nullptr"
@ -388,16 +397,17 @@ for wire in range(num_wires):
pips.append("%d" % pipcache[(wire, dst)]) pips.append("%d" % pipcache[(wire, dst)])
num_downhill = len(pips) num_downhill = len(pips)
list_downhill = "wire%d_downpips" % wire list_downhill = "wire%d_downpips" % wire
print("static int wire%d_downpips[] = {%s};" % (wire, ", ".join(pips))) print("#define wire%d_downpips (wire_downpips+%d)" % (wire, len(downpips_array)))
downpips_array += pips
else: else:
num_downhill = 0 num_downhill = 0
list_downhill = "nullptr" list_downhill = "nullptr"
if wire in wire_downhill_belports: if wire in wire_downhill_belports:
num_bels_downhill = len(wire_downhill_belports[wire]) num_bels_downhill = len(wire_downhill_belports[wire])
print("static BelPortPOD wire%d_downbels[] = {" % wire)
print(",\n".join([" {%d, PIN_%s}" % it for it in wire_downhill_belports[wire]])) print("#define wire%d_downbels (wire_downbels+%d)" % (wire, len(downbels_array)))
print("};") downbels_array += ["{%d, PIN_%s}" % it for it in wire_downhill_belports[wire]]
else: else:
num_bels_downhill = 0 num_bels_downhill = 0
@ -424,6 +434,18 @@ for wire in range(num_wires):
wireinfo.append(info) wireinfo.append(info)
print("static int wire_uppips[] = {")
print(" " + "\n ".join(textwrap.wrap(", ".join(uppips_array))))
print("};");
print("static int wire_downpips[] = {")
print(" " + "\n ".join(textwrap.wrap(", ".join(downpips_array))))
print("};");
print("static BelPortPOD wire_downbels[] = {")
print(" " + "\n ".join(textwrap.wrap(", ".join(downbels_array))))
print("};");
packageinfo = [] packageinfo = []
for package in packages: for package in packages:
@ -436,7 +458,7 @@ for package in packages:
bel_idx = bel_name.index(pin_bel) bel_idx = bel_name.index(pin_bel)
pins_info.append('{"%s", %d}' % (pinname, bel_idx)) pins_info.append('{"%s", %d}' % (pinname, bel_idx))
print("static PackagePinPOD package_%s_pins[%d] = {" % (safename, len(pins_info))) print("static PackagePinPOD package_%s_pins[%d] = {" % (safename, len(pins_info)))
print(",\n".join(pins_info)) print(" " + ",\n ".join(pins_info))
print("};") print("};")
packageinfo.append('{"%s", %d, package_%s_pins}' % (name, len(pins_info), safename)) packageinfo.append('{"%s", %d, package_%s_pins}' % (name, len(pins_info), safename))
@ -458,7 +480,7 @@ for t in range(num_tile_types):
print("static ConfigBitPOD tile%d_%s_bits[%d] = {%s};" % (t, safename, len(bits_list), ", ".join(bits_list))) print("static ConfigBitPOD tile%d_%s_bits[%d] = {%s};" % (t, safename, len(bits_list), ", ".join(bits_list)))
centries_info.append('{"%s", %d, tile%d_%s_bits}' % (name, len(bits_list), t, safename)) centries_info.append('{"%s", %d, tile%d_%s_bits}' % (name, len(bits_list), t, safename))
print("static ConfigEntryPOD tile%d_config[%d] = {" % (t, len(centries_info))) print("static ConfigEntryPOD tile%d_config[%d] = {" % (t, len(centries_info)))
print(",\n".join(centries_info)) print(" " + ",\n ".join(centries_info))
print("};") print("};")
tileinfo.append("{%d, %d, %d, tile%d_config}" % (tile_sizes[t][0], tile_sizes[t][1], len(centries_info), t)) tileinfo.append("{%d, %d, %d, tile%d_config}" % (tile_sizes[t][0], tile_sizes[t][1], len(centries_info), t))
@ -480,37 +502,37 @@ for ieren in ierens:
iereninfo.append("{%d, %d, %d, %d, %d, %d}" % ieren) iereninfo.append("{%d, %d, %d, %d, %d, %d}" % ieren)
print("static WireInfoPOD wire_data_%s[%d] = {" % (dev_name, num_wires)) print("static WireInfoPOD wire_data_%s[%d] = {" % (dev_name, num_wires))
print(",\n".join(wireinfo)) print(" " + ",\n ".join(wireinfo))
print("};") print("};")
print("static PipInfoPOD pip_data_%s[%d] = {" % (dev_name, len(pipinfo))) print("static PipInfoPOD pip_data_%s[%d] = {" % (dev_name, len(pipinfo)))
print(",\n".join(pipinfo)) print(" " + ",\n ".join(pipinfo))
print("};") print("};")
print("static SwitchInfoPOD switch_data_%s[%d] = {" % (dev_name, len(switchinfo))) print("static SwitchInfoPOD switch_data_%s[%d] = {" % (dev_name, len(switchinfo)))
print(",\n".join(switchinfo)) print(" " + ",\n ".join(switchinfo))
print("};") print("};")
print("static TileInfoPOD tile_data_%s[%d] = {" % (dev_name, num_tile_types)) print("static TileInfoPOD tile_data_%s[%d] = {" % (dev_name, num_tile_types))
print(",\n".join(tileinfo)) print(" " + ",\n ".join(tileinfo))
print("};") print("};")
print("static IerenInfoPOD ieren_data_%s[%d] = {" % (dev_name, len(iereninfo))) print("static IerenInfoPOD ieren_data_%s[%d] = {" % (dev_name, len(iereninfo)))
print(",\n".join(iereninfo)) print(" " + ",\n ".join(iereninfo))
print("};") print("};")
print("static BitstreamInfoPOD bits_info_%s = {" % dev_name) print("static BitstreamInfoPOD bits_info_%s = {" % dev_name)
print("%d, %d, tile_data_%s, switch_data_%s, ieren_data_%s" % (len(switchinfo), len(iereninfo), dev_name, dev_name, dev_name)) print(" %d, %d, tile_data_%s, switch_data_%s, ieren_data_%s" % (len(switchinfo), len(iereninfo), dev_name, dev_name, dev_name))
print("};") print("};")
print("static TileType tile_grid_%s[%d] = {" % (dev_name, len(tilegrid))) print("static TileType tile_grid_%s[%d] = {" % (dev_name, len(tilegrid)))
print(",\n".join(tilegrid)) print(" " + ",\n ".join(tilegrid))
print("};") print("};")
print("static PackageInfoPOD package_info_%s[%d] = {" % (dev_name, len(packageinfo))) print("static PackageInfoPOD package_info_%s[%d] = {" % (dev_name, len(packageinfo)))
print(",\n".join(packageinfo)) print(" " + ",\n ".join(packageinfo))
print("};") print("};")
print('}') print('}')