Пример #1
0
def analyze_dependence(program):
    program_w_attributes = assign_node_ids(program)
    graph = DependenceGraph()
    for (ref1, ref2) in iterate_unique_reference_pairs(program_w_attributes):
        for dependence_dv in iterate_dependence_direction_vectors(ref1, ref2):
            for ref1_then_ref2_dv in iterate_execution_order_direction_vector(
                    ref1, ref2):
                logger.debug(
                    f'Testing:\n'
                    f'{ref1.pprint()} -> {ref2.pprint()}:, '
                    f'dep({dependence_dv}) exe_order({ref1_then_ref2_dv})')
                dv1 = calculate_valid_direction_vector(dependence_dv,
                                                       ref1_then_ref2_dv)
                if dv1 is not None:
                    logger.debug(f'Valid direction vector: {dv1}')
                    graph.add(ref1, ref2, dv1)

            dependence_dv_inv = negate_direction_vector(dependence_dv)
            for ref2_then_ref1_dv in iterate_execution_order_direction_vector(
                    ref2, ref1):
                logger.debug(
                    f'Testing:\n'
                    f'{ref2.pprint()} -> {ref2.pprint()}:, '
                    f'dep({dependence_dv_inv}) exe_order({ref2_then_ref1_dv})')
                dv2 = calculate_valid_direction_vector(dependence_dv_inv,
                                                       ref2_then_ref1_dv)
                if dv2 is not None:
                    logger.debug(f'Valid direction vector: {dv2}')
                    graph.add(ref2, ref1, dv2)
    return graph, program_w_attributes