mirror of https://github.com/openXC7/prjxray.git
Adding tool for canonicalizing json files.
Fixes #154. Signed-off-by: Tim 'mithro' Ansell <me@mith.ro>
This commit is contained in:
parent
70294b3329
commit
db7e2d7dd3
|
|
@ -0,0 +1,63 @@
|
|||
#!/usr/bin/env python3
|
||||
import re
|
||||
import json
|
||||
import sys
|
||||
|
||||
|
||||
def extract_numbers(s):
|
||||
"""
|
||||
>>> extract_numbers("CLK_HROW_WR10END2_3")
|
||||
('CLK_HROW_WR', 10, 'END', 2, '_', 3)
|
||||
>>> extract_numbers("VBRK_WR1END2")
|
||||
('VBRK_WR', 1, 'END', 2)
|
||||
"""
|
||||
bits = []
|
||||
for m in re.finditer("([^0-9]*)([0-9]*)",s):
|
||||
if m.group(1):
|
||||
bits.append(m.group(1))
|
||||
if m.group(2):
|
||||
bits.append(int(m.group(2)))
|
||||
return tuple(bits)
|
||||
|
||||
|
||||
def sort(data):
|
||||
# FIXME: We assume that a list is a tileconn.json format...
|
||||
if isinstance(data, list):
|
||||
for o in data:
|
||||
o['wire_pairs'].sort(key=lambda o: (extract_numbers(o[0]), extract_numbers(o[1])))
|
||||
|
||||
data.sort(key=lambda o: (o['tile_types'], o['grid_deltas']))
|
||||
else:
|
||||
def walker(o, f):
|
||||
if isinstance(o, dict):
|
||||
for i in o.values():
|
||||
walker(i, f)
|
||||
elif isinstance(o, list):
|
||||
for i in o:
|
||||
walker(i, f)
|
||||
f(o)
|
||||
|
||||
def f(o):
|
||||
if isinstance(o, list):
|
||||
if len(o) > 2:
|
||||
strings = all(isinstance(x, str) for x in o)
|
||||
if strings:
|
||||
o.sort()
|
||||
|
||||
walker(data, f)
|
||||
|
||||
|
||||
def pprint(f, data):
|
||||
sort(data)
|
||||
json.dump(d, f, sort_keys=True, indent=4)
|
||||
f.write('\n')
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) == 1:
|
||||
import doctest
|
||||
doctest.testmod()
|
||||
else:
|
||||
assert len(sys.argv) == 2
|
||||
d = json.load(open(sys.argv[1]))
|
||||
pprint(sys.stdout, d)
|
||||
Loading…
Reference in New Issue