#
# Copyright (c) 2018 Bobby Noelte
#
# SPDX-License-Identifier: Apache-2.0
#

# NOTE: This file is part of the old device tree scripts, which will be removed
# later. They are kept to generate some legacy #defines via the
# --deprecated-only flag.
#
# The new scripts are gen_defines.py, edtlib.py, and dtlib.py.

from extract.globals import *
from extract.directive import DTDirective

##
# @brief Manage interrupts directives.
#
class DTInterrupts(DTDirective):
    ##
    # @brief Extract interrupts
    #
    # @param node_path Path to node owning the
    #                  interrupts definition.
    # @param prop compatible property name
    # @param names (unused)
    # @param def_label Define label string of node owning the
    #                  compatible definition.
    #
    def extract(self, node_path, prop, names, def_label):
        vals = reduced[node_path]['props'][prop]
        if not isinstance(vals, list):
            vals = [vals]

        irq_parent = parent_irq_node(node_path)
        if not irq_parent:
            err(node_path + " has no interrupt-parent")

        l_base = [def_label]
        index = 0

        while vals:
            prop_def = {}
            prop_alias = {}
            l_idx = [str(index)]

            if names:
                name = [str_to_label(names.pop(0))]
            else:
                name = []

            cell_yaml = get_binding(irq_parent)
            l_cell_prefix = ['IRQ']

            for i in range(reduced[irq_parent]['props']['#interrupt-cells']):
                l_cell_name = [cell_yaml['#cells'][i].upper()]
                if l_cell_name == l_cell_prefix:
                    l_cell_name = []

                full_name = '_'.join(l_base + l_cell_prefix + l_idx + l_cell_name)
                prop_def[full_name] = vals.pop(0)
                add_compat_alias(node_path,
                                 '_'.join(l_cell_prefix + l_idx + l_cell_name),
                                 full_name, prop_alias)

                if name:
                    alias_list = l_base + l_cell_prefix + name + l_cell_name
                    prop_alias['_'.join(alias_list)] = full_name
                    add_compat_alias(node_path,
                                     '_'.join(l_cell_prefix + name + l_cell_name),
                                     full_name, prop_alias)

                if node_path in aliases:
                    add_prop_aliases(
                        node_path,
                        lambda alias:
                            '_'.join([str_to_label(alias)] +
                                     l_cell_prefix + l_idx + l_cell_name),
                        full_name,
                        prop_alias)

                    if name:
                        add_prop_aliases(
                            node_path,
                            lambda alias:
                                '_'.join([str_to_label(alias)] +
                                         l_cell_prefix + name + l_cell_name),
                            full_name,
                            prop_alias)
                    else:
                        add_prop_aliases(
                            node_path,
                            lambda alias:
                                '_'.join([str_to_label(alias)] +
                                         l_cell_prefix + name + l_cell_name),
                            full_name,
                            prop_alias, True)

            index += 1
            insert_defs(node_path, prop_def, prop_alias)


def parent_irq_node(node_path):
    while node_path:
        if 'interrupt-parent' in reduced[node_path]['props']:
            return phandles[reduced[node_path]['props']['interrupt-parent']]

        node_path = get_parent_path(node_path)

    return None


##
# @brief Management information for interrupts.
interrupts = DTInterrupts()
