#! /usr/bin/env python
#
# sysgen.py - System Generator
#
#
# Copyright (c) 2015, Wind River Systems, Inc.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1) Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# 2) Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# 3) Neither the name of Wind River Systems nor the names of its contributors
# may be used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#

# Arguments:
#   - name of MDEF file
#   - name of directory for output files (optional)

# Generates:
#   - kernel_main.c file
#   - kernel_main.h file (local copy)
#   - kernel_struct.h file (local copy)
#   - zephyr.h file

import os
import sys
import subprocess

# global variables describing system

num_kargs = 0
num_timers = 0
num_prios = 0

task_list = []
event_list = []
mutex_list = []
sema_list = []
fifo_list = []
pipe_list = []
mbx_list = []
map_list = []
pool_list = []

driver_list = []

group_dictionary = {}
group_key_list = []

# global variables used during generation of output files

do_not_edit_warning = \
    "\n\n\n/* THIS FILE IS AUTOGENERATED -- DO NOT MODIFY! */\n\n\n"

copyright = \
    "/*\n" + \
    " * Copyright (c) 2015 Wind River Systems, Inc.\n" + \
    " *\n" + \
    " * Redistribution and use in source and binary forms," + \
    " with or without\n" + \
    " * modification, are permitted provided that the following conditions" + \
    " are met:\n" + \
    " *\n" + \
    " * 1) Redistributions of source code must retain" + \
    " the above copyright notice,\n" + \
    " * this list of conditions and the following disclaimer.\n" + \
    " *\n" + \
    " * 2) Redistributions in binary form must reproduce" + \
    " the above copyright notice,\n" + \
    " * this list of conditions and the following disclaimer" + \
    " in the documentation\n" + \
    " * and/or other materials provided with the distribution.\n" + \
    " *\n" + \
    " * 3) Neither the name of Wind River Systems nor the names" + \
    " of its contributors\n" + \
    " * may be used to endorse or promote products derived" + \
    " from this software without\n" + \
    " * specific prior written permission.\n" + \
    " *\n" + \
    " * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS" + \
    " AND CONTRIBUTORS \"AS IS\"\n" + \
    " * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING," + \
    " BUT NOT LIMITED TO, THE\n" + \
    " * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS" + \
    " FOR A PARTICULAR PURPOSE\n" + \
    " * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER" + \
    " OR CONTRIBUTORS BE\n" + \
    " * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL," + \
    " EXEMPLARY, OR\n" + \
    " * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO," + \
    " PROCUREMENT OF\n" + \
    " * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;" + \
    " OR BUSINESS\n" + \
    " * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY," + \
    " WHETHER IN\n" + \
    " * CONTRACT, STRICT LIABILITY, OR TORT" + \
    " (INCLUDING NEGLIGENCE OR OTHERWISE)\n" + \
    " * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE," + \
    " EVEN IF ADVISED OF THE\n" + \
    " * POSSIBILITY OF SUCH DAMAGE.\n" + \
    " */\n"

output_dir = ""


def get_output_dir():
    """ Handle optional output directory argument """

    global output_dir
    if len(sys.argv) > 2:
        output_dir = sys.argv[2]


def write_file(filename, contents):
    """ Create file using specified name and contents """

    f = open(filename, 'w')    # overwrites file if it already exists
    f.write(contents)
    f.close()


#
# ERROR HANDLING
#


def sysgen_error(msg):
    print "\n*** sysgen error: " + msg + "\n"
    sys.exit(1)


def error_arg_count(line):
    sysgen_error("invalid number of arguments on following line\n" + line)


#
# CREATE INTERNAL REPRESENTATION OF SYSTEM
#


