| Application module: Fabrication technology | ISO/TS 10303-1670:2018-11(E) © ISO | 
         (*
ISO/TC 184/SC 4/WG 12 N9424 - ISO/TS 10303-1670 Fabrication technology - EXPRESS ARM
Supersedes 
         ISO/TC 184/SC 4/WG 12 N8137
*)
         
SCHEMA Fabrication_technology_arm;
         USE FROM
         Constructive_solid_geometry_2d_arm;
            -- ISO/TS 10303-1731
         USE FROM
         Geometric_tolerance_arm;
            -- ISO/TS 10303-1051
         USE FROM
         Requirement_decomposition_arm;
            -- ISO/TS 10303-1740
         USE FROM
         Part_template_arm;
            -- ISO/TS 10303-1722
         REFERENCE FROM 
         Specification_document_arm   -- ISO/TS 10303-1747
  (get_document_definition);
         
         REFERENCE FROM 
         Support_resource_arm   -- ISO/TS 10303-1800
  (bag_to_set);
         
TYPE ft_classification_item =
         
         EXTENSIBLE
         
         GENERIC_ENTITY
         
         
         SELECT
         BASED_ON
         classification_item
         WITH 
         
            (Stratum_technology_occurrence_relationship);
         END_TYPE; 
         
TYPE ft_documented_element_select =
         
         EXTENSIBLE
         
         GENERIC_ENTITY
         
         
         SELECT
         BASED_ON
         documented_element_select
         WITH 
         
            (Passage_technology, 
    Stratum_technology, 
    Stratum_surface_technology);
         END_TYPE; 
         
TYPE ft_external_identification_item =
         
         EXTENSIBLE
         
         GENERIC_ENTITY
         
         
         SELECT
         BASED_ON
         external_identification_item
         WITH 
         
            (Design_layer_technology, 
    Documentation_layer_technology);
         END_TYPE; 
         
TYPE ft_material_item_select =
         
         EXTENSIBLE
         
         GENERIC_ENTITY
         
         
         SELECT
         BASED_ON
         material_item_select
         WITH 
         
            (Passage_technology, 
    Stratum_technology);
         END_TYPE; 
         
TYPE ft_property_assignment_select =
         
         
         SELECT
         BASED_ON
         property_assignment_select
         WITH 
         
            (Stratum_technology, 
    Passage_technology);
         END_TYPE; 
         
TYPE ft_requirement_assignment_item =
         
         EXTENSIBLE
         
         GENERIC_ENTITY
         
         
         SELECT
         BASED_ON
         requirement_assignment_item
         WITH 
         
            (Passage_technology, 
    Stratum_technology, 
    Stratum_technology_occurrence, 
    Stratum_technology_occurrence_relationship);
         END_TYPE; 
         
TYPE ft_terminus_condition =
         
         EXTENSIBLE
         
         ENUMERATION
         
         OF
         
            
         (bilateral_bond,
    bilateral_complete_removal,
    unilateral_bond);
         END_TYPE; 
         
TYPE ft_value_select =
         
         
         SELECT
            (Value_limit, 
    Value_range, 
    Numerical_item_with_unit);
         END_TYPE; 
         
TYPE layer_position_type =
         
         ENUMERATION
         
         OF
         
            
         (secondary,
    all,
    external,
    primary,
    internal);
         END_TYPE; 
         
TYPE predefined_design_layer_purpose =
         
         ENUMERATION
         
         OF
         
            
         (other_signal,
    lands_only,
    power_or_ground,
    embedded_passive_capacitor_dielectric,
    embedded_passive_resistor);
         END_TYPE; 
         
TYPE predefined_documentation_layer_purpose =
         
         ENUMERATION
         
         OF
         
            
         (solderdam,
    soldermask,
    solderpaste,
    silkscreen,
    generic_layer,
    glue,
    gluemask,
    pastemask,
    finish_coating,
    coverlay);
         END_TYPE; 
         
TYPE stiffness_class =
         
         ENUMERATION
         
         OF
         
            
         (fluid_like_with_constant_thickness,
    fluid_like_with_varying_thickness,
    stiff_laminate);
         END_TYPE; 
         
TYPE up_or_down =
         
         ENUMERATION
         
         OF
         
            
         (independent,
    precedent,
    subsequent);
         END_TYPE; 
         
ENTITY Allocated_passage_minimum_annular_ring
           SUBTYPE OF (Characterizable_object);
           supported_external_minimum_annular_ring : 
         OPTIONAL 
         Length_data_element;
           supported_internal_minimum_annular_ring : 
         OPTIONAL 
         Length_data_element;
           unsupported_minimum_annular_ring : 
         OPTIONAL 
         Length_data_element;
           minimum_fabrication_allowance : 
         OPTIONAL 
         Length_data_element;
           associated_passage_allocation : SET[1:?] OF Passage_technology_allocation_to_stack_model;
           associated_stratum_technology_occurrence : 
         OPTIONAL 
         Stratum_technology_occurrence;
