/*
 * 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
 */

// This include is relative to $CARAVEL_PATH (see Makefile)
#include <defs.h>
#include <stub.c>

/*
	IO Test:
		- Configures MPRJ lower 8-IO pins as outputs
		- Observes counter value through the MPRJ lower 8 IO pins (in the testbench)
*/

#define GPIO0_OE_ADDR ((uint32_t*)0x33031000)
#define GPIO0_OUTPUT_ADDR ((uint32_t*)0x33031004)
#define GPIO0_INPUT_ADDR ((uint32_t*)0x33031008)
#define GPIO1_OE_ADDR ((uint32_t*)0x33032000)
#define GPIO1_OUTPUT_ADDR ((uint32_t*)0x33032004)
#define GPIO1_INPUT_ADDR ((uint32_t*)0x33032008)

#define GPIO0_OE (*GPIO0_OE_ADDR)
#define GPIO0_OUTPUT (*GPIO0_OUTPUT_ADDR)
#define GPIO0_INPUT (*GPIO0_INPUT_ADDR)
#define GPIO1_OE (*GPIO1_OE_ADDR)
#define GPIO1_OUTPUT (*GPIO1_OUTPUT_ADDR)
#define GPIO1_INPUT (*GPIO1_INPUT_ADDR)

#define CORE0_CONFIG_ADDR ((uint32_t*)0x30800000)
#define CORE0_STATUS_ADDR ((uint32_t*)0x30800004)
#define CORE0_REG_PC_ADDR ((uint32_t*)0x30810000)
#define CORE0_REG_JUMP_ADDR ((uint32_t*)0x30810004)
#define CORE0_REG_STEP_ADDR ((uint32_t*)0x30810008)
#define CORE0_REG_INSTR_ADDR ((uint32_t*)0x30810010)
#define CORE0_REG_IREG_ADDR ((uint32_t*)0x30811000)
#define CORE0_SRAM_ADDR ((uint32_t*)0x30000000)

#define CORE1_CONFIG_ADDR ((uint32_t*)0x31800000)
#define CORE1_STATUS_ADDR ((uint32_t*)0x31800004)
#define CORE1_REG_PC_ADDR ((uint32_t*)0x31810000)
#define CORE1_REG_JUMP_ADDR ((uint32_t*)0x31810004)
#define CORE1_REG_STEP_ADDR ((uint32_t*)0x31810008)
#define CORE1_REG_INSTR_ADDR ((uint32_t*)0x31810010)
#define CORE1_REG_IREG_ADDR ((uint32_t*)0x31811000)
#define CORE1_SRAM_ADDR ((uint32_t*)0x31000000)

#define MPRJ_WB_ADDRESS (*(volatile uint32_t*)0x30000000)
#define MPRJ_WB_DATA_LOCATION 0x30008000

#define CORE_RUN 0x1
#define CORE_HALT 0x0
#define CORE_RUNNING_NOERROR 0x10

#define RV32I_NOP 0x00000013

void wbWrite (uint32_t* location, uint32_t value)
{
	// Write the address
	uint32_t locationData = (uint32_t)location;
	MPRJ_WB_ADDRESS = locationData & 0xFFFF8000;

	// Write the data
	uint32_t writeAddress = (locationData & 0x00007FFF) | MPRJ_WB_DATA_LOCATION;
	*((volatile uint32_t*)writeAddress) = value;
}

uint32_t wbRead (uint32_t* location)
{
	// Write the address
	uint32_t locationData = (uint32_t)location;
	MPRJ_WB_ADDRESS = locationData & 0xFFFF8000;

	// Write the data
	uint32_t writeAddress = (locationData & 0x00007FFF) | MPRJ_WB_DATA_LOCATION;
	return *((volatile uint32_t*)writeAddress);
}

void nextTest (bool testPassing)
{
	uint32_t testPassingOutput = testPassing ? 0x01000 : 0;
	wbWrite (GPIO0_OUTPUT_ADDR, testPassingOutput | 0x02000);
	wbWrite (GPIO0_OUTPUT_ADDR, testPassingOutput);
}