def mdef_parse():
    """ Parse MDEF file """

    global num_kargs
    global num_timers
    global num_prios

    # read file contents in a single shot
    with open(sys.argv[1], 'r') as infile:
        data = infile.read()

    # create list of the lines, breaking at line boundaries
    my_list = data.splitlines()

    # process each line
    for line in my_list:
        words = line.split()

        if (len(words) == 0):
            continue    # ignore blank line

        if (words[0][0] == "%"):
            continue    # ignore comment line

        if (words[0] == "CONFIG"):
            if (len(words) != 4):
                error_arg_count(line)
            num_kargs = int(words[1])
            num_timers = int(words[2])
            num_prios = int(words[3])
            continue

        if (words[0] == "TASK"):
            if (len(words) != 6):
                error_arg_count(line)
            task_list.append((words[1], int(words[2]), words[3],
                              int(words[4]), words[5]))
            continue

        if (words[0] == "TASKGROUP"):
            if (len(words) != 2):
                error_arg_count(line)
            if words[1] in group_dictionary:
                continue    # ignore re-definition of a task group
            group_bitmask = 1 << len(group_dictionary)
            group_dictionary[words[1]] = group_bitmask
            group_key_list.append(words[1])
            continue

        if (words[0] == "EVENT"):
            if (len(words) != 3):
                error_arg_count(line)
            event_list.append((words[1], words[2]))
            continue

        if (words[0] == "SEMA"):
            if (len(words) != 2):
                error_arg_count(line)
            sema_list.append((words[1],))
            continue

        if (words[0] == "MUTEX"):
            if (len(words) != 2):
                error_arg_count(line)
            mutex_list.append((words[1],))
            continue

        if (words[0] == "FIFO"):
            if (len(words) != 4):
                error_arg_count(line)
            fifo_list.append((words[1], int(words[2]), int(words[3])))
            continue

        if (words[0] == "PIPE"):
            if (len(words) != 3):
                error_arg_count(line)
            pipe_list.append((words[1], int(words[2])))
            continue

        if (words[0] == "MAILBOX"):
            if (len(words) != 2):
                error_arg_count(line)
            mbx_list.append((words[1],))
            continue

        if (words[0] == "MAP"):
            if (len(words) != 4):
                error_arg_count(line)
            map_list.append((words[1], int(words[2]), int(words[3])))
            continue

        if (words[0] == "POOL"):
            if (len(words) != 5):
                error_arg_count(line)
            pool_list.append((words[1], int(words[2]), int(words[3]),
                              int(words[4])))
            continue

        if (words[0] == "TIMERDRIVER"):
            if (len(words) == 1):
                error_arg_count(line)
            if (num_timers == 0):
                continue    # ignore timer driver for a tickless microkernel
            start_quote = line.find("'")
            end_quote = line.rfind("'")
            driver_list.append(line[start_quote + 1:end_quote])
            continue

        if (words[0] == "USERDRIVER"):
            if (len(words) == 1):
                error_arg_count(line)
            start_quote = line.find("'")
            end_quote = line.rfind("'")
            driver_list.append(line[start_quote + 1:end_quote])
            continue

        sysgen_error("unrecognized keyword %s on following line\n%s" %
                     (words[0], line))


#
# GENERATE kernel_main.c FILE
#


kernel_main_c_data = ""

kernel_main_c_filename_str = \
    "/* kernel_main.c - microkernel mainline and kernel objects */\n\n"


def kernel_main_c_out(string):
    """ Append a string to kernel_main.c """

    global kernel_main_c_data
    kernel_main_c_data += string


def kernel_main_c_header():
    """ Generate initial portion of kernel_main.c """

    kernel_main_c_out(
        kernel_main_c_filename_str +
        copyright +
        do_not_edit_warning +
        "\n" +
        "#include <zephyr.h>\n" +
        "#include <drivers/system_timer.h>\n" +
        "#include <kernel_struct.h>\n" +
        "#include <kernel_main.h>\n" +
        "#include <toolchain.h>\n" +
        "#include <sections.h>\n")


def kernel_main_c_kargs():
    """ Generate command packet variables """

    # command packets

    kernel_main_c_out("\n" +
        "struct k_args _k_server_command_packets[%s] =\n" % (num_kargs) +
        "{\n" +
        "    {NULL, NULL, 0, 0, (K_COMM) UNDEFINED},\n")
    for i in range(1, num_kargs - 1):
        kernel_main_c_out(
            "    {&_k_server_command_packets[%d], " % (i - 1) +
            "NULL, 0, 0, (K_COMM) UNDEFINED},\n")
    kernel_main_c_out(
        "    {&_k_server_command_packets[%d], " % (num_kargs - 2) +
        "NULL, 0, 0, (K_COMM) UNDEFINED}\n" +
        "};\n")

    # linked list of free command packets

    kernel_main_c_out("\n" +
        "struct nano_lifo _k_server_command_packet_free = " +
        "{{NULL, &_k_server_command_packet_free.wait_q.head}, " +
        "(void *) &_k_server_command_packets[%d]};\n" % (num_kargs - 1))


def kernel_main_c_timers():
    """ Generate timer system variables """

    if (num_timers == 0):
        return

    # timer descriptors

    kernel_main_c_out("\n" +
        "struct k_timer _k_timer_blocks[%d] =\n" % (num_timers) +
        "{\n" +
        "    {NULL, NULL, 0, 0, (struct k_args *)0xffffffff},\n")
    for i in range(1, num_timers - 1):
        kernel_main_c_out(
            "    {&_k_timer_blocks[%d], " % (i - 1) +
            "NULL, 0, 0, (struct k_args *)0xffffffff},\n")
    kernel_main_c_out(
        "    {&_k_timer_blocks[%d], " % (num_timers - 2) +
        "NULL, 0, 0, (struct k_args *)0xffffffff}\n" +
        "};\n")

    # linked list of free timers

    kernel_main_c_out("\n" +
        "struct nano_lifo _k_timer_free = " +
        "{{NULL, &_k_timer_free.wait_q.head}, " +
        "(void *) &_k_timer_blocks[%d]};\n" % (num_timers - 1))


