| Application module: Footprint definition | ISO/TS 10303-1646:2019(E) © ISO | 
         (*
ISO/TC 184/SC 4/WG 12 N10301 - ISO/TS 10303-1646 Footprint definition - EXPRESS ARM
Supersedes 
         ISO/TC 184/SC 4/WG 12 N9418
*)
         
SCHEMA Footprint_definition_arm;
         USE FROM
         Layered_interconnect_complex_template_arm;
            -- ISO/TS 10303-1716
         USE FROM
         Package_arm;
            -- ISO/TS 10303-1707
         REFERENCE FROM 
         Support_resource_arm   -- ISO/TS 10303-1800
  (bag_to_set);
         
ENTITY Breakout_footprint_definition
           SUBTYPE OF (Generic_footprint_definition);
           reference_footprint : Footprint_definition;
INVERSE
           breakout_traces : SET[1:?] OF stratum_feature_template_location_in_breakout_footprint_definition FOR assembly;
WHERE
           WR1: SELF\Multi_stratum_structured_template.location = reference_footprint\Multi_stratum_structured_template.location;
         
         END_ENTITY;
ENTITY Breakout_footprint_definition_shape_model
           SUBTYPE OF (Structured_template_planar_shape_model);
           SELF\structured_template_planar_shape_model.shape_characterized_definition : SET[1:1] OF Breakout_footprint_definition;
           reference_shape : Footprint_definition_shape_model;
WHERE
           WR1: reference_shape.shape_characterized_definition[1] :=: shape_characterized_definition[1].reference_footprint;
         
         END_ENTITY;
ENTITY Footprint_definition
           SUBTYPE OF (Generic_footprint_definition);
           reference_package : 
         OPTIONAL 
         Part_usage_view;
DERIVE
           locations_with_reference_feature : SET OF Part_feature_based_template_location := QUERY(trf <* templates | 'FOOTPRINT_DEFINITION_ARM.PART_FEATURE_BASED_TEMPLATE_LOCATION' IN TYPEOF(trf));
WHERE
           WR1: SIZEOF(QUERY(shape                <* SELF\Structured_template.shapes                | NOT ('LAYERED_INTERCONNECT_COMPLEX_TEMPLATE_ARM.FOOTPRINT_DEFINITION_SHAPE_MODEL'
            IN TYPEOF(shape)))) =   0;
           WR2: SIZEOF(QUERY(tlist                <* SELF\Structured_template.templates                | ('FOOTPRINT_DEFINITION_ARM.FOOTPRINT_DEFINITION'
            IN TYPEOF(tlist.template)))) =   0;
           WR3: (SIZEOF(locations_with_reference_feature) = 0) OR   NOT EXISTS(reference_package) OR       (SIZEOF(QUERY(lwrf       
            <* locations_with_reference_feature                     | NOT (reference_package :=:                            lwrf\Part_feature_based_template_location.reference_feature\Part_feature.associated_definition)))
            =        0);
         
         END_ENTITY;
ENTITY Footprint_definition_shape_model
           SUBTYPE OF (Structured_template_planar_shape_model);
           SELF\structured_template_planar_shape_model.shape_characterized_definition : SET[1:1] OF Footprint_definition;
           reference_shape : 
         OPTIONAL 
         physical_unit_shape_model_select;
           reference_seating_plane_placement : 
         OPTIONAL 
         Usage_concept_usage_relationship;