void main ()
{
	/*
	IO Control Registers
	| DM     | VTRIP | SLOW  | AN_POL | AN_SEL | AN_EN | MOD_SEL | INP_DIS | HOLDH | OEB_N | MGMT_EN |
	| 3-bits | 1-bit | 1-bit | 1-bit  | 1-bit  | 1-bit | 1-bit   | 1-bit   | 1-bit | 1-bit | 1-bit   |

	Output: 0000_0110_0000_1110  (0x1808) = GPIO_MODE_USER_STD_OUTPUT
	| DM     | VTRIP | SLOW  | AN_POL | AN_SEL | AN_EN | MOD_SEL | INP_DIS | HOLDH | OEB_N | MGMT_EN |
	| 110    | 0     | 0     | 0      | 0      | 0     | 0       | 1       | 0     | 0     | 0       |


	Input: 0000_0001_0000_1111 (0x0402) = GPIO_MODE_USER_STD_INPUT_NOPULL
	| DM     | VTRIP | SLOW  | AN_POL | AN_SEL | AN_EN | MOD_SEL | INP_DIS | HOLDH | OEB_N | MGMT_EN |
	| 001    | 0     | 0     | 0      | 0      | 0     | 0       | 0       | 0     | 1     | 0       |

	*/

	/* Set up the housekeeping SPI to be connected internally so	*/
	/* that external pin changes don't affect it.			*/

	// Connect the housekeeping SPI to the SPI master
	// so that the CSB line is not left floating.  This allows
	// all of the GPIO pins to be used for user functions.

	// https://github.com/efabless/caravel/blob/main/docs/other/gpio.txt

	// Enable the wishbone bus
	reg_wb_enable = 1;

	// Enable GPIO
	reg_mprj_io_12 = GPIO_MODE_USER_STD_OUTPUT;
	reg_mprj_io_13 = GPIO_MODE_USER_STD_OUTPUT;

	/* Apply configuration */
	reg_mprj_xfer = 1;
	while (reg_mprj_xfer == 1) {}

	// Setup test output
	bool testPass = true;
	wbWrite (GPIO0_OUTPUT_ADDR, 0x01000);
	wbWrite (GPIO0_OE_ADDR, ~0x03000);

	// Write nop to sram to allow step to be a valid instruction
	// This does assume that instructions can be read
	// Maybe test current instruction
	wbWrite (CORE0_SRAM_ADDR, RV32I_NOP);
	wbWrite (CORE1_SRAM_ADDR, RV32I_NOP);

	// Test core 0
	// Read that the config defaulted to 0
	if (wbRead (CORE0_CONFIG_ADDR) != CORE_HALT) testPass = false;
	nextTest (testPass);

	// Read that the program counter defaulted to 0x0000_0000
	if (wbRead (CORE0_REG_PC_ADDR) != 0x0) testPass = false;
	nextTest (testPass);

	// Step PC
	wbWrite (CORE0_REG_STEP_ADDR, 0x0);

	// Read that the PC stepped once
	if (wbRead (CORE0_REG_PC_ADDR) != 0x4) testPass = false;
	nextTest (testPass);

	// Check that an NOP was read
	if (wbRead (CORE0_REG_INSTR_ADDR) != RV32I_NOP) testPass = false;
	nextTest (testPass);

	// Jump PC
	wbWrite (CORE0_REG_JUMP_ADDR, 0x100);

	// Read that the PC jumped correctly
	if (wbRead (CORE0_REG_PC_ADDR) != 0x104) testPass = false;
	nextTest (testPass);

	// Let the core run
	wbWrite (CORE0_CONFIG_ADDR, CORE_RUN);

	// Check that the core is running
	if (wbRead (CORE0_STATUS_ADDR) != CORE_RUNNING_NOERROR) testPass = false;
	nextTest (testPass);

	// Check that the PC has increased
	if (wbRead (CORE0_REG_PC_ADDR) >= 0x100) testPass = false;
	nextTest (testPass);

	// Halt the core
	wbWrite (CORE0_CONFIG_ADDR, CORE_HALT);

	// Make sure the core halted
	if (wbRead (CORE0_CONFIG_ADDR) != CORE_HALT) testPass = false;

	// Test core 1
	// Read that the config defaulted to 0
	if (wbRead (CORE1_CONFIG_ADDR) != CORE_HALT) testPass = false;
	nextTest (testPass);

	// Read that the program counter defaulted to 0x0000_0000
	if (wbRead (CORE1_REG_PC_ADDR) != 0x0) testPass = false;
	nextTest (testPass);

	// Step PC
	wbWrite (CORE1_REG_STEP_ADDR, 0x0);

	// Read that the PC stepped once
	if (wbRead (CORE1_REG_PC_ADDR) != 0x4) testPass = false;
	nextTest (testPass);

	// Check that an NOP was read
	if (wbRead (CORE1_REG_INSTR_ADDR) != RV32I_NOP) testPass = false;
	nextTest (testPass);

	// Jump PC
	wbWrite (CORE1_REG_JUMP_ADDR, 0x100);

	// Read that the PC jumped correctly
	if (wbRead (CORE1_REG_PC_ADDR) != 0x104) testPass = false;
	nextTest (testPass);

	// Let the core run
	wbWrite (CORE1_CONFIG_ADDR, CORE_RUN);

	// Check that the core is running
	if (wbRead (CORE1_STATUS_ADDR) != CORE_RUNNING_NOERROR) testPass = false;
	nextTest (testPass);

	// Check that the PC has increased
	if (wbRead (CORE1_REG_PC_ADDR) >= 0x100) testPass = false;
	nextTest (testPass);

	// Halt the core
	wbWrite (CORE1_CONFIG_ADDR, CORE_HALT);

	// Make sure the core halted
	if (wbRead (CORE1_CONFIG_ADDR) != CORE_HALT) testPass = false;

	// Finish test
	nextTest (testPass);
}
