mirror of https://github.com/openXC7/prjxray.git
Merge pull request #34 from SymbiFlow/tileconnloops
Add tileconnloops.py script
This commit is contained in:
commit
ed8b8a79ef
|
|
@ -0,0 +1,82 @@
|
|||
#!/usr/bin/env python3
|
||||
#
|
||||
# Produces a complete database of wires in the ROI and their connections and tests if each
|
||||
# routing node is a tree (i.e. fails with an error when a loop is found).
|
||||
|
||||
import os, sys, json
|
||||
|
||||
with open("%s/%s/tilegrid.json" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")), "r") as f:
|
||||
tilegrid = json.load(f)["tiles"]
|
||||
|
||||
with open("%s/%s/tileconn.json" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")), "r") as f:
|
||||
tileconn = json.load(f)
|
||||
|
||||
grid = dict()
|
||||
wirepairs = dict()
|
||||
remwires = set()
|
||||
|
||||
for tilename, tiledata in tilegrid.items():
|
||||
key = (tiledata["grid_x"], tiledata["grid_y"])
|
||||
grid[key] = tilename
|
||||
|
||||
def check_tileconn_entry(tilename, tiledata, entry, idx):
|
||||
if idx == 0:
|
||||
otheridx = 1
|
||||
otherxy = (tiledata["grid_x"] + entry["grid_deltas"][0], tiledata["grid_y"] + entry["grid_deltas"][1])
|
||||
else:
|
||||
otheridx = 0
|
||||
otherxy = (tiledata["grid_x"] - entry["grid_deltas"][0], tiledata["grid_y"] - entry["grid_deltas"][1])
|
||||
|
||||
if otherxy not in grid:
|
||||
return
|
||||
|
||||
othertilename = grid[otherxy]
|
||||
othertiledata = tilegrid[othertilename]
|
||||
|
||||
if othertiledata["type"] != entry["tile_types"][otheridx]:
|
||||
return
|
||||
|
||||
print(" Found relevant entry (%s %s %d %d): %s" % (entry["tile_types"][0], entry["tile_types"][1],
|
||||
entry["grid_deltas"][0], entry["grid_deltas"][1], othertilename))
|
||||
|
||||
for pair in entry["wire_pairs"]:
|
||||
wirename = "%s/%s" % (tilename, pair[idx])
|
||||
otherwirename = "%s/%s" % (othertilename, pair[otheridx])
|
||||
|
||||
remwires.add(wirename)
|
||||
remwires.add(otherwirename)
|
||||
|
||||
if wirename not in wirepairs:
|
||||
wirepairs[wirename] = set()
|
||||
wirepairs[wirename].add(otherwirename)
|
||||
|
||||
if otherwirename not in wirepairs:
|
||||
wirepairs[otherwirename] = set()
|
||||
wirepairs[otherwirename].add(wirename)
|
||||
|
||||
for tilename, tiledata in tilegrid.items():
|
||||
print("Connecting wires in tile %s." % tilename)
|
||||
for entry in tileconn:
|
||||
if entry["tile_types"][0] == tiledata["type"]:
|
||||
check_tileconn_entry(tilename, tiledata, entry, 0)
|
||||
if entry["tile_types"][1] == tiledata["type"]:
|
||||
check_tileconn_entry(tilename, tiledata, entry, 1)
|
||||
|
||||
def check_wire(wire, source):
|
||||
for next_wire in wirepairs[wire]:
|
||||
if next_wire == source:
|
||||
continue
|
||||
print(" %s" % next_wire)
|
||||
if next_wire not in remwires:
|
||||
print(" ** FOUND LOOP IN THIS NODE **")
|
||||
sys.exit(1)
|
||||
remwires.remove(next_wire)
|
||||
check_wire(next_wire, wire)
|
||||
|
||||
while len(remwires):
|
||||
wire = remwires.pop()
|
||||
print("Checking %s:" % wire)
|
||||
check_wire(wire, None)
|
||||
|
||||
print("NO LOOP FOUND: OK")
|
||||
|
||||
Loading…
Reference in New Issue