FUNCTION dependently_instantiated
(* SCHEMA Ap210_electronic_assembly_interconnect_and_packaging_design_mim_lf; *)
FUNCTION dependently_instantiated
(set_of_input_instances: SET [0:?] OF GENERIC: igen; set_of_input_types: SET [0:?] OF STRING; previous_in_chain: LIST [0:?] OF GENERIC: cgen) : BOOLEAN;
LOCAL
number_of_input_instances : INTEGER;
number_of_referring_instances : INTEGER;
bag_of_referring_instances : BAG OF GENERIC:igen := [];
dependently_instantiated_flag : BOOLEAN;
previous_in_chain_plus : LIST OF GENERIC:cgen := [];
result : BOOLEAN := true;
set_of_types : SET OF STRING := [];
END_LOCAL;
IF EXISTS(set_of_input_instances) THEN
number_of_input_instances := SIZEOF(set_of_input_instances);
(* Add the declared type of bag_of_referring_instances to the set of
types of the REFERENCEd instances for the subset comparison later.
*)
set_of_input_types := set_of_input_types + 'GENERIC';
REPEAT i:=1 TO number_of_input_instances;
(* Determine all references to the current input instance. *)
bag_of_referring_instances := USEDIN (set_of_input_instances[i] , '');
IF EXISTS(bag_of_referring_instances) THEN
number_of_referring_instances := SIZEOF(bag_of_referring_instances);
dependently_instantiated_flag := false;
REPEAT j:=1 TO number_of_referring_instances;
(* Determine the type strings of the current referencing instance.
*)
set_of_types := TYPEOF(bag_of_referring_instances[j]);
(* If the referencing instance is of one of the types of the
only dependently instantiable select items, the current input
instance may still be invalidly instantiated.
Otherwise it is OK, and the next input instance is tested.
*)
IF set_of_types <= set_of_input_types THEN -- subset operator
(* The referring instance is of one of the restricted types.
However, it may itself be referred to by a valid instance;
then also the current instance would be valid.
Thus, call this function recursively with the referring
instance as input.
To avoid an infinite loop in case a set of instances
reference each other in a closed loop, test first whether
the current referencing instance is in the list of
previously processed chain members.
*)
IF NOT (bag_of_referring_instances[j] IN previous_in_chain) THEN
previous_in_chain_plus := previous_in_chain +
set_of_input_instances[i];
IF dependently_instantiated([bag_of_referring_instances[j]],
set_of_input_types,
previous_in_chain_plus) THEN
dependently_instantiated_flag := true;
ESCAPE; -- dependently instantiated; next input instance
ELSE
(* Not dependently instantiated: go to next referring
instance. *)
SKIP;
END_IF;
END_IF;
ELSE
dependently_instantiated_flag := true;
ESCAPE; -- dependently instantiated; take next input instance
END_IF;
END_REPEAT;
IF NOT dependently_instantiated_flag THEN
RETURN(false);
END_IF;
ELSE
RETURN(false); -- not referenced at all => invalidly instantiated
END_IF;
END_REPEAT;
ELSE
RETURN(false); -- no input
END_IF;
RETURN(true);
END_FUNCTION;
Referenced By
Defintion dependently_instantiated is references by the following definitions:
[Top Level Definitions] [Exit]Generated by STEP Tools® EXPRESS to HTML Converter
2012-03-27T17:15:33-04:00