From eb97c69c53eebb0a7f87e8f73ecc92dfabd0a9a4 Mon Sep 17 00:00:00 2001
From: dam1n19 <dam1n19@soton.ac.uk>
Date: Wed, 3 May 2023 15:21:26 +0100
Subject: [PATCH] SOC1-167: Added test list infrastructure and the ability to
 build testcodes in project repository

---
 .gitignore                                    |  5 +-
 software/common/demos/interrupt_demo.c        | 14 ++--
 .../common/validation/uart_driver_tests.c     | 16 ++---
 software/common/validation/uart_tests.c       | 36 +++++-----
 system/makefile                               | 67 +++++++++++++------
 system/testcodes/software_list.txt            | 20 ++++++
 6 files changed, 105 insertions(+), 53 deletions(-)
 create mode 100644 system/testcodes/software_list.txt

diff --git a/.gitignore b/.gitignore
index 74191db..8953030 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,4 +15,7 @@ system/testcodes/*/*.lst
 system/testcodes/*/*.o
 
 # Bootrom removal
-/system/src/bootrom/
\ No newline at end of file
+system/src/bootrom/
+
+# Simulation Removal (If running at Tech Level)
+sim
\ No newline at end of file
diff --git a/software/common/demos/interrupt_demo.c b/software/common/demos/interrupt_demo.c
index d0598c0..699d836 100644
--- a/software/common/demos/interrupt_demo.c
+++ b/software/common/demos/interrupt_demo.c
@@ -162,13 +162,13 @@ void UartExample(void)
 
   // Ensure Interrupt is not pending
 
-  NVIC_ClearPendingIRQ(UARTTX0_IRQn);
-  NVIC_ClearPendingIRQ(UARTRX1_IRQn);
+  NVIC_ClearPendingIRQ(EXP1_IRQn);   // NVIC_ClearPendingIRQ(UARTTX0_IRQn);
+  NVIC_ClearPendingIRQ(EXP2_IRQn);   // NVIC_ClearPendingIRQ(UARTRX1_IRQn);
 
   // Enable Interrupts
 
-  NVIC_EnableIRQ(UARTTX0_IRQn);
-  NVIC_EnableIRQ(UARTRX1_IRQn);
+  NVIC_EnableIRQ(EXP1_IRQn);   // NVIC_EnableIRQ(UARTTX0_IRQn);
+  NVIC_EnableIRQ(EXP2_IRQn);   // NVIC_EnableIRQ(UARTRX1_IRQn);
 
   /* Initialize UART in cross over configuration
    uint32_t CMSDK_uart_init(CMSDK_UART_TypeDef *CMSDK_UART,
@@ -206,10 +206,10 @@ void UartExample(void)
   printf ("Received message : %s\n", str_rx);
 
 
-  NVIC_DisableIRQ(UARTTX0_IRQn);   //disable both UART0 TX and UART1 RX IRQs
-  NVIC_DisableIRQ(UARTRX1_IRQn);
+  NVIC_DisableIRQ(EXP1_IRQn); // NVIC_DisableIRQ(UARTTX0_IRQn);   -disable both UART0 TX and UART1 RX IRQs
+  NVIC_DisableIRQ(EXP2_IRQn); // NVIC_DisableIRQ(UARTRX1_IRQn);
 
-  return;
+ -return;
 }
 
 // ----------------------------------------------------------
diff --git a/software/common/validation/uart_driver_tests.c b/software/common/validation/uart_driver_tests.c
index 544f45c..4f073b1 100644
--- a/software/common/validation/uart_driver_tests.c
+++ b/software/common/validation/uart_driver_tests.c
@@ -305,8 +305,8 @@ int Uart_IRQ(void){
   puts("\nStage 4 IRQ\n");
   puts("- Stage 4a Overrun IRQ\n");
 
-  NVIC_EnableIRQ(UARTOVF0_IRQn);         //enable both UART0 and UART1 overflow IRQs
-  NVIC_EnableIRQ(UARTOVF1_IRQn);
+  NVIC_EnableIRQ(EXPC_IRQn);         //enable both UART0 and UART1 overflow IRQs
+  NVIC_EnableIRQ(EXPD_IRQn);
 
   while(uart_txorirq_counter <= 3)       //repeat until 3 TX OR IRQs have occurred
   {
@@ -338,8 +338,8 @@ int Uart_IRQ(void){
     - when received flag has been set send the next character from transmit variable
     - repeat until all characters have been received*/
 
