# Copyright 2020 Project U-Ray Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import re
frame_set_bits = {}
group_set_bits = {}

line_re = re.compile(r'F(0x[0-9A-Fa-f]+)W(\d+)B(\d+)')

with open("bram.dump", "r") as df:
	for line in df:
			m = line_re.match(line)
			if not m:
				continue
			frame = int(m[1], 16)
			if (frame >> 24) != 0x01:
				continue
			frame = frame & 0xFF
			if frame not in frame_set_bits:
				frame_set_bits[frame] = set()
			framebit = int(m[2]) * 32 + int(m[3])
			frame_set_bits[frame].add(framebit)
with open("bram.txt", "r") as ef:
	for line in ef:
		frame, startbit, site_y, data, parity = line.strip().split(" ")
		frame = int(frame)
		startbit = int(startbit)
		site_y = int(site_y)
		data = [int(x) for x in data]
		parity = [int(x) for x in parity]
		if (frame, startbit) not in group_set_bits:
			group_set_bits[frame, startbit] = set()
		for i, d in enumerate(data):
			if d != 1:
				continue
			group_set_bits[frame, startbit].add("%d_%d" % (site_y, i))
		for i, d in enumerate(parity):
			if d != 1:
				continue
			group_set_bits[frame, startbit].add("%d_P%d" % (site_y, i))

#features = []
#for y in range(2):
#	features += ["%d_%d" % (y, i) for i in range(64)]
#	features += ["%d_P%d" % (y, i) for i in range(8)]


bram_permute = []
for i, prefix in enumerate(("0_", "0_P", "1_", "1_P")):
	permute = []
	for j in range(8 if prefix.endswith("P") else 64):
		f = "%s%d" % (prefix, j)
		candidates = None
		for group, features in group_set_bits.items():
			if f not in features:
				continue
			frame, startbit = group
			if frame not in frame_set_bits:
				continue
			set_bits = frame_set_bits[frame]
			if candidates is None:
				candidates = set()
				for b in range(startbit, startbit + 240):
					if b in set_bits:
						candidates.add(b - startbit)
			else:
				todelete = []
				for c in candidates:
					if (startbit + c) not in set_bits:
						todelete.append(c)
				for t in todelete:
					candidates.remove(t)
		print("%s: %s" % (f, " ".join([str(c) for c in sorted(candidates)])))
		permute.append(list(candidates)[0])
	bram_permute.append(permute)

for i, cname in enumerate(("bram_y0_permute", "bram_p_y0_permute", "bram_y1_permute", "bram_p_y1_permute")):
	p = bram_permute[i]
	print("static const int %s[%d] = {%s};" % (
		cname, len(p), ", ".join(str(x) for x in p)
	))
