| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'instr-scripts/structural_level.py')
| -rwxr-xr-x | instr-scripts/structural_level.py | 1332 | 
1 files changed, 1332 insertions, 0 deletions
| diff --git a/instr-scripts/structural_level.py b/instr-scripts/structural_level.py new file mode 100755 index 0000000..9c99b3e --- /dev/null +++ b/instr-scripts/structural_level.py @@ -0,0 +1,1332 @@ +#!/usr/bin/env python3 + +import argparse +from lxml import etree + +import id_manager +import waveform_manager +import process_internals + +################################################################################ +## Types ####################################################################### +################################################################################ +def new_element_from_xml ( +    inst_list_output, +    id_manager, +    etype, +    xml_id +): +    result = id_manager.get_id_from_xml(xml_id) + +    inst_list_output.write("(add_element " + etype + "  " + result + ")\n") + +    return result + +def new_element_from_string ( +    inst_list_output, +    id_manager, +    string +): +    result = id_manager.get_id_from_string(string) + +    inst_list_output.write("(add_element string " + result + ")\n") + +    return result + +def new_element ( +    inst_list_output, +    id_manager, +    etype +): +    result = id_manager.generate_new_pure_id() + +    inst_list_output.write("(add_element " + etype + "  " + result + ")\n") + +    return result + + +################################################################################ +## Components ################################################################## +################################################################################ +def handle_port_map ( +    inst_list_output, +    extra_output, +    id_manager, +    wfm_manager, +    root, +    design_file, +    architecture, +    component, +    linked_entity, +    port_map +): +    port_map_list = port_map.findall( +        "./el[@kind=\"association_element_by_expression\"]" +    ) +    real_ports_list = linked_entity.findall( +        "./port_chain/el[@kind=\"interface_signal_declaration\"]" +    ) + +    for i in range(len(port_map_list)): +        actual_wfm = port_map_list[i].find("./actual/named_entity") +        true_port = "" + +        formal = port_map_list[i].find("./formal") + +        if (formal == None): +            ## The port is mapped using its position (i). +            inst_list_output.write( +                "(port_maps " +                + id_manager.get_id_from_xml(component.attrib.get("id")) +                + " " +                + wfm_manager.get_waveform_from_source( +                    id_manager.get_id_from_xml(actual_wfm.attrib.get("ref")) +                ) +                + " " +                + id_manager.get_id_from_xml( +                    real_ports_list[i].attrib.get("id") +                ) +                + ")\n" +            ) +        else: +            ## The port is mapped "Destination => Origin" style +            #### Find the matching port +            true_port = linked_entity.find( +                "./port_chain/el[@identifier=\"" +                + formal.attrib.get("identifier") +                + "\"]" +            ) + +            if (true_port == None): +                # TODO +                raise Exception("Could not find true port for ...") + +            inst_list_output.write( +                "(port_maps " +                + id_manager.get_id_from_xml(component.attrib.get("id")) +                + " " +                + wfm_manager.get_waveform_from_source( +                    id_manager.get_id_from_xml(actual_wfm.attrib.get("ref")) +                ) +                + " " +                + id_manager.get_id_from_xml(true_port.attrib.get("id")) +                + ")\n" +            ) + +## Component uses reference from the architecture declaration ##################  +def handle_component_internal_ref ( +    inst_list_output, +    extra_output, +    id_manager, +    wfm_manager, +    root, +    design_file, +    architecture, +    component, +    source +): +    # We have to find the associated component declaration +    ref_id = source.find("./base_name").attrib.get("ref") + +    component_declaration = architecture.find( +        "./declaration_chain/el[@kind=\"component_declaration\"][@id=\"" +        + ref_id +        + "\"]" +    ) + +    # Then find the actual referenced entity +    linked_entity = root.find( +        ".//library_unit[@kind=\"entity_declaration\"][@identifier=\"" +        + component_declaration.attrib.get("identifier") +        + "\"]" +    ) + +    if (linked_entity == None): +        print( +            "[W] Could not find entity linked to component " +            + id_manager.get_id_from_xml(component.attrib.get("id")) +            + " (XML id: \"" +            + component.attrib.get("id") +            + "\", \"" +            + component.attrib.get("label") +            + "\" from architecture \"" +            + architecture.attrib.get("identifier") +            + "\")." +        ) +        return None + +    linked_entity_id = linked_entity.attrib.get("id") + +    inst_list_output.write( +        "(is_component_of " +        + id_manager.get_id_from_xml(component.attrib.get("id")) +        + " " +        + id_manager.get_id_from_xml(linked_entity_id) +        + ")\n" +    ) + +    return linked_entity + +## Component uses the name of the other entity directly ########################  +def handle_component_external_ref ( +    inst_list_output, +    extra_output, +    id_manager, +    wfm_manager, +    root, +    design_file, +    architecture, +    component, +    source +): +    # FIXME: there's a simpler way: source->./entity_name/named_entity@ref +    entity_ref = source.find( +        "./entity_name[@kind=\"selected_name\"]" +    ) + +    library_ref = entity_ref.find( +        "./prefix[@kind=\"simple_name\"]" +    ) + +    # Then find the actual referenced entity +    linked_entity = root.find( +        "./el[@kind=\"library_declaration\"][@identifier=\"" +        + library_ref.attrib.get("identifier") +        + "\"]//library_unit[@kind=\"entity_declaration\"][@identifier=\"" +        + entity_ref.attrib.get("identifier") +        + "\"]" +    ) + +    if (linked_entity == None): +        print( +            "[W] Could not find entity linked to component " +            + id_manager.get_id_from_xml(component.attrib.get("id")) +            + " (XML id: \"" +            + component.attrib.get("id") +            + "\", \"" +            + elem.attrib.get("label") +            + "\" from architecture \"" +            + architecture.attrib.get("identifier") +            + "\"), looked for \"" +            + library_ref.attrib.get("identifier") +            + "." +            + + entity_ref.attrib.get("identifier") +            +"\"." +        ) +        return None + +    linked_entity_id = linked_entity.attrib.get("id") + +    inst_list_output.write( +        "(is_component_of " +        + component.attrib.get("id") +        + " " +        + linked_entity_id +        + ")\n" +    ) + +    return linked_entity + +################################################################################ +def handle_component ( +    inst_list_output, +    extra_output, +    id_manager, +    wfm_manager, +    root, +    design_file, +    architecture, +    elem +): +    xml_id = elem.attrib.get("id") + +    local_id = new_element_from_xml( +        inst_list_output, +        id_manager, +        "component", +        xml_id +    ) + +    ## Set Functions ########################################################### +    #### line +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("line") +    ) +    inst_list_output.write( +        "(set_function line " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    #### column +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("col") +    ) +    inst_list_output.write( +        "(set_function column " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    #### label +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("label") +    ) +    inst_list_output.write( +        "(set_function label " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    ## Set Unary Predicates #################################################### + +    ## Find Source ############################################################# +    source = elem.find("./instantiated_unit") + +    linked_entity = None +    #### If it is from a "component" declaration ############################### +    if (source.attrib.get("kind") == "simple_name"): +        linked_entity = handle_component_internal_ref( +            inst_list_output, +            extra_output, +            id_manager, +            wfm_manager, +            root, +            design_file, +            architecture, +            elem, +            source +        ) +    #### If it is a more direct instantiation ################################## +    elif (source.attrib.get("kind") == "entity_aspect_entity"): +        linked_entity = handle_component_external_ref( +            inst_list_output, +            extra_output, +            id_manager, +            wfm_manager, +            root, +            design_file, +            architecture, +            elem, +            source +        ) +    else: +        raise Exception ( +            "Unhandled component instantiation type for component " +            + local_id +            + " (XML id: \"" +            + xml_id +            + "\", \"" +            + elem.attrib.get("label") +            + "\" from architecture \"" +            + architecture.attrib.get("identifier") +            + "\")." +        ) + +    if (linked_entity != None): +        ## Find Mapped Ports ################################################### +        port_map = elem.find("./port_map_aspect_chain") + +        if (port_map == None): +            print( +                "[W] Component instantiation " +                + local_id +                + " (XML id: \"" +                + xml_id +                + "\", \"" +                + elem.attrib.get("label") +                + "\" from architecture \"" +                + architecture.attrib.get("identifier") +                + "\") does not have any associated port map." +            ) +        else: +            handle_port_map( +                inst_list_output, +                extra_output, +                id_manager, +                wfm_manager, +                root, +                design_file, +                architecture, +                elem, +                linked_entity, +                port_map +            ) + +    return xml_id + +################################################################################ +## PROCESSES ################################################################### +################################################################################ +def handle_process ( +    inst_list_output, +    extra_output, +    id_manager, +    wfm_manager, +    root, +    design_file, +    architecture, +    elem +): +    xml_id = elem.attrib.get("id") + +    local_id = new_element_from_xml( +        inst_list_output, +        id_manager, +        "process", +        xml_id +    ) + +    ## Set Functions ########################################################### +    #### line +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("line") +    ) +    inst_list_output.write( +        "(set_function line " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    #### column +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("col") +    ) +    inst_list_output.write( +        "(set_function column " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    #### label +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("label") +    ) +    inst_list_output.write( +        "(set_function label " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    ## Set Unary Predicates #################################################### +    if (elem.attrib.get("seen_flag") == "true"): +        inst_list_output.write("(has_seen_flag " + local_id + ")\n") + +    if (elem.attrib.get("end_has_postponed") == "true"): +        inst_list_output.write("(end_has_postponed " + local_id + ")\n") + +    if (elem.attrib.get("is_ref") == "true"): +        inst_list_output.write("(is_ref " + local_id + ")\n") +    else: +        inst_list_output.write("(is_explicit_process " + local_id + ")\n") + +    if (elem.attrib.get("passive_flag") == "true"): +        inst_list_output.write("(has_passive_flag " + local_id + ")\n") + +    if (elem.attrib.get("postponed_flag") == "true"): +        inst_list_output.write("(has_postponed_flag " + local_id + ")\n") + +    if (elem.attrib.get("visible_flag") == "true"): +        inst_list_output.write("(has_visible_flag " + local_id + ")\n") + +    if (elem.attrib.get("is_within_flag") == "true"): +        inst_list_output.write("(is_within_flag " + local_id + ")\n") + +    if (elem.attrib.get("has_label") == "true"): +        inst_list_output.write("(has_label " + local_id + ")\n") + +    if (elem.attrib.get("has_is") == "true"): +        inst_list_output.write("(has_is " + local_id + ")\n") + +    if (elem.attrib.get("end_has_reserved_id") == "true"): +        inst_list_output.write("(end_has_reserved_id " + local_id + ")\n") + +    if (elem.attrib.get("end_has_identifier") == "true"): +        inst_list_output.write("(end_has_identifier " + local_id + ")\n") + +    ## Link with Waveforms ##################################################### +    children = elem.findall( +        "./sensitivity_list/el/named_entity" +    ) +    for c in children: +        inst_list_output.write( +            "(is_in_sensitivity_list " +            + wfm_manager.get_waveform_from_source( +                id_manager.get_id_from_xml(c.attrib.get("ref")) +            ) +            + " " +            + local_id +            + ")\n" +        ) + +    children = elem.findall( +        "./sensitivity_list/el[@ref]" +    ) +    for c in children: +        inst_list_output.write( +            "(is_in_sensitivity_list " +            + wfm_manager.get_waveform_from_source( +                id_manager.get_id_from_xml(c.attrib.get("ref")) +            ) +            + " " +            + local_id +            + ")\n" +        ) + +    children = elem.findall( +        ".//*[@kind=\"simple_name\"]/named_entity" +    ) +    for c in children: +        inst_list_output.write( +            "(is_accessed_by " +            + wfm_manager.get_waveform_from_source( +                id_manager.get_id_from_xml(c.attrib.get("ref")) +            ) +            + " " +            + local_id +            + ")\n" +        ) + +    ############################################################################ +    inst_list_output.write("\n") + +    # TODO: use 'pfp' parameter. +    pf = open(('./pfp_id_' + local_id), 'w') + +    internals = process_internals.Process_Internals( +        elem, +        id_manager, +        wfm_manager, +        pf +    ) +    internals.parse() +    pf.write("\n") +    pf.close() + +    return xml_id + +################################################################################ +## Signals ##################################################################### +################################################################################ +def handle_signal ( +    inst_list_output, +    extra_output, +    id_manager, +    wfm_manager, +    root, +    design_file, +    architecture, +    elem +): +    xml_id = elem.attrib.get("id") + +    local_id = new_element_from_xml( +        inst_list_output, +        id_manager, +        "signal", +        xml_id +    ) + +    ## Set Functions ########################################################### +    #### line +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("line") +    ) +    inst_list_output.write( +        "(set_function line " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    #### column +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("col") +    ) +    inst_list_output.write( +        "(set_function column " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    #### column +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("identifier") +    ) +    inst_list_output.write( +        "(set_function identifier " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    ## Set Unary Predicates ####################################################  +    if (elem.attrib.get("has_disconnect_flag") == "true"): +        inst_llocalist_output.write("(has_disconnect_flag " + local_id + ")\n") + +    if (elem.attrib.get("is_ref") == "true"): +        inst_list_output.write("(is_ref " + local_id + ")\n") + +    if (elem.attrib.get("has_active_flag") == "true"): +        inst_list_output.write("(has_active_flag " + local_id + ")\n") + +    if (elem.attrib.get("has_identifier_list") == "true"): +        inst_list_output.write("(has_identifier_list " + local_id + ")\n") + +    if (elem.attrib.get("visible_flag") == "true"): +        inst_list_output.write("(has_visible_flag " + local_id + ")\n") + +    if (elem.attrib.get("after_drivers_flag") == "true"): +        inst_list_output.write("(has_after_drivers_flag " + local_id + ")\n") + +    if (elem.attrib.get("use_flag") == "true"): +        inst_list_output.write("(has_use_flag " + local_id + ")\n") + +    if (elem.attrib.get("guarded_signal_flag") == "true"): +        inst_list_output.write("(has_guarded_signal_flag " + local_id + ")\n") + +    ## Set Other Predicates ####################################################  +    #### Link with Signal Kinds ################################################ +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("signal_kind").upper() +    ) +    inst_list_output.write( +        "(is_of_kind " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    inst_list_output.write("\n") + +    ## Matching Waveform ####################################################### +    #### Add Element ########################################################### +    waveform_id = wfm_manager.get_waveform_from_source(local_id) +    inst_list_output.write("(add_element waveform " + waveform_id + ")\n") + +    #### Link With Signal ###################################################### +    inst_list_output.write( +        "(is_waveform_of " +        + waveform_id +        + " " +        + local_id +        + ")\n" +    ) + +    ############################################################################ +    inst_list_output.write("\n") + +    return xml_id + +################################################################################ +## Architectures ############################################################### +################################################################################ +def handle_architecture ( +    inst_list_output, +    extra_output, +    id_manager, +    wfm_manager, +    root, +    design_file, +    elem +): +    xml_id = elem.attrib.get("id") + +    local_id = new_element_from_xml( +        inst_list_output, +        id_manager, +        "architecture", +        xml_id +    ) + +    ## Set Functions ########################################################### +    #### line +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("line") +    ) +    inst_list_output.write( +        "(set_function line " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    #### column +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("col") +    ) +    inst_list_output.write( +        "(set_function column " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    #### identifier +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("identifier") +    ) +    inst_list_output.write( +        "(set_function identifier " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    ## Set Unary Predicates #################################################### +    if (elem.attrib.get("foreign_flag") == "true"): +        inst_list_output.write("(has_foreign_flag " + local_id + ")\n") + +    if (elem.attrib.get("visible_flag") == "true"): +        inst_list_output.write("(has_visible_flag " + local_id + ")\n") + +    if (elem.attrib.get("is_within_flag") == "true"): +        inst_list_output.write("(is_within_flag " + local_id + ")\n") + +    if (elem.attrib.get("end_has_reserved_id") == "true"): +        inst_list_output.write("(end_has_reserved_id " + local_id + ")\n") + +    if (elem.attrib.get("end_has_identifier") == "true"): +        inst_list_output.write("(end_has_identifier " + local_id + ")\n") + +    ## Link to Parent ########################################################## +    inst_list_output.write( +        "(is_in_file " +        + local_id +        + " " +        + id_manager.get_id_from_xml(design_file.attrib.get("id")) +        + ")\n" +    ) + +    inst_list_output.write("\n") + +    ## Handle Children ######################################################### +    #### Internal Signals ###################################################### +    children = elem.findall( +        "./*/el[@kind=\"signal_declaration\"]" +    ) +    for c in children: +        c_id = handle_signal( +            inst_list_output, +            extra_output, +            id_manager, +            wfm_manager, +            root, +            design_file, +            elem, +            c +        ) +        inst_list_output.write( +            "(belongs_to_architecture " +            + id_manager.get_id_from_xml(c_id) +            + " " +            + local_id +            + ")\n" +        ) + +    #### Internal Processes #################################################### +    children = elem.findall( +        "./*/el[@kind=\"sensitized_process_statement\"]" +    ) +    for c in children: +        c_id = handle_process( +            inst_list_output, +            extra_output, +            id_manager, +            wfm_manager, +            root, +            design_file, +            elem, +            c +        ) +        inst_list_output.write( +            "(belongs_to_architecture " +            + id_manager.get_id_from_xml(c_id) +            + " " +            + local_id +            + ")\n" +        ) + +    #### Internal Components ################################################### +    children = elem.findall( +        "./*/el[@kind=\"component_instantiation_statement\"]" +    ) +    for c in children: +        c_id = handle_component( +            inst_list_output, +            extra_output, +            id_manager, +            wfm_manager, +            root, +            design_file, +            elem, +            c +        ) +        inst_list_output.write( +            "(belongs_to_architecture " +            + id_manager.get_id_from_xml(c_id) +            + " " +            + local_id +            + ")\n" +        ) + +    ############################################################################ +    entity = elem.find("./entity_name/named_entity") +    inst_list_output.write( +        "(is_architecture_of " +        + local_id +        + " " +        + id_manager.get_id_from_xml(entity.attrib.get("ref")) +        + ")\n" +    ) +    return xml_id + +################################################################################ +## Generic Constants ########################################################### +################################################################################ +def handle_generic ( +    inst_list_output, +    extra_output, +    id_manager, +    wfm_manager, +    root, +    design_file, +    entity, +    elem +): +    xml_id = elem.attrib.get("id") + +    local_id = new_element_from_xml( +        inst_list_output, +        id_manager, +        "generic", +        xml_id +    ) + +    ## Set Functions ########################################################### +    #### line +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("line") +    ) +    inst_list_output.write( +        "(set_function line " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    #### column +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("col") +    ) +    inst_list_output.write( +        "(set_function column " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    #### identifier +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("identifier") +    ) +    inst_list_output.write( +        "(set_function identifier " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    ## Set Unary Predicates #################################################### +    if (elem.attrib.get("has_class") == "true"): +        inst_list_output.write("(has_class " + local_id + ")\n") + +    if (elem.attrib.get("is_ref") == "true"): +        inst_list_output.write("(is_ref " + local_id + ")\n") + +    if (elem.attrib.get("has_identifier_list") == "true"): +        inst_list_output.write("(has_identifier_list " + local_id + ")\n") + +    if (elem.attrib.get("visible_flag") == "true"): +        inst_list_output.write("(has_visible_flag " + local_id + ")\n") + +    if (elem.attrib.get("after_drivers_flag") == "true"): +        inst_list_output.write("(has_after_drivers_flag " + local_id + ")\n") + +    if (elem.attrib.get("use_flag") == "true"): +        inst_list_output.write("(has_use_flag " + local_id + ")\n") + +    if (elem.attrib.get("guarded_signal_flag") == "true"): +        inst_list_output.write("(has_guarded_signal_flag " + local_id + ")\n") + +    ############################################################################ +    inst_list_output.write("\n") + +    return xml_id + +################################################################################ +## Ports ####################################################################### +################################################################################ +def handle_port ( +    inst_list_output, +    extra_output, +    id_manager, +    wfm_manager, +    root, +    design_file, +    entity, +    elem +): +    xml_id = elem.attrib.get("id") + +    local_id = new_element_from_xml( +        inst_list_output, +        id_manager, +        "port", +        xml_id +    ) + +    ## Set Functions ########################################################### +    #### line +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("line") +    ) +    inst_list_output.write( +        "(set_function line " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    #### column +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("col") +    ) +    inst_list_output.write( +        "(set_function column " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    #### identifier +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("identifier") +    ) +    inst_list_output.write( +        "(set_function identifier " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    ## Set Unary Predicates #################################################### +    if (elem.attrib.get("has_disconnect_flag") == "true"): +        inst_list_output.write("(has_disconnect_flag " + local_id + ")\n") + +    if (elem.attrib.get("has_class") == "true"): +        inst_list_output.write("(has_class " + local_id + ")\n") + +    if (elem.attrib.get("is_ref") == "true"): +        inst_list_output.write("(is_ref " + local_id + ")\n") + +    if (elem.attrib.get("has_active_flag") == "true"): +        inst_list_output.write("(has_active_flag " + local_id + ")\n") + +    if (elem.attrib.get("has_identifier_list") == "true"): +        inst_list_output.write("(has_identifier_list " + local_id + ")\n") + +    if (elem.attrib.get("visible_flag") == "true"): +        inst_list_output.write("(has_visible_flag " + local_id + ")\n") + +    if (elem.attrib.get("after_drivers_flag") == "true"): +        inst_list_output.write("(has_after_drivers_flag " + local_id + ")\n") + +    if (elem.attrib.get("use_flag") == "true"): +        inst_list_output.write("(has_use_flag " + local_id + ")\n") + +    if (elem.attrib.get("open_flag") == "true"): +        inst_list_output.write("(has_open_flag " + local_id + ")\n") + +    if (elem.attrib.get("guarded_signal_flag") == "true"): +        inst_list_output.write("(has_guarded_signal_flag " + local_id + ")\n") + +    ## Link With Signal Modes ################################################## +    if (elem.attrib.get("has_mode") == "true"): +        string_id = new_element_from_string( +            inst_list_output, +            id_manager, +            elem.attrib.get("mode").upper() +        ) +        inst_list_output.write( +            "(is_of_mode " +            + local_id +            + " " +            + string_id +            + ")\n" +        ) +    else: +        string_id = new_element_from_string( +            inst_list_output, +            id_manager, +            elem.attrib.get("NONE").upper() +        ) +        inst_list_output.write("(is_of_mode " + local_id + " " + string_id + ")\n") + +    inst_list_output.write("\n") + +    ## Matching Waveform ####################################################### +    #### Add Element ########################################################### +    wfm_id = wfm_manager.get_waveform_from_source(local_id) +    inst_list_output.write( +        "(add_element waveform " +        + wfm_id +        + ")\n" +    ) + +    #### Link With Port ######################################################## +    inst_list_output.write("(is_waveform_of " + wfm_id + " " + local_id + ")\n") + +    ############################################################################ +    inst_list_output.write("\n") + +    return xml_id + +################################################################################ +## Entities #################################################################### +################################################################################ +def handle_entity ( +    inst_list_output, +    extra_output, +    id_manager, +    wfm_manager, +    root, +    design_file, +    elem +): +    xml_id = elem.attrib.get("id") + +    local_id = new_element_from_xml( +        inst_list_output, +        id_manager, +        "entity", +        xml_id +    ) + +    ## Set Functions ########################################################### +    #### line +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("line") +    ) +    inst_list_output.write( +        "(set_function line " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    #### column +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("col") +    ) +    inst_list_output.write( +        "(set_function column " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    #### identifier +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("identifier") +    ) +    inst_list_output.write( +        "(set_function identifier " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) + +    ## Set Unary Predicates #################################################### +    if (elem.attrib.get("has_begin") == "true"): +        inst_list_output.write("(has_begin " + local_id + ")\n") + +    if (elem.attrib.get("visible_flag") == "true"): +        inst_list_output.write("(has_visible_flag " + local_id + ")\n") + +    if (elem.attrib.get("is_within_flag") == "true"): +        inst_list_output.write("(is_within_flag " + local_id + ")\n") + +    if (elem.attrib.get("end_has_reserved_id") == "true"): +        inst_list_output.write("(end_has_reserved_id " + local_id + ")\n") + +    if (elem.attrib.get("end_has_identifier") == "true"): +        inst_list_output.write("(end_has_identifier " + local_id + ")\n") + +    ## Link to Parent ########################################################## +    inst_list_output.write( +        "(is_in_file " +        + local_id +        + " " +        + id_manager.get_id_from_xml(design_file.attrib.get("id")) +        + ")\n" +    ) + +    inst_list_output.write("\n") + +    ## Handle Children ######################################################### +    #### Ports ################################################################# +    interfaces = elem.findall( +        "./port_chain/el[@kind=\"interface_signal_declaration\"]" +    ) +    for p in interfaces: +        p_id = handle_port( +            inst_list_output, +            extra_output, +            id_manager, +            wfm_manager, +            root, +            design_file, +            elem, +            p +        ) +        inst_list_output.write( +            "(is_port_of " +            + id_manager.get_id_from_xml(p_id) +            + " " +            + local_id +            + ")\n" +        ) + +    #### Generic Constants ##################################################### +    interfaces = elem.findall( +        "./generic_chain/el[@kind=\"interface_constant_declaration\"]" +    ) +    for g in interfaces: +        g_id = handle_generic( +            inst_list_output, +            extra_output, +            id_manager, +            wfm_manager, +            root, +            design_file, +            elem, +            g +        ) +        inst_list_output.write( +            "(is_generic_of " +            + id_manager.get_id_from_xml(g_id) +            + " " +            + local_id +            + ")\n" +        ) + +    return xml_id + +################################################################################ +## Files ####################################################################### +################################################################################ +def handle_design_file ( +    inst_list_output, +    extra_output, +    id_manager, +    wfm_manager, +    root, +    elem +): +    xml_id = elem.attrib.get("id") +    local_id = new_element_from_xml( +        inst_list_output, +        id_manager, +        "file", +        xml_id +    ) + +    ## Set Functions ########################################################### +    #### filename +    string_id = new_element_from_string( +        inst_list_output, +        id_manager, +        elem.attrib.get("file") +    ) +    inst_list_output.write( +        "(set_function filename " +        + local_id +        + " " +        + string_id +        + ")\n" +    ) +    local_id = id_manager.get_id_from_xml(xml_id) + +    ## Handle Children ######################################################### +    #### Entities ############################################################## +    children = elem.findall( +        "./*/*/library_unit[@kind=\"entity_declaration\"]" +    ) +    for c in children: +        c_id = handle_entity( +            inst_list_output, +            extra_output, +            id_manager, +            wfm_manager, +            root, +            elem, +            c +        ) + +    #### Architectures ######################################################### +    children = elem.findall( +        "./*/*/library_unit[@kind=\"architecture_body\"]" +    ) +    for c in children: +        c_id = handle_architecture( +            inst_list_output, +            extra_output, +            id_manager, +            wfm_manager, +            root, +            elem, +            c +        ) + +    ############################################################################ +    return xml_id + +################################################################################ +### MAIN ####################################################################### +################################################################################ +parser = argparse.ArgumentParser( +    description = ( +        "Generates a list of instructions to construct the Structural Level." +    ) +) + +parser.add_argument( +    '-i', +    '--input', +    type = str, +    required = True, +    help = 'AST of the system produced by GHDL (XML).' +) + +parser.add_argument( +    '-io', '--instructions-output', +    type = argparse.FileType(mode = 'w', encoding = 'UTF-8'), +    default = 'system.sl', +    help = 'Instruction List output file (default: system.sl)', +) + +parser.add_argument( +    '-eo', '--extra-output', +    type = argparse.FileType(mode = 'w', encoding = 'UTF-8'), +    default = 'system_extra.sl', +    help = 'Extra Information output file (default: system_extra.sl)', +) + +parser.add_argument( +    '-pfp', +    '--process-files-prefix', +    type = str, +    default = "./process_instr_", +    help = 'Resulting process description files: this + their ID.' +) + +args = parser.parse_args() + +xmltree = etree.parse(args.input) + +xmlroot = xmltree.getroot() + +id_manager = id_manager.Id_Manager(args.extra_output, 0) +wfm_manager = waveform_manager.Waveform_Manager(args.extra_output, id_manager) +## Handle Libraries ############################################################ +#elements = xmlroot.findall("./*/el[@kind=\"library_declaration\"]") +#[handle_library(e, root) for e in elements] + +## Handle Files ################################################################ +elements = xmlroot.findall("./*/*/el[@kind=\"design_file\"][@file]") +[ +    handle_design_file( +        args.instructions_output, +        args.extra_output, +        id_manager, +        wfm_manager, +        xmlroot, +        e +    ) for e in elements +] + +id_manager.finalize() | 


