import sys
def fix_crosslink_nx_bitstream(input_file, output_file):
# Магический маркер синхронизации для семейства Lattice Nexus (CrossLink-NX)
TARGET_SIGNATURE = b'\x7B\x9B\xFF\x00'
ALIGNMENT = 4096
with open(input_file, 'rb') as f:
content = f.read()
# Ищем слово синхронизации
idx = content.find(TARGET_SIGNATURE)
if idx == -1:
print("Ошибка: Маркер синхронизации Nexus (7B 9B FF 00) не найден!")
sys.exit(1)
# Отрезаем текстовый заголовок Radiant, оставляя чистый bitstream
bitstream = content[idx:]
print(f"Полезные данные найдены со смещения {idx} (0x{idx:X}). Заголовок успешно удален.")
# Считаем размер и необходимый padding (дополнение) до кратности 4096
current_size = len(bitstream)
remainder = current_size % ALIGNMENT
if remainder != 0:
padding_needed = ALIGNMENT - remainder
# Дописываем строго байты 0xFF (команда NOP для контроллера FPGA)
bitstream += b'\xFF' * padding_needed
print(f"Размер выровнен: добавлено {padding_needed} байт 0xFF. Финальный размер: {len(bitstream)} байт.")
else:
print(f"Размер файла идеален ({current_size} байт), выравнивание не требуется.")
# Записываем чистый бинарник без какого-либо изменения бит
with open(output_file, 'wb') as f:
f.write(bitstream)
print(f"Успех! Файл подготовлен для I2C CrossLink-NX: {output_file}")
if __name__ == '__main__':
if len(sys.argv) < 3:
print("Использование: python3 lpc_convert.py <input.bit> <output.bin>")
sys.exit(1)
fix_crosslink_nx_bitstream(sys.argv[1], sys.argv[2])