DERIVE
           associated_model : Stratum_stack_model := associated_passage_allocation[1]\Stratum_sub_stack.associated_stackup;
WHERE
           WR1: EXISTS(supported_external_minimum_annular_ring) OR
            EXISTS(supported_internal_minimum_annular_ring) OR
            EXISTS(unsupported_minimum_annular_ring) OR
            EXISTS(minimum_fabrication_allowance);
           WR2: NOT EXISTS(associated_stratum_technology_occurrence) OR
            (associated_stratum_technology_occurrence IN associated_model\Stratum_stack_model.composing_occurrence);
           WR3: NOT EXISTS(supported_external_minimum_annular_ring) OR
            (SIZEOF(QUERY(ptatsm <* associated_passage_allocation |
            NOT(ptatsm\Passage_technology_allocation_to_stack_model.allocated_technology\Passage_technology.plated_passage)
            )) = 0);
           WR4: NOT EXISTS(supported_internal_minimum_annular_ring) OR
            (SIZEOF(QUERY(ptatsm <* associated_passage_allocation |
            NOT(ptatsm\Passage_technology_allocation_to_stack_model.allocated_technology\Passage_technology.plated_passage)
            )) = 0);
           WR5: NOT (EXISTS(unsupported_minimum_annular_ring) AND
            (SIZEOF(QUERY(ptatsm <* associated_passage_allocation |
            NOT(ptatsm\Passage_technology_allocation_to_stack_model.allocated_technology\Passage_technology.plated_passage)
            )) = 0));
           WR6: SIZEOF(QUERY(ptatsm <* associated_passage_allocation |
            NOT(associated_model = ptatsm\Stratum_sub_stack.associated_stackup)
            )) =0;
           WR7: NOT (EXISTS(associated_stratum_technology_occurrence) AND
            EXISTS(supported_internal_minimum_annular_ring));
         
         END_ENTITY;
ENTITY Copy_stratum_technology_occurrence_relationship
           SUBTYPE OF (Derived_stratum_technology_occurrence_relationship);
         
         END_ENTITY;
ENTITY Default_component_termination_passage_definition
           SUBTYPE OF (Passage_technology);
           allowed_component_terminal_extent : Length_tolerance_characteristic;
           SELF\Passage_technology.as_finished_deposition_thickness : Length_tolerance_characteristic;
           SELF\Passage_technology.as_finished_passage_extent : ft_value_select;
INVERSE
           SELF\Passage_technology.deposition_material : SET[1:1] OF Passage_deposition_material_identification FOR items;
WHERE
           WR1: 'CONDUCTIVITY_MATERIAL_ASPECTS_ARM.'+ 'MATERIAL_IDENTIFICATION_WITH_CONDUCTIVITY_CLASSIFICATION' IN TYPEOF (deposition_material[1]);
         
         END_ENTITY;
ENTITY Default_tapered_blind_via_definition
           SUBTYPE OF (Default_via_definition);
           as_finished_interior_passage_extent : Length_tolerance_characteristic;
WHERE
           WR1: less(as_finished_interior_passage_extent, SELF\default_via_definition.as_finished_passage_extent);
         
         END_ENTITY;
ENTITY Default_unsupported_passage_definition
           SUBTYPE OF (Passage_technology);
           SELF\Passage_technology.as_finished_passage_extent : ft_value_select;
         
         END_ENTITY;
ENTITY Default_via_definition
           SUBTYPE OF (Passage_technology);
           SELF\Passage_technology.as_finished_deposition_thickness : Length_tolerance_characteristic;
           SELF\Passage_technology.as_finished_passage_extent : ft_value_select;
INVERSE
           SELF\Passage_technology.deposition_material : SET[1:1] OF Passage_deposition_material_identification FOR items;
WHERE
           WR1: 'CONDUCTIVITY_MATERIAL_ASPECTS_ARM.'+ 'MATERIAL_IDENTIFICATION_WITH_CONDUCTIVITY_CLASSIFICATION' IN TYPEOF (deposition_material[1]);
         
         END_ENTITY;
ENTITY Derived_stratum_technology_occurrence_relationship
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (Copy_stratum_technology_occurrence_relationship,
                                Inverse_copy_stratum_technology_occurrence_relationship))
           SUBTYPE OF (Stratum_technology_occurrence_relationship);
         
         END_ENTITY;
ENTITY Design_layer_technology
           SUBTYPE OF (Stratum_technology);
           design_layer_purpose : 
         OPTIONAL 
         predefined_design_layer_purpose;
INVERSE
           externally_defined_design_layer_purpose : SET[0:1] OF External_source_identification FOR item;
