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
def parse(cls, caseNode: Iir, label: str = None) -> "OthersCase": from pyGHDL.dom._Translate import GetSequentialStatementsFromChainedNodes body = nodes.Get_Associated_Block(caseNode) if body is nodes.Null_Iir: return cls(caseNode) statementChain = nodes.Get_Concurrent_Statement_Chain(body) statements = GetSequentialStatementsFromChainedNodes(statementChain, "case others", label) return cls(caseNode, statements)
def parse(cls, caseNode: Iir) -> "OthersGenerateCase": from pyGHDL.dom._Translate import ( GetDeclaredItemsFromChainedNodes, GetConcurrentStatementsFromChainedNodes, ) body = nodes.Get_Associated_Block(caseNode) # TODO: alternative label # alternativeLabelId = nodes.Get_Alternative_Label(body) alternativeLabel = "" declarationChain = nodes.Get_Declaration_Chain(body) declaredItems = GetDeclaredItemsFromChainedNodes(declarationChain, "case-generate others", alternativeLabel) statementChain = nodes.Get_Concurrent_Statement_Chain(body) statements = GetConcurrentStatementsFromChainedNodes(statementChain, "case-generate others", alternativeLabel) return cls(caseNode, declaredItems, statements, alternativeLabel)
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