WHERE
           WR1: NOT (SIZEOF(['PHYSICAL_UNIT_3D_SHAPE_ARM.PHYSICAL_UNIT_3D_SHAPE_MODEL',                'PHYSICAL_UNIT_2D_SHAPE_ARM.PHYSICAL_UNIT_PLANAR_SHAPE_MODEL']
            *               TYPEOF(reference_shape)) =        1) OR       NOT ('PHYSICAL_UNIT_USAGE_VIEW_ARM.PART_USAGE_VIEW' IN     
            TYPEOF(reference_shape\Physical_unit_shape_model.shape_characterized_definition)) OR           NOT ('LAYERED_INTERCONNECT_COMPLEX_TEMPLATE_ARM.FOOTPRINT_DEFINITION'
            IN                TYPEOF(shape_characterized_definition[1])) OR               (shape_characterized_definition[1]\Footprint_definition.reference_package
            :=:                reference_shape\Physical_unit_shape_model.shape_characterized_definition);
           WR2: NOT (SIZEOF(['PHYSICAL_UNIT_3D_SHAPE_ARM.PHYSICAL_UNIT_3D_SHAPE_MODEL',                'PHYSICAL_UNIT_2D_SHAPE_ARM.PHYSICAL_UNIT_PLANAR_SHAPE_MODEL']
            *               TYPEOF(reference_shape)) =        1) OR       ('PHYSICAL_UNIT_USAGE_VIEW_ARM.PART_USAGE_VIEW' IN        TYPEOF(reference_shape\Physical_unit_shape_model.shape_characterized_definition));
           WR3: NOT EXISTS(SELF\Representation.description);
           WR4: NOT EXISTS(reference_shape) OR EXISTS(shape_characterized_definition[1]\Footprint_definition.reference_package);
           WR5: NOT EXISTS(reference_seating_plane_placement) OR EXISTS(reference_shape);
           WR6: NOT EXISTS(reference_seating_plane_placement) OR       ('PACKAGE_ARM.PACKAGE' IN TYPEOF(shape_characterized_definition[1]\Footprint_definition.reference_package));
           WR7: NOT EXISTS(reference_seating_plane_placement) OR       ('NON_FEATURE_SHAPE_ELEMENT_ARM.SEATING_PLANE' IN        TYPEOF(reference_seating_plane_placement\Usage_concept_usage_relationship.associated_usage));
           WR8: NOT EXISTS(reference_seating_plane_placement) OR       ((reference_seating_plane_placement\Usage_concept_usage_relationship.associating_usage_shape\Usage_view_level_non_feature_shape_model.model_shape)
            =        reference_shape);
           WR9: NOT EXISTS(reference_seating_plane_placement) OR       ((reference_seating_plane_placement\Usage_concept_usage_relationship.associated_usage\Non_feature_shape_element.associated_definition)
            =        shape_characterized_definition[1]\Footprint_definition.reference_package);
           WR10: NOT EXISTS(reference_seating_plane_placement) OR       ('PHYSICAL_UNIT_3D_SHAPE_ARM.PHYSICAL_UNIT_3D_SHAPE_MODEL' IN
            TYPEOF(reference_seating_plane_placement\Usage_concept_usage_relationship.associating_usage_shape\Usage_view_level_non_feature_shape_model.model_shape));
           WR11: NOT (EXISTS(reference_seating_plane_placement) AND        ('PHYSICAL_UNIT_2D_SHAPE_ARM.PHYSICAL_UNIT_PLANAR_SHAPE_MODEL'
            IN TYPEOF(reference_shape)));
           WR12: NOT ('PHYSICAL_UNIT_2D_SHAPE_ARM.PHYSICAL_UNIT_PLANAR_SHAPE_MODEL' IN TYPEOF(reference_shape)) OR       (SELF\Geometric_model.context_of_items
            = reference_shape\Geometric_model.context_of_items);
         
         END_ENTITY;
ENTITY Generic_footprint_definition
         ABSTRACT
           SUPERTYPE OF 
         (ONEOF (Footprint_definition,
                       Breakout_footprint_definition))
           SUBTYPE OF (Multi_stratum_structured_template);
DERIVE
           padstack_based_location : template_arrangement := get_template_arrangement(padstacks);
           padstacks : SET[1:?] OF Template_location_in_structured_template := QUERY(tlict <* SELF\Structured_template.templates | ('LAYERED_INTERCONNECT_COMPLEX_TEMPLATE_ARM.PADSTACK_DEFINITION' IN
         TYPEOF(tlict.template)));
           single_stratum_components : SET[0:?] OF Single_stratum_template := fd_get_single_stratum_components(SELF\Structured_template.templates);
