/*
 * Copyright (c) 2017-2018 Oticon A/S
 *
 * SPDX-License-Identifier: Apache-2.0
 */
#include "soc.h"
#include "posix_soc.h"
#include "NRF_HW_model_top.h"
#include "NRF_HWLowL.h"
#include "bs_tracing.h"
#include "bs_symbols.h"
#include "bs_types.h"
#include "bs_utils.h"
#include "bs_rand_main.h"
#include "bs_pc_backchannel.h"
#include "bs_dump_files.h"
#include "time_machine.h"
#include "argparse.h"
#include "bstests.h"
#include <stdlib.h>

uint8_t inner_main_clean_up(int exit_code)
{
	static int max_exit_code;

	max_exit_code = BS_MAX(exit_code, max_exit_code);

	/*
	 * posix_soc_clean_up may not return if this is called from a SW thread,
	 * but instead it would get posix_exit() recalled again
	 * ASAP from the HW thread
	 */
	posix_soc_clean_up();

	hwll_terminate_simulation();
	nrf_hw_models_free_all();
	bs_dump_files_close_all();

	bs_clean_back_channels();

	uint8_t bst_result = bst_delete();

	if (bst_result != 0U) {
		bs_trace_raw_time(2, "main: The TESTCASE FAILED with return "
				  "code %u\n", bst_result);
	}
	return BS_MAX(bst_result, max_exit_code);
}

uint8_t main_clean_up_trace_wrap(void)
{
	return inner_main_clean_up(0);
}

void posix_exit(int exit_code)
{
	exit(inner_main_clean_up(exit_code));
}

uint global_device_nbr;

int main(int argc, char *argv[])
{
	/*
	 * Let's ensure that even if we are redirecting to a file, we get stdout
	 * and stderr line buffered (default for console)
	 * Note that glibc ignores size. But just in case we set a reasonable
	 * number in case somebody tries to compile against a different library
	 */
	setvbuf(stdout, NULL, _IOLBF, 512);
	setvbuf(stderr, NULL, _IOLBF, 512);

	bs_trace_register_cleanup_function(main_clean_up_trace_wrap);
	bs_trace_register_time_function(tm_get_abs_time);

	nrf_hw_pre_init();
	run_native_tasks(_NATIVE_PRE_BOOT_1_LEVEL);

	struct NRF_bsim_args_t *args;

	args = nrfbsim_argsparse(argc, argv);
	global_device_nbr = args->global_device_nbr;

	bs_read_function_names_from_Tsymbols(argv[0]);

	run_native_tasks(_NATIVE_PRE_BOOT_2_LEVEL);

	bs_trace_raw(9, "%s: Connecting to phy...\n", __func__);
	hwll_connect_to_phy(args->device_nbr, args->s_id, args->p_id);
	bs_trace_raw(9, "%s: Connected\n", __func__);

	bs_random_init(args->rseed);
	bs_dump_files_open(args->s_id, args->global_device_nbr);

	/* We pass to a possible testcase its command line arguments */
	bst_pass_args(args->test_case_argc, args->test_case_argv);

	nrf_hw_initialize(&args->nrf_hw);

	run_native_tasks(_NATIVE_PRE_BOOT_3_LEVEL);

	bst_pre_init();

	posix_boot_cpu();

	run_native_tasks(_NATIVE_FIRST_SLEEP_LEVEL);

	bst_post_init();

	tm_run_forever();

	/* This code is unreachable */
	bs_trace_exit_line("\n");
	return 0;
}
