/*
 * SPDX-FileCopyrightText: 2020 Efabless Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * SPDX-License-Identifier: Apache-2.0
 */


#include "common_misc.h"
#include "common_bthread.h"
#include "../c_func/inc/int_reg_map.h"

#define SC_SIM_OUTPORT (0xf0000000)
#define uint32_t  long
#define uint16_t  int
#define size      10

  print_message(const char *fmt) {
      char ch;
     // Wait for Semaphore-lock=0
     while((reg_sema_lock0 & 0x1) == 0x0);
     while(ch = *(unsigned char *)fmt) {

        while((reg_uart0_status & 0x1) == 0x1);

	    reg_uart0_txdata = ch;
        ++fmt;
     }
     // Release Semaphore Lock
     reg_sema_lock0 = 0x1;

    // Added nop to Semaphore to acquire by other core
    asm ("nop");
    asm ("nop");
    asm ("nop");
    asm ("nop");


  }


 int main( int argc, char* argv[] )
 {
      char ch;

       // Common Sub-Routine 
       if ( bthread_get_core_id() == 0 ) {
         // Enable the GPIO UART I/F
         reg_glbl_multi_func = 0x100;

         // 1152000 Baud at 50Mhz System clock
         reg_uart0_baud_ctrl1 = 0x0;
         reg_uart0_baud_ctrl2 = 0x0;
         // Enable the UART TX/RX & STOP=2
         reg_uart0_ctrl = 0x7;

           // GLBL_CFG_MAIL_BOX used as mail box, each core update boot up handshake at 8 bit
           // bit[7:0]   - core-0
           // bit[15:8]  - core-1
           // bit[23:16] - core-2
           // bit[31:24] - core-3
           reg_glbl_mail_box = 0x1 << (bthread_get_core_id() * 8); // Start of Main 

       }
       // Core 0 thread
       if ( bthread_get_core_id() == 0 ) {
         print_message("UART command-0 from core-0\n");
         print_message("UART command-1 from core-0\n");
         print_message("UART command-2 from core-0\n");
         print_message("UART command-3 from core-0\n");

       }
       // Core 1 thread
       if ( bthread_get_core_id() == 1 ) {

         while((reg_glbl_mail_box & 0x1) == 0x0); // wait for test start
         print_message("UART command-0 from core-1\n");
         print_message("UART command-1 from core-1\n");
         print_message("UART command-2 from core-1\n");
         print_message("UART command-3 from core-1\n");

       }
       // Core 2 thread
       if ( bthread_get_core_id() == 2 ) {
         while((reg_glbl_mail_box & 0x1) == 0x0); // wait for test start
         print_message("UART command-0 from core-2\n");
         print_message("UART command-1 from core-2\n");
         print_message("UART command-2 from core-2\n");
         print_message("UART command-3 from core-2\n");

       }
       // Core 3 thread
       if ( bthread_get_core_id() == 3 ) {
         while((reg_glbl_mail_box & 0x1) == 0x0); // wait for test start
         print_message("UART command-0 from core-3\n");
         print_message("UART command-1 from core-3\n");
         print_message("UART command-2 from core-3\n");
         print_message("UART command-3 from core-3\n");

       }
      
       return 0;
 }