WHERE
           WR1: (SIZEOF([SELF\Stratum_technology.stratum_material[1]\Material_identification_with_conductivity_classification.electrical_conductivity_classification,
            SELF\Stratum_technology.stratum_material[1]\Material_identification_with_conductivity_classification.thermal_conductivity_classification]
            *
            ['conductive']) >= 1) OR
            (SELF\Stratum_technology.stratum_material[1]\Material_identification_with_conductivity_classification.magnetic_permeability_classification
            IN ['highly permeable']) OR
            (SELF\Stratum_technology.stratum_material[1]\Material_identification_with_conductivity_classification.optical_insertion_loss_classification
            IN ['vacuum', 'very low loss', 'low loss']);
           WR2: (EXISTS (design_layer_purpose)) XOR ((SIZEOF(externally_defined_design_layer_purpose)) = 1);
         
         END_ENTITY;
ENTITY Design_stack_model
           SUBTYPE OF (Stratum_stack_model);
           model_thickness : 
         OPTIONAL 
         Length_tolerance_characteristic;
INVERSE
           sub_stack : SET[1:?] OF Stratum_sub_stack FOR associated_stackup;
         
         END_ENTITY;
ENTITY Documentation_layer_technology
           SUBTYPE OF (Stratum_technology);
           pre_defined_documentation_layer_purpose : 
         OPTIONAL 
         predefined_documentation_layer_purpose;
INVERSE
           externally_defined_documentation_layer_purpose : SET[0:1] OF External_source_identification FOR item;
WHERE
           WR1: (EXISTS (pre_defined_documentation_layer_purpose)) XOR ((SIZEOF(externally_defined_documentation_layer_purpose)) = 1);
         
         END_ENTITY;
ENTITY Equivalent_stackup_model_definition
           SUBTYPE OF (Product_view_definition, View_definition_relationship);
           SELF\View_definition_relationship.relating_view RENAMED primary_stackup_model : Stratum_stack_model;
           SELF\View_definition_relationship.related_view RENAMED equivalent_stackup_model : Stratum_stack_model;
           equivalent_sub_stacks : SET[1:?] OF Equivalent_sub_stack_definition;
WHERE
           WR1: primary_stackup_model :<>: equivalent_stackup_model;
           WR2: SIZEOF(QUERY( ess <* equivalent_sub_stacks |
            NOT (ess\Equivalent_sub_stack_definition.equivalent_stack\Stratum_sub_stack.associated_stackup :=: equivalent_stackup_model)
            )) = 0;
           WR3: acyclic_equivalent_stackup_model_definition(SELF,
            [equivalent_stackup_model],
            'FABRICATION_TECHNOLOGY_ARM.EQUIVALENT_STACKUP_MODEL_DEFINITION');
         
         END_ENTITY;
ENTITY Equivalent_sub_stack_definition
           SUBTYPE OF (Product_view_definition);
           equivalent_stack : Local_linear_stack;
           primary_sto : Stratum_technology_occurrence;
           primary_sto_link : Stratum_technology_occurrence_link;
WHERE
           WR1: primary_sto IN [primary_sto_link\Stratum_technology_occurrence_relationship.sto_1,
            primary_sto_link\Stratum_technology_occurrence_relationship.sto_2];
           WR2: equivalent_stack\Stratum_sub_stack.associated_stackup :<>: primary_sto_link\Stratum_technology_occurrence_relationship.scope;
         
         END_ENTITY;
ENTITY Footprint_library_stratum_technology
           SUBTYPE OF (Stratum_technology);
WHERE
           WR1: NOT EXISTS(stratum_thickness);
         
         END_ENTITY;
ENTITY Impedance_measurement_setup_requirement
           SUBTYPE OF (Predefined_requirement_view_definition);
           characterized_stackup : Stratum_sub_stack;
           measurement_stratum_1 : Stratum_technology_occurrence;
           measurement_stratum_2 : Stratum_technology_occurrence;
           reference_stratum : SET[1:2] OF Stratum_technology_occurrence;
WHERE
           WR1: SELF\Product_view_definition.initial_context.life_cycle_stage = 'test';
           WR2: NOT EXISTS(SELF\Product_view_definition.id);
           WR3: SIZEOF([measurement_stratum_1, measurement_stratum_2] * reference_stratum) = 0;
         
         END_ENTITY;
ENTITY Impedance_requirement
           SUBTYPE OF (Predefined_requirement_view_definition);
           frequency_range : Value_range;
           impedance_value : Tolerance_characteristic;
           test_bench : Impedance_measurement_setup_requirement;
           test_method : Test_specification;
WHERE
           WR1: SELF\Product_view_definition.initial_context.life_cycle_stage = 'test';
           WR2: NOT EXISTS(SELF\Product_view_definition.id);
         
         END_ENTITY;
