diff options
author | Tristan Gingold <tgingold@free.fr> | 2019-07-04 18:19:52 +0200 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2019-07-04 18:19:52 +0200 |
commit | 76482ce0e7ce6e03bc5e17e217ac6d8b6f075846 (patch) | |
tree | 85fb43ca5b3a4aefa781b57a474126171dc3a4cd /python/xtools | |
parent | e477ba0c50eada497760ba83474318a7e1270a7a (diff) | |
download | ghdl-76482ce0e7ce6e03bc5e17e217ac6d8b6f075846.tar.gz ghdl-76482ce0e7ce6e03bc5e17e217ac6d8b6f075846.tar.bz2 ghdl-76482ce0e7ce6e03bc5e17e217ac6d8b6f075846.zip |
Move pnodes.py.py to xtools directory.
Diffstat (limited to 'python/xtools')
-rwxr-xr-x | python/xtools/pnodespy.py | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/python/xtools/pnodespy.py b/python/xtools/pnodespy.py new file mode 100755 index 000000000..641452def --- /dev/null +++ b/python/xtools/pnodespy.py @@ -0,0 +1,248 @@ +#!/usr/bin/env python + +"""Like pnodes but output for python""" + +from __future__ import print_function +import pnodes +import re + +libname = 'libghdl' + + +def print_enum(name, vals): + print() + print() + print('class {0}:'.format(name)) + for n, k in enumerate(vals): + if k == 'None': + k = 'PNone' + print(' {0} = {1}'.format(k, n)) + + +def do_class_kinds(): + print_enum(pnodes.prefix_name.rstrip('_'), pnodes.kinds) + + print() + print() + print('class Iir_Kinds:') + for k, v in pnodes.kinds_ranges.items(): + print(' {0} = ['.format(k)) + first = True + for e in v: + if first: + first = False + else: + print(',') + print(' Iir_Kind.{}'.format(e), end='') + print(']') + print() + +def do_iirs_subprg(): + classname = 'vhdl__nodes' + print() + print('Get_Kind = {0}.{1}__get_kind'.format(libname, classname)) + print('Get_Location = {0}.{1}__get_location'.format(libname, classname)) + for k in pnodes.funcs: + print() + print('Get_{0} = {1}.{2}__get_{3}'.format( + k.name, libname, classname, k.name.lower())) + print() + print('Set_{0} = {1}.{2}__set_{3}'.format( + k.name, libname, classname, k.name.lower(), k.pname, k.rname)) + + +def do_libghdl_elocations(): + classname = 'vhdl__elocations' + print('from libghdl import libghdl') + print() + for k in pnodes.funcs: + print() + print('Get_{0} = {1}.{2}__get_{3}'.format( + k.name, libname, classname, k.name.lower())) + print() + print('Set_{0} = {1}.{2}__set_{3}'.format( + k.name, libname, classname, k.name.lower(), k.pname, k.rname)) + + +def do_class_types(): + print_enum('types', pnodes.get_types()) + + +def do_types_subprg(): + print() + for k in pnodes.get_types(): + print() + print('Get_{0} = {1}.vhdl__nodes_meta__get_{2}'.format( + k, libname, k.lower())) + + +def do_has_subprg(): + print() + for f in pnodes.funcs: + print() + print('Has_{0} =\\'.format(f.name)) + print(' {0}.vhdl__nodes_meta__has_{1}'.format(libname, f.name.lower())) + + +def do_class_field_attributes(): + print_enum('Attr', ['ANone' if a == 'None' else a + for a in pnodes.get_attributes()]) + + +def do_class_fields(): + print_enum('fields', [f.name for f in pnodes.funcs]) + + +def read_enum(filename, type_name, prefix, class_name, g=lambda m:m.group(1)): + """Read an enumeration declaration from :param filename:""" + pat_decl = re.compile(r' type {0} is$'.format(type_name)) + pat_enum = re.compile(r' {0}(\w+),?( *-- .*)?$'.format(prefix)) + pat_comment = re.compile(r' *-- .*$') + lr = pnodes.linereader(filename) + while not pat_decl.match(lr.get()): + pass + line = lr.get() + if line != ' (\n': + raise pnodes.ParseError( + lr, "{}:{}: missing open parenthesis".format( + filename, lr.lineno)) + toks = [] + while True: + line = lr.get() + if line == ' );\n': + break + m = pat_enum.match(line) + if m: + toks.append(g(m)) + elif pat_comment.match(line): + pass + elif line == '\n': + pass + else: + print(line, file=sys.stderr) + raise pnodes.ParseError( + lr, "{}:{}: incorrect line in enum {}".format( + filename, lr.lineno, type_name)) + print_enum(class_name, toks) + + +def read_spec_enum(type_name, prefix, class_name): + """Read an enumeration declaration from iirs.ads""" + read_enum(pnodes.kind_file, type_name, prefix, class_name) + + +def do_libghdl_nodes(): + print('from libghdl import libghdl') + print(""" +Null_Iir = 0 + +Null_Iir_List = 0 +Iir_List_All = 1 + +Null_Iir_Flist = 0 +Iir_Flist_Others = 1 +Iir_Flist_All = 2 +""") + do_class_kinds() + read_spec_enum('Iir_Mode', 'Iir_', 'Iir_Mode') + read_spec_enum('Iir_Staticness', '', 'Iir_Staticness') + read_spec_enum('Iir_Constraint', '', 'Iir_Constraint') + read_spec_enum('Iir_Direction', 'Iir_', 'Iir_Direction') + read_spec_enum('Iir_Delay_Mechanism', 'Iir_', 'Iir_Delay_Mechanism') + read_spec_enum('Date_State_Type', 'Date_', 'Date_State') + read_spec_enum('Iir_Predefined_Functions', + 'Iir_Predefined_', 'Iir_Predefined') + do_iirs_subprg() + + +def do_libghdl_meta(): + print('from libghdl import libghdl') + print(""" + + +# From nodes_meta +get_fields_first = libghdl.vhdl__nodes_meta__get_fields_first + +get_fields_last = libghdl.vhdl__nodes_meta__get_fields_last + +get_field_by_index = libghdl.vhdl__nodes_meta__get_field_by_index + +get_field_type = libghdl.vhdl__nodes_meta__get_field_type + +get_field_attribute = libghdl.vhdl__nodes_meta__get_field_attribute""") + do_class_types() + do_class_field_attributes() + do_class_fields() + do_types_subprg() + do_has_subprg() + + +def do_libghdl_names(): + pat_name_first = re.compile( + r' Name_(\w+)\s+: constant Name_Id := (\d+);') + pat_name_def = re.compile( + r' Name_(\w+)\s+:\s+constant Name_Id :=\s+Name_(\w+)( \+ (\d+))?;') + dict = {} + lr = pnodes.linereader('../std_names.ads') + while True: + line = lr.get() + m = pat_name_first.match(line) + if m: + name_def = m.group(1) + val = int(m.group(2)) + dict[name_def] = val + res = [(name_def, val)] + break + val_max = 1 + while True: + line = lr.get() + if line == 'end Std_Names;\n': + break + if line.endswith(':=\n'): + line = line.rstrip() + lr.get() + m = pat_name_def.match(line) + if m: + name_def = m.group(1) + name_ref = m.group(2) + val = m.group(3) + if not val: + val = 0 + val_ref = dict.get(name_ref, None) + if not val_ref: + raise pnodes.ParseError( + lr, "name {0} not found".format(name_ref)) + val = val_ref + int(val) + val_max = max(val_max, val) + dict[name_def] = val + res.append((name_def, val)) + print('class Name:') + for n, v in res: + # Avoid clash with Python names + if n in ['False', 'True', 'None']: + n = 'N' + n + print(' {0} = {1}'.format(n, v)) + + +def do_libghdl_tokens(): + read_enum("vhdl-tokens.ads", "Token_Type", "Tok_", "Tok") + + +def do_libghdl_errorout(): + print('from libghdl import libghdl') + print(""" +Enable_Warning = libghdl.errorout__enable_warning +""") + read_enum("../errorout.ads", "Msgid_Type", "(Msgid|Warnid)_", "Msgid", + g=lambda m: m.group(1) + '_' + m.group(2)) + + +pnodes.actions.update({'class-kinds': do_class_kinds, + 'libghdl-nodes': do_libghdl_nodes, + 'libghdl-meta': do_libghdl_meta, + 'libghdl-names': do_libghdl_names, + 'libghdl-tokens': do_libghdl_tokens, + 'libghdl-elocs': do_libghdl_elocations, + 'libghdl-errorout': do_libghdl_errorout}) + + +pnodes.main() |