# 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
import sys
import json

line_re = re.compile(r'F(0x[0-9A-Fa-f]+)W(\d+)B(\d+)')
frames_to_tiles = {} # (start, size, tile, tile offset)
 
with open(sys.argv[1]) as tb_f:
	tbj = json.load(tb_f)

for tilename, tiledata in tbj.items():
	tile_offset = 0
	for chunk in tiledata:
		frame, start, size = chunk
		if frame not in frames_to_tiles:
			frames_to_tiles[frame] = []
		frames_to_tiles[frame].append((start, size, tilename, tile_offset))
		tile_offset += size

tile_bits = {}

# Always write these tiles to avoid correlation issues
# (distinguishing between all/no bits)
for tilename, tiledata in tbj.items():
	if "INT_INTF_L_IO" in tilename:
		tile_bits[tilename] = set()

with open(sys.argv[2]) as df:
	for line in df:
		m = line_re.match(line)
		if not m:
			continue
		frame = int(m[1], 16)
		if frame not in frames_to_tiles:
			continue
		framebit = int(m[2]) * 32 + int(m[3])
		for fb in frames_to_tiles[frame]:
			start, size, tile, toff = fb
			if framebit >= start and framebit < (start + size):
				if tile not in tile_bits:
					tile_bits[tile] = set()
				tile_bits[tile].add(toff + (framebit - start))

for tile, bits in sorted(tile_bits.items()):
	print(".tile %s" % tile)
	for b in sorted(bits):
		print(b)