ENTITY Inverse_copy_stratum_technology_occurrence_relationship
           SUBTYPE OF (Derived_stratum_technology_occurrence_relationship);
         
         END_ENTITY;
ENTITY Local_linear_stack
           SUBTYPE OF (Stratum_sub_stack);
           SELF\Stratum_sub_stack.stratum_technology_sequence : SET[1:?] OF Stratum_technology_occurrence_link;
WHERE
           WR1: SIZEOF(get_stack(stratum_technology_sequence)) = (SIZEOF(stratum_technology_sequence) + 1);
           WR2: sts_vertex_degree_check(stratum_technology_sequence, 2);
         
         END_ENTITY;
ENTITY Passage_deposition_material_identification
           SUBTYPE OF (Material_identification);
           SELF\Material_identification.items : SET[1:?] OF Passage_technology;
         
         END_ENTITY;
ENTITY Passage_filling_material_identification
           SUBTYPE OF (Material_identification);
           SELF\Material_identification.items : SET[1:?] OF Passage_technology;
         
         END_ENTITY;
ENTITY Passage_technology
           SUPERTYPE OF 
         (ONEOF (Default_via_definition,
                       Default_component_termination_passage_definition,
                       Default_unsupported_passage_definition))
           SUBTYPE OF (Characterizable_object);
           as_finished_deposition_thickness : 
         OPTIONAL 
         Length_tolerance_characteristic;
           as_finished_passage_extent : 
         OPTIONAL 
         ft_value_select;
           maximum_aspect_ratio : 
         OPTIONAL 
         REAL;
           minimum_finished_size : 
         OPTIONAL 
         Length_data_element;
           plated_passage : BOOLEAN;
           passage_terminus_condition : 
         OPTIONAL 
         ft_terminus_condition;
           minimum_fabrication_allowance : 
         OPTIONAL 
         Length_data_element;
           minimum_finished_feature_size : 
         OPTIONAL 
         Length_data_element;
           supported_external_minimum_annular_ring : 
         OPTIONAL 
         Length_data_element;
           supported_internal_minimum_annular_ring : 
         OPTIONAL 
         Length_data_element;
           unsupported_minimum_annular_ring : 
         OPTIONAL 
         Length_data_element;
DERIVE
           specification : SET[0:1] OF Document_definition := get_document_definition(SELF, 'specification', 
         			'SPECIFICATION_DOCUMENT_ARM.PROCESS_SPECIFICATION');
INVERSE
           deposition_material : SET[0:1] OF Passage_deposition_material_identification FOR items;
           fill_material : SET[0:1] OF Passage_filling_material_identification FOR items;
UNIQUE
           UR1: SELF\Characterizable_object.name;
WHERE
           WR1: NOT (SIZEOF(deposition_material) = 1) OR
            ('CONDUCTIVITY_MATERIAL_ASPECTS_ARM.'+ 'MATERIAL_IDENTIFICATION_WITH_CONDUCTIVITY_CLASSIFICATION' IN TYPEOF (deposition_material[1]));
           WR2: NOT plated_passage OR (SIZEOF(deposition_material) = 1);
           WR3: NOT EXISTS(as_finished_deposition_thickness) OR (SIZEOF(deposition_material) = 1);
           WR4: NOT plated_passage OR
            (SIZEOF([deposition_material[1]\Material_identification_with_conductivity_classification.electrical_conductivity_classification,
            deposition_material[1]\Material_identification_with_conductivity_classification.thermal_conductivity_classification] *
            ['conductive']) >= 1);
           WR5: NOT ((passage_terminus_condition = ft_terminus_condition.bilateral_bond) OR
            (passage_terminus_condition = ft_terminus_condition.unilateral_bond)) OR
            plated_passage;
           WR6: NOT (EXISTS(as_finished_passage_extent) AND EXISTS(minimum_finished_feature_size));
           WR7: NOT EXISTS(supported_external_minimum_annular_ring) OR plated_passage;
           WR8: NOT EXISTS(supported_internal_minimum_annular_ring) OR plated_passage;
           WR9: NOT EXISTS(unsupported_minimum_annular_ring) AND plated_passage;
         
         END_ENTITY;
ENTITY Passage_technology_allocation_to_stack_model
           SUBTYPE OF (Stratum_sub_stack);
           allocated_technology : Passage_technology;
           single_stratum_passage_location : 
         OPTIONAL 
         Stratum_technology_occurrence;
           target_stratum : 
         OPTIONAL 
         Stratum_technology_occurrence;
DERIVE
           terminus_stratum : SET[0:?] OF Stratum_technology_occurrence := ft_get_terminus(SELF\Stratum_sub_stack.stratum_technology_sequence);
INVERSE
           minimum_annular_ring : SET[0:?] OF Allocated_passage_minimum_annular_ring FOR associated_passage_allocation;
