#!/usr/bin/env python3

#file extracted from pulp sdk : https://github.com/pulp-platform/pulp-sdk.git
#to be used in marsellus project
import argparse
import os
from os import listdir
from os.path import isfile, join, isdir
import struct
import plp_flash_stimuli as plp_flash_stimuli

class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'

parser = argparse.ArgumentParser(description='Build flash image for Pulp')

parser.add_argument("--flash-boot-binary", dest="flashBootBinary", default=None, help="Boot from flash")
parser.add_argument("--elf-loader", dest="elfLoader", default=None, help="Boot using the specified ELF loader")
parser.add_argument("--binary", dest="binary", default=None, help="Resident binary")
parser.add_argument("--flash-type", dest="flashType", default='spi', help="Flash type")
parser.add_argument("--comp-dir", dest="compDir", default=[], action="append", help="Component directory")
parser.add_argument("--comp-dir-rec", dest="compDirRec", default=[], action="append", help="Recursive component directory")
parser.add_argument("--comp", dest="comp", default=[], action="append", help="Component")
parser.add_argument("--stimuli", dest="stimuli", default=None, help="Generate stimuli")
parser.add_argument("--raw", dest="raw", default=None, help="Generate raw image")
parser.add_argument("--archi", dest="archi", default=None, help="Architecture")
parser.add_argument("--verbose", dest="verbose", action="store_true", help="Verbose mode")
parser.add_argument("--encrypt", dest="encrypt", action="store_true", help="Encrypt binary")
parser.add_argument("--qpi", dest="qpi", action="store_true", help="Use QPI")
parser.add_argument("--aes-key", dest="aesKey", default=None, help="AES key for encryption")
parser.add_argument("--aes-iv", dest="aesIv", default=None, help="AES init vector for encryption")

args = parser.parse_args()



def getFilesFromDir(path, rec=False, incDirInName=True):
	files = []
	for file in listdir(path):
		fullPath = os.path.join(path, file)
		if isfile(fullPath): files.append(Comp(path, file))
		elif rec and isdir(fullPath): files += getFilesFromDir(fullPath, True)
	return files


flashImage = plp_flash_stimuli.FlashImage(raw=args.raw, stimuli=args.stimuli, verbose=args.verbose, archi=args.archi, encrypt=args.encrypt, aesKey=args.aesKey, aesIv=args.aesIv, flashType=args.flashType, qpi=args.qpi)


#
# Boot binary
#

# In case the chip is booting from ROM, the flash contains first the binary to be loaded into the chip by the ROM

bootBinary = args.flashBootBinary
if bootBinary != None:

	flashImage.appendBootBinary(elf=bootBinary)


#
#  Collect files from options
#

for comp in args.comp:
	flashImage.appendComponent(os.path.dirname(comp), os.path.basename(comp))

for compDir in args.compDir:
	for dirname, name in getFilesFromDir(compDir, incDirInName=False):
		flashImage.appendComponent(dirname, name)

for compDir in args.compDirRec:
	for dirname, name in getFilesFromDir(compDir, True, incDirInName=False):
		flashImage.appendComponent(dirname, name)



#
#  Finally generate the image
#

flashImage.generate()