def kernel_main_c_tasks():
    """ Generate task variables """

    global num_prios

    total_tasks = len(task_list) + 1

    # task global variables

    kernel_main_c_out("\nint _k_task_count = %d;\n" % (total_tasks - 1))

    # task stack areas

    kernel_main_c_out("\n")
    for task in task_list:
        kernel_main_c_out("char __noinit __stack __%s_stack[%d];\n" %
                          (task[0], task[3]))

    kernel_main_c_out("extern char main_task_stack[CONFIG_MAIN_STACK_SIZE];\n")

    # declare task entry points

    kernel_main_c_out("\n")
    for task in task_list:
        kernel_main_c_out("extern void %s(void);\n" % task[2])

    # task descriptors (including one for idle task)

    kernel_main_c_out("\n" +
        "struct k_proc _k_task_list[%d] =\n" % (total_tasks) +
        "{\n")
    ident = 0x00010000
    for task in task_list:
        prio = task[1]
        entry = task[2]
        size = task[3]

        stack = "__" + task[0] + "_stack"

        # create bitmask of group(s) task belongs to
        group_bitmask = 0
        group_set = task[4][1:len(task[4]) - 1]   # drop [] surrounding groups
        if (group_set != ""):
            group_list = group_set.split(',')
            for group in group_list:
                group_bitmask |= group_dictionary[group]

        # invert bitmask to convert SYS indication to non-SYS indication
        #
        # NOTE: There actually is no SYS group; instead, there is a non-SYS
        # group that all tasks belong to unless they specify the 'SYS' name.
        # This approach allows the kernel to easily suspend all non-SYS tasks
        # during debugging, while minimizing the number of task entries that
        # have to explicitly indicate their SYS/non-SYS status.
        group_bitmask ^= group_dictionary['SYS']

        kernel_main_c_out(
            "    {NULL, NULL, %d, %#010x, " % (prio, ident) +
            "0x00000001, %#010x,\n" % (group_bitmask) +
            "%s, %s, %d, (taskabortfunction)NULL},\n" % (entry, stack, size))
        ident += 1

    kernel_main_c_out("    {NULL, NULL, %d, 0x00000000, " % (num_prios - 1) +
        "0x00000000, 0x00000000,\n" +
        "(taskstartfunction)NULL, main_task_stack, CONFIG_MAIN_STACK_SIZE, " +
        "(taskabortfunction)NULL}\n")
    kernel_main_c_out("};\n")

    # currently scheduled task (idle task)

    kernel_main_c_out("\n" +
        "struct k_proc * _k_current_task = &_k_task_list[%d];\n" %
        (total_tasks - 1))


def kernel_main_c_priorities():
    """ Generate task scheduling variables """

    global num_prios

    total_tasks = len(task_list) + 1

    # priority queue descriptors (lowest priority queue contains idle task)

    kernel_main_c_out("\n" +
        "struct k_tqhd _k_task_priority_list[%d] =\n" % (num_prios) +
        "{\n")
    for i in range(1, num_prios):
        kernel_main_c_out(
            "    {NULL, (struct k_proc *)&_k_task_priority_list[%d]},\n" %
            (i - 1))
    kernel_main_c_out(
        "    {&_k_task_list[%d], &_k_task_list[%d]}\n" %
        (total_tasks - 1, total_tasks - 1) +
        "};\n")

    # active priority queue (idle task's queue)

    kernel_main_c_out("\n" +
        "struct k_tqhd * K_Prio = &_k_task_priority_list[%d];\n" %
        (num_prios - 1))

    # priority queue bit map (indicates which priority queues are non-empty;
    # initially only the idle task's queue has a runnable task)

    num_bit_maps = ((num_prios + 31) / 32)

    kernel_main_c_out("\n" +
        "uint32_t _k_task_priority_bitmap[%d] = {" % (num_bit_maps))
    for i in range(1, num_bit_maps):
        kernel_main_c_out("0, ")
    kernel_main_c_out("(1u << %d)};\n" % ((num_prios - 1) & 0x1f))


def kernel_main_c_events():
    """ Generate event variables """

    total_events = 4 + len(event_list)

    # event descriptors

    kernel_main_c_out("\n" +
        "struct evstr _k_event_list[%d] =\n" % (total_events) +
        "{\n")
    # pre-defined events
    if (num_timers > 0):
        kernel_main_c_out(
            "    {0, (kevent_handler_t)K_ticker, (struct k_args *)NULL, 0},\n")
    else:
        kernel_main_c_out(
            "    {0, (kevent_handler_t)NULL, (struct k_args *)NULL, 0},\n")
    kernel_main_c_out(
        "    {0, (kevent_handler_t)NULL, (struct k_args *)NULL, 0},\n" +
        "    {0, (kevent_handler_t)NULL, (struct k_args *)NULL, 0},\n" +
        "    {0, (kevent_handler_t)NULL, (struct k_args *)NULL, 0},\n"
    )
    # project-specific events
    for event in event_list:
        kernel_main_c_out(
            "    {0, (kevent_handler_t)%s, (struct k_args *)NULL, 0},\n" %
            (event[1]))
    kernel_main_c_out("};\n")

    # number of events

    kernel_main_c_out("\n" +
        "const int _k_num_events = %d;\n" % (total_events))

    # event object identifiers (for project-defined events only)

    if (len(event_list) > 0):
        kernel_main_c_out("\n")

        for event_name in event_list:
            kernel_main_c_out(
                "const kevent_t %s_objId = %s;\n" %
                (event_name[0], event_name[0]))