WHERE
           WR1: (NOT EXISTS(single_stratum_passage_location) OR
            (single_stratum_passage_location IN
            SELF\Stratum_sub_stack.associated_stackup.composing_occurrence));
           WR2: EXISTS(SELF\Stratum_sub_stack.stratum_technology_sequence) XOR
            EXISTS(single_stratum_passage_location);
           WR3: SIZEOF(get_stack(SELF\Stratum_sub_stack.stratum_technology_sequence)) = 
            (SIZEOF(SELF\Stratum_sub_stack.stratum_technology_sequence) + 1);
           WR4: sts_vertex_degree_check(SELF\Stratum_sub_stack.stratum_technology_sequence, 2);
           WR5: NOT EXISTS(single_stratum_passage_location) OR NOT EXISTS(target_stratum);
           WR6: NOT EXISTS(target_stratum) OR
            			  ((target_stratum IN SELF\Stratum_sub_stack.associated_stackup.composing_occurrence) AND
            	           (target_stratum IN terminus_stratum));
           WR7: ft_count_unspecified_asto(minimum_annular_ring) < 2;
         
         END_ENTITY;
ENTITY Stratum_stack_model
           ABSTRACT SUPERTYPE
         
         OF (Design_stack_model)
           SUBTYPE OF (Template_definition);
DERIVE
           composing_occurrence : SET[1:?] OF Stratum_technology_occurrence := get_stack(composing_link);
INVERSE
           composing_link : SET[1:?] OF Stratum_technology_occurrence_relationship FOR scope;
WHERE
           WR1: SIZEOF(QUERY( cl <* composing_link |
            NOT('FABRICATION_TECHNOLOGY_ARM.STRATUM_TECHNOLOGY_OCCURRENCE_LINK' IN TYPEOF(cl))
            )) = 0;
         
         END_ENTITY;
ENTITY Stratum_sub_stack
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (Local_linear_stack,
                                Passage_technology_allocation_to_stack_model))
           SUBTYPE OF (Template_definition);
           stratum_technology_sequence : 
         OPTIONAL 
         SET[1:?] OF Stratum_technology_occurrence_link;
           stack_thickness : 
         OPTIONAL 
         Length_tolerance_characteristic;
           associated_stackup : Design_stack_model;
WHERE
           WR1: SIZEOF(QUERY(sts <* stratum_technology_sequence | 
            NOT(associated_stackup :=: sts\Stratum_technology_occurrence_relationship.scope)) ) = 0;
         
         END_ENTITY;
ENTITY Stratum_surface_technology
           SUBTYPE OF (Shape_element);
           SELF\Shape_element.associated_definition : Stratum_technology;
DERIVE
           surface_specification : SET[0:1] OF Document_definition := get_document_definition(SELF, 'surface specification',  	
         'SPECIFICATION_DOCUMENT_ARM.SURFACE_FINISH_SPECIFICATION');
WHERE
           WR1: (SIZEOF(QUERY(se <* bag_to_set(USEDIN(SELF,'PROPERTY_ASSIGNMENT_ARM.ASSIGNED_PROPERTY.DESCRIBED_ELEMENT'))
            | 'SURFACE_CONDITIONS_ARM.SURFACE_CONDITION' IN TYPEOF(se) )) > 0) OR 
            (SIZEOF(get_document_definition(SELF, 'surface specification', 'SPECIFICATION_DOCUMENT_ARM.SURFACE_FINISH_SPECIFICATION'))
            = 1);
         
         END_ENTITY;
ENTITY Stratum_technology
           SUPERTYPE OF 
         (ONEOF (Design_layer_technology,
                       Documentation_layer_technology))
           SUBTYPE OF (Characterizable_object);
           layer_position : layer_position_type;
           stratum_thickness : 
         OPTIONAL 
         Length_tolerance_characteristic;
           minimum_finished_feature_size : 
         OPTIONAL 
         Length_data_element;
           laminate_stiffness_class : 
         OPTIONAL 
         stiffness_class;
           minimum_finished_feature_spacing : 
         OPTIONAL 
         Length_data_element;
           maximum_feature_size_requirement : 
         OPTIONAL 
         Length_data_element;
           minimum_aspect_ratio : 
         OPTIONAL 
         REAL;
DERIVE
           specification : SET[0:1] OF Document_definition := get_document_definition(SELF, 'specification', 
         			'SPECIFICATION_DOCUMENT_ARM.PROCESS_SPECIFICATION');
           surface_specification : SET[0:1] OF Document_definition := get_document_definition(SELF, 'surface specification', 
         			'SPECIFICATION_DOCUMENT_ARM.SURFACE_FINISH_SPECIFICATION');
