| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2017-07-21 14:57:46 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2017-07-21 14:57:46 +0200 | 
| commit | 0aa91fb542bd4e2bec97de98ab819ddd6ccbb698 (patch) | |
| tree | 4a07e98fa5008c9728a58265fd59471ff321e346 /ast-to-instr/src/VHDLComponent.java | |
| parent | 008d9c6d2a5e7028dc06b8398846ff60999b8732 (diff) | |
Adds "port maps" support.
Diffstat (limited to 'ast-to-instr/src/VHDLComponent.java')
| -rw-r--r-- | ast-to-instr/src/VHDLComponent.java | 191 | 
1 files changed, 178 insertions, 13 deletions
| diff --git a/ast-to-instr/src/VHDLComponent.java b/ast-to-instr/src/VHDLComponent.java index a9f2cae..2d594f1 100644 --- a/ast-to-instr/src/VHDLComponent.java +++ b/ast-to-instr/src/VHDLComponent.java @@ -11,9 +11,13 @@ public class VHDLComponent extends ParsableXML  {     private static final XPathExpression XPE_FIND_INST_UNIT;     private static final XPathExpression XPE_FIND_BASE_NAME; +   private static final XPathExpression XPE_FIND_ENTITY_NAME; +   private static final XPathExpression XPE_FIND_LIBRARY_NAME;     private static final XPathExpression XPE_FIND_PORT_MAPS;     private static final XPathExpression XPE_FIND_REAL_PORTS; +   private static final XPathExpression XPE_FIND_ACTUAL_NE; +   private static final XPathExpression XPE_FIND_FORMAL;     private static final XPathExpression XPE_FIND_GENERIC_MAPS; @@ -22,10 +26,21 @@ public class VHDLComponent extends ParsableXML        XPE_FIND_INST_UNIT = XMLManager.compile_or_die("./instantiated_unit");        XPE_FIND_BASE_NAME = XMLManager.compile_or_die("./base_name"); +      XPE_FIND_ENTITY_NAME = XMLManager.compile_or_die +      ( +        "./entity_name[@kind=\"selected_name\"]" +      ); + +      XPE_FIND_LIBRARY_NAME = XMLManager.compile_or_die +      ( +         "./prefix[@kind=\"simple_name\"]" +      ); +        XPE_FIND_PORT_MAPS =           XMLManager.compile_or_die           ( -            "./el[@kind=\"association_element_by_expression\"]" +            "./port_map_aspect_chain/el" +            + "[@kind=\"association_element_by_expression\"]"           );        XPE_FIND_REAL_PORTS = @@ -34,6 +49,9 @@ public class VHDLComponent extends ParsableXML              "./port_chain/el[@kind=\"interface_signal_declaration\"]"           ); +      XPE_FIND_ACTUAL_NE = XMLManager.compile_or_die("./actual/named_entity"); +      XPE_FIND_FORMAL = XMLManager.compile_or_die("./formal"); +        XPE_FIND_GENERIC_MAPS = null; /* TODO */     } @@ -55,6 +73,7 @@ public class VHDLComponent extends ParsableXML     {        final String xml_id;        final IDs local_id; +      final Node linked_entity;        xml_id = XMLManager.get_attribute(xml_node, "id"); @@ -62,7 +81,7 @@ public class VHDLComponent extends ParsableXML        /** Parent **************************************************************/        handle_link_to_architecture(local_id); -      handle_link_to_entity(local_id); +      linked_entity = handle_link_to_entity(local_id);        /** Functions ***********************************************************/        handle_function_line(local_id); @@ -70,8 +89,12 @@ public class VHDLComponent extends ParsableXML        handle_function_label(local_id);        /** Predicates **********************************************************/ -      handle_predicate_port_maps(local_id); -      handle_predicate_generic_maps(local_id); + +      if (linked_entity != (Node) null) +      { +         handle_predicate_port_maps(local_id, linked_entity); +         handle_predicate_generic_maps(local_id, linked_entity); +      }     }     /***************************************************************************/ @@ -129,12 +152,50 @@ public class VHDLComponent extends ParsableXML        return           (Node) current_query.evaluate           ( -            current_node, +            Main.get_xml_root(), +            XPathConstants.NODE +         ); +   } + +   private Node find_entity_from_direct_ref (final Node source_node) +   throws XPathExpressionException +   { +      final XPathExpression xpe_get_matching_entity; +      final Node entity_ref, library_ref; + +      entity_ref = +         (Node) XPE_FIND_ENTITY_NAME.evaluate +         ( +            source_node, +            XPathConstants.NODE +         ); + +      library_ref = +         (Node) XPE_FIND_ENTITY_NAME.evaluate +         ( +            entity_ref, +            XPathConstants.NODE +         ); + +      xpe_get_matching_entity = +         XMLManager.compile_or_die +         ( +            "./el[@kind=\"library_declaration\"][@identifier=\"" +            + XMLManager.get_attribute(library_ref, "identifier") +            + "\"]//library_unit[@kind=\"entity_declaration\"][@identifier=\"" +            + XMLManager.get_attribute(entity_ref, "identifier") +            + "\"]" +         ); + +      return +         (Node) xpe_get_matching_entity.evaluate +         ( +            Main.get_xml_root(),              XPathConstants.NODE           );     } -   private void handle_link_to_entity +   private Node handle_link_to_entity     (        final IDs local_id     ) @@ -158,8 +219,7 @@ public class VHDLComponent extends ParsableXML        }        else if (kind.equals("entity_aspect_entity"))        { -         /* TODO */ -         //current_node = find_entity_from_external_ref(current_node); +         current_node = find_entity_from_direct_ref(current_node);        }        else        { @@ -172,7 +232,7 @@ public class VHDLComponent extends ParsableXML              + ")."           ); -         return; +         return null;        }        if (current_node == (Node) null) @@ -186,7 +246,7 @@ public class VHDLComponent extends ParsableXML              + ")."           ); -         return; +         return null;        }        Predicates.add_entry @@ -199,6 +259,8 @@ public class VHDLComponent extends ParsableXML              "entity"           )        ); + +      return current_node;     }     /***************************************************************************/ @@ -257,16 +319,119 @@ public class VHDLComponent extends ParsableXML     /***************************************************************************/     private void handle_predicate_port_maps     ( -      final IDs local_id +      final IDs local_id, +      final Node linked_entity     ) +   throws XPathExpressionException     { -      /* TODO */ +      final NodeList port_maps, real_ports; +      final int port_maps_length; + +      port_maps = +         (NodeList) XPE_FIND_PORT_MAPS.evaluate +         ( +            xml_node, +            XPathConstants.NODESET +         ); + +      real_ports = +         (NodeList) XPE_FIND_REAL_PORTS.evaluate +         ( +            linked_entity, +            XPathConstants.NODESET +         ); + +      port_maps_length = port_maps.getLength(); + +      for (int i = 0; i < port_maps_length; ++i) +      { +         final Node mapping, formal_name, actual_waveform; + +         mapping = port_maps.item(i); + +         actual_waveform = +            (Node) XPE_FIND_ACTUAL_NE.evaluate +            ( +               mapping, +               XPathConstants.NODE +            ); + +         formal_name = +            (Node) XPE_FIND_FORMAL.evaluate +            ( +               mapping, +               XPathConstants.NODE +            ); + +         if (formal_name == null) +         { +            Predicates.add_entry +            ( +               "port_maps", +               local_id, +               Waveforms.get_associated_waveform_id +               ( +                  IDs.get_id_from_xml_id +                  ( +                     XMLManager.get_attribute(actual_waveform, "ref"), +                     null +                  ) +               ), +               IDs.get_id_from_xml_id +               ( +                  XMLManager.get_attribute(real_ports.item(i), "id"), +                  "port" +               ) +            ); +         } +         else +         { +            final XPathExpression xpe_find_true_port; +            final Node true_port; + +            xpe_find_true_port = +               XMLManager.compile_or_die +               ( +                  "./port_chain/el[@identifier=\"" +                  + XMLManager.get_attribute(formal_name, "identifier") +                  + "\"]" +               ); + +            true_port = +               (Node) xpe_find_true_port.evaluate +               ( +                  linked_entity, +                  XPathConstants.NODE +               ); + +            Predicates.add_entry +            ( +               "port_maps", +               local_id, +               Waveforms.get_associated_waveform_id +               ( +                  IDs.get_id_from_xml_id +                  ( +                     XMLManager.get_attribute(actual_waveform, "ref"), +                     null +                  ) +               ), +               IDs.get_id_from_xml_id +               ( +                  XMLManager.get_attribute(true_port, "id"), +                  "port" +               ) +            ); +         } +      }     }     private void handle_predicate_generic_maps     ( -      final IDs local_id +      final IDs local_id, +      final Node linked_entity     ) +   throws XPathExpressionException     {        /* TODO */     } | 