WHERE
           WR1: SIZEOF(QUERY(ps                <* SELF\Structured_template.templates                | (ps\Template_location_in_structured_template.template\Multi_stratum_structured_template.location
            <>                   SELF\Multi_stratum_structured_template.location) AND                  (ps\Template_location_in_structured_template.template\Multi_stratum_structured_template.location
            <>                   template_arrangement.symmetrical))) =   0;
           WR2: ((SELF\Multi_stratum_structured_template.location = template_arrangement.top) AND    (SELF\Product_view_definition.initial_context\View_definition_context.description
            = 'top')) OR   (NOT (SELF\Multi_stratum_structured_template.location = template_arrangement.top) AND        NOT (SELF\Product_view_definition.initial_context\View_definition_context.description
            = 'top'));
           WR3: ((SELF\Multi_stratum_structured_template.location = template_arrangement.bottom) AND    (SELF\Product_view_definition.initial_context\View_definition_context.description
            = 'bottom')) OR   (NOT (SELF\Multi_stratum_structured_template.location = template_arrangement.bottom) AND        NOT (SELF\Product_view_definition.initial_context\View_definition_context.description
            = 'bottom'));
           WR4: ((SELF\Multi_stratum_structured_template.location = template_arrangement.symmetrical) AND    (SELF\Product_view_definition.initial_context\View_definition_context.description
            = 'symmetrical')) OR   (NOT (SELF\Multi_stratum_structured_template.location = template_arrangement.symmetrical) AND     
            NOT (SELF\Product_view_definition.initial_context\View_definition_context.description = 'symmetrical'));
           WR5: ((SELF\Multi_stratum_structured_template.location = template_arrangement.swappable) AND    (SELF\Product_view_definition.initial_context\View_definition_context.description
            = 'swappable')) OR   (NOT (SELF\Multi_stratum_structured_template.location = template_arrangement.swappable) AND        NOT
            (SELF\Product_view_definition.initial_context\View_definition_context.description = 'swappable'));
           WR6: NOT (SIZEOF(single_stratum_components) = 0) OR       (SELF\Multi_stratum_structured_template.location = padstack_based_location);
         
         END_ENTITY;
ENTITY Package_footprint_relationship_definition
           SUBTYPE OF (Product_view_definition);
DERIVE
           associated_model : SET[1:1] OF Geometric_model := fd_get_amodel(SELF);
           related_models : SET[2:2] OF Geometric_model := fd_get_rmodels(related_elements);
           related_transforms : SET[2:2] OF Geometric_model_relationship_with_transformation := fd_get_transforms(associated_model, related_models);
INVERSE
           related_elements : SET[2:2] OF view_definition_relationship FOR related_view;
WHERE
           WR1: SIZEOF(QUERY(re                <* related_elements                | ('PACKAGE_ARM.PACKAGE' IN TYPEOF(re\View_definition_relationship.relating_view))))
            =   1;
           WR2: SIZEOF(QUERY(re                <* related_elements                | ('FOOTPRINT_DEFINITION_ARM.FOOTPRINT_DEFINITION'
            IN                   TYPEOF(re\View_definition_relationship.relating_view)))) =   1;
           WR3: SIZEOF(related_models) = 2;
           WR4: SIZEOF(associated_model) = 1;
           WR5: SIZEOF(QUERY(rm                <* related_models                | ('PHYSICAL_UNIT_2D_SHAPE_ARM.PHYSICAL_UNIT_PLANAR_SHAPE_MODEL'
            IN TYPEOF(rm)))) =   1;
           WR6: SIZEOF(QUERY(rm <* related_models | ('FOOTPRINT_DEFINITION_ARM.FOOTPRINT_DEFINITION_SHAPE_MODEL' IN TYPEOF(rm)))) = 1;
           WR7: 'LAYERED_2D_SHAPE_ARM.PLANAR_SHAPE_MODEL' IN TYPEOF(associated_model[1]);
           WR8: SIZEOF(related_transforms) = 2;
         
         END_ENTITY;
ENTITY Part_feature_based_template_location
           SUBTYPE OF (Template_location_in_structured_template);
           reference_feature : Part_feature;
         
         END_ENTITY;