INVERSE
           stratum_material : SET[1:1] OF Material_identification FOR items;
           surface_technology : SET[0:2] OF Stratum_surface_technology FOR associated_definition;
UNIQUE
           UR1: SELF\Characterizable_object.name;
WHERE
           WR1: NOT (layer_position = layer_position_type.primary) OR ('FABRICATION_TECHNOLOGY_ARM.DESIGN_LAYER_TECHNOLOGY' IN TYPEOF(SELF));
           WR2: NOT (layer_position = layer_position_type.secondary) OR ('FABRICATION_TECHNOLOGY_ARM.DESIGN_LAYER_TECHNOLOGY' IN TYPEOF(SELF));
           WR3: 'CONDUCTIVITY_MATERIAL_ASPECTS_ARM.'+ 'MATERIAL_IDENTIFICATION_WITH_CONDUCTIVITY_CLASSIFICATION' IN TYPEOF (stratum_material);
           WR4: NOT((SIZEOF(surface_technology) > 0 ) AND (SIZEOF(surface_specification) = 1));
         
         END_ENTITY;
ENTITY Stratum_technology_mapping_relationship;
           source_stratum_technology : Footprint_library_stratum_technology;
           target_stratum_technology : Stratum_technology;
WHERE
           WR1: NOT ('FABRICATION_TECHNOLOGY_ARM.FOOTPRINT_LIBRARY_STRATUM_TECHNOLOGY' IN TYPEOF(target_stratum_technology));
           WR2: acyclic_stratum_technology_mapping_relationship(SELF,
            [target_stratum_technology], 
            'FABRICATION_TECHNOLOGY_ARM.STRATUM_TECHNOLOGY_MAPPING_RELATIONSHIP');
         
         END_ENTITY;
ENTITY Stratum_technology_occurrence;
           name : STRING;
           definition : Stratum_technology;
           primary : 
         OPTIONAL 
         Stratum_surface_technology;
           rotation : 
         OPTIONAL 
         Angle_data_element;
UNIQUE
           UR1: name;
         
         END_ENTITY;
ENTITY Stratum_technology_occurrence_feature_constraint
           SUBTYPE OF (Stratum_technology_occurrence_relationship);
           difference_distance : 
         OPTIONAL 
         length_measure;
           intersection_distance : 
         OPTIONAL 
         length_measure;
WHERE
           WR1: EXISTS (difference_distance) XOR EXISTS(intersection_distance);
         
         END_ENTITY;
ENTITY Stratum_technology_occurrence_link
           SUBTYPE OF (Stratum_technology_occurrence_relationship);
           base_stratum_technology_occurrence : 
         OPTIONAL 
         up_or_down;
WHERE
           WR1: NOT (SELF\Stratum_technology_occurrence_relationship.sto_1 :=: SELF\Stratum_technology_occurrence_relationship.sto_2)
            OR 
            (SIZEOF(SELF\Stratum_technology_occurrence_relationship.scope\Stratum_stack_model.composing_link) = 1);
         
         END_ENTITY;
ENTITY Stratum_technology_occurrence_relationship
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (Derived_stratum_technology_occurrence_relationship,
                                Stratum_technology_occurrence_link,
                                Stratum_technology_occurrence_swap_relationship,
                                Stratum_technology_occurrence_feature_constraint));
           sto_1 : Stratum_technology_occurrence;
           sto_2 : Stratum_technology_occurrence;
           scope : Stratum_stack_model;
WHERE
           WR1: acyclic_stratum_technology_occurrence_relationship(SELF, [sto_2], 
            'FABRICATION_TECHNOLOGY_ARM.STRATUM_TECHNOLOGY_OCCURRENCE_RELATIONSHIP');
         
         END_ENTITY;
ENTITY Stratum_technology_occurrence_swap_relationship
           SUBTYPE OF (Stratum_technology_occurrence_relationship);
UNIQUE
           UR1: SELF\Stratum_technology_occurrence_relationship.sto_1, SELF\Stratum_technology_occurrence_relationship.scope;
           UR2: SELF\Stratum_technology_occurrence_relationship.sto_2, SELF\Stratum_technology_occurrence_relationship.scope;
WHERE
           WR1: SELF\Stratum_technology_occurrence_relationship.sto_1 <> SELF\Stratum_technology_occurrence_relationship.sto_2;
           WR2: (SELF\Stratum_technology_occurrence_relationship.sto_1 IN SELF\Stratum_technology_occurrence_relationship.scope\Stratum_stack_model.composing_occurrence)
            AND
            (SELF\Stratum_technology_occurrence_relationship.sto_2 IN SELF\Stratum_technology_occurrence_relationship.scope\Stratum_stack_model.composing_occurrence);
         
         END_ENTITY;
ENTITY Stratum_technology_swap_relationship;
           primary_stratum_technology : Stratum_technology;
           secondary_stratum_technology : Stratum_technology;