def kernel_main_c_mutexes():
    """ Generate mutex variables """

    total_mutexes = len(mutex_list)

    if (total_mutexes == 0):
        kernel_main_c_out("\nstruct mutex_struct * _k_mutex_list = NULL;\n")
        return

    # mutex descriptors

    kernel_main_c_out("\n" +
        "struct mutex_struct _k_mutex_list[%s] =\n" % (total_mutexes) +
        "{\n")
    for mutex in mutex_list:
        kernel_main_c_out("    {ANYTASK, 64, 64, 0, NULL, 0, 0},\n")
    kernel_main_c_out("};\n")
    kernel_main_c_out("\n")

    # mutex object identifiers

    for mutex in mutex_list:
        name = mutex[0]
        kernel_main_c_out("const kmutex_t %s_objId = %s;\n" % (name, name))


def kernel_main_c_semas():
    """ Generate semaphore variables """

    total_semas = len(sema_list)

    if (total_semas == 0):
        kernel_main_c_out("\nstruct sem_struct * _k_sem_list = NULL;\n")
        return

    # semaphore descriptors

    kernel_main_c_out("\n" +
        "struct sem_struct _k_sem_list[%s] =\n" % (total_semas) +
        "{\n")
    for semaphore in sema_list:
        kernel_main_c_out("    {NULL, 0, 0},\n")
    kernel_main_c_out("};\n")


def kernel_main_c_fifos():
    """ Generate FIFO variables """

    total_fifos = len(fifo_list)

    if (total_fifos == 0):
        kernel_main_c_out("\nstruct que_struct * _k_fifo_list = NULL;\n")
        return

    # FIFO buffers

    kernel_main_c_out("\n")

    for fifo in fifo_list:
        kernel_main_c_out(
            "char __noinit __%s_buffer[%d];\n" % (fifo[0], fifo[1] * fifo[2]))

    # FIFO descriptors

    kernel_main_c_out("\n" +
        "struct que_struct _k_fifo_list[%s] =\n" % (total_fifos) +
        "{\n"
    )
    for fifo in fifo_list:
        depth = fifo[1]
        width = fifo[2]
        buffer = "__" + fifo[0] + "_buffer"
        kernel_main_c_out(
            "    {%d, %d, %s, %s + (%d * %d),\n" %
            (depth, width, buffer, buffer, depth, width) +
            "%s, %s, NULL, 0, 0, 0},\n" %
            (buffer, buffer))
    kernel_main_c_out("};\n")


def kernel_main_c_pipes():
    """ Generate pipe variables """

    total_pipes = len(pipe_list)

    # pipe global variables

    kernel_main_c_out("\nint _k_pipe_count = %d;\n" % (total_pipes))

    if (total_pipes == 0):
        kernel_main_c_out("\nstruct pipe_struct * _k_pipe_list = NULL;\n")
        return

    # pipe buffers

    kernel_main_c_out("\n")

    for pipe in pipe_list:
        kernel_main_c_out(
            "char __noinit __%s_buffer[%d];\n" % (pipe[0], pipe[1]))

    # pipe descriptors

    kernel_main_c_out("\n" +
        "struct pipe_struct _k_pipe_list[%d] =\n" % (total_pipes) +
        "{\n")
    for pipe in pipe_list:
        size = pipe[1]
        buffer = "__" + pipe[0] + "_buffer"
        kernel_main_c_out("    {%d, %s},\n" % (size, buffer))
    kernel_main_c_out("};\n")


def kernel_main_c_mailboxes():
    """ Generate mailbox variables """

    total_mbxs = len(mbx_list)

    if (total_mbxs == 0):
        kernel_main_c_out("\nstruct mbx_struct * _k_mbox_list = NULL;\n")
        return

    # mailbox descriptors

    kernel_main_c_out("\n" +
        "struct mbx_struct _k_mbox_list[%d] =\n" % (total_mbxs) +
        "{\n")
    for mbx in mbx_list:
        kernel_main_c_out("    {NULL, NULL, 0},\n")
    kernel_main_c_out("};\n")


def kernel_main_c_maps():
    """ Generate memory map variables """

    total_maps = len(map_list)

    # map global variables

    kernel_main_c_out("\nint _k_mem_map_count = %d;\n" % (total_maps))

    if (total_maps == 0):
        kernel_main_c_out("\nstruct map_struct * _k_mem_map_list = NULL;\n")
        return

    # memory map buffers

    kernel_main_c_out("\n")

    for map in map_list:
        blocks = map[1]
        block_size = map[2]
        kernel_main_c_out("char __noinit __MAP_%s_buffer[%d];\n" %
                    (map[0], blocks * block_size))

    # memory map descriptors

    kernel_main_c_out(
        "\nstruct map_struct _k_mem_map_list[%d] =\n{\n" % (total_maps))
    for map in map_list:
        blocks = map[1]
        block_size = map[2]
        kernel_main_c_out("    { %d, %d, __MAP_%s_buffer },\n" %
                    (blocks, block_size, map[0]))
    kernel_main_c_out("};\n")