ENTITY Stratum_feature_template_location_in_breakout_footprint_definition
           SUBTYPE OF (Stratum_specific_template_location);
           SELF\template_location_in_structured_template.assembly : Breakout_footprint_definition;
           SELF\template_location_in_structured_template.template : Stratum_feature_template;
           original_padstack : Part_feature_based_template_location;
           breakout_padstack : Template_location_in_structured_template;
WHERE
           WR1: original_padstack.assembly :=: assembly.reference_footprint;
           WR2: breakout_padstack.assembly :=: assembly;
         
         END_ENTITY;
SUBTYPE_CONSTRAINT multi_stratum_structured_template_subtypes FOR multi_stratum_structured_template;
           (ONEOF (Padstack_definition,
          Generic_footprint_definition,
          Multi_stratum_special_symbol_template));
      
         END_SUBTYPE_CONSTRAINT;
SUBTYPE_CONSTRAINT structured_template_planar_shape_model_subtypes FOR structured_template_planar_shape_model;
           (ONEOF (Breakout_footprint_definition_shape_model,
          Footprint_definition_shape_model));
      
         END_SUBTYPE_CONSTRAINT;
FUNCTION fd_get_amodel
 (input : Product_view_definition) : SET OF Geometric_model;
           LOCAL
  gm : SET OF Geometric_model := [];
  sda : SET OF Shape_description_association := [];
    END_LOCAL;
      -- process input.primary_shape_representation
      IF 'ELEMENTAL_GEOMETRIC_SHAPE_ARM.GEOMETRIC_MODEL' IN TYPEOF(input.primary_shape_representation)
  THEN
    gm := gm + input.primary_shape_representation;
  END_IF;
      -- process input.auxiliary_shape_representations
      IF (SIZEOF(input.auxiliary_shape_representations) >= 0)
  THEN
    REPEAT i := 1 TO HIINDEX(input.auxiliary_shape_representations);
      IF 'ELEMENTAL_GEOMETRIC_SHAPE_ARM.GEOMETRIC_MODEL' IN TYPEOF(input.auxiliary_shape_representations[i])
      THEN
        gm := gm + input.auxiliary_shape_representations[i];
      END_IF;
    END_REPEAT;
  END_IF;
      -- process other SHAPE_DESCRIPTION_ASSOCIATIONs that could still hang around
      sda := bag_to_set(USEDIN(input, 'SHAPE_PROPERTY_ASSIGNMENT_ARM.SHAPE_DESCRIPTION_ASSOCIATION.DEFINITION'));
      IF (SIZEOF(sda) >= 0)
  THEN
    REPEAT i := 1 TO HIINDEX(sda);
      IF 'ELEMENTAL_GEOMETRIC_SHAPE_ARM.GEOMETRIC_MODEL' IN TYPEOF(input.primary_shape_representation)
      THEN
        gm := gm + sda[i]\Property_definition_representation.used_representation;
      END_IF;
    END_REPEAT;
  END_IF;
      RETURN(gm);
         END_FUNCTION;
         
FUNCTION fd_get_components
 (input : SET[2:2] OF View_definition_relationship) : SET OF Product_view_definition;
           LOCAL
  pvd : SET OF Product_view_definition := [];
    END_LOCAL;
      REPEAT i := 1 TO HIINDEX(input);
    pvd := pvd + input[i]\View_definition_relationship.relating_view;
  END_REPEAT;
      RETURN(pvd);
         END_FUNCTION;
         
FUNCTION fd_get_rmodels
 (input : SET[2:2] OF View_definition_relationship) : SET OF Geometric_model;
           LOCAL
  gm : SET OF Geometric_model := [];
  pvd : SET OF Product_view_definition := [];
    END_LOCAL;
      pvd := fd_get_components(input);
      IF (SIZEOF(pvd) >= 0)
  THEN
    REPEAT i := 1 TO HIINDEX(pvd);
      gm := gm + fd_get_amodel(pvd[i]);
    END_REPEAT;
    RETURN(gm);
  END_IF;
      RETURN(?);
         END_FUNCTION;
         
