def parse(cls, componentNode: Iir): name = GetNameOfNode(componentNode) generics = GetGenericsFromChainedNodes( nodes.Get_Generic_Chain(componentNode)) ports = GetPortsFromChainedNodes(nodes.Get_Port_Chain(componentNode)) return cls(componentNode, name, generics, ports)
def x_get_entity_interface(self, library, name): def create_interfaces(inters): res = [] while inters != nodes.Null_Iir: res.append({ "name": name_table.Get_Name_Ptr( nodes.Get_Identifier(inters)).decode("latin-1") }) inters = nodes.Get_Chain(inters) return res # Find library lib_id = name_table.Get_Identifier(library.encode("utf-8")) lib = libraries.Get_Library_No_Create(lib_id) if lib == name_table.Null_Identifier: return None # Find entity ent_id = name_table.Get_Identifier(name.encode("utf-8")) unit = libraries.Find_Primary_Unit(lib, ent_id) if unit == nodes.Null_Iir: return None ent = nodes.Get_Library_Unit(unit) return { "library": library, "entity": name, "generics": create_interfaces(nodes.Get_Generic_Chain(ent)), "ports": create_interfaces(nodes.Get_Port_Chain(ent)), }
def parse(cls, procedureNode: Iir) -> "Procedure": from pyGHDL.dom._Translate import ( GetGenericsFromChainedNodes, GetParameterFromChainedNodes, ) procedureName = GetNameOfNode(procedureNode) generics = GetGenericsFromChainedNodes(nodes.Get_Generic_Chain(procedureNode)) parameters = GetParameterFromChainedNodes(nodes.Get_Interface_Declaration_Chain(procedureNode)) return cls(procedureNode, procedureName, generics, parameters)
def parse(cls, entityNode: Iir, contextItems: Iterable[ContextUnion]): name = GetNameOfNode(entityNode) generics = GetGenericsFromChainedNodes( nodes.Get_Generic_Chain(entityNode)) ports = GetPortsFromChainedNodes(nodes.Get_Port_Chain(entityNode)) declaredItems = GetDeclaredItemsFromChainedNodes( nodes.Get_Declaration_Chain(entityNode), "entity", name) statements = GetConcurrentStatementsFromChainedNodes( nodes.Get_Concurrent_Statement_Chain(entityNode), "entity", name) # FIXME: read use clauses return cls(entityNode, name, contextItems, generics, ports, declaredItems, statements)
def parse(cls, packageNode: Iir, contextItems: Iterable[ContextUnion]): name = GetNameOfNode(packageNode) packageHeader = nodes.Get_Package_Header(packageNode) if packageHeader is not nodes.Null_Iir: generics = GetGenericsFromChainedNodes( nodes.Get_Generic_Chain(packageHeader)) else: generics = [] declaredItems = GetDeclaredItemsFromChainedNodes( nodes.Get_Declaration_Chain(packageNode), "package", name) # FIXME: read use clauses return cls(packageNode, name, contextItems, generics, declaredItems)
def parse(cls, functionNode: Iir) -> "Function": from pyGHDL.dom._Translate import ( GetGenericsFromChainedNodes, GetParameterFromChainedNodes, ) functionName = GetNameOfNode(functionNode) generics = GetGenericsFromChainedNodes(nodes.Get_Generic_Chain(functionNode)) parameters = GetParameterFromChainedNodes(nodes.Get_Interface_Declaration_Chain(functionNode)) returnType = nodes.Get_Return_Type_Mark(functionNode) returnTypeName = GetNameOfNode(returnType) returnTypeSymbol = SimpleSubtypeSymbol(returnType, returnTypeName) return cls(functionNode, functionName, returnTypeSymbol, generics, parameters)
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)))
def __ghdlGetGenerics(cls, entity): return pyutils.chain_iter(nodes.Get_Generic_Chain(entity))