def kernel_main_c_pools():
    """ Generate memory pool variables """

    total_pools = len(pool_list)

    # pool global variables

    kernel_main_c_out("\nint _k_mem_pool_count = %d;\n" % (total_pools))

    if (total_pools == 0):
        kernel_main_c_out("\nstruct pool_struct * _k_mem_pool_list = NULL;\n")
        return

    # start accumulating memory pool descriptor info

    pool_descriptors = "\nstruct pool_struct _k_mem_pool_list[%d] =\n{\n" % \
                        (total_pools)
    ident = 0x00010000

    for pool in pool_list:

        kernel_main_c_out("\n")

        # create local variables relating to current pool

        min_block_size = pool[1]
        max_block_size = pool[2]
        num_maximal_blocks = pool[3]
        total_memory = max_block_size * num_maximal_blocks
        buffer = "__" + pool[0] + "_buffer"
        frag_table = "fragtab_%#010x" % ident

        # determine block sizes used by pool (including actual minimum size)

        frag_size_list = [max_block_size]
        while (ident != 0):    # loop forever
            min_block_size_actual = frag_size_list[len(frag_size_list) - 1]
            min_block_size_proposed = min_block_size_actual / 4
            if (min_block_size_proposed < min_block_size):
                break
            frag_size_list.append(min_block_size_proposed)
        frag_levels = len(frag_size_list)

        # determine size of block status arrays
        # - largest size gets special handling
        # - remainder of algorithm is a complete mystery ...

        block_status_sizes = [(num_maximal_blocks + 3) / 4]
        block_status_size_to_use = num_maximal_blocks
        for index in range(1, frag_levels):
            block_status_sizes.append(block_status_size_to_use)
            block_status_size_to_use *= 4

        # generate block status areas

        for index in range(0, frag_levels):
            kernel_main_c_out(
                "struct block_stat blockstatus_%#010x_%d[%d];\n" %
                (ident, index, block_status_sizes[index]))

        # generate memory pool fragmentation descriptor

        kernel_main_c_out("\nstruct pool_block %s[%d] =\n{\n" %
                        (frag_table, frag_levels))
        for index in range(0, frag_levels):
            kernel_main_c_out("    { %d, %d, blockstatus_%#010x_%d},\n" %
                (frag_size_list[index], block_status_sizes[index],
                 ident, index))
        kernel_main_c_out("};\n")

        # generate memory pool buffer

        kernel_main_c_out("\nchar __noinit %s[%d];\n" % (buffer, total_memory))

        # append memory pool descriptor info

        pool_descriptors += "    {%d, %d, 2, %d, %d, %d, NULL, %s, %s},\n" % \
            (max_block_size, min_block_size_actual, total_memory,
            num_maximal_blocks, frag_levels, frag_table, buffer)

        ident += 1

    # generate memory pool descriptor info

    pool_descriptors += "};\n"
    kernel_main_c_out(pool_descriptors)