FUNCTION fd_get_single_stratum_components
 (input : SET OF Template_location_in_structured_template) : SET OF Single_stratum_template;
           LOCAL
  sst : SET OF Single_stratum_template := [];
    END_LOCAL;
      REPEAT i := 1 TO HIINDEX(input);
    IF ('LAYERED_INTERCONNECT_SIMPLE_TEMPLATE_ARM.SINGLE_STRATUM_TEMPLATE' IN
        TYPEOF(input[i]\Template_location_in_structured_template.template))
    THEN
      sst := sst + input[i]\Template_location_in_structured_template.template;
    END_IF;
  END_REPEAT;
      RETURN(sst);
         END_FUNCTION;
         
FUNCTION fd_get_transforms
 (input1 : SET[1:1] OF Geometric_model; input2 : SET[2:2] OF Geometric_model) : SET OF Geometric_model_relationship_with_transformation;
           LOCAL
  gmrwt : SET OF Geometric_model_relationship_with_transformation := [];
    END_LOCAL;
      gmrwt := bag_to_set(USEDIN(input1[1], 'GEOMETRIC_MODEL_RELATIONSHIP_ARM.GEOMETRIC_MODEL_RELATIONSHIP.REP_1'));
      REPEAT i := 1 TO HIINDEX(gmrwt);
    IF NOT ((gmrwt[i]\Geometric_model_relationship.rep_2 IN input2) AND
            ('CONTEXTUAL_SHAPE_POSITIONING_ARM.GEOMETRIC_MODEL_RELATIONSHIP_WITH_TRANSFORMATION' IN TYPEOF(gmrwt[i])))
    THEN
      RETURN(?);
    END_IF;
  END_REPEAT;
      RETURN(gmrwt);
         END_FUNCTION;
         
FUNCTION get_template_arrangement
 (input : SET OF Template_location_in_structured_template) : template_arrangement;
           LOCAL
  tlist : SET OF Template_location_in_structured_template := (QUERY(inx
                                                                    <* input
                                                                    | ('LAYERED_INTERCONNECT_COMPLEX_TEMPLATE_ARM.MULTI_STRATUM_STRUCTURED_TEMPLATE' IN
                                                                       TYPEOF(inx.template))));
  pabt : BAG OF STRING := [];
  pabb : BAG OF STRING := [];
  pabsymmetrical : BAG OF STRING := [];
  pabswappable : BAG OF STRING := [];
    END_LOCAL;
      REPEAT i := 1 TO SIZEOF(tlist) BY 1;
    IF (tlist[i].template\Multi_stratum_structured_template.location = template_arrangement.top)
    THEN
      pabt := pabt + 'top';
    END_IF;
    IF (tlist[i].template\Multi_stratum_structured_template.location = template_arrangement.bottom)
    THEN
      pabb := pabb + 'bottom';
    END_IF;
    IF (tlist[i].template\Multi_stratum_structured_template.location = template_arrangement.symmetrical)
    THEN
      pabsymmetrical := pabsymmetrical + 'symmetrical';
    END_IF;
    IF (tlist[i].template\Multi_stratum_structured_template.location = template_arrangement.swappable)
    THEN
      pabswappable := pabswappable + 'swappable';
    END_IF;
  END_REPEAT;
      IF ((SIZEOF(pabt) > 0) AND (SIZEOF(pabb) = 0))
  THEN
    RETURN(template_arrangement.top);
  END_IF;
      IF ((SIZEOF(pabb) > 0) AND (SIZEOF(pabt) = 0))
  THEN
    RETURN(template_arrangement.bottom);
  END_IF;
      IF ((SIZEOF(pabb) = 0) AND (SIZEOF(pabt) = 0) AND (SIZEOF(pabsymmetrical) > 0))
  THEN
    RETURN(template_arrangement.symmetrical);
  END_IF;
      IF ((SIZEOF(pabb) = 0) AND (SIZEOF(pabt) = 0) AND (SIZEOF(pabsymmetrical) = 0) AND (SIZEOF(pabswappable) > 0))
  THEN
    RETURN(template_arrangement.swappable);
  END_IF;
      RETURN(?);
         END_FUNCTION;
         
         END_SCHEMA;  -- Footprint_definition_arm
© ISO 2019 — All rights reserved