UNIQUE
           UR1: primary_stratum_technology;
           UR2: secondary_stratum_technology;
WHERE
           WR1: NOT (('FABRICATION_TECHNOLOGY_ARM.DOCUMENTATION_LAYER_TECHNOLOGY' IN TYPEOF(primary_stratum_technology)) AND
            EXISTS(primary_stratum_technology\Documentation_layer_technology.pre_defined_documentation_layer_purpose))
            OR
            (primary_stratum_technology\Documentation_layer_technology.pre_defined_documentation_layer_purpose =
            secondary_stratum_technology\Documentation_layer_technology.pre_defined_documentation_layer_purpose);
           WR2: TYPEOF(primary_stratum_technology) = TYPEOF(secondary_stratum_technology);
           WR3: primary_stratum_technology\Stratum_technology.layer_position = layer_position_type.primary;
           WR4: secondary_stratum_technology\Stratum_technology.layer_position = layer_position_type.secondary;
           WR5: primary_stratum_technology <> secondary_stratum_technology;
           WR6: acyclic_stratum_technology_swap_relationship(SELF,
            [secondary_stratum_technology], 
            'FABRICATION_TECHNOLOGY_ARM.STRATUM_TECHNOLOGY_SWAP_RELATIONSHIP');
         
         END_ENTITY;
FUNCTION acyclic_equivalent_stackup_model_definition
 (relation : Equivalent_stackup_model_definition; relatives : SET[1:?] OF Stratum_stack_model; specific_relation : STRING) : BOOLEAN;
         LOCAL
    x : SET OF Equivalent_stackup_model_definition := [];
END_LOCAL;
    IF relation.primary_stackup_model IN relatives THEN
      RETURN (FALSE);
    END_IF;
      x := QUERY(pd <* bag_to_set(USEDIN(relation.primary_stackup_model,
        'FABRICATION_TECHNOLOGY_ARM.' + 'EQUIVALENT_STACKUP_MODEL_DEFINITION.' +
        'EQUIVALENT_STACKUP_MODEL')) | specific_relation IN TYPEOF(pd));
    REPEAT i := 1 TO HIINDEX(x);
      IF NOT acyclic_equivalent_stackup_model_definition(x[i], relatives +
        relation.primary_stackup_model, specific_relation) THEN
        RETURN (FALSE);
      END_IF;
    END_REPEAT;
  RETURN (TRUE);
         END_FUNCTION;
         
FUNCTION acyclic_stratum_technology_mapping_relationship
 (relation : Stratum_technology_mapping_relationship; relatives : SET[1:?] OF Stratum_technology; specific_relation : STRING) : BOOLEAN;
         LOCAL
     x : SET OF Stratum_technology_mapping_relationship := [];
  END_LOCAL;
    IF relation.source_stratum_technology IN relatives THEN
      RETURN (FALSE);
    END_IF;
    x := QUERY(pd <* bag_to_set(USEDIN(relation.source_stratum_technology,
      'FABRICATION_TECHNOLOGY_ARM.' +
      'STRATUM_TECHNOLOGY_MAPPING_RELATIONSHIP.' +
      'TARGET_STRATUM_TECHNOLOGY')) | specific_relation IN TYPEOF(pd));
    REPEAT i := 1 TO HIINDEX(x);
      IF NOT acyclic_stratum_technology_mapping_relationship(x[i], relatives +
        relation.source_stratum_technology, specific_relation) THEN
        RETURN (FALSE);
      END_IF;
    END_REPEAT;
    RETURN (TRUE);
         END_FUNCTION;
         
FUNCTION acyclic_stratum_technology_occurrence_relationship
 (relation : Stratum_technology_occurrence_relationship; relatives : SET[1:?] OF Stratum_technology_occurrence; specific_relation : STRING) : BOOLEAN;
         LOCAL
     x : SET OF Stratum_technology_occurrence_relationship := [];
  END_LOCAL;
    IF relation.sto_1 IN relatives THEN
      RETURN (FALSE);
    END_IF;
    x := QUERY(pd <* bag_to_set(USEDIN(relation.sto_1,
      'FABRICATION_TECHNOLOGY_ARM.' +
      'STRATUM_TECHNOLOGY_OCCURRENCE_RELATIONSHIP.' +
      'STO_2')) | specific_relation IN TYPEOF(pd));
    REPEAT i := 1 TO HIINDEX(x);
      IF NOT acyclic_Stratum_technology_occurrence_relationship(x[i], relatives +
        relation.sto_1, specific_relation) THEN
        RETURN (FALSE);
      END_IF;
    END_REPEAT;
    RETURN (TRUE);
         END_FUNCTION;
         
