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)))
def parse(cls, loopNode: Iir, label: str) -> "ForLoopStatement": from pyGHDL.dom._Utils import GetIirKindOfNode from pyGHDL.dom._Translate import ( GetSequentialStatementsFromChainedNodes, GetRangeFromNode, GetNameFromNode, ) spec = nodes.Get_Parameter_Specification(loopNode) loopIndex = GetNameOfNode(spec) discreteRange = nodes.Get_Discrete_Range(spec) rangeKind = GetIirKindOfNode(discreteRange) if rangeKind == nodes.Iir_Kind.Range_Expression: rng = GetRangeFromNode(discreteRange) elif rangeKind in ( nodes.Iir_Kind.Attribute_Name, nodes.Iir_Kind.Parenthesis_Name, ): rng = GetNameFromNode(discreteRange) else: pos = Position.parse(loopNode) raise DOMException( "Unknown discete range kind '{kind}' in for...loop statement at line {line}.".format( kind=rangeKind.name, line=pos.Line ) ) statementChain = nodes.Get_Sequential_Statement_Chain(loopNode) statements = GetSequentialStatementsFromChainedNodes(statementChain, "for", label) return cls(loopNode, loopIndex, rng, statements, label)
def parse(cls, branchNode: Iir, label: str) -> "ElseBranch": from pyGHDL.dom._Translate import ( GetSequentialStatementsFromChainedNodes, ) statementChain = nodes.Get_Sequential_Statement_Chain(branchNode) statements = GetSequentialStatementsFromChainedNodes(statementChain, "else branch", label) return cls(branchNode, statements)
def parse(cls, branchNode: Iir, label: str) -> "IfBranch": from pyGHDL.dom._Translate import ( GetSequentialStatementsFromChainedNodes, GetExpressionFromNode, ) condition = GetExpressionFromNode(nodes.Get_Condition(branchNode)) statementChain = nodes.Get_Sequential_Statement_Chain(branchNode) statements = GetSequentialStatementsFromChainedNodes(statementChain, "if branch", label) return cls(branchNode, condition, statements)
def parse(cls, processNode: Iir, label: str, hasSensitivityList: bool) -> "ProcessStatement": from pyGHDL.dom._Translate import ( GetDeclaredItemsFromChainedNodes, GetSequentialStatementsFromChainedNodes, ) sensitivityList = None if hasSensitivityList: sensitivityList = [] for item in utils.list_iter(nodes.Get_Sensitivity_List(processNode)): sensitivityList.append(GetNameOfNode(item)) declaredItems = GetDeclaredItemsFromChainedNodes(nodes.Get_Declaration_Chain(processNode), "process", label) statements = GetSequentialStatementsFromChainedNodes( nodes.Get_Sequential_Statement_Chain(processNode), "process", label ) return cls(processNode, label, declaredItems, statements, sensitivityList)
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)))