| summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'instr-scripts/process_internals.py')
| -rw-r--r-- | instr-scripts/process_internals.py | 517 |
1 files changed, 517 insertions, 0 deletions
diff --git a/instr-scripts/process_internals.py b/instr-scripts/process_internals.py new file mode 100644 index 0000000..e323300 --- /dev/null +++ b/instr-scripts/process_internals.py @@ -0,0 +1,517 @@ +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 + +class Process_Internals: + def __init__ (self, xml, id_manager, wfm_manager, output): + self.xml = xml + self.id_manager = id_manager + self.wfm_manager = wfm_manager + self.output = output + + def parse (self): + start = self.xml.find("./sequential_statement_chain") + + self.handle_sequential_statement_chain( + start, + [], + 0, + [] + ) + + def handle_sequential_statement_chain ( + self, + xml, + prev_nodes, + node_depth, + extra_attributes + ): + instructions = xml.findall("./el") + + for el in instructions: + el_kind = el.attrib.get("kind") + + if (el_kind == "if_statement"): + prev_nodes = self.handle_if_node( + el, + prev_nodes, + node_depth, + extra_attributes + ) + elif (el_kind == "simple_signal_assignment_statement"): + prev_nodes = self.handle_signal_assignment_node( + el, + prev_nodes, + node_depth, + extra_attributes + ) + elif (el_kind == "case_statement"): + prev_nodes = self.handle_case_node( + el, + prev_nodes, + node_depth, + extra_attributes + ) + else: + raise Exception ( + "Unimplemented instruction kind \"" + + el_kind + + "\"" + ) + + extra_attributes = [] + + return prev_nodes + + + def handle_if_node (self, xml, prev_nodes, node_depth, extra_attributes): + cond_node_id = new_element(self.output, self.id_manager, "node") + + for pn in prev_nodes: + self.output.write( + "(node_connect " + + pn + + " " + + cond_node_id + + ")\n" + ) + + cond_node_xml = xml.find("./condition") + + sources_xml = cond_node_xml.findall( + ".//named_entity" + ) + + for src_xml in sources_xml: + self.output.write( + "(expr_reads " + + cond_node_id + + " " + + self.id_manager.get_id_from_xml(src_xml.attrib.get("ref")) + + ")\n" + ) + + #### label + string_id = new_element_from_string( + self.output, + self.id_manager, + xml.attrib.get("label") + ) + self.output.write( + "(set_attribute label " + + cond_node_id + + " " + + string_id + + ")\n" + ) + + #### Expression + # TODO + + #### Kind + string_id = new_element_from_string( + self.output, + self.id_manager, + "IF" + ) + self.output.write( + "(set_attribute kind " + + cond_node_id + + " " + + string_id + + ")\n" + ) + + #### Options + for attr in extra_attributes: + string_id = new_element_from_string( + self.output, + self.id_manager, + attr + ) + self.output.write( + "(add_option " + cond_node_id + " " + string_id + ")\n" + ) + + #### Depth + self.output.write( + "(set_attribute depth " + + cond_node_id + + " " + + str(node_depth + 1) + + ")\n" + ) + + #### File / Line / Column + # TODO + + true_branch_xml = xml.find("./sequential_statement_chain") + + exit_points = self.handle_sequential_statement_chain ( + true_branch_xml, + [cond_node_id], + (node_depth + 2), + ["COND_WAS_TRUE"] + ) + + false_branch_xml = xml.find("./else_clause/sequential_statement_chain") + + if (false_branch_xml == None): + exit_points += prev_nodes + else: + exit_points += self.handle_sequential_statement_chain ( + false_branch_xml, + [cond_node_id], + (node_depth + 2), + ["COND_WAS_FALSE"] + ) + + return exit_points + + def handle_signal_assignment_node ( + self, + xml, + prev_nodes, + node_depth, + extra_attributes + ): + node_id = new_element(self.output, self.id_manager, "node") + + for pn in prev_nodes: + self.output.write( + "(node_connect " + + pn + + " " + + node_id + + ")\n" + ) + + #### label + string_id = new_element_from_string( + self.output, + self.id_manager, + xml.attrib.get("label") + ) + self.output.write( + "(set_attribute label " + + node_id + + " " + + string_id + + ")\n" + ) + + #### Expression + # TODO + + #### Kind + string_id = new_element_from_string( + self.output, + self.id_manager, + "INSTRUCTION" + ) + self.output.write( + "(set_attribute kind " + + node_id + + " " + + string_id + + ")\n" + ) + + #### Options + for attr in extra_attributes: + string_id = new_element_from_string( + self.output, + self.id_manager, + attr + ) + self.output.write( + "(add_option " + node_id + " " + string_id + ")\n" + ) + + #### Depth + self.output.write( + "(set_attribute depth " + + node_id + + " " + + str(node_depth) + + ")\n" + ) + + #### File / Line / Column + # TODO + + # <target kind="indexed_name" if vector + target_xml = xml.find( + "./target" + ) + + if (target_xml.attrib.get("kind") == "indexed_name"): + target_xml = target_xml.find("./prefix/named_entity") + else: + target_xml = target_xml.find("./named_entity") + + self.output.write( + "(expr_writes " + + node_id + + " " + + self.id_manager.get_id_from_xml(target_xml.attrib.get("ref")) + + ")\n" + ) + + sources_xml = xml.findall( + "./waveform_chain//named_entity" + ) + + for src_xml in sources_xml: + self.output.write( + "(expr_reads " + + node_id + + " " + + self.id_manager.get_id_from_xml(src_xml.attrib.get("ref")) + + ")\n" + ) + + ## Predicates ########################################################## + + return [node_id] + + def handle_case_node (self, xml, prev_nodes, node_depth, extra_attributes): + cond_node_id = new_element(self.output, self.id_manager, "node") + + for pn in prev_nodes: + self.output.write( + "(node_connect " + + pn + + " " + + cond_node_id + + ")\n" + ) + + cond_node_xml = xml.find("./expression") + + sources_xml = cond_node_xml.findall( + ".//named_entity" + ) + + for src_xml in sources_xml: + self.output.write( + "(expr_reads " + + cond_node_id + + " " + + self.id_manager.get_id_from_xml(src_xml.attrib.get("ref")) + + ")\n" + ) + + #### label + string_id = new_element_from_string( + self.output, + self.id_manager, + xml.attrib.get("label") + ) + self.output.write( + "(set_attribute label " + + cond_node_id + + " " + + string_id + + ")\n" + ) + + #### Expression + # TODO + + #### Kind + string_id = new_element_from_string( + self.output, + self.id_manager, + "CASE" + ) + self.output.write( + "(set_attribute kind " + + cond_node_id + + " " + + string_id + + ")\n" + ) + + #### Options + for attr in extra_attributes: + string_id = new_element_from_string( + self.output, + self.id_manager, + attr + ) + self.output.write( + "(add_option " + cond_node_id + " " + string_id + ")\n" + ) + + #### Depth + self.output.write( + "(set_attribute depth " + + cond_node_id + + " " + + str(node_depth + 1) + + ")\n" + ) + + #### File / Line / Column + # TODO + + others_branch_xml = xml.find( + "./case_statement_alternative_chain/el[@kind=\"choice_by_others\"]" + ) + + if (others_branch_xml == None): + exit_points = [] + else: + exit_points = self.handle_when_node( + others_branch_xml, + [cond_node_id], + (node_depth + 2), + ["WHEN_OTHERS"] + ) + + when_branches_xml = xml.findall( + "./case_statement_alternative_chain/el[@kind=\"choice_by_expression\"]" + ) + + for when_branch in when_branches_xml: + exit_points += self.handle_when_node( + when_branch, + [cond_node_id], + (node_depth + 2), + [] + ) + + false_branch_xml = xml.find("./else_cause/sequential_statement_chain") + + if (false_branch_xml == None): + exit_points += prev_nodes + else: + exit_points += self.handle_sequential_statement_chain ( + false_branch_xml, + [cond_node_id], + (node_depth + 2), + ["COND_WAS_FALSE"] + ) + + return exit_points + + def handle_when_node (self, xml, prev_nodes, node_depth, extra_attributes): + node_id = new_element(self.output, self.id_manager, "node") + + sources_xml = xml.findall( + "./choice_expression//named_entity" + ) + + for src_xml in sources_xml: + self.output.write( + "(expr_reads " + + node_id + + " " + + self.id_manager.get_id_from_xml(src_xml.attrib.get("ref")) + + ")\n" + ) + + for pn in prev_nodes: + self.output.write( + "(node_connect " + + pn + + " " + + node_id + + ")\n" + ) + + #### label + string_id = new_element_from_string( + self.output, + self.id_manager, + "" + ) + self.output.write( + "(set_attribute label " + + node_id + + " " + + string_id + + ")\n" + ) + + #### Expression + # TODO + + #### Kind + string_id = new_element_from_string( + self.output, + self.id_manager, + "WHEN" + ) + self.output.write( + "(set_attribute kind " + + node_id + + " " + + string_id + + ")\n" + ) + + #### Options + for attr in extra_attributes: + string_id = new_element_from_string( + self.output, + self.id_manager, + attr + ) + self.output.write( + "(add_option " + node_id + " " + string_id + ")\n" + ) + + #### Depth + self.output.write( + "(set_attribute depth " + + node_id + + " " + + str(node_depth) + + ")\n" + ) + + #### File / Line / Column + # TODO + + chain_xml = xml.find("./associated_chain") + + exit_points = self.handle_sequential_statement_chain( + chain_xml, + [node_id], + (node_depth + 1), + ["COND_WAS_TRUE"] + ) + + return exit_points |


