diff --git a/scripts/genlink.py b/scripts/genlink.py index 9975b132..18fd4de7 100755 --- a/scripts/genlink.py +++ b/scripts/genlink.py @@ -23,103 +23,162 @@ import sys import re import os -if len(sys.argv) != 4: - print("usage: %s " % sys.argv[0], file=sys.stderr) - sys.exit(1) -data_file_path = sys.argv[1] -find = sys.argv[2].lower() -mode = sys.argv[3].upper() +def get_device_data(data_file_path, device_id): + device = { + 'info': {}, + 'defs': [], + 'family': [], + } -device = { - 'info': {}, - 'defs': [], - 'family': [], -} + # open device data file + with open(data_file_path, 'r') as data_file: + # iterate lines + for line in data_file: + # strip whitespace from the beginning and end of line + line = line.strip() -# open device data file -with open(data_file_path, 'r') as data_file: - # iterate lines - for line in data_file: - # strip whitespace from the beginning and end of line - line = line.strip() - - # skip empty lines and comments - if line == '' or line.startswith('#'): - continue - - # split line into it's parts: - parts = line.split() - pattern, parent, data = parts[0], parts[1], parts[2:] - - # skip line if pattern did not match first element - if not fnmatch.fnmatch(find, pattern): - continue - - # extract data - for d in data: - # split into K=V - try: - (k, v) = d.split('=') - except: + # skip empty lines and comments + if line == '' or line.startswith('#'): continue - # skip invalid datas - if not re.match('^[A-Z0-9_]+$', k): + # split line into it's parts: + parts = line.split() + pattern, parent, data = parts[0], parts[1], parts[2:] + + # skip line if pattern did not match first element + if not fnmatch.fnmatch(device_id, pattern): continue - # add FPU and CPU to info, not defs - if k in ('FPU', 'CPU'): - device['info'][k.lower()] = v + # extract data + for d in data: + # split into K=V + try: + (k, v) = d.split('=') + except: + continue + + # skip invalid datas + if not re.match('^[A-Z0-9_]+$', k): + continue + + # add FPU and CPU to info, not defs + if k in ('FPU', 'CPU'): + device['info'][k.lower()] = v + continue + + device['defs'].append((k, v)) + + # if parent is +, there's more data for this pattern + if parent == '+': continue - device['defs'].append((k, v)) + # device family + device['family'].append(device_id) - # if parent is +, there's more data for this pattern - if parent == '+': - continue + # break if this was the last line in this chain + if parent == 'END': + break - # device family - device['family'].append(find) + # look for the parent + device_id = parent - # break if this was the last line in this chain - if parent == 'END': - break + # reverse device list + device['family'] = device['family'][::-1] - # look for the parent - find = parent + # device was not found + if len(device['family']) == 0: + sys.exit(1) -# reverse device list -device['family'] = device['family'][::-1] + return device -# device was not found -if len(device['family']) == 0: - sys.exit(1) -# for CPPFLAGS and DEFS, define device family -if mode in ('CPPFLAGS', 'DEFS'): - sys.stdout.write(' '.join('-D%s' % d.upper() for d in device['family'])) +def get_device_family_flags(data_file_path, device_id, device=None): + if not device: + device = get_device_data(data_file_path, device_id) -# defines -if mode == 'DEFS': - if len(device['defs']) > 0: - defs = ' '.join('-D_%s=%s' % d for d in device['defs']) - sys.stdout.write(' ' + defs) + return ' '.join('-D%s' % d.upper() for d in device['family']) + + +def get_device_defines(data_file_path, device_id, device=None): + if not device: + device = get_device_data(data_file_path, device_id) + + defs = ' '.join('-D_%s=%s' % d for d in device['defs']) + return defs + + +def get_device_family(data_file_path, device_id, device=None): + if not device: + device = get_device_data(data_file_path, device_id) -# device family -elif mode == 'FAMILY': if len(device['family']) > 0: - sys.stdout.write(device['family'][0]) + return device['family'][0] + else: + return '' + + +def get_device_subfamily(data_file_path, device_id, device=None): + if not device: + device = get_device_data(data_file_path, device_id) -# device subfamily -elif mode == 'SUBFAMILY': if len(device['family']) > 1: - sys.stdout.write(device['family'][1]) + return device['family'][1] + else: + return '' + + +def get_device_info(data_file_path, device_id, info, device=None): + if not device: + device = get_device_data(data_file_path, device_id) + + info = info.lower() -# device info -else: - info = mode.lower() if info in device['info']: - sys.stdout.write(device['info'][info]) + return device['info'][info] + else: + return '' -sys.stdout.flush() + +def main(): + if len(sys.argv) != 4: + print("usage: %s " % sys.argv[0], + file=sys.stderr) + sys.exit(1) + + data_file_path = sys.argv[1] + find = sys.argv[2].lower() + mode = sys.argv[3].upper() + device = get_device_data(data_file_path, find) + + # for CPPFLAGS and DEFS, define device family + if mode in ('CPPFLAGS', 'DEFS'): + sys.stdout.write( + get_device_family_flags(data_file_path, find, device=device)) + + # defines + if mode == 'DEFS': + defs = get_device_defines(data_file_path, find, device=device) + if defs: + sys.stdout.write(' ' + defs) + + # device family + elif mode == 'FAMILY': + sys.stdout.write(get_device_family(data_file_path, find, + device=device)) + + # device subfamily + elif mode == 'SUBFAMILY': + sys.stdout.write( + get_device_subfamily(data_file_path, find, device=device)) + + # device info + else: + sys.stdout.write( + get_device_info(data_file_path, find, mode, device=device)) + + sys.stdout.flush() + + +if __name__ == '__main__': + main() \ No newline at end of file