def kernel_main_c_kernel_services():
    """ Generate kernel services function table """

    # initialize table with info for all possible kernel services

    func_table = [
"/*  0 */ _k_nop,",                               # required
"/*  1 */ _k_movedata_request,",                  # required
"/*  2 */ (kernelfunc) NULL,",                    # unused
"/*  3 */ (kernelfunc) NULL,",                    # unused
"/*  4 */ _k_offload_to_fiber,",                  # required
"/*  5 */ _k_workload_get,",                      # required
"/*  6 */ _k_sem_signal,",                        # depends on semaphores
"/*  7 */ _k_sem_group_signal,",                  # depends on semaphores
"/*  8 */ _k_sem_reset,",                         # depends on semaphores
"/*  9 */ _k_sem_group_reset,",                   # depends on semaphores
"/* 10 */ _k_sem_wait_request,",                  # depends on semaphores
"/* 11 */ _k_sem_wait_reply,",                    # depends on semaphores
"/* 12 */ _k_sem_wait_reply,",                    # depends on semaphores and
                                                  #  timers
"/* 13 */ _k_sem_group_wait_any,",                # depends on semaphores
"/* 14 */ _k_sem_group_wait_request,",            # depends on semaphores
"/* 15 */ _k_sem_group_ready,",                   # depends on semaphores
"/* 16 */ _k_sem_group_wait_cancel,",             # depends on semaphores
"/* 17 */ _k_sem_group_wait_accept,",             # depends on semaphores
"/* 18 */ _k_sem_group_wait,",                    # depends on semaphores
"/* 19 */ _k_sem_group_wait_timeout,",            # depends on semaphores
                                                  #  (but not timers)
"/* 20 */ _k_sem_inquiry,",                       # depends on semaphores
"/* 21 */ _k_mutex_lock_request,",                # depends on mutexes
"/* 22 */ _k_mutex_lock_reply,",                  # depends on mutexes
"/* 23 */ _k_mutex_lock_reply,",                  # depends on mutexes and
                                                  #  timers
"/* 24 */ _k_mutex_unlock,",                      # depends on mutexes
"/* 25 */ _k_fifo_enque_request,",                # depends on FIFOs
"/* 26 */ _k_fifo_enque_reply,",                  # depends on FIFOs
"/* 27 */ _k_fifo_enque_reply,",                  # depends on FIFOs and timers
"/* 28 */ _k_fifo_deque_request,",                # depends on FIFOs
"/* 29 */ _k_fifo_deque_reply,",                  # depends on FIFOs
"/* 30 */ _k_fifo_deque_reply,",                  # depends on FIFOs and timers
"/* 31 */ _k_fifo_ioctl,",                        # depends on FIFOs
"/* 32 */ _k_mbox_send_request,",                 # depends on mailboxes
"/* 33 */ _k_mbox_send_reply,",                   # depends on mailboxes and
                                                  #  timers
"/* 34 */ _k_mbox_send_ack,",                     # depends on mailboxes
"/* 35 */ _k_mbox_send_data,",                    # depends on mailboxes
"/* 36 */ _k_mbox_receive_request,",              # depends on mailboxes
"/* 37 */ _k_mbox_receive_reply,",                # depends on mailboxes and
                                                  #  timers
"/* 38 */ _k_mbox_receive_ack,",                  # depends on mailboxes
"/* 39 */ _k_mbox_receive_data,",                 # depends on mailboxes
"/* 40 */ _k_time_elapse,",                       # depends on timers
"/* 41 */ _k_task_sleep,",                        # depends on timers
"/* 42 */ _k_task_wakeup,",                       # depends on timers
"/* 43 */ _k_task_op,",                           # required
"/* 44 */ _k_task_group_op,",                     # required
"/* 45 */ _k_task_priority_set,",                 # required
"/* 46 */ _k_task_yield,",                        # required
"/* 47 */ _k_mem_map_alloc,",                     # depends on memory maps
"/* 48 */ _k_mem_map_dealloc,",                   # depends on memory maps
"/* 49 */ _k_timer_alloc,",                       # depends on timers
"/* 50 */ _k_timer_dealloc,",                     # depends on timers
"/* 51 */ _k_timer_start,",                       # depends on timers
"/* 52 */ _k_timer_stop,",                        # depends on timers
"/* 53 */ _k_mem_map_alloc_timeout,",             # depends on memory maps and
                                                  #  timers
"/* 54 */ (kernelfunc) NULL,",                    # unused
"/* 55 */ (kernelfunc) NULL,",                    # unused
"/* 56 */ (kernelfunc) NULL,",                    # unused
"/* 57 */ (kernelfunc) NULL,",                    # unused
"/* 58 */ _k_event_test,",                        # required
"/* 59 */ _k_event_handler_set,",                 # required
"/* 60 */ _k_event_signal,",                      # required
"/* 61 */ _k_mem_pool_block_get,",                # depends on memory pools
"/* 62 */ _k_mem_pool_block_release,",            # depends on memory pools
"/* 63 */ _k_block_waiters_get,",                 # depends on memory pools
"/* 64 */ _k_mem_pool_block_get_timeout_handle,",  # depends on memory pools
                                                   #  and timers
"/* 65 */ _k_defrag,",                            # depends on memory pools
"/* 66 */ (kernelfunc) NULL,",                    # unused
"/* 67 */ (kernelfunc) NULL,",                    # unused
"/* 68 */ (kernelfunc) NULL,",                    # unused
"/* 69 */ (kernelfunc) NULL,",                    # unused
"/* 70 */ (kernelfunc) NULL,",                    # unused
"/* 71 */ (kernelfunc) NULL,",                    # unused
"/* 72 */ K_ChSendReq,",                          # depends on pipes
"/* 73 */ K_ChSendTmo,",                          # depends on pipes and timers
"/* 74 */ K_ChSendRpl,",                          # depends on pipes
"/* 75 */ K_ChSendAck,",                          # depends on pipes
"/* 76 */ K_ChRecvReq,",                          # depends on pipes
"/* 77 */ K_ChRecvTmo,",                          # depends on pipes and timers
"/* 78 */ K_ChRecvRpl,",                          # depends on pipes
"/* 79 */ K_ChRecvAck,",                          # depends on pipes
"/* 80 */ K_ChMovedAck,",                         # depends on pipes
"/* 81 */ _k_event_test_timeout"                  # depends on timers
    ]

    # eliminate table entries for kernel services that project doesn't utilize
    # (note: some entries can be eliminated for more than one reason)

    if (len(sema_list) == 0):
        func_table[6] = "/*  6 */ (kernelfunc) NULL,"
        func_table[7] = "/*  7 */ (kernelfunc) NULL,"
        func_table[8] = "/*  8 */ (kernelfunc) NULL,"
        func_table[9] = "/*  9 */ (kernelfunc) NULL,"
        func_table[10] = "/* 10 */ (kernelfunc) NULL,"
        func_table[11] = "/* 11 */ (kernelfunc) NULL,"
        func_table[12] = "/* 12 */ (kernelfunc) NULL,"
        func_table[13] = "/* 13 */ (kernelfunc) NULL,"
        func_table[14] = "/* 14 */ (kernelfunc) NULL,"
        func_table[15] = "/* 15 */ (kernelfunc) NULL,"
        func_table[16] = "/* 16 */ (kernelfunc) NULL,"
        func_table[17] = "/* 17 */ (kernelfunc) NULL,"
        func_table[18] = "/* 18 */ (kernelfunc) NULL,"
        func_table[19] = "/* 19 */ (kernelfunc) NULL,"
        func_table[20] = "/* 20 */ (kernelfunc) NULL,"

    if (len(mutex_list) == 0):
        func_table[21] = "/* 21 */ (kernelfunc) NULL,"
        func_table[22] = "/* 22 */ (kernelfunc) NULL,"
        func_table[23] = "/* 23 */ (kernelfunc) NULL,"
        func_table[24] = "/* 24 */ (kernelfunc) NULL,"

    if (len(fifo_list) == 0):
        func_table[25] = "/* 25 */ (kernelfunc) NULL,"
        func_table[26] = "/* 26 */ (kernelfunc) NULL,"
        func_table[27] = "/* 27 */ (kernelfunc) NULL,"
        func_table[28] = "/* 28 */ (kernelfunc) NULL,"
        func_table[29] = "/* 29 */ (kernelfunc) NULL,"
        func_table[30] = "/* 30 */ (kernelfunc) NULL,"
        func_table[31] = "/* 31 */ (kernelfunc) NULL,"

    if (len(mbx_list) == 0):
        func_table[32] = "/* 32 */ (kernelfunc) NULL,"
        func_table[33] = "/* 33 */ (kernelfunc) NULL,"
        func_table[34] = "/* 34 */ (kernelfunc) NULL,"
        func_table[35] = "/* 35 */ (kernelfunc) NULL,"
        func_table[36] = "/* 36 */ (kernelfunc) NULL,"
        func_table[37] = "/* 37 */ (kernelfunc) NULL,"
        func_table[38] = "/* 38 */ (kernelfunc) NULL,"
        func_table[39] = "/* 39 */ (kernelfunc) NULL,"

    if (len(map_list) == 0):
        func_table[47] = "/* 47 */ (kernelfunc) NULL,"
        func_table[48] = "/* 48 */ (kernelfunc) NULL,"
        func_table[53] = "/* 53 */ (kernelfunc) NULL,"

    if (len(pool_list) == 0):
        func_table[61] = "/* 61 */ (kernelfunc) NULL,"
        func_table[62] = "/* 62 */ (kernelfunc) NULL,"
        func_table[63] = "/* 63 */ (kernelfunc) NULL,"
        func_table[64] = "/* 64 */ (kernelfunc) NULL,"
        func_table[65] = "/* 65 */ (kernelfunc) NULL,"

    if (len(pipe_list) == 0):
        func_table[72] = "/* 72 */ (kernelfunc) NULL,"
        func_table[73] = "/* 73 */ (kernelfunc) NULL,"
        func_table[74] = "/* 74 */ (kernelfunc) NULL,"
        func_table[75] = "/* 75 */ (kernelfunc) NULL,"
        func_table[76] = "/* 76 */ (kernelfunc) NULL,"
        func_table[77] = "/* 77 */ (kernelfunc) NULL,"
        func_table[78] = "/* 78 */ (kernelfunc) NULL,"
        func_table[79] = "/* 79 */ (kernelfunc) NULL,"
        func_table[80] = "/* 80 */ (kernelfunc) NULL,"

    if (num_timers == 0):
        func_table[12] = "/* 12 */ (kernelfunc) NULL,"
        func_table[23] = "/* 23 */ (kernelfunc) NULL,"
        func_table[27] = "/* 27 */ (kernelfunc) NULL,"
        func_table[30] = "/* 30 */ (kernelfunc) NULL,"
        func_table[33] = "/* 33 */ (kernelfunc) NULL,"
        func_table[37] = "/* 37 */ (kernelfunc) NULL,"
        func_table[40] = "/* 40 */ (kernelfunc) NULL,"
        func_table[41] = "/* 41 */ (kernelfunc) NULL,"
        func_table[42] = "/* 42 */ (kernelfunc) NULL,"
        func_table[49] = "/* 49 */ (kernelfunc) NULL,"
        func_table[50] = "/* 50 */ (kernelfunc) NULL,"
        func_table[51] = "/* 51 */ (kernelfunc) NULL,"
        func_table[52] = "/* 52 */ (kernelfunc) NULL,"
        func_table[53] = "/* 53 */ (kernelfunc) NULL,"
        func_table[64] = "/* 64 */ (kernelfunc) NULL,"
        func_table[73] = "/* 73 */ (kernelfunc) NULL,"
        func_table[77] = "/* 77 */ (kernelfunc) NULL,"
        func_table[81] = "/* 81 */ (kernelfunc) NULL,"

    # generate function table

    kernel_main_c_out("\n" +
        "const kernelfunc _k_server_dispatch_table[82] =\n" +
        "{\n")
    for func in func_table:
        kernel_main_c_out("    " + func + "\n")
    kernel_main_c_out("};\n")


