summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2017-07-17 10:13:31 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2017-07-17 10:13:31 +0200
commit3e019d57fab57afe7aad373385f32a23bd178941 (patch)
treec11e3440e4f199c8da54e649f01f9598df87e46b /instr-scripts/structural_level.py
Initial commit.
Diffstat (limited to 'instr-scripts/structural_level.py')
-rwxr-xr-xinstr-scripts/structural_level.py1332
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()