aboutsummaryrefslogtreecommitdiffstats
path: root/icebox
diff options
context:
space:
mode:
authorTim 'mithro' Ansell <me@mith.ro>2018-06-12 17:48:50 -0700
committerTim 'mithro' Ansell <me@mith.ro>2018-06-14 17:54:25 -0700
commitbb025493aae0ce64b0740d8aa8d297c541a04fce (patch)
tree1648ec4ba48cdd8d3c1c631c4ad7ac7a624db6ab /icebox
parentf23b1f212affec49cc55df819cd47e0428b6eb78 (diff)
downloadicestorm-bb025493aae0ce64b0740d8aa8d297c541a04fce.tar.gz
icestorm-bb025493aae0ce64b0740d8aa8d297c541a04fce.tar.bz2
icestorm-bb025493aae0ce64b0740d8aa8d297c541a04fce.zip
icebox_hlcsort: Adding a tool for canonicalizing HLC files.
This is done by sorting all the commands inside a block. Doing so makes it much easier to diff two files.
Diffstat (limited to 'icebox')
-rwxr-xr-xicebox/icebox_hlcsort.py41
1 files changed, 41 insertions, 0 deletions
diff --git a/icebox/icebox_hlcsort.py b/icebox/icebox_hlcsort.py
new file mode 100755
index 0000000..8696449
--- /dev/null
+++ b/icebox/icebox_hlcsort.py
@@ -0,0 +1,41 @@
+#!/usr/bin/env python3
+import sys
+
+top_levels = []
+f = open(sys.argv[1])
+
+current_block_stack = [top_levels]
+while len(current_block_stack) > 0:
+ line = f.readline()
+ if not line:
+ break
+
+ if '#' in line:
+ continue
+
+ if '{' in line:
+ new_block = []
+ current_block_stack[-1].append(new_block)
+ current_block_stack.append(new_block)
+
+ if line.strip():
+ current_block_stack[-1].append(line)
+
+ if '}' in line or not line:
+ assert len(current_block_stack) > 1 or not line, current_block_stack
+ old_block = current_block_stack.pop(-1)
+ sorted_block = [old_block[0],] + sorted(old_block[1:-1], key=lambda x: repr(x)) + [old_block[-1],]
+ old_block.clear()
+ old_block.extend(sorted_block)
+
+top_levels = list(sorted(top_levels, key=lambda x: repr(x)))
+
+output_stack = [top_levels]
+while len(output_stack) > 0:
+ if len(output_stack[0]) == 0:
+ output_stack.pop(0)
+ continue
+ if type(output_stack[0][0]) == list:
+ output_stack.insert(0, output_stack[0].pop(0))
+ continue
+ print(output_stack[0].pop(0), end='')