def kernel_main_c_driver_init():
    """ Generate driver initialization routine """

    kernel_main_c_out("\n" +
        "void init_drivers(void)\n" +
        "{\n")
    for driver_call in driver_list:
        kernel_main_c_out("    " + driver_call + ";\n")
    kernel_main_c_out("}\n")


def kernel_main_c_node_init():
    """ Generate node initialization routine """

    kernel_main_c_out("\n" +
        "void init_node(void)\n{\n")
    if (len(pipe_list) > 0):
        kernel_main_c_out("    _pipe_init();\n")
    if (len(map_list) > 0):
        kernel_main_c_out("    _mem_map_init();\n")
    if (len(pool_list) > 0):
        kernel_main_c_out("    _mem_pools_init();\n")
    kernel_main_c_out("}\n")


def kernel_main_c_main():
    """ Generate main() routine """

    kernel_main_c_out("\n" +
        "void main(void)\n" +
        "{\n" +
        "    kernel_init();\n" +
        "    task_group_start(EXE);\n" +
        "    kernel_idle();\n" +
        "}\n")


def kernel_main_c_generate():
    """ Generate kernel_main.c file """

    global kernel_main_c_data

    kernel_main_c_header()
    kernel_main_c_kargs()
    kernel_main_c_timers()
    kernel_main_c_tasks()
    kernel_main_c_priorities()
    kernel_main_c_events()
    kernel_main_c_mutexes()
    kernel_main_c_semas()
    kernel_main_c_fifos()
    kernel_main_c_pipes()
    kernel_main_c_mailboxes()
    kernel_main_c_maps()
    kernel_main_c_pools()
    kernel_main_c_kernel_services()
    kernel_main_c_driver_init()
    kernel_main_c_node_init()
    kernel_main_c_main()

    write_file(output_dir + 'kernel_main.c', kernel_main_c_data)


