提交 00ba3402 编写于 作者: 饶先宏's avatar 饶先宏

202108061129

上级 1e633fd1
......@@ -6,7 +6,7 @@ cmake_minimum_required (VERSION 3.8)
add_library (bignumber STATIC
"include/bignumber.h"
"src/bignumber.c"
)
)
include_directories("../../lcom/include")
include_directories("../bignumber/include")
......
......@@ -298,6 +298,8 @@ static const IBigNumber _obj##_bn_interface = { \
DEFINE_GUID(CLSID_BIGINTEGER, 0xabde0235, 0x8f00, 0x4f30, 0x92, 0xbf, 0x95, 0x2e, 0x35, 0x8b, 0x1a, 0xeb);
DEFINE_GUID(CLSID_BIGINT64, 0x4be318ad, 0xc98c, 0x40b9, 0x92, 0xa5, 0xcf, 0x3e, 0xe, 0x1f, 0x8f, 0xd);
DEFINE_GUID(PARAMID_BIGINTEGERWIDTH, 0xb3a21034, 0x27d5, 0x4e09, 0xba, 0xfd, 0x2, 0xeb, 0x0, 0xfc, 0x28, 0xfb);
IBigNumber** bigintegerCreate(int width);
......
此差异已折叠。
......@@ -785,6 +785,7 @@ lastnum:
static int bigint_bn_Clone(HOBJECT object, HOBJECT src)
{
#if 0
sBigInteger* pobj;
IBigNumber** numsrc;
int i;
......@@ -828,6 +829,34 @@ static int bigint_bn_Clone(HOBJECT object, HOBJECT src)
objectRelease(numsrc);
returnnorelease:
BIGINTUNLOCK;
#else
sBigInteger* pobj;
sBigInteger* pobjsrc;
int i;
int width;
int buflen;
int ret = 0;
if (objectThis(object) == objectThis(src))
return 0;
pobj = (sBigInteger*)objectThis(object);
pobjsrc = (sBigInteger*)objectThis(src);
width = pobjsrc->width;
buflen = (width + CELL_WIDTH - 1) / CELL_WIDTH;
if (buflen < 2)
buflen = 2;
if (pobj->buflen < buflen) {
unsigned int* buf;
buf = (unsigned int*)mt_malloc(buflen * (CELL_WIDTH / 8));
mt_free(pobj->buf);
pobj->buf = buf;
}
pobj->buflen = buflen;
pobj->width = width;
pobj->isunsigned = pobjsrc->isunsigned;
for (i = 0; i < pobj->buflen; i++) {
pobj->buf[i] = pobjsrc->buf[i];
}
#endif
return ret;
}
......
......@@ -80,6 +80,7 @@ MODULE_DECLARE(cnncell_concat)
int input_w[4], input_h[4], input_c[4];
int c0, c1, c2, c3;
int output_w, output_h, output_c;
int reset;
END_MODULE_DECLARE(cnncell_concat)
DEFINE_FUNC(cncell_concat_gen_read_write) {
......@@ -89,7 +90,7 @@ DEFINE_FUNC(cncell_concat_gen_read_write) {
int read2 = 0;
int read3 = 0;
int write = 0;
if (vget(nwReset) && vget(wDataWriteEnable)) {
if (pobj->reset && vget(wDataWriteEnable)) {
if (((index >= 0) && (index < pobj->c0) && vget(wDataReadValid_0))) {
read0 = 1;
write = 1;
......@@ -121,7 +122,7 @@ DEFINE_FUNC(cncell_concat_gen_read_write) {
DEFINE_FUNC(cncell_concat_gen_write_data) {
int index = vget(index);
vput(bDataWriteData, 0xcdcdcdcd);
if (vget(nwReset) && vget(wDataWriteEnable)) {
if (pobj->reset && vget(wDataWriteEnable)) {
if (((index >= 0) && (index < pobj->c0) && vget(wDataReadValid_0))) {
VAssign(bDataWriteData, bDataReadData_0);
}
......@@ -141,7 +142,7 @@ DEFINE_FUNC(cncell_concat_gen_write_data) {
DEFINE_FUNC(cncell_concat_gen_write) {
int index = vget(index);
vput(wDataWrite, 0);
if (vget(nwReset) && vget(wDataWriteEnable)) {
if (pobj->reset && vget(wDataWriteEnable)) {
if ( ((index >= 0) && (index < pobj->c0) && vget(wDataReadValid_0))
|| ((index >= pobj->c0) && (index < pobj->c1) && vget(wDataReadValid_1))
|| ((index >= pobj->c1) && (index < pobj->c2) && vget(wDataReadValid_2))
......@@ -156,7 +157,7 @@ DEFINE_FUNC(cncell_concat_gen_write) {
DEFINE_FUNC(cncell_concat_gen_read_0) {
int index = vget(index);
vput(wDataRead_0, 0);
if (vget(nwReset) && vget(wDataWriteEnable)) {
if (pobj->reset && vget(wDataWriteEnable)) {
if (((index >= 0) && (index < pobj->c0) && vget(wDataReadValid_0))) {
vput(wDataRead_0, 1);
}
......@@ -166,7 +167,7 @@ DEFINE_FUNC(cncell_concat_gen_read_0) {
DEFINE_FUNC(cncell_concat_gen_read_1) {
int index = vget(index);
vput(wDataRead_1, 0);
if (vget(nwReset) && vget(wDataWriteEnable)) {
if (pobj->reset && vget(wDataWriteEnable)) {
if (((index >= pobj->c0) && (index < pobj->c1) && vget(wDataReadValid_1))) {
vput(wDataRead_1, 1);
}
......@@ -176,7 +177,7 @@ DEFINE_FUNC(cncell_concat_gen_read_1) {
DEFINE_FUNC(cncell_concat_gen_read_2) {
int index = vget(index);
vput(wDataRead_2, 0);
if (vget(nwReset) && vget(wDataWriteEnable)) {
if (pobj->reset && vget(wDataWriteEnable)) {
if (((index >= pobj->c1) && (index < pobj->c2) && vget(wDataReadValid_2))) {
vput(wDataRead_2, 1);
}
......@@ -186,7 +187,7 @@ DEFINE_FUNC(cncell_concat_gen_read_2) {
DEFINE_FUNC(cncell_concat_gen_read_3) {
int index = vget(index);
vput(wDataRead_3, 0);
if (vget(nwReset) && vget(wDataWriteEnable)) {
if (pobj->reset && vget(wDataWriteEnable)) {
if (((index >= pobj->c2) && (index < pobj->c3) && vget(wDataReadValid_3))) {
vput(wDataRead_3, 1);
}
......@@ -194,23 +195,31 @@ DEFINE_FUNC(cncell_concat_gen_read_3) {
} END_DEFINE_FUNC
DEFINE_FUNC(cncell_concat_gen_clktick) {
int index = vget(index);
if (vget(nwReset) == 0) {
index = 0;
int index;
if (pobj->reset == 0) {
if (vget(nwReset) == 0) {
index = 0;
vput(index, index);
}
else {
pobj->reset = 1;
}
}
else if (vget(wDataWriteEnable)) {
if ( ((index >= 0) && (index < pobj->c0) && vget(wDataReadValid_0))
index = vget(index);
if ( ((index >= 0) && (index < pobj->c0) && vget(wDataReadValid_0))
|| ((index >= pobj->c0) && (index < pobj->c1) && vget(wDataReadValid_1))
|| ((index >= pobj->c1) && (index < pobj->c2) && vget(wDataReadValid_2))
|| ((index >= pobj->c2) && (index < pobj->c3) && vget(wDataReadValid_3))
) {
index = index + 1;
if (index >= pobj->c3) {
index = 0;
}
vput(index, index);
}
}
if (index >= pobj->c3) {
index = 0;
}
vput(index, index);
} END_DEFINE_FUNC
MODULE_INIT(cnncell_concat)
......@@ -227,6 +236,7 @@ MODULE_INIT(cnncell_concat)
pobj->output_w = (int)MODULE_PARAM(i * 3 + 0);
pobj->output_h = (int)MODULE_PARAM(i * 3 + 1);
pobj->output_c = (int)MODULE_PARAM(i * 3 + 2);
pobj->reset = 0;
PORT_IN(wClk, 1);
PORT_IN(nwReset, 1);
......
......@@ -96,6 +96,7 @@ enum outputstate {
MODULE_DECLARE(cnncell_dataoutput)
int w, h, c;
float* buf;
int reset;
END_MODULE_DECLARE(cnncell_dataoutput)
DEFINE_FUNC(cnncell_dataoutput_output) {
......@@ -112,9 +113,14 @@ DEFINE_FUNC(cnncell_dataoutput_output) {
} END_DEFINE_FUNC
DEFINE_FUNC(cnncell_dataoutput_clktick) {
if (vget(nwReset) == 0) {
vput(state, READ_DATA);
vput(index, 0);
if (pobj->reset == 0) {
if (vget(nwReset) == 0) {
vput(state, READ_DATA);
vput(index, 0);
}
else {
pobj->reset = 1;
}
}
else {
int state = vget(state);
......@@ -142,7 +148,7 @@ DEFINE_FUNC(cnncell_dataoutput_clktick) {
DEFINE_FUNC(cnncell_dataoutput_gen_output_read) {
vput(wDataRead, 0);
if (vget(nwReset) != 0) {
if (pobj->reset != 0) {
int state = vget(state);
if (state == READ_DATA) {
if (vget(wDataReadValid)) {
......@@ -164,6 +170,7 @@ MODULE_INIT(cnncell_dataoutput)
pobj->buf = (float*)malloc(pobj->c * pobj->w * pobj->h * sizeof(float));
PORT_IN(wClk, 1);
PORT_IN(nwReset, 1);
pobj->reset = 0;
GPORT_OUT(wDataRead, 1, cnncell_dataoutput_gen_output_read);
PORT_IN(wDataReadValid, 1);
......
......@@ -74,10 +74,11 @@ END_IDLIST
MODULE_DECLARE(cnncell_datasource)
int w, h, c;
int reset;
END_MODULE_DECLARE(cnncell_datasource)
DEFINE_FUNC(cnncell_datasource_gen_wDataWrite) {
vput(wDataWrite, (vget(complete) == 0) && (vget(nwReset) != 0) && vget(wDataWriteEnable));
vput(wDataWrite, (vget(complete) == 0) && (pobj->reset != 0) && vget(wDataWriteEnable));
} END_DEFINE_FUNC
DEFINE_FUNC(cnncell_datasource_gen_bDataWriteData) {
......@@ -85,7 +86,7 @@ DEFINE_FUNC(cnncell_datasource_gen_bDataWriteData) {
} END_DEFINE_FUNC
DEFINE_FUNC(cnncell_datasource_gen_cur_whc) {
if (vget(nwReset) == 0) {/* 低电平有效 */
if (pobj->reset == 0) {/* 低电平有效 */
vput(index, 0);
vput(complete, 0);
vput(cur_w, 0);
......@@ -122,11 +123,18 @@ DEFINE_FUNC(cnncell_datasource_gen_cur_whc) {
}
} END_DEFINE_FUNC
DEFINE_FUNC(cnncell_datasource_clktick){
if (pobj->reset == 0) {
if (vget(nwReset))
pobj->reset = 1;
}
} END_DEFINE_FUNC
MODULE_INIT(cnncell_datasource)
pobj->w = (int)MODULE_PARAM(0);
pobj->h = (int)MODULE_PARAM(1);
pobj->c = (int)MODULE_PARAM(2);
pobj->reset = 0;
PORT_IN(wClk, 1);
PORT_IN(nwReset, 1);
......@@ -138,6 +146,7 @@ MODULE_INIT(cnncell_datasource)
GREG(cur_c, 32, cnncell_datasource_gen_cur_whc);
GREG(index, 32, cnncell_datasource_gen_cur_whc);
GREG(complete, 1, cnncell_datasource_gen_cur_whc);
CLKTICK_FUNC(cnncell_datasource_clktick);
END_MODULE_INIT(cnncell_datasource)
#else
......
......@@ -90,6 +90,7 @@ MODULE_DECLARE(cnncell_innerproduct)
short* bias;
float* inbuf;
float* outbuf;
int reset;
#if CNNCELLDEBUG
FILE* pDumpFile;
#endif
......@@ -104,7 +105,7 @@ enum innerproductstate {
};
DEFINE_FUNC(cnncell_innerproduct_gen_output_coeff) {
if (vget(nwReset) == 0) {
if (pobj->reset == 0) {
vput(wCoeffRead, 0);
vput(bCoeffReadAddr, 0);
}
......@@ -178,9 +179,14 @@ DEFINE_FUNC(cnncell_innerproduct_calc) {
DEFINE_FUNC(cnncell_innerproduct_clktick) {
if (vget(nwReset) == 0) {
vput(state, READ_COEFF);
vput(index, 0);
if (pobj->reset == 0) {
if (vget(nwReset) == 0) {
vput(state, READ_COEFF);
vput(index, 0);
}
else {
pobj->reset = 1;
}
}
else {
int state = vget(state);
......@@ -263,7 +269,7 @@ DEFINE_FUNC(cnncell_innerproduct_clktick) {
DEFINE_FUNC(cnncell_innerproduct_gen_output_read) {
vput(wDataRead, 0);
if (vget(nwReset) != 0) {
if (pobj->reset != 0) {
int state = vget(state);
if (state == READ_DATA) {
if (vget(wDataReadValid)) {
......@@ -301,6 +307,7 @@ MODULE_INIT(cnncell_innerproduct)
pobj->output_w = (int)MODULE_PARAM(3);
pobj->output_h = (int)MODULE_PARAM(4);
pobj->output_c = (int)MODULE_PARAM(5);
pobj->reset = 0;
pobj->coeffcount = pobj->output_c * pobj->input_h * pobj->input_w * pobj->input_c;
pobj->coeff = (short*)malloc(pobj->coeffcount * sizeof(short));
pobj->bias = (short*)malloc(pobj->output_c * pobj->output_h * pobj->output_w * sizeof(short));
......
......@@ -72,6 +72,7 @@ MODULE_DECLARE(cnncell_lrn)
float k, alpha, beta;
float* buf;
float* square;
int reset;
#if CNNCELLDEBUG
FILE* pDumpFile;
#endif
......@@ -85,7 +86,7 @@ enum cnncell_lrn_state {
DEFINE_FUNC(cnncell_lrn_gen_read) {
vput(wDataRead, 0);
if (vget(nwReset) != 0) {
if (pobj->reset != 0) {
if (vget(state) == LRN_READ) {
if (vget(wDataReadValid)) {
vput(wDataRead, 1);
......@@ -158,9 +159,14 @@ DEFINE_FUNC(cnncell_lrn_gen_line) {
DEFINE_FUNC(cnncell_lrn_clktick) {
int state = vget(state);
int index = vget(index);
if (vget(nwReset) == 0) {
vput(state, LRN_READ);
index = 0;
if (pobj->reset == 0) {
if (vget(nwReset) == 0) {
vput(state, LRN_READ);
index = 0;
}
else {
pobj->reset = 1;
}
}
else if (state == LRN_READ) {
if (vget(wDataReadValid)) {
......@@ -209,6 +215,7 @@ MODULE_INIT(cnncell_lrn)
pobj->alpha = (float)MODULE_PARAM_REAL(5);
pobj->beta = (float)MODULE_PARAM_REAL(6);
pobj->region = (int)MODULE_PARAM(7);
pobj->reset = 0;
#if CNNCELLDEBUG
{
char filename[80];
......
......@@ -78,6 +78,7 @@ MODULE_DECLARE(cnncell_pooling)
int linesize;
float* line_in;
float* line_out;
int reset;
#if CNNCELLDEBUG
FILE* pDumpFile;
#endif
......@@ -94,7 +95,7 @@ enum poolingstate {
DEFINE_FUNC(cnncell_pooling_gen_read) {
vput(wDataRead, 0);
if (vget(nwReset) != 0) {
if (pobj->reset != 0) {
int state = vget(state);
if (state == POOLING_START) {
if (vget(wDataReadValid)) {
......@@ -201,11 +202,16 @@ END_DEFINE_FUNC
DEFINE_FUNC(cnncell_pooling_clktick) {
//wDataRead = 0;
if (vget(nwReset) == 0) {
vput(state, POOLING_START);
vput(index, 0);
vput(readline, 0);
vput(writeline, 0);
if (pobj->reset == 0) {
if (vget(nwReset) == 0) {
vput(state, POOLING_START);
vput(index, 0);
vput(readline, 0);
vput(writeline, 0);
}
else {
pobj->reset = 1;
}
}
else {
int state = vget(state);
......@@ -320,6 +326,7 @@ MODULE_INIT(cnncell_pooling)
pobj->line_in = (float*)malloc(pobj->kh * pobj->linesize * sizeof(float));
memset(pobj->line_in, 0, pobj->kh* pobj->linesize * sizeof(float));
pobj->line_out = (float*)malloc(pobj->output_w * pobj->output_c * sizeof(float));
pobj->reset = 0;
#if CNNCELLDEBUG
{
char filename[80];
......
......@@ -69,6 +69,7 @@ MODULE_DECLARE(cnncell_softmax)
int w, h, c;
float* inbuf;
float* outbuf;
int reset;
#if CNNCELLDEBUG
FILE* pDumpFile;
#endif
......@@ -112,9 +113,14 @@ DEFINE_FUNC(cnncell_softmax_calc) {
DEFINE_FUNC(cnncell_softmax_clktick) {
if (vget(nwReset) == 0) {
vput(state, READ_DATA);
vput(index, 0);
if (pobj->reset == 0) {
if (vget(nwReset) == 0) {
vput(state, READ_DATA);
vput(index, 0);
}
else {
pobj->reset = 1;
}
}
else {
int state = vget(state);
......@@ -156,7 +162,7 @@ DEFINE_FUNC(cnncell_softmax_clktick) {
DEFINE_FUNC(cnncell_softmax_gen_output_read) {
vput(wDataRead, 0);
if (vget(nwReset) != 0) {
if (pobj->reset != 0) {
int state = vget(state);
if (state == READ_DATA) {
if (vget(wDataReadValid)) {
......@@ -190,6 +196,7 @@ MODULE_INIT(cnncell_softmax)
pobj->c = (int)MODULE_PARAM(2);
pobj->inbuf = (float*)malloc(pobj->c * pobj->h * pobj->w * sizeof(float));
pobj->outbuf = (float*)malloc(pobj->c * pobj->h * pobj->w * sizeof(float));
pobj->reset = 0;
#if CNNCELLDEBUG
{
char filename[80];
......
......@@ -14,7 +14,7 @@ int main(int argc, char * argv[])
ModuleVariable * var;
vartempInit();
var = varConcat(2, 2, varConstStr("3'b101"), varConstStr("2'b11"));
objectCall3(var->data, GetStr, 2, buf, 255);
//objectCall3(var->data, GetStr, 2, buf, 255);
printf("result: %s\n", buf);
return 0;
}
\ No newline at end of file
......@@ -98,6 +98,8 @@ typedef struct _sGeneralModule {
int canruninthread;
}sGeneralModule;
#define USEBIGINT 1
typedef struct sModuleVariable {
struct sModuleVariable * pNext, *pLast;
int index;
......@@ -110,8 +112,13 @@ typedef struct sModuleVariable {
IHDL4SEModuleVar* module;
int moduleportindex;
int genfuncindex;
#if USEBIGINT
IBigNumber** data;
IBigNumber** data_reg;
#else
unsigned long long data;
unsigned long long data_reg;
#endif
THREADLOCK lock;
void (*func_UpdateVariable)(struct sModuleVariable* var);
}ModuleVariable;
......
......@@ -70,6 +70,7 @@ MODULE_DECLARE(hdl4se_fifo)
unsigned int depth;
unsigned int wordsize;
unsigned int* fifo_data;
int reset;
END_MODULE_DECLARE(hdl4se_fifo)
DEFINE_FUNC(hdl4se_fifo_gen_bReadData) {
......@@ -90,11 +91,16 @@ DEFINE_FUNC(hdl4se_fifo_gen_wWriteEnable) {
} END_DEFINE_FUNC
DEFINE_FUNC(hdl4se_fifo_ClkTick) {
if (vget(nwReset) == 0) {
vput(readpos, 0);
vput(writepos, 0);
vput(wReadEn, 0);
vput(wWriteEn, 0);
if (pobj->reset == 0) {
if (vget(nwReset) == 0) {
vput(readpos, 0);
vput(writepos, 0);
vput(wReadEn, 0);
vput(wWriteEn, 0);
}
else {
pobj->reset = 1;
}
}
else {
unsigned int readaddr = vget(readpos);
......@@ -140,6 +146,7 @@ MODULE_INIT(hdl4se_fifo)
pobj->fifo_data = NULL;
pobj->width = (int)MODULE_PARAM(0);
pobj->depth = (int)MODULE_PARAM(1);
pobj->reset = 0;
if (pobj->width <= 0)
return EIID_INVALIDPARAM;
if (pobj->depth <= 2)
......
......@@ -280,8 +280,10 @@ ModuleVariable * varTemp(int width, int isunsigned)
temp->pLast->pNext = temp->pNext;
temp->width = width;
temp->isunsigned = isunsigned;
#if USEBIGINT
objectCall1(temp->data, SetWidth, width);
objectCall1(temp->data, SetUnsigned, isunsigned);
#endif
}
/* 加入到正在使用的表中 */
temp->pLast = &tempvar_using_list;
......
......@@ -218,7 +218,7 @@ static int hdl4sesim_hdl4se_simulator_SetReset(HOBJECT object, int reset)
return 0;
}
#define THREADCOUNT 4
#define THREADCOUNT 1
static int hdl4sesim_hdl4se_simulator_ClkTick(HOBJECT object)
{
......@@ -230,7 +230,7 @@ static int hdl4sesim_hdl4se_simulator_ClkTick(HOBJECT object)
for (i = 0; i < pobj->singlethreadmodules.itemcount; i++) {
hdl4se_module_ClkTick(&((IHDL4SEModuleVar*)(pobj->singlethreadmodules.array[i]))->data);
}
#pragma omp parallel for num_threads(THREADCOUNT)
//#pragma omp parallel for num_threads(THREADCOUNT)
for (i = 0; i < pobj->multithreadmodules.itemcount; i++) {
hdl4se_module_ClkTick(&((IHDL4SEModuleVar*)(pobj->multithreadmodules.array[i]))->data);
}
......@@ -249,7 +249,7 @@ static int hdl4sesim_hdl4se_simulator_Setup(HOBJECT object)
for (i = 0; i < pobj->singlethreadmodules.itemcount; i++) {
hdl4se_module_Setup(&((IHDL4SEModuleVar*)(pobj->singlethreadmodules.array[i]))->data);
}
#pragma omp parallel for num_threads(THREADCOUNT)
//#pragma omp parallel for num_threads(THREADCOUNT)
for (i = 0; i < pobj->multithreadmodules.itemcount; i++) {
hdl4se_module_Setup(&((IHDL4SEModuleVar*)(pobj->multithreadmodules.array[i]))->data);
}
......@@ -272,3 +272,35 @@ IHDL4SESimulator** hdl4sesimCreateSimulator()
return sim;
}
/*
threadcount=3
clocks : 1867776, TSPD = 1552.598504cps, LSPD = 2048.000000cps
softmax_168 complete
0.4901 n03085013 computer keyboard, keypad
0.1591 n04264628 space bar
0.0543 n04074963 remote control, remote
0.0439 n03832673 notebook, notebook computer
0.0356 n04505470 typewriter keyboard
clocks : 1884160, TSPD = 1550.748971cps, LSPD = 1365.333333cps
threadcount=2
clocks: 1867776, TSPD=1562.992469cps, LSPD=1365.333333cps
softmax_168 complete
0.4901 n03085013 computer keyboard, keypad
0.1591 n04264628 space bar
0.0543 n04074963 remote control, remote
0.0439 n03832673 notebook, notebook computer
0.0356 n04505470 typewriter keyboard
clocks: 1884160, TSPD=1567.520799cps, LSPD=2340.571429cps
threadcount=1
clocks: 1867776, TSPD=993.497872cps, LSPD=963.764706cps
softmax_168 complete
0.4901 n03085013 computer keyboard, keypad
0.1591 n04264628 space bar
0.0543 n04074963 remote control, remote
0.0439 n03832673 notebook, notebook computer
0.0356 n04505470 typewriter keyboard
clocks: 1884160, TSPD=993.755274cps, LSPD=1024.000000cps
*/
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册