-  NVIC_EnableIRQ(UARTTX0_IRQn);   //enable both UART0 TX and UART1 RX IRQs
-  NVIC_EnableIRQ(UARTRX1_IRQn);
+  NVIC_EnableIRQ(EXP1_IRQn);   //enable both UART0 TX and UART1 RX IRQs
+  NVIC_EnableIRQ(EXP2_IRQn);
 
   while(j < 11)   /*while j, the received character counter, is less than 11, the number of characters to be sent*/
   { /* uart_data_received and uart_data_sent are updated by TX and RX handlers */
@@ -365,10 +365,10 @@ int Uart_IRQ(void){
     puts("** TEST FAILED ** Strings Do Not Match!");
   }
 
-  NVIC_DisableIRQ(UARTOVF0_IRQn);
-  NVIC_DisableIRQ(UARTOVF1_IRQn);       //disable all the enabled IRQs
-  NVIC_DisableIRQ(UARTTX0_IRQn);
-  NVIC_DisableIRQ(UARTRX1_IRQn);
+  NVIC_DisableIRQ(EXPC_IRQn);
+  NVIC_DisableIRQ(EXPD_IRQn);       //disable all the enabled IRQs
+  NVIC_DisableIRQ(EXP1_IRQn);
+  NVIC_DisableIRQ(EXP2_IRQn);
 
   if(!err_code) return 0;
   else return 8;
diff --git a/software/common/validation/uart_tests.c b/software/common/validation/uart_tests.c
index cf3b331..551276d 100644
--- a/software/common/validation/uart_tests.c
+++ b/software/common/validation/uart_tests.c
@@ -596,14 +596,14 @@ int uart_tx_rx_irq_test(CMSDK_UART_TypeDef *CMSDK_UART)
     uart1_irq_expected=0;
     uart0_irq_occurred=0;
     uart1_irq_occurred=0;
-    NVIC_EnableIRQ(UARTTX0_IRQn);
+    NVIC_EnableIRQ(EXP1_IRQn);
     }
   if (CMSDK_UART==CMSDK_UART1){
     uart0_irq_expected=0;
     uart1_irq_expected=1;
     uart0_irq_occurred=0;
     uart1_irq_occurred=0;
-    NVIC_EnableIRQ(UARTTX1_IRQn);
+    NVIC_EnableIRQ(EXP3_IRQn);
     }
 
   TX_UART->CTRL = UART_CTRL_TXEN | UART_CTRL_TXIRQEN;
@@ -640,14 +640,14 @@ int uart_tx_rx_irq_test(CMSDK_UART_TypeDef *CMSDK_UART)
     uart1_irq_expected=0;
     uart0_irq_occurred=0;
     uart1_irq_occurred=0;
-    NVIC_EnableIRQ(UARTTX0_IRQn);
+    NVIC_EnableIRQ(EXP1_IRQn);
     }
   if (CMSDK_UART==CMSDK_UART1){
     uart0_irq_expected=0;
     uart1_irq_expected=0;
     uart0_irq_occurred=0;
     uart1_irq_occurred=0;
-    NVIC_EnableIRQ(UARTTX1_IRQn);
+    NVIC_EnableIRQ(EXP3_IRQn);
     }
 
   TX_UART->CTRL = UART_CTRL_TXEN;  /* No interrupt generation */
@@ -679,14 +679,14 @@ int uart_tx_rx_irq_test(CMSDK_UART_TypeDef *CMSDK_UART)
     uart1_irq_expected=1;
     uart0_irq_occurred=0;
     uart1_irq_occurred=0;
-    NVIC_EnableIRQ(UARTRX1_IRQn);
+    NVIC_EnableIRQ(EXP3_IRQn);
     }
   if (CMSDK_UART==CMSDK_UART1){
     uart0_irq_expected=1;
     uart1_irq_expected=0;
     uart0_irq_occurred=0;
     uart1_irq_occurred=0;
-    NVIC_EnableIRQ(UARTRX0_IRQn);
+    NVIC_EnableIRQ(EXP0_IRQn);
     }
 
   TX_UART->CTRL = UART_CTRL_TXEN ;  /* No interrupt generation */
@@ -748,10 +748,10 @@ int uart_tx_rx_irq_test(CMSDK_UART_TypeDef *CMSDK_UART)
   while ((RX_UART->STATE & UART_STATE_RXFULL)!=0) {
     ctmp=RX_UART->DATA;
     }
-  NVIC_DisableIRQ(UARTRX0_IRQn);
-  NVIC_DisableIRQ(UARTRX1_IRQn);
-  NVIC_DisableIRQ(UARTTX0_IRQn);
-  NVIC_DisableIRQ(UARTTX1_IRQn);
+  NVIC_DisableIRQ(EXP0_IRQn);
+  NVIC_DisableIRQ(EXP3_IRQn);
+  NVIC_DisableIRQ(EXP1_IRQn);
+  NVIC_DisableIRQ(EXP3_IRQn);
 
   if (err_code != 0) {
     printf ("ERROR : uart interrupt enable failed (0x%x)\n", err_code);
@@ -848,14 +848,14 @@ int uart_tx_rx_overflow_test(CMSDK_UART_TypeDef *CMSDK_UART)
     uart1_irq_expected=0;
     uart0_irq_occurred=0;
     uart1_irq_occurred=0;
-    NVIC_EnableIRQ(UARTOVF0_IRQn);
+    NVIC_EnableIRQ(EXPC_IRQn);
     }
   if (CMSDK_UART==CMSDK_UART1){
     uart0_irq_expected=0;
     uart1_irq_expected=1;
     uart0_irq_occurred=0;
     uart1_irq_occurred=0;
-    NVIC_EnableIRQ(UARTOVF1_IRQn);
+    NVIC_EnableIRQ(EXPD_IRQn);
     }
 
   __DSB();
@@ -871,8 +871,8 @@ int uart_tx_rx_overflow_test(CMSDK_UART_TypeDef *CMSDK_UART)
   TX_UART->CTRL = UART_CTRL_TXEN ;  /* No interrupt generation */
   RX_UART->CTRL = UART_CTRL_RXEN ;  /* No interrupt generation */
 
-  NVIC_DisableIRQ(UARTOVF0_IRQn);
-  NVIC_DisableIRQ(UARTOVF1_IRQn);
+  NVIC_DisableIRQ(EXPC_IRQn);
+  NVIC_DisableIRQ(EXPD_IRQn);
   uart0_irq_expected = 0;
   uart1_irq_expected = 0;
 
@@ -900,14 +900,14 @@ int uart_tx_rx_overflow_test(CMSDK_UART_TypeDef *CMSDK_UART)
     uart1_irq_expected=1;
     uart0_irq_occurred=0;
     uart1_irq_occurred=0;
-    NVIC_EnableIRQ(UARTOVF1_IRQn);
+    NVIC_EnableIRQ(EXPD_IRQn);
     }
   if (CMSDK_UART==CMSDK_UART1){
     uart0_irq_expected=1;
     uart1_irq_expected=0;
     uart0_irq_occurred=0;
     uart1_irq_occurred=0;
-    NVIC_EnableIRQ(UARTOVF0_IRQn);
+    NVIC_EnableIRQ(EXPC_IRQn);
     }
 
   __DSB();
@@ -933,8 +933,8 @@ int uart_tx_rx_overflow_test(CMSDK_UART_TypeDef *CMSDK_UART)
     ctmp=RX_UART->DATA;
     }
 
-  NVIC_DisableIRQ(UARTOVF0_IRQn);
-  NVIC_DisableIRQ(UARTOVF1_IRQn);
+  NVIC_DisableIRQ(EXPC_IRQn);
+  NVIC_DisableIRQ(EXPD_IRQn);
 
   if (err_code != 0) {
     printf ("ERROR : uart overflow test failed (0x%x)\n", err_code);
diff --git a/system/makefile b/system/makefile
index 28313d8..636a0e6 100644
--- a/system/makefile
+++ b/system/makefile
@@ -47,17 +47,17 @@ TESTCODES_DIR    := $(NANOSOC_SYSTEM_DIR)/testcodes
 
 # Project System Directory
 PROJ_SYS_DIR     := $(PROJECT_DIR)/system
+PROJ_SW_DIR      ?= $(PROJ_SYS_DIR)/cpu_software
 
 # Name of test directory (e.g. hello, dhry)
 # TESTNAME must be specified on the make command line
 TESTNAME    =
 
 # List of all tests (this is used when running 'make all/clean')
-TEST_LIST   = hello dhry sleep_demo interrupt_demo dualtimer_demo \
- self_reset_demo watchdog_demo rtx_demo gpio_tests timer_tests \
- uart_tests debug_tests default_slaves_tests dma_tests \
- gpio_driver_tests uart_driver_tests timer_driver_tests apb_mux_tests \
- memory_tests romtable_tests
+TEST_LIST_FILE ?= $(TESTCODES_DIR)/software_list.txt
+TEST_LIST_FILE += $(PROJ_SW_DIR)/software_list.txt
+
+TEST_LIST = $(shell cat $(TEST_LIST_FILE) | while read line || [ -n "$$line" ]; do echo $$line; done)
 
 # Default to DS-5 tool-chain
 TOOL_CHAIN = ds5
@@ -78,7 +78,7 @@ ADP_OPTIONS := -define ADP_FILE=\"$(ADP_PATH)\"
 BOOTLOADER        ?= bootloader
 BOOTROM_ADDRW     ?= 8
 BOOTROM_HEX       ?= $(NANOSOC_TECH_DIR)/system/testcodes/bootloader/$(BOOTLOADER).hex
-BOOTROM_BUILD_DIR ?= $(PROJ_SYS_DIR)/bootrom
+BOOTROM_BUILD_DIR ?= $(NANOSOC_TECH_DIR)/system/src/bootrom
 
 
 NANSOC_EXPANSION_REGION ?= yes
@@ -98,13 +98,9 @@ TBENCH_VC   ?= -f $(PROJECT_DIR)/flist/project/system.flist
 SIMULATOR   = xm
 
 # Directory to put simulation files
-SIM_DIR ?= 
-
+SIM_TOP_DIR ?= $(PROJECT_DIR)/simulate/sim
 
-ifeq ($(SIM_DIR),)
-# Defaultly put simulation files in simulation directory with c code testname
-SIM_DIR = $(PROJECT_DIR)/simulate/sim/$(TESTNAME)
-endif
+SIM_DIR = $(SIM_TOP_DIR)/$(TESTNAME)
 
 # MTI option
 #DF#MTI_OPTIONS    = -novopt
@@ -297,9 +293,8 @@ bootrom:
 	mkdir -p $(BOOTROM_BUILD_DIR)/verilog/ ;\
 	mkdir -p $(BOOTROM_BUILD_DIR)/bintxt/ ;\
 	python3 bootrom_gen.py -a $(BOOTROM_ADDRW) -i $(BOOTLOADER).hex -v $(BOOTROM_BUILD_DIR)/verilog/bootrom.v -b $(BOOTROM_BUILD_DIR)/bintxt/bootrom.bintxt )
-ifneq ($(PROJECT_DIR),)
-	cp $(BOOTROM_HEX)  $(SIM_DIR)/$(BOOTLOADER).hex
-endif
+	mkdir -p $(SIM_DIR)/bootloader
+	cp $(BOOTROM_HEX)  $(SIM_DIR)/bootloader/$(BOOTLOADER).hex
 
 # Compile test code
 # Note : The use of ls after compile allows the computing server to sync up
@@ -314,6 +309,31 @@ endif
 	  ls > /dev/null ;\
 	  echo Copy $(TESTNAME).hex ;\
 	  if [ -e  $(TESTNAME).hex ] ; then \
+	    mkdir -p $(SIM_DIR) ; \
+	    cp $(TESTNAME).hex $(SIM_DIR)/image.hex ; \
+	  else \
+	    while [ ! -e $(TESTNAME).hex ] ; do \
+	      echo Wait for $(TESTNAME).hex file ...; \
+	      ls > /dev/null ; \
+	      sleep 5 ; \
+	    done; \
+	    if [ -e  $(TESTNAME).hex ] ; then \
+		  mkdir -p $(SIM_DIR) ; \
+	      cp $(TESTNAME).hex $(SIM_DIR)/image.hex ; \
+	    else \
+	      echo Problem reading hex file ;\
+	      exit 1; \
+	    fi ;\
+	  fi ;\
+	  cd $(SIM_DIR) ;\
+	elif [ -d "$(PROJ_SW_DIR)/$(TESTNAME)" ] ; then \
+	  cd $(PROJ_SW_DIR)/$(TESTNAME) ;\
+	  make all $(SW_MAKE_OPTIONS) ; \
+	  echo Compile done ;\
+	  ls > /dev/null ;\
+	  echo Copy $(TESTNAME).hex ;\
+	  if [ -e  $(TESTNAME).hex ] ; then \
+	    mkdir -p $(SIM_DIR) ; \
 	    cp $(TESTNAME).hex $(SIM_DIR)/image.hex ; \
 	  else \
 	    while [ ! -e $(TESTNAME).hex ] ; do \
@@ -322,6 +342,7 @@ endif
 	      sleep 5 ; \
 	    done; \
 	    if [ -e  $(TESTNAME).hex ] ; then \
+		  mkdir -p $(SIM_DIR) ; \
 	      cp $(TESTNAME).hex $(SIM_DIR)/image.hex ; \
 	    else \
 	      echo Problem reading hex file ;\
@@ -353,11 +374,13 @@ debugtester:
 	    sleep 5 ; \
 	  done; \
 	  if [ -e  $(DEBUGTESTER)_le.hex ] ; then \
+	  	mkdir -p $(SIM_DIR) ;\
 	    cp $(DEBUGTESTER)_le.hex  $(SIM_DIR)/$(DEBUGTESTER)_le.hex ;\
 	  fi ;\
 	fi ;\
 	echo Copy $(DEBUGTESTER)_be.hex ;\
 	if [ -e  $(DEBUGTESTER)_be.hex ] ; then \
+	  	mkdir -p $(SIM_DIR) ;\
 	  cp $(DEBUGTESTER)_be.hex  $(SIM_DIR)/$(DEBUGTESTER)_be.hex ;\
 	else \
 	  while [ ! -e $(DEBUGTESTER)_be.hex ] ; do \
@@ -382,7 +405,7 @@ compile_all_code: bootrom debugtester
 	  echo Removing old image.hex ;\
 	  rm -f image.hex  ;\
 	  make testcode TESTNAME=$$thistest;\
-	  if [ -e image.hex ] ; then \
+	  if [ -e $(SIM_DIR)/$$thistest/image.hex ] ; then \
             echo OK    - image.hex     created for test $$thistest ;\
 	  else \
 	    echo ERROR - image.hex NOT created for test $$thistest ;\
@@ -414,10 +437,15 @@ v2html:
 clean_all_code:
 	@(cd $(NANOSOC_SW_DIR)/debug_tester ; make clean; )
 	@(cd $(TESTCODES_DIR)/$(BOOTLOADER) ; make clean; )
-	for thistest in $(TEST_LIST) ; do \
+	@for thistest in $(TEST_LIST) ; do \
 	  echo Cleaning $$thistest ...  ; \
-	  cd $(TESTCODES_DIR)/$$thistest ; \
-	  make clean; \
+	  if [ -e $(TESTCODES_DIR)/$$thistest ]; then \
+	  	cd $(TESTCODES_DIR)/$$thistest ; \
+	  	make clean; \
+	  elif [ -e $(PROJ_SW_DIR)/$$thistest ]; then \
+	  	cd $(PROJ_SW_DIR)/$$thistest ; \
+	  	make clean; \
+	  fi \
 	done
 	@rm -rf $(BOOTROM_BUILD_DIR)
 
@@ -434,6 +462,7 @@ verify:
 
 # Remove RTL compile files, log files, software compile files
 clean : clean_all_code
+	@rm -rf $(SIM_DIR)
 	@if [ -d work ] ; then \
 	  rm -rf work ; \
 	fi
diff --git a/system/testcodes/software_list.txt b/system/testcodes/software_list.txt
new file mode 100644
index 0000000..412e3c5
--- /dev/null
+++ b/system/testcodes/software_list.txt
@@ -0,0 +1,20 @@
+hello
+dhry
+sleep_demo
+dualtimer_demo
+self_reset_demo
+watchdog_demo
+rtx_demo
+gpio_tests
+timer_tests
+debug_tests
+default_slaves_tests
+dma_tests
+gpio_driver_tests
+timer_driver_tests
+apb_mux_tests
+memory_tests
+romtable_tests
+interrupt_demo
+uart_tests
+uart_driver_tests
-- 
GitLab