#
# GENERATE kernel_main.h FILE
#


def kernel_main_h_generate():
    """ Generate kernel_main.h file """

    global output_dir

    subprocess.check_call([
        "cp",
        "-f",
        os.environ["ZEPHYR_BASE"] +
        "/kernel/microkernel/include/kernel_main.h",
        output_dir])


#
# GENERATE kernel_struct.h FILE
#


def kernel_struct_h_generate():
    """ Generate kernel_struct.h file """

    global output_dir

    subprocess.check_call([
        "cp",
        "-f",
        os.environ["ZEPHYR_BASE"] +
        "/kernel/microkernel/include/kernel_struct.h",
        output_dir])


#
# GENERATE zephyr.h FILE
#


zephyr_h_data = ""

zephyr_h_filename_str = \
    "/* zephyr.h - microkernel master header file */\n\n"

zephyr_h_include_guard = "_ZEPHYR__H_"

zephyr_h_header_include_guard_str = \
    "#ifndef " + zephyr_h_include_guard + "\n" \
    "#define " + zephyr_h_include_guard + "\n\n"


def generate_zephyr_h_header():

    global zephyr_h_data
    zephyr_h_data += \
        zephyr_h_filename_str + \
        copyright + \
        do_not_edit_warning + \
        zephyr_h_header_include_guard_str + \
        "#include <microkernel.h>\n" + \
        "\n"


def generate_taskgroup_line(taskgroup, group_id):

    global zephyr_h_data
    zephyr_h_data += \
        "#define " + taskgroup + " 0x%8.8x\n" % group_id


def generate_zephyr_h_taskgroups():

    global zephyr_h_data

    for group in group_key_list:
        generate_taskgroup_line(group, group_dictionary[group])

    zephyr_h_data += "\n"


def generate_obj_id_line(name, obj_id):

    return "#define " + name + " 0x0001%4.4x\n" % obj_id


def generate_obj_id_lines(obj_types):

    data = ""
    for obj_type in obj_types:
        for obj in obj_type[0]:
            data += generate_obj_id_line(str(obj[0]), obj_type[1])
            obj_type[1] += 1
        if obj_type[1] > 0:
            data += "\n"

    return data


def generate_zephyr_h_obj_ids():

    global zephyr_h_data

    base_event = 4  # no need to generate ids for the 4 pre-defined events
    event_id = base_event
    for event in event_list:
        zephyr_h_data += "#define %s %u\n" % (str(event[0]), event_id)
        event_id += 1
    if event_id > base_event:
        zephyr_h_data += "\n"

    obj_types = [
        [task_list, 0],
        [mutex_list, 0],
        [sema_list, 0],
        [fifo_list, 0],
        [pipe_list, 0],
        [mbx_list, 0],
        [map_list, 0],
        [pool_list, 0],
    ]
    zephyr_h_data += generate_obj_id_lines(obj_types)


zephyr_h_footer_include_guard_str = \
    "\n#endif /* " + zephyr_h_include_guard + " */\n"


def generate_zephyr_h_footer():

    global zephyr_h_data
    zephyr_h_data += \
        zephyr_h_footer_include_guard_str


def zephyr_h_generate():
    """ Generate zephyr.h file """

    generate_zephyr_h_header()
    generate_zephyr_h_taskgroups()
    generate_zephyr_h_obj_ids()
    generate_zephyr_h_footer()

    write_file(output_dir + 'zephyr.h', zephyr_h_data)


#
# SYSTEM GENERATOR MAINLINE
#


mdef_parse()
get_output_dir()
kernel_main_c_generate()
kernel_main_h_generate()
kernel_struct_h_generate()
zephyr_h_generate()
