genlink.py: refactor to expose some kind of device info API

Reviewed-by: Karl Palsson <karlp@tweak.au>
This commit is contained in:
Mattia Maldini
2020-12-26 13:09:46 +01:00
committed by Karl Palsson
parent 1f3abd4376
commit 0817f9175e

View File

@@ -23,22 +23,16 @@ import sys
import re import re
import os import os
if len(sys.argv) != 4:
print("usage: %s <device-data-file> <device> <mode>" % sys.argv[0], file=sys.stderr)
sys.exit(1)
data_file_path = sys.argv[1] def get_device_data(data_file_path, device_id):
find = sys.argv[2].lower() device = {
mode = sys.argv[3].upper()
device = {
'info': {}, 'info': {},
'defs': [], 'defs': [],
'family': [], 'family': [],
} }
# open device data file # open device data file
with open(data_file_path, 'r') as data_file: with open(data_file_path, 'r') as data_file:
# iterate lines # iterate lines
for line in data_file: for line in data_file:
# strip whitespace from the beginning and end of line # strip whitespace from the beginning and end of line
@@ -53,7 +47,7 @@ with open(data_file_path, 'r') as data_file:
pattern, parent, data = parts[0], parts[1], parts[2:] pattern, parent, data = parts[0], parts[1], parts[2:]
# skip line if pattern did not match first element # skip line if pattern did not match first element
if not fnmatch.fnmatch(find, pattern): if not fnmatch.fnmatch(device_id, pattern):
continue continue
# extract data # extract data
@@ -80,46 +74,111 @@ with open(data_file_path, 'r') as data_file:
continue continue
# device family # device family
device['family'].append(find) device['family'].append(device_id)
# break if this was the last line in this chain # break if this was the last line in this chain
if parent == 'END': if parent == 'END':
break break
# look for the parent # look for the parent
find = parent device_id = parent
# reverse device list # reverse device list
device['family'] = device['family'][::-1] device['family'] = device['family'][::-1]
# device was not found # device was not found
if len(device['family']) == 0: if len(device['family']) == 0:
sys.exit(1) sys.exit(1)
# for CPPFLAGS and DEFS, define device family return device
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)
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)
# defines
if mode == 'DEFS':
if len(device['defs']) > 0:
defs = ' '.join('-D_%s=%s' % d for d in device['defs']) 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)
if len(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)
if len(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()
if info in device['info']:
return device['info'][info]
else:
return ''
def main():
if len(sys.argv) != 4:
print("usage: %s <device-data-file> <device> <mode>" % 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) sys.stdout.write(' ' + defs)
# device family # device family
elif mode == 'FAMILY': elif mode == 'FAMILY':
if len(device['family']) > 0: sys.stdout.write(get_device_family(data_file_path, find,
sys.stdout.write(device['family'][0]) device=device))
# device subfamily # device subfamily
elif mode == 'SUBFAMILY': elif mode == 'SUBFAMILY':
if len(device['family']) > 1: sys.stdout.write(
sys.stdout.write(device['family'][1]) get_device_subfamily(data_file_path, find, device=device))
# device info # device info
else: else:
info = mode.lower() sys.stdout.write(
if info in device['info']: get_device_info(data_file_path, find, mode, device=device))
sys.stdout.write(device['info'][info])
sys.stdout.flush() sys.stdout.flush()
if __name__ == '__main__':
main()