FUNCTION acyclic_stratum_technology_swap_relationship
 (relation : Stratum_technology_swap_relationship; relatives : SET[1:?] OF Stratum_technology; specific_relation : STRING) : BOOLEAN;
         LOCAL
     x : SET OF Stratum_technology_swap_relationship := [];
  END_LOCAL;
    IF relation.primary_stratum_technology IN relatives THEN
      RETURN (FALSE);
    END_IF;
    x := QUERY(pd <* bag_to_set(USEDIN(relation.primary_stratum_technology,
      'FABRICATION_TECHNOLOGY_ARM.' +
      'STRATUM_TECHNOLOGY_SWAP_RELATIONSHIP.' +
      'SECONDARY_STRATUM_TECHNOLOGY')) | specific_relation IN TYPEOF(pd));
    REPEAT i := 1 TO HIINDEX(x);
      IF NOT acyclic_stratum_technology_swap_relationship(x[i], relatives +
        relation.primary_stratum_technology, specific_relation) THEN
        RETURN (FALSE);
      END_IF;
    END_REPEAT;
    RETURN (TRUE);
         END_FUNCTION;
         
FUNCTION ft_count_unspecified_asto
 (input : SET[0:?] OF Allocated_passage_minimum_annular_ring) : INTEGER;
         LOCAL
     count : INTEGER := 0;
    END_LOCAL;
    REPEAT i := 1 to SIZEOF(input) BY 1;
     IF NOT EXISTS(input[i]\Allocated_passage_minimum_annular_ring.associated_stratum_technology_occurrence) THEN
       count := count + 1;
     END_IF;
    END_REPEAT;
    RETURN(count);
         END_FUNCTION;
         
FUNCTION ft_get_terminus
 (input : SET[0:?] OF Stratum_technology_occurrence_link) : SET[0:?] OF Stratum_technology_occurrence;
         LOCAL sto : SET OF Stratum_technology_occurrence := get_stack(input); i : INTEGER := 0; j : INTEGER := 0; pstoo : SET OF Stratum_technology_occurrence := []; sstoo : SET OF Stratum_technology_occurrence := []; END_LOCAL; pstoo := sto; sstoo := sto; REPEAT i := 1 TO SIZEOF(sto) BY 1; REPEAT j := 1 TO SIZEOF(input) BY 1; IF (input[j]\Stratum_technology_occurrence_relationship.sto_1 :=: sto[i]) THEN pstoo := pstoo - sto[i]; END_IF; IF (input[j]\Stratum_technology_occurrence_relationship.sto_2 :=: sto[i]) THEN sstoo := sstoo - sto[i]; END_IF; END_REPEAT; END_REPEAT; RETURN(pstoo + sstoo);
         END_FUNCTION;
         
FUNCTION get_stack
 (input : SET[0:?] OF Stratum_technology_occurrence_link) : SET[0:?] OF Stratum_technology_occurrence;
         LOCAL
      sto : SET OF Stratum_technology_occurrence := [];
      i : INTEGER := 0;
    END_LOCAL;
    REPEAT  i := 1 TO SIZEOF(input) BY 1;
      sto := sto + input[i]\Stratum_technology_occurrence_relationship.sto_1 + input[i]\Stratum_technology_occurrence_relationship.sto_2;
    END_REPEAT;
    RETURN(sto);
         END_FUNCTION;
         
FUNCTION less
 (input1 : Length_tolerance_characteristic; input2 : ft_value_select) : BOOLEAN;
         RETURN(TRUE);
         END_FUNCTION;
         
FUNCTION sts_vertex_degree_check
 (input : SET[0:?] OF Stratum_technology_occurrence_link; n : INTEGER) : BOOLEAN;
         LOCAL
   psto : INTEGER := 0;
   ssto : INTEGER := 0;
   sto : SET OF Stratum_technology_occurrence := get_stack(input);
   i : INTEGER := 0;
   j : INTEGER := 0;
   pass : BOOLEAN := TRUE;
 END_LOCAL;
  REPEAT i := 1 TO SIZEOF(sto) BY 1;
   REPEAT j := 1 TO SIZEOF(input) BY 1;
     IF (input[j]\Stratum_technology_occurrence_relationship.sto_1 :=: sto[i]) THEN 
      psto := psto + 1;
      IF (psto = n) THEN
       pass := FALSE; 
       ESCAPE; 
      END_IF;
     END_IF;  
     IF (input[j]\Stratum_technology_occurrence_relationship.sto_2 :=: sto[i]) THEN 
      ssto := ssto + 1;  
      IF (ssto = n) THEN 
       pass := FALSE; 
       ESCAPE; 
      END_IF;
     END_IF;  
   END_REPEAT;                                     
  END_REPEAT;                                     
 RETURN(pass);
         END_FUNCTION;
         
         END_SCHEMA;  -- Fabrication_technology_arm
© ISO 2018 — All rights reserved