diff options
author | Patrick Lehmann <Patrick.Lehmann@plc2.de> | 2021-01-09 00:52:47 +0100 |
---|---|---|
committer | tgingold <tgingold@users.noreply.github.com> | 2021-01-10 10:14:16 +0100 |
commit | 00274e966e0e10cca9707d489cf75090ae7f1b96 (patch) | |
tree | ee4e4c0ec4c6b72333d7af35b94800c93b661a12 /pyGHDL/libghdl/utils | |
parent | e4379c7f1f6188f845fc9b895f0b982c7c0b66ca (diff) | |
download | ghdl-00274e966e0e10cca9707d489cf75090ae7f1b96.tar.gz ghdl-00274e966e0e10cca9707d489cf75090ae7f1b96.tar.bz2 ghdl-00274e966e0e10cca9707d489cf75090ae7f1b96.zip |
Changed pyGHDL.libghdl.utils from package to module.
Diffstat (limited to 'pyGHDL/libghdl/utils')
-rw-r--r-- | pyGHDL/libghdl/utils/__init__.py | 459 |
1 files changed, 0 insertions, 459 deletions
diff --git a/pyGHDL/libghdl/utils/__init__.py b/pyGHDL/libghdl/utils/__init__.py deleted file mode 100644 index 3b64e7698..000000000 --- a/pyGHDL/libghdl/utils/__init__.py +++ /dev/null @@ -1,459 +0,0 @@ -# ============================================================================= -# ____ _ _ ____ _ _ _ _ _ _ _ -# _ __ _ _ / ___| | | | _ \| | | (_) |__ __ _| |__ __| | | -# | '_ \| | | | | _| |_| | | | | | | | | '_ \ / _` | '_ \ / _` | | -# | |_) | |_| | |_| | _ | |_| | |___ _| | | |_) | (_| | | | | (_| | | -# | .__/ \__, |\____|_| |_|____/|_____(_)_|_|_.__/ \__, |_| |_|\__,_|_| -# |_| |___/ |___/ -# ============================================================================= -# Authors: Tristan Gingold -# -# Package module: Generators/iterators and low-level helpers for pyGHDL.libghdl. -# -# License: -# ============================================================================ -# Copyright (C) 2019-2020 Tristan Gingold -# -# GHDL is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2, or (at your option) any later -# version. -# -# GHDL is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# for more details. -# -# You should have received a copy of the GNU General Public License -# along with GHDL; see the file COPYING. If not, write to the Free -# Software Foundation, 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. -# -# SPDX-License-Identifier: GPL-2.0-or-later -# ============================================================================ -# -from ctypes import byref -from typing import List, Any, Generator - -from pydecor import export - -from pyGHDL.libghdl._decorator import EnumLookupTable -from pyGHDL.libghdl._types import NameId -import pyGHDL.libghdl.name_table as name_table -import pyGHDL.libghdl.files_map as files_map -import pyGHDL.libghdl.vhdl.nodes as nodes -import pyGHDL.libghdl.vhdl.nodes_meta as nodes_meta -import pyGHDL.libghdl.vhdl.lists as lists -import pyGHDL.libghdl.vhdl.flists as flists - - -@export -def name_image(NameId: NameId) -> str: - """Lookup a :obj:`NameId` and return its string.""" - return name_table.Get_Name_Ptr(NameId) - - -#@export # FIXME: see above -@EnumLookupTable(nodes_meta.fields) -def fields_image(idx: int) -> str: - """String representation of Nodes_Meta.fields :obj:`idx`.""" - - -#@export # FIXME: see above -@EnumLookupTable(nodes.Iir_Kind) -def kind_image(k: int) -> str: - """String representation of Nodes.Iir_Kind :obj:`k`.""" - - -#@export # FIXME: see above -@EnumLookupTable(nodes_meta.types) -def types_image(t: int) -> str: - """String representation of Nodes_Meta.Types :obj:`t`.""" - - -#@export # FIXME: see above -@EnumLookupTable(nodes_meta.Attr) -def attr_image(a: int) -> str: - """String representation of Nodes_Meta.Attr :obj:`a`.""" - - -@export -def leftest_location(n): - while True: - if n == nodes.Null_Iir: - return files_map.No_Location - k = nodes.Get_Kind(n) - if k == nodes.Iir_Kind.Array_Subtype_Definition: - n = nodes.Get_Subtype_Type_Mark(n) - else: - return nodes.Get_Location(n) - - -@export -def fields_iter(n) -> Generator[Any, None, None]: - """Iterate on fields of node :obj:`n`.""" - if n == nodes.Null_Iir: - return - k = nodes.Get_Kind(n) - first = nodes_meta.get_fields_first(k) - last = nodes_meta.get_fields_last(k) - for i in range(first, last + 1): - yield nodes_meta.get_field_by_index(i) - - -@export -def chain_iter(n) -> Generator[Any, None, None]: - """Iterate of a chain headed by node :obj:`n`.""" - while n != nodes.Null_Iir: - yield n - n = nodes.Get_Chain(n) - - -@export -def chain_to_list(n) -> List[Any]: - """Convert a chain headed by node :obj:`n` to a Python list.""" - return [e for e in chain_iter(n)] - - -@export -def nodes_iter(n) -> Generator[Any, None, None]: - """ - Iterate all nodes of :obj:`n`, including :obj:`n`. - Nodes are returned only once. - """ - if n == nodes.Null_Iir: - return - # print 'nodes_iter for {0}'.format(n) - yield n - for f in fields_iter(n): - typ = nodes_meta.get_field_type(f) - # print ' {0}: field {1} (type: {2})'.format( - # n, fields_image(f), types_image(typ)) - if typ == nodes_meta.types.Iir: - attr = nodes_meta.get_field_attribute(f) - if attr == nodes_meta.Attr.ANone: - for n1 in nodes_iter(nodes_meta.Get_Iir(n, f)): - yield n1 - elif attr == nodes_meta.Attr.Chain: - n2 = nodes_meta.Get_Iir(n, f) - while n2 != nodes.Null_Iir: - for n1 in nodes_iter(n2): - yield n1 - n2 = nodes.Get_Chain(n2) - elif attr == nodes_meta.Attr.Maybe_Ref: - if not nodes.Get_Is_Ref(n, f): - for n1 in nodes_iter(nodes_meta.Get_Iir(n, f)): - yield n1 - elif typ == nodes_meta.types.Iir_List: - attr = nodes_meta.get_field_attribute(f) - if attr == nodes_meta.Attr.ANone: - for n1 in list_iter(nodes_meta.Get_Iir_List(n, f)): - for n2 in nodes_iter(n1): - yield n2 - elif typ == nodes_meta.types.Iir_Flist: - attr = nodes_meta.get_field_attribute(f) - if attr == nodes_meta.Attr.ANone: - for n1 in flist_iter(nodes_meta.Get_Iir_Flist(n, f)): - for n2 in nodes_iter(n1): - yield n2 - - -@export -def list_iter(lst) -> Generator[Any, None, None]: - """Iterate all element of Iir_List :obj:`lst`.""" - if lst <= nodes.Iir_List_All: - return - iter = lists.Iterate(lst) - while lists.Is_Valid(byref(iter)): - yield lists.Get_Element(byref(iter)) - lists.Next(byref(iter)) - - -@export -def flist_iter(lst) -> Generator[Any, None, None]: - """Iterate all element of Iir_List :obj:`lst`.""" - if lst <= nodes.Iir_Flist_All: - return - for i in range(flists.Flast(lst) + 1): - yield flists.Get_Nth_Element(lst, i) - - -@export -def declarations_iter(n) -> Generator[Any, None, None]: - """Iterate all declarations in node :obj:`n`.""" - k = nodes.Get_Kind(n) - if nodes_meta.Has_Generic_Chain(k): - for n1 in chain_iter(nodes.Get_Generic_Chain(n)): - yield n1 - if nodes_meta.Has_Port_Chain(k): - for n1 in chain_iter(nodes.Get_Port_Chain(n)): - yield n1 - if nodes_meta.Has_Interface_Declaration_Chain(k): - for n1 in chain_iter(nodes.Get_Interface_Declaration_Chain(n)): - yield n1 - if nodes_meta.Has_Declaration_Chain(k): - for n1 in chain_iter(nodes.Get_Declaration_Chain(n)): - k1 = nodes.Get_Kind(n1) - if k1 in nodes.Iir_Kinds.Specification or k1 == nodes.Iir_Kind.Use_Clause: - # Not a declaration - pass - elif k1 == nodes.Iir_Kind.Signal_Attribute_Declaration: - # Not a declaration - pass - elif k1 in ( - nodes.Iir_Kind.Type_Declaration, - nodes.Iir_Kind.Anonymous_Type_Declaration, - ): - yield n1 - # Handle nested declarations: record elements, physical units, - # enumeration literals... - typ = nodes.Get_Type_Definition(n1) - for n2 in declarations_iter(n1): - yield n2 - else: - yield n1 - # There can be nested declarations (subprograms) - for n2 in declarations_iter(n1): - yield n2 - if nodes_meta.Has_Concurrent_Statement_Chain(k): - for n1 in chain_iter(nodes.Get_Concurrent_Statement_Chain(n)): - for n2 in declarations_iter(n1): - yield n2 - if nodes_meta.Has_Sequential_Statement_Chain(k): - for n1 in chain_iter(nodes.Get_Sequential_Statement_Chain(n)): - for n2 in declarations_iter(n1): - yield n2 - if nodes_meta.Has_Parameter_Specification(k): - yield nodes.Get_Parameter_Specification(n) - if nodes_meta.Has_Generate_Statement_Body(k): - for n1 in declarations_iter(nodes.Get_Generate_Statement_Body(n)): - yield n1 - if nodes_meta.Has_Else_Clause(k): - n1 = nodes.Get_Else_Clause(n) - if n1 != nodes.Null_Iir: - for n2 in declarations_iter(n1): - yield n2 - if nodes_meta.Has_Generate_Else_Clause(k): - n1 = nodes.Get_Generate_Else_Clause(n) - if n1 != nodes.Null_Iir: - for n2 in declarations_iter(n1): - yield n2 - if nodes_meta.Has_Block_Header(k): - n1 = nodes.Get_Block_Header(n) - if n1 != nodes.Null_Iir: - for n2 in declarations_iter(n1): - yield n2 - # All these nodes are handled: - if k in ( - nodes.Iir_Kind.Entity_Declaration, - nodes.Iir_Kind.Architecture_Body, - nodes.Iir_Kind.Package_Declaration, - nodes.Iir_Kind.Package_Body, - nodes.Iir_Kind.Process_Statement, - nodes.Iir_Kind.Sensitized_Process_Statement, - nodes.Iir_Kind.Concurrent_Assertion_Statement, - nodes.Iir_Kind.Concurrent_Simple_Signal_Assignment, - nodes.Iir_Kind.Concurrent_Selected_Signal_Assignment, - nodes.Iir_Kind.Concurrent_Conditional_Signal_Assignment, - nodes.Iir_Kind.Concurrent_Procedure_Call_Statement, - nodes.Iir_Kind.Block_Statement, - nodes.Iir_Kind.Block_Header, - nodes.Iir_Kind.For_Generate_Statement, - nodes.Iir_Kind.If_Generate_Statement, - nodes.Iir_Kind.Generate_Statement_Body, - nodes.Iir_Kind.Assertion_Statement, - nodes.Iir_Kind.Wait_Statement, - nodes.Iir_Kind.Simple_Signal_Assignment_Statement, - nodes.Iir_Kind.Variable_Assignment_Statement, - nodes.Iir_Kind.For_Loop_Statement, - nodes.Iir_Kind.While_Loop_Statement, - nodes.Iir_Kind.Case_Statement, - nodes.Iir_Kind.Null_Statement, - nodes.Iir_Kind.Exit_Statement, - nodes.Iir_Kind.Next_Statement, - nodes.Iir_Kind.Procedure_Call_Statement, - nodes.Iir_Kind.Signal_Declaration, - nodes.Iir_Kind.Constant_Declaration, - nodes.Iir_Kind.Variable_Declaration, - nodes.Iir_Kind.File_Declaration, - nodes.Iir_Kind.Object_Alias_Declaration, - nodes.Iir_Kind.Attribute_Declaration, - nodes.Iir_Kind.Component_Declaration, - nodes.Iir_Kind.Use_Clause, - nodes.Iir_Kind.If_Statement, - nodes.Iir_Kind.Elsif, - nodes.Iir_Kind.Return_Statement, - nodes.Iir_Kind.Type_Declaration, - nodes.Iir_Kind.Anonymous_Type_Declaration, - nodes.Iir_Kind.Subtype_Declaration, - nodes.Iir_Kind.Function_Declaration, - nodes.Iir_Kind.Function_Body, - nodes.Iir_Kind.Procedure_Declaration, - nodes.Iir_Kind.Procedure_Body, - nodes.Iir_Kind.Component_Instantiation_Statement, - ): - return - raise Exception("Unknown node of kind {}".format(kind_image(k))) - - -@export -def concurrent_stmts_iter(n) -> Generator[Any, None, None]: - """Iterate concurrent statements in node :obj:`n`.""" - k = nodes.Get_Kind(n) - if k == nodes.Iir_Kind.Design_File: - for n1 in chain_iter(nodes.Get_First_Design_Unit(n)): - for n2 in concurrent_stmts_iter(n1): - yield n2 - elif k == nodes.Iir_Kind.Design_Unit: - for n1 in concurrent_stmts_iter(nodes.Get_Library_Unit(n)): - yield n1 - elif k in ( - nodes.Iir_Kind.Entity_Declaration, - nodes.Iir_Kind.Architecture_Body, - nodes.Iir_Kind.Block_Statement - ): - for n1 in chain_iter(nodes.Get_Concurrent_Statement_Chain(n)): - yield n1 - for n2 in concurrent_stmts_iter(n1): - yield n2 - elif k == nodes.Iir_Kind.For_Generate_Statement: - for n1 in concurrent_stmts_iter(nodes.Get_Generate_Statement_Body(n)): - yield n1 - elif k == nodes.Iir_Kind.If_Generate_Statement: - while n != nodes.Null_Iir: - for n1 in concurrent_stmts_iter(nodes.Get_Generate_Statement_Body(n)): - yield n1 - n = nodes.Get_Generate_Else_Clause(n) - elif k == nodes.Iir_Kind.Case_Generate_Statement: - alt = nodes.Get_Case_Statement_Alternative_Chain(n) - for n1 in chain_iter(alt): - blk = nodes.Get_Associated_Block(n1) - if blk != nodes.Null_Iir: - for n2 in concurrent_stmts_iter(nodes.Get_Generate_Statement_Body(n)): - yield n2 - - -@export -def constructs_iter(n) -> Generator[Any, None, None]: - """ - Iterate library units, concurrent statements and declarations - that appear directly within a declarative part. - """ - if n == nodes.Null_Iir: - return - k = nodes.Get_Kind(n) - if k == nodes.Iir_Kind.Design_File: - for n1 in chain_iter(nodes.Get_First_Design_Unit(n)): - for n2 in constructs_iter(n1): - yield n2 - elif k == nodes.Iir_Kind.Design_Unit: - n1 = nodes.Get_Library_Unit(n) - yield n1 - for n2 in constructs_iter(n1): - yield n2 - elif k in ( - nodes.Iir_Kind.Entity_Declaration, - nodes.Iir_Kind.Architecture_Body, - nodes.Iir_Kind.Block_Statement, - nodes.Iir_Kind.Generate_Statement_Body, - ): - for n1 in chain_iter(nodes.Get_Declaration_Chain(n)): - yield n1 - for n2 in constructs_iter(n1): - yield n2 - for n1 in chain_iter(nodes.Get_Concurrent_Statement_Chain(n)): - yield n1 - for n2 in constructs_iter(n1): - yield n2 - elif k in ( - nodes.Iir_Kind.Configuration_Declaration, - nodes.Iir_Kind.Package_Declaration, - nodes.Iir_Kind.Package_Body, - nodes.Iir_Kind.Function_Body, - nodes.Iir_Kind.Procedure_Body, - nodes.Iir_Kind.Protected_Type_Declaration, - nodes.Iir_Kind.Protected_Type_Body, - nodes.Iir_Kind.Process_Statement, - nodes.Iir_Kind.Sensitized_Process_Statement, - ): - for n1 in chain_iter(nodes.Get_Declaration_Chain(n)): - yield n1 - for n2 in constructs_iter(n1): - yield n2 - elif k == nodes.Iir_Kind.For_Generate_Statement: - n1 = nodes.Get_Generate_Statement_Body(n) - yield n1 - for n2 in constructs_iter(n1): - yield n2 - elif k == nodes.Iir_Kind.If_Generate_Statement: - while n != nodes.Null_Iir: - n1 = nodes.Get_Generate_Statement_Body(n) - yield n1 - for n2 in constructs_iter(n1): - yield n2 - n = nodes.Get_Generate_Else_Clause(n) - elif k == nodes.Iir_Kind.Case_Generate_Statement: - alt = nodes.Get_Case_Statement_Alternative_Chain(n) - for n1 in chain_iter(alt): - blk = nodes.Get_Associated_Block(n1) - if blk != nodes.Null_Iir: - n2 = nodes.Get_Generate_Statement_Body(blk) - yield n2 - for n3 in constructs_iter(n2): - yield n3 - - -@export -def sequential_iter(n) -> Generator[Any, None, None]: - """ - Iterate sequential statements. The first node must be either - a process or a subprogram body. - """ - if n == nodes.Null_Iir: - return - k = nodes.Get_Kind(n) - if k in ( - nodes.Iir_Kind.Process_Statement, - nodes.Iir_Kind.Sensitized_Process_Statement, - nodes.Iir_Kind.Function_Body, - nodes.Iir_Kind.Procedure_Body, - ): - for n1 in chain_iter(nodes.Get_Sequential_Statement_Chain(n)): - yield n1 - for n2 in sequential_iter(n1): - yield n2 - elif k == nodes.Iir_Kind.If_Statement: - while True: - n = nodes.Get_Chain(n) - if n == nodes.Null_Iir: - break - yield n - for n1 in sequential_iter(n): - yield n1 - elif k == nodes.Iir_Kind.Case_Statement: - for ch in chain_iter(nodes.Get_Case_Statement_Alternative_Chain(n)): - stmt = nodes.Get_Associated_Chain(ch) - if stmt != nodes.Null_Iir: - for n1 in chain_iter(stmt): - yield n1 - for n2 in sequential_iter(n1): - yield n2 - elif k in [nodes.Iir_Kind.For_Loop_Statement, nodes.Iir_Kind.While_Loop_Statement]: - for n1 in chain_iter(nodes.Get_Sequential_Statement_Chain(n)): - yield n1 - for n2 in sequential_iter(n1): - yield n2 - elif k in ( - nodes.Iir_Kind.Assertion_Statement, - nodes.Iir_Kind.Wait_Statement, - nodes.Iir_Kind.Null_Statement, - nodes.Iir_Kind.Exit_Statement, - nodes.Iir_Kind.Next_Statement, - nodes.Iir_Kind.Return_Statement, - nodes.Iir_Kind.Variable_Assignment_Statement, - nodes.Iir_Kind.Simple_Signal_Assignment_Statement, - nodes.Iir_Kind.Procedure_Call_Statement, - ): - return - else: - raise Exception("Unknown node of kind {}".format(kind_image(k))) |