aboutsummaryrefslogtreecommitdiff
path: root/etc/compile-by-zinc/make-graph-with-reg-by-ac-buckets.py
diff options
context:
space:
mode:
Diffstat (limited to 'etc/compile-by-zinc/make-graph-with-reg-by-ac-buckets.py')
-rwxr-xr-xetc/compile-by-zinc/make-graph-with-reg-by-ac-buckets.py31
1 files changed, 30 insertions, 1 deletions
diff --git a/etc/compile-by-zinc/make-graph-with-reg-by-ac-buckets.py b/etc/compile-by-zinc/make-graph-with-reg-by-ac-buckets.py
index 6396cb6ed..6a7ddda1d 100755
--- a/etc/compile-by-zinc/make-graph-with-reg-by-ac-buckets.py
+++ b/etc/compile-by-zinc/make-graph-with-reg-by-ac-buckets.py
@@ -408,6 +408,7 @@ def push_allocate(existing, nodes, *args, **kwargs):
elif node['out'] in full_map.keys() and len(node['rev_deps']) == 1 and all(d['out'] not in full_map.keys() for d in node['rev_deps']) and len(node['rev_deps'][0]['deps']) == 1 and node['type'] == node['rev_deps'][0]['type']:
next_node = node['rev_deps'][0]
cur_map[next_node['out']] = full_map[node['out']]
+ emit_vars.append(next_node)
fill_node(next_node)
full_map.update(cur_map)
elif node['out'] not in full_map.keys() and len(node['rev_deps']) == 2 and len(node['deps']) == 2 and all(d['out'] not in full_map.keys() for d in node['rev_deps']) and all(d['out'] in full_map.keys() for d in node['deps']) and node['type'] == 'uint64_t' and all(d['type'] == 'uint64_t' for d in node['rev_deps']) and all(d['type'] == 'uint64_t' for d in node['deps']):
@@ -479,10 +480,38 @@ def print_graph(graph, allocs):
body += ''.join(' %s -> out ;\n' % node['out'] for node in graph['out'].values())
return ('digraph G {\n' + body + '}\n')
+def fix_emit_vars(emit_vars):
+ ret = []
+ waiting = []
+ seen = set()
+ for node in emit_vars:
+ waiting.append(node)
+ new_waiting = []
+ for wnode in waiting:
+ if all(dep['out'] in seen for dep in wnode['deps']):
+ ret.append(wnode)
+ seen.add(wnode['out'])
+ else:
+ new_waiting.append(wnode)
+ waiting = new_waiting
+ while len(waiting) > 0:
+ print('Waiting on...')
+ print(list(sorted(node['out'] for node in waiting)))
+ new_waiting = []
+ for wnode in waiting:
+ if all(dep['out'] in seen for dep in wnode['deps']):
+ ret.append(wnode)
+ seen.add(wnode['out'])
+ else:
+ new_waiting.append(wnode)
+ waiting = new_waiting
+ return tuple(ret)
+
def schedule(input_data, existing, emit_vars):
ret = ''
buckets_seen = set()
buckets_carried = set()
+ emit_vars = fix_emit_vars(emit_vars)
ret += ('// Convention is low_reg:high_reg\n')
for node in emit_vars:
if node['op'] == 'INPUT':
@@ -585,7 +614,7 @@ def schedule(input_data, existing, emit_vars):
pass
else:
raw_input((node['out'], node['op']))
- if node['op'] not in ('GET_HIGH', 'GET_LOW', 'COMBINE'):
+ if node['op'] not in ('GET_HIGH', 'GET_LOW', 'COMBINE', 'GET_CARRY'):
for rdep in node['rev_deps']:
if len(rdep['extra_out']) > 0 and rdep['op'] == '+':
if rdep['out'] not in buckets_seen: