331 lines
10 KiB
C
331 lines
10 KiB
C
|
/****************************************************************************
|
||
|
|
||
|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
||
|
|
||
|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
||
|
be copied by any method or incorporated into another program without
|
||
|
the express written consent of Aerospace C.Power. This Information or any portion
|
||
|
thereof remains the property of Aerospace C.Power. The Information contained herein
|
||
|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
||
|
liability for its use in any way and conveys no license or title under
|
||
|
any patent or copyright and makes no representation or warranty that this
|
||
|
Information is free from patent or copyright infringement.
|
||
|
|
||
|
****************************************************************************/
|
||
|
/* os shim includes */
|
||
|
#include "os_types.h"
|
||
|
#include "os_utils.h"
|
||
|
#include "os_mem.h"
|
||
|
#include "iot_diag.h"
|
||
|
#include "iot_io.h"
|
||
|
#include "dbg_io.h"
|
||
|
#include "hw_reg_api.h"
|
||
|
#include "ahb.h"
|
||
|
#include "iot_uart_api.h"
|
||
|
|
||
|
#include "iot_matrix_api.h"
|
||
|
#include "chol_hw.h"
|
||
|
#include "input.h"
|
||
|
|
||
|
/****************************************************************************/
|
||
|
// test case config
|
||
|
#define INVERSE (1 << 0)
|
||
|
#define DETERMINANT (1 << 1)
|
||
|
#define INVERSE_DETERMINANT (1 << 2)
|
||
|
#define CHOLESKY (1 << 3)
|
||
|
#define OP_TYPE_ALL (INVERSE | DETERMINANT | INVERSE_DETERMINANT | CHOLESKY)
|
||
|
#define TEST_CASE_CHOL (OP_TYPE_ALL)
|
||
|
|
||
|
#define EIGENVALUE_VECTOR (1 << 0)
|
||
|
#define TEST_CASE_EIG (EIGENVALUE_VECTOR)
|
||
|
|
||
|
#define MTX_MUL_AB (1 << 0)
|
||
|
#define MTX_MUL_ABC (1 << 1)
|
||
|
#define MTX_MUL_ABCD (1 << 2)
|
||
|
#define MTX_MUL_TEST (1 << 3)
|
||
|
#define MTX_MUL_DIAG (1 << 4)
|
||
|
#define TEST_CMM_ALL (MTX_MUL_AB | MTX_MUL_ABC \
|
||
|
| MTX_MUL_ABCD | MTX_MUL_TEST | MTX_MUL_DIAG)
|
||
|
#define TEST_CASE_CMM (TEST_CMM_ALL)
|
||
|
|
||
|
/****************************************************************************/
|
||
|
// test data
|
||
|
typedef struct _mtx_format_t {
|
||
|
float real;
|
||
|
float imag;
|
||
|
} mtx_format_t;
|
||
|
|
||
|
mtx_format_t test_m_4x4[16] = {
|
||
|
{2.0, 0}, {0, 0}, {0, 0}, {0, 0},
|
||
|
{0, 0}, {2.0, 0}, {0, 0}, {0, 0},
|
||
|
{0, 0}, {0, 0}, {2.0, 0}, {0, 0},
|
||
|
{0, 0}, {0, 0}, {0, 0}, {2.0, 0},
|
||
|
};
|
||
|
|
||
|
mtx_format_t test_m_6x6[36] = {
|
||
|
{2.0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
|
||
|
{0, 0}, {2.0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},
|
||
|
{0, 0}, {0, 0}, {2.0, 0}, {0, 0}, {0, 0}, {0, 0},
|
||
|
{0, 0}, {0, 0}, {0, 0}, {2.0, 0}, {0, 0}, {0, 0},
|
||
|
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {2.0, 0}, {0, 0},
|
||
|
{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {2.0, 0},
|
||
|
};
|
||
|
|
||
|
mtx_format_t test_m_b_4x4[16] = {
|
||
|
{3.0, 0}, {0, 0}, {0, 0}, {0, 0},
|
||
|
{0, 0}, {3.0, 0}, {0, 0}, {0, 0},
|
||
|
{0, 0}, {0, 0}, {3.0, 0}, {0, 0},
|
||
|
{1, 0}, {1, 0}, {1, 0}, {3.0, 0},
|
||
|
};
|
||
|
|
||
|
mtx_format_t test_adiag_5x5[16] = {
|
||
|
{2.0, 213.123}, {2, 0.21379}, {3, 123.67777}, {4, -110}, {5, 0.000213},
|
||
|
};
|
||
|
|
||
|
mtx_format_t test_bdiag_5x5[16] = {
|
||
|
{100, 2384.1037}, {-213, -0.12}, {0.213, 1203.12}, {-324, 0.123}, {0.0000345, 1},
|
||
|
};
|
||
|
|
||
|
mtx_format_t test_det_4x4[16] = {
|
||
|
{0.000073359617,0.000000000000},{0.000072876348,0.000000000000},
|
||
|
{0.000049108014,0.000000000000},{0.000033062126,0.000000000000},
|
||
|
{0.000072876348,0.000000000000},{0.000006834176,0.000000000000},
|
||
|
{0.000025137975,0.000000000000},{0.000003169524,0.000000000000},
|
||
|
{0.000049108014,0.000000000000},{0.000025137975,0.000000000000},
|
||
|
{0.000004611953,0.000000000000},{-0.000008321789,0.000000000000},
|
||
|
{0.000033062126,0.000000000000},{0.000003169524,0.000000000000},
|
||
|
{-0.000008321789,0.000000000000},{-0.000014774589,0.000000000000},
|
||
|
};
|
||
|
|
||
|
mtx_format_t eigen_src_4x4[16] = {
|
||
|
{0.000013537996,0.000000000000},{0.000021811342,0.000007851141},
|
||
|
{0.000015675963,-0.000000539224},{0.000019629195,0.000001672964},
|
||
|
{0.000021811342,-0.000007851141},{0.000030159135,0.000000000000},
|
||
|
{0.000023983768,-0.000008469722},{0.000029418617,-0.000006122700},
|
||
|
{0.000015675963,0.000000539224},{0.000023983768,0.000008469722},
|
||
|
{0.000018281047,0.000000000000},{0.000022573047,0.000002196881},
|
||
|
{0.000019629195,-0.000001672964},{0.000029418617,0.000006122700},
|
||
|
{0.000022573047,-0.000002196881},{0.000027791539,0.000000000000},
|
||
|
};
|
||
|
|
||
|
uint32_t test_det_hex_4x4[32] = {
|
||
|
0x3899d8a5,0x00000000,
|
||
|
0x3898d531,0x00000000,
|
||
|
0x384df954,0x00000000,
|
||
|
0x380aac30,0x00000000,
|
||
|
0x3898d531,0x00000000,
|
||
|
0x36e55120,0x00000000,
|
||
|
0x37d2df64,0x00000000,
|
||
|
0x3654b402,0x00000000,
|
||
|
0x384df954,0x00000000,
|
||
|
0x37d2df64,0x00000000,
|
||
|
0x369ac060,0x00000000,
|
||
|
0xb70b9dd0,0x00000000,
|
||
|
0x380aac30,0x00000000,
|
||
|
0x3654b402,0x00000000,
|
||
|
0xb70b9dd0,0x00000000,
|
||
|
0xb777e060,0x00000000
|
||
|
};
|
||
|
|
||
|
float src[8]={0.012300251983, 0.000000000000, 0.017685770988, 0.000000000000,
|
||
|
0.030364101753, 0.000000000000, 0.023820413277, 0.000000000000};
|
||
|
float src1[8]={0.012300251983, 0.000000000000, 0.017685770988, 0.000000000000,
|
||
|
0.030364101753, 0.000000000000, 0.023820413277, 0.000000000000};
|
||
|
|
||
|
mtx_format_t test_det_tran_4x4[16] = {0};
|
||
|
|
||
|
mtx_format_t result[100] = {0};
|
||
|
mtx_format_t g_det[100] = {0};
|
||
|
mtx_format_t g_norm[100] = {0};
|
||
|
mtx_format_t g_eigval[100] = {0};
|
||
|
|
||
|
static void output_clear()
|
||
|
{
|
||
|
for(uint32_t i = 0; i < 100; i++) {
|
||
|
result[i].imag = 0;
|
||
|
result[i].real = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void dump_output()
|
||
|
{
|
||
|
for(uint32_t i = 0; i < 100; i++) {
|
||
|
iot_printf("(%04f, %04f) ", result[i].real, result[i].imag);
|
||
|
if (i%4 == 3) {
|
||
|
iot_printf("\n");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void chol_test()
|
||
|
{
|
||
|
// test case : input a simple 4x4 matrix - test_m_4x4, and repeat count is 1
|
||
|
// test inverse, determinant and cholesky
|
||
|
iot_printf("[chol test]\n");
|
||
|
uint32_t i = 0;
|
||
|
iot_printf("test matrix data:\n");
|
||
|
for(i = 0; i < 16; i++) {
|
||
|
iot_printf("(%04f, %04f) ", test_m_4x4[i].real, test_m_4x4[i].imag);
|
||
|
if (i%4 == 3) {
|
||
|
iot_printf("\n");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#if (TEST_CASE_CHOL & INVERSE)
|
||
|
output_clear();
|
||
|
iot_math_mtx_inverse((float *)result, (float*)test_m_4x4, CHOL_SIZE_4X4, 1);
|
||
|
iot_printf("INVERSE case output 4x4 matrix\n");
|
||
|
dump_output();
|
||
|
#endif
|
||
|
|
||
|
#if (TEST_CASE_CHOL & DETERMINANT)
|
||
|
output_clear();
|
||
|
iot_math_mtx_det((float *)result, (float*)test_m_4x4, CHOL_SIZE_4X4, 1);
|
||
|
iot_printf("DETERMINANT case ouput 1 word data:\n");
|
||
|
dump_output();
|
||
|
#endif
|
||
|
|
||
|
#if (TEST_CASE_CHOL & INVERSE_DETERMINANT)
|
||
|
output_clear();
|
||
|
iot_math_mtx_inv_det((float *)result, (float *)g_det,
|
||
|
(float*)test_m_4x4, CHOL_SIZE_4X4, 1);
|
||
|
iot_printf("INVERSE_DETERMINANT case output 4x4 matrix:\n");
|
||
|
dump_output();
|
||
|
#endif
|
||
|
|
||
|
#if (TEST_CASE_CHOL & CHOLESKY)
|
||
|
output_clear();
|
||
|
iot_math_mtx_cholesky((float *)result, (float*)test_m_4x4, CHOL_SIZE_4X4, 1);
|
||
|
iot_printf("CHOLESKY case output 4x4 matrix:\n");
|
||
|
dump_output();
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void eig_test()
|
||
|
{
|
||
|
// test case : input a 4x4 matrix - test_m_4x4, and repeat count is 1
|
||
|
// test eigenvalue of maximum and eigenvector
|
||
|
iot_printf("[eigen test]\n");
|
||
|
uint32_t i = 0;
|
||
|
iot_printf("test matrix data:\n");
|
||
|
for(i = 0; i < 16; i++) {
|
||
|
iot_printf("(%04f, %04f) ", test_m_4x4[i].real, test_m_4x4[i].imag);
|
||
|
if (i%4 == 3) {
|
||
|
iot_printf("\n");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#if (TEST_CASE_EIG & EIGENVALUE_VECTOR)
|
||
|
output_clear();
|
||
|
iot_math_mtx_eig((float *)result, (float *)g_norm, (float *)g_eigval,
|
||
|
(float*)test_m_4x4, CHOL_SIZE_4X4, 1);
|
||
|
iot_printf("EIGENVALUE_VECTOR case ouput 4x1 vector norm^2 and value:\n");
|
||
|
dump_output();
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void cmm_test()
|
||
|
{
|
||
|
#if 1
|
||
|
// test case : input a 4x4 matrix - test_m_4x4, and repeat count is 1
|
||
|
// test matrix multiplication
|
||
|
iot_printf("[matrix mul test]\n");
|
||
|
uint32_t i = 0;
|
||
|
iot_printf("test matrix A data:\n");
|
||
|
for(i = 0; i < 16; i++) {
|
||
|
iot_printf("(%04f, %04f) ", test_m_4x4[i].real, test_m_4x4[i].imag);
|
||
|
if (i%4 == 3) {
|
||
|
iot_printf("\n");
|
||
|
}
|
||
|
}
|
||
|
iot_printf("test matrix B data:\n");
|
||
|
for(i = 0; i < 16; i++) {
|
||
|
iot_printf("(%04f, %04f) ", test_m_b_4x4[i].real, test_m_b_4x4[i].imag);
|
||
|
if (i%4 == 3) {
|
||
|
iot_printf("\n");
|
||
|
}
|
||
|
}
|
||
|
#if (TEST_CASE_CMM & MTX_MUL_AB)
|
||
|
iot_math_cmm_cfg((float *) test_m_4x4, 4, 4, 0,
|
||
|
(float *)test_m_b_4x4, 4, 4, 0);
|
||
|
// AxB
|
||
|
output_clear();
|
||
|
iot_math_cmm_ab((float *)result, CMM_CONV_A, CMM_CONV_B, 1);
|
||
|
iot_printf("EIGENVALUE_VECTOR AxB case 4x4 matrix:\n");
|
||
|
dump_output();
|
||
|
|
||
|
output_clear();
|
||
|
iot_math_cmm_ab((float *)result, CMM_CONV_A, CMM_CONV_B_TRAN, 1);
|
||
|
iot_printf("EIGENVALUE_VECTOR AxB' case 4x4 matrix:\n");
|
||
|
dump_output();
|
||
|
#endif
|
||
|
|
||
|
#if (TEST_CASE_CMM& MTX_MUL_ABC)
|
||
|
output_clear();
|
||
|
|
||
|
iot_math_cmm_cfg((float *) test_m_4x4, 4, 4, 0,
|
||
|
(float *)test_m_b_4x4, 4, 4, 0);
|
||
|
// AxBxA
|
||
|
iot_math_cmm_abc((float *)result,
|
||
|
CMM_CONV_A, CMM_CONV_B, CMM_CONV_C, CMM_CONV_A, 1);
|
||
|
|
||
|
iot_printf("EIGENVALUE_VECTOR AxBxA case 4x4 matrix:\n");
|
||
|
dump_output();
|
||
|
#endif
|
||
|
|
||
|
#if (TEST_CASE_CMM& MTX_MUL_ABCD)
|
||
|
output_clear();
|
||
|
|
||
|
iot_math_cmm_cfg((float *) test_m_4x4, 4, 4, 0,
|
||
|
(float *)test_m_b_4x4, 4, 4, 0);
|
||
|
// (AxB)xA.'xB.'
|
||
|
//iot_math_cmm_ab((float *)result, CMM_CONV_A, CMM_CONV_B, 1);
|
||
|
iot_math_cmm_abc((float *)result,
|
||
|
CMM_CONV_A, CMM_CONV_B, CMM_CONV_C, CMM_CONV_C_CONJ_TRAN, 1);
|
||
|
|
||
|
iot_printf("EIGENVALUE_VECTOR AxBxA.'xB.' case 4x4 matrix:\n");
|
||
|
dump_output();
|
||
|
#endif
|
||
|
|
||
|
#if (TEST_CASE_CMM & MTX_MUL_TEST)
|
||
|
iot_math_cmm_cfg((float *) src, 4, 1, 0,
|
||
|
(float *)src1, 1, 4, 0);
|
||
|
// AxB
|
||
|
output_clear();
|
||
|
iot_math_cmm_ab((float *)result, CMM_CONV_A, CMM_CONV_B, 1);
|
||
|
iot_printf("EIGENVALUE_VECTOR AxB case 4x4 matrix:\n");
|
||
|
dump_output();
|
||
|
#endif
|
||
|
|
||
|
#if (TEST_CASE_CMM & MTX_MUL_DIAG)
|
||
|
iot_math_cmm_cfg((float *) test_adiag_5x5, 5, 5, 1,
|
||
|
(float *)test_bdiag_5x5, 5, 5, 1);
|
||
|
// AxB
|
||
|
output_clear();
|
||
|
iot_math_cmm_ab((float *)result, CMM_CONV_A, CMM_CONV_B, 1);
|
||
|
iot_printf("EIGENVALUE_VECTOR AxB case 4x4 matrix:\n");
|
||
|
dump_output();
|
||
|
#endif
|
||
|
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
int main(void)
|
||
|
{
|
||
|
dbg_uart_init();
|
||
|
|
||
|
//iot_dbg_uart_set_port(IOT_UART_PORT0, 3000000, 0, 8, 1);
|
||
|
|
||
|
iot_printf("\n-------MATRIX TEST---------\n");
|
||
|
|
||
|
while(1) {
|
||
|
chol_test();
|
||
|
eig_test();
|
||
|
cmm_test();
|
||
|
}
|
||
|
iot_printf("\n-------MATRIX TEST FINISH---------\n");
|
||
|
while(1);
|
||
|
|
||
|
return 0;
|
||
|
}
|