提交 5b61d24f 编写于 作者: 饶先宏's avatar 饶先宏

202105201151

上级 27057bee
......@@ -10,6 +10,7 @@ add_subdirectory ("preprocess")
add_subdirectory ("testpreprocess")
add_subdirectory ("hdl4secell")
add_subdirectory ("hdl4sesim")
add_subdirectory ("bignumber")
add_subdirectory ("examples")
......
# CMakeList.txt: 顶层 CMake 项目文件,在此处执行全局配置
# 并包含子项目。
#
cmake_minimum_required (VERSION 3.8)
add_library (bignumber STATIC
"include/bignumber.h"
"src/bignumber.c"
)
include_directories("../../lcom/include")
include_directories("../bignumber/include")
/*
** HDL4SE: 软件Verilog综合仿真平台
** Copyright (C) 2021-2021, raoxianhong<raoxianhong@163.net>
** LCOM: 轻量级组件对象模型
** Copyright (C) 2021-2021, raoxianhong<raoxianhong@163.net>
** All rights reserved.
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are met:
**
** * Redistributions of source code must retain the above copyright notice,
** this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright notice,
** this list of conditions and the following disclaimer in the documentation
** and/or other materials provided with the distribution.
** * The name of the author may be used to endorse or promote products
** derived from this software without specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
** THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* bignumber.h
202105201110: rxh, initial version
*/
#ifndef __BIGNUMBER_H
#define __BIGNUMBER_H
#ifdef __cplusplus
extern "C" {
#endif
#ifndef _ASMLANGUAGE
#include "guid.h"
DEFINE_GUID(IID_BIGNUMBER, 0x80dc5305, 0x1ca6, 0x4678, 0xbf, 0xc3, 0xd0, 0x1b, 0x9c, 0xd3, 0x63, 0x62);
typedef struct sIBigNumber {
OBJECT_INTERFACE
int (*GetBitsCount)(HOBJECT object);
int (*GetInt)(HOBJECT object, int* pvaue);
int (*GetInt64)(HOBJECT object, long long* pvaue);
int (*GetFloat)(HOBJECT object, float* pvaue);
int (*GetDouble)(HOBJECT object, double* pvaue);
int (*GetStr)(HOBJECT object, int base, char * str, int strlen);
int (*AssignStr)(HOBJECT object, const char * str);
int (*AssignInt)(HOBJECT object, int value);
int (*AssignInt64)(HOBJECT object, long long value);
int (*AssignFloat)(HOBJECT object, float value);
int (*AssignDouble)(HOBJECT object, double value);
int (*Assign)(HOBJECT object, HOBJECT src);
int (*Neg)(HOBJECT object);
int (*AddInt)(HOBJECT object, int value);
int (*Add)(HOBJECT object, HOBJECT src);
int (*SubInt)(HOBJECT object, int value);
int (*Sub)(HOBJECT object, HOBJECT src);
int (*MulInt)(HOBJECT object, int value);
int (*Mul)(HOBJECT object, HOBJECT src);
int (*DivInt)(HOBJECT object, int value);
int (*Div)(HOBJECT object, HOBJECT src);
int (*SHL)(HOBJECT object, int bits);
int (*SHR)(HOBJECT object, int bits);
int (*And)(HOBJECT object, HOBJECT src);
int (*Or)(HOBJECT object, HOBJECT src);
int (*IsZero)(HOBJECT object);
int (*IsNeg)(HOBJECT object);
int (*IsEQ)(HOBJECT object, HOBJECT src);
int (*IsLE)(HOBJECT object, HOBJECT src);
int (*IsLT)(HOBJECT object, HOBJECT src);
}IBigNumber;
#define HDL4SEUNIT_VARDECLARE
#define HDL4SEUNIT_VARINIT(_objptr, _sid)
#define HDL4SEUNIT_FUNCDECLARE(_obj, _clsid, _localstruct) \
static int _obj##_bn_GetBitsCount)(HOBJECT object); \
static int _obj##_bn_GetInt(HOBJECT object, int* pvaue); \
static int _obj##_bn_GetInt64(HOBJECT object, long long* pvaue); \
static int _obj##_bn_GetFloat(HOBJECT object, float* pvaue); \
static int _obj##_bn_GetDouble(HOBJECT object, double* pvaue); \
static int _obj##_bn_GetStr(HOBJECT object, int base, char* str, int strlen); \
static int _obj##_bn_AssignStr(HOBJECT object, const char* str); \
static int _obj##_bn_AssignInt(HOBJECT object, int value); \
static int _obj##_bn_AssignInt64(HOBJECT object, long long value); \
static int _obj##_bn_AssignFloat(HOBJECT object, float value); \
static int _obj##_bn_AssignDouble(HOBJECT object, double value); \
static int _obj##_bn_Assign(HOBJECT object, HOBJECT src);\
static int _obj##_bn_Neg(HOBJECT object); \
static int _obj##_bn_AddInt(HOBJECT object, int value); \
static int _obj##_bn_Add(HOBJECT object, HOBJECT src); \
static int _obj##_bn_SubInt(HOBJECT object, int value); \
static int _obj##_bn_Sub(HOBJECT object, HOBJECT src); \
static int _obj##_bn_MulInt(HOBJECT object, int value); \
static int _obj##_bn_Mul(HOBJECT object, HOBJECT src); \
static int _obj##_bn_DivInt(HOBJECT object, int value); \
static int _obj##_bn_Div(HOBJECT object, HOBJECT src); \
static int _obj##_bn_SHL(HOBJECT object, int bits); \
static int _obj##_bn_SHR(HOBJECT object, int bits); \
static int _obj##_bn_And(HOBJECT object, HOBJECT src); \
static int _obj##_bn_Or(HOBJECT object, HOBJECT src); \
static int _obj##_bn_IsZero(HOBJECT object); \
static int _obj##_bn_IsNeg(HOBJECT object); \
static int _obj##_bn_IsEQ(HOBJECT object, HOBJECT src); \
static int _obj##_bn_IsLE(HOBJECT object, HOBJECT src); \
static int _obj##_bn_IsLT(HOBJECT object, HOBJECT src); \
static const IBigNumber _obj##_bn_interface = { \
INTERFACE_HEADER(_obj, IBigNumber, _localstruct) \
_obj##_bn_GetBitsCount, \
_obj##_bn_GetInt, \
_obj##_bn_GetInt64, \
_obj##_bn_GetFloat, \
_obj##_bn_GetDouble, \
_obj##_bn_GetStr, \
_obj##_bn_AssignStr, \
_obj##_bn_AssignInt, \
_obj##_bn_AssignInt64, \
_obj##_bn_AssignFloat, \
_obj##_bn_AssignDouble, \
_obj##_bn_Assign, \
_obj##_bn_Neg, \
_obj##_bn_AddInt, \
_obj##_bn_Add, \
_obj##_bn_SubInt, \
_obj##_bn_Sub, \
_obj##_bn_MulInt, \
_obj##_bn_Mul, \
_obj##_bn_DivInt, \
_obj##_bn_Div, \
_obj##_bn_SHL, \
_obj##_bn_SHR, \
_obj##_bn_And, \
_obj##_bn_Or, \
_obj##_bn_IsZero, \
_obj##_bn_IsNeg, \
_obj##_bn_IsEQ, \
_obj##_bn_IsLE, \
_obj##_bn_IsLT \
};
#endif /* _ASMLANGUAGE */
#ifdef __cplusplus
}
#endif
#endif /* __BIGNUMBER_H */
\ No newline at end of file
/*
** HDL4SE: 软件Verilog综合仿真平台
** Copyright (C) 2021-2021, raoxianhong<raoxianhong@163.net>
** LCOM: 轻量级组件对象模型
** Copyright (C) 2021-2021, raoxianhong<raoxianhong@163.net>
** All rights reserved.
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are met:
**
** * Redistributions of source code must retain the above copyright notice,
** this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright notice,
** this list of conditions and the following disclaimer in the documentation
** and/or other materials provided with the distribution.
** * The name of the author may be used to endorse or promote products
** derived from this software without specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
** THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* bignumber.c
202105201110: rxh, initial version
*/
#include "stdlib.h"
#include "stdio.h"
#include "object.h"
#define IMPLEMENT_GUID
#include "bignumber.h"
#undef IMPLEMENT_GUID
\ No newline at end of file
......@@ -34,6 +34,8 @@
* counter.c
202105180851: rxh, initial version
*/
#include "stdlib.h"
#include "stdio.h"
#include "object.h"
#include "hdl4secell.h"
......@@ -63,7 +65,7 @@ static IHDL4SEUnit** hdl4seCreateDec2seg(IHDL4SEModule** parent, char* instancep
/* 生成模块对象 */
unit_dec2seg = hdl4seCreateUnit(parent, CLSID_HDL4SE_MODULE, instanceparam, name);
/* 得到对象的IHDL4SEModule 接口 */
objectQueryInterface(unit_dec2seg, IID_HDL4SEMODULE, &module_dec2seg);
objectQueryInterface(unit_dec2seg, IID_HDL4SEMODULE, (void **)&module_dec2seg);
/* 增加端口 */
objectCall3(module_dec2seg, AddPort, 4, PORTTYPE_INPUT, "0.dec");
objectCall3(module_dec2seg, AddPort, 8, PORTTYPE_OUTPUT, "1.seg");
......@@ -100,7 +102,7 @@ static IHDL4SEUnit** hdl4seCreateCounter(IHDL4SEModule** parent, char* instancep
IHDL4SEUnit** unit_counter = NULL;
int width, maxvalue, resetvalue;
char temp[128];
sscanf(instanceparam, "%d, %d, %d", &width, &maxvalue, &resetvalue);
sscanf_s(instanceparam, "%d, %d, %d", &width, &maxvalue, &resetvalue);
/* 生成模块对象 */
unit_counter = hdl4seCreateUnit(parent, CLSID_HDL4SE_MODULE, instanceparam, name);
/* 得到对象的IHDL4SEModule 接口 */
......@@ -234,7 +236,7 @@ IHDL4SEUnit** hdl4seCreateMain(IHDL4SEModule** parent, char* instanceparam, char
/* 生成模块对象 */
unit_main = hdl4seCreateUnit(parent, CLSID_HDL4SE_MODULE, instanceparam, name);
/* 得到对象的IHDL4SEModule 接口 */
objectQueryInterface(unit_main, IID_HDL4SEMODULE, &module_main);
objectQueryInterface(unit_main, IID_HDL4SEMODULE, (void **)&module_main);
/* 增加端口 */
objectCall3(module_main, AddPort, 1, PORTTYPE_INPUT, "0.nwReset");
objectCall3(module_main, AddPort, 1, PORTTYPE_OUTPUT, "1.wWrite");
......
......@@ -42,7 +42,20 @@ IHDL4SEModule** sim;
IHDL4SEUnit** topmodule;
int main(int argc, char* argv[])
{
sim = hdl4sesimCreateSimulator();
hdl4seCreateMain(sim, "", "main");
unsigned int iid[4];
str2iid("7691029B-DAE3-4AC9-9A81-411C1B529039", iid);
printf("str: %08x, %08x, %08x, %08x\n", iid[0], iid[1], iid[2], iid[3]);
{
#define IMPLEMENT_GUID
#include "guid.h"
{
DEFINE_GUID(iid, 0x7691029B, 0xDAE3, 0x4AC9, 0x9A, 0x81,0x41, 0x1C, 0x1B, 0x52, 0x90, 0x39);
printf("def: %08x, %08x, %08x, %08x\n", iid[0], iid[1], iid[2], iid[3]);
}
#undef IMPLEMENT_GUID
}
//sim = hdl4sesimCreateSimulator();
//hdl4seCreateMain(sim, "", "main");
return 0;
}
\ No newline at end of file
......@@ -115,7 +115,6 @@ typedef struct sIHDL4SEModule {
_obj##_hdl4se_module_AddUnit, \
};
IHDL4SEUnit** hdl4seCreateUnit(IHDL4SEModule** parent, IIDTYPE clsid, char* instanceparam, char* name);
/*
以下定义请与hdl4cell.v中的定义保持一致
......@@ -159,6 +158,38 @@ DEFINE_GUID(CLSID_HDL4SE_REG, 0x76FBFD4B, 0xFEAD, 0x45fd, 0xAA, 0x27, 0xAF, 0x
DEFINE_GUID(CLSID_HDL4SE_WIRE, 0x7acb063f, 0x081c, 0x45c6, 0xaa, 0x1d, 0xdc, 0x43, 0xb1, 0x78, 0x14, 0x63);
DEFINE_GUID(CLSID_HDL4SE_MODULE,0x167d115e, 0x0c1e, 0x484e, 0x8b, 0xf3, 0xa7, 0x38, 0x5b, 0x3d, 0x3a, 0x57);
/*
用CLSID和实例化参数生成一个电路单元,如果生成成功,电路单元而且parent是一个合法的Module,
则单元以name命名加入到parent中
*/
IHDL4SEUnit** hdl4seCreateUnit(IHDL4SEModule** parent, IIDTYPE clsid, char* instanceparam, char* name);
/*
下面是支持函数
*/
/*
把一个"7691029B-DAE3-4AC9-9A81-411C1B529039"格式的IID转换成一个IIDTYPE
返回值:
0 -- 成功
否则 -- 格式不对
*/
int str2iid(const char* str, IIDTYPE iid);
/*
从字符串中解析下一个数字,数字是verilog数字格式, 自动跳过开始的非数字字符
str: 字符串,
value: 数字缓冲区,可能表达多位数据,数字只支持无符号整数, 如果不带宽度,
则认为是32位数,不带基数,则认为是十进制
value必须提供能够放下数字所需要的缓冲区,
数字的顺序,value[0]:0--31位, value[1]--32..63位,依此类推。
width: value缓冲区的按位长度
pnextstr: 返回解析后剩余的字符串首地址
返回值:
>0 : 得到的数字的位数,此时如果返回值比width大,则并不在value中写入值。
否则:出错,没有找到数字
*/
int str2verilognum(const char* str, HDL4SEUINT32* value, int width, const char* * pnextstr);
#endif /* _ASMLANGUAGE */
......
......@@ -34,12 +34,17 @@
修改记录:
202105180851: rxh, initial version
*/
#include "stdlib.h"
#include "stdio.h"
#include "object.h"
#define IMPLEMENT_GUID
#include "hdl4secell.h"
#undef IMPLEMENT_GUID
/*
用CLSID和实例化参数生成一个电路单元,如果生成成功,电路单元而且parent是一个合法的Module,
则单元以name命名加入到parent中
*/
IHDL4SEUnit** hdl4seCreateUnit(IHDL4SEModule** parent, IIDTYPE clsid, char* instanceparam, char* name)
{
PARAMITEM param[3];
......@@ -50,7 +55,241 @@ IHDL4SEUnit** hdl4seCreateUnit(IHDL4SEModule** parent, IIDTYPE clsid, char* inst
param[1].pvalue = name;
param[2].name = PARAMID_HDL4SE_UNIT_PARENT;
param[2].pvalue = parent;
objectCreateEx(clsid, param, 3, IID_HDL4SEUNIT, &result);
objectCreateEx(clsid, param, 3, IID_HDL4SEUNIT, (const void**)&result);
objectCall2(parent, AddUnit, result, name);
return result;
}
/*
把一个"7691029B-DAE3-4AC9-9A81-411C1B529039"格式的IID转换成一个IIDTYPE
返回值:
0 -- 成功
否则 -- 格式不对
*/
int str2iid(const char* str, IIDTYPE iid)
{
unsigned int L;
unsigned int s[2];
unsigned int b[8];
if (sscanf_s(str, "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", &L, &s[0], &s[1],
&b[0], &b[1], &b[2], &b[3], &b[4], &b[5], &b[6], &b[7]) != 11)
return -1;
#define IMPLEMENT_GUID
#include "guid.h"
{
DEFINE_GUID(temp, L, s[0], s[1], b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]);
iid[0] = temp[0];
iid[1] = temp[1];
iid[2] = temp[2];
iid[3] = temp[3];
}
#undef IMPLEMENT_GUID
return 0;
}
/*
从字符串中解析下一个数字,数字是verilog数字格式, 自动跳过开始的非数字字符
str: 字符串
value: 数字缓冲区,可能表达多位数据,只支持无符号整数, 如果不带宽度,
则认为是32位数,不带基数,则认为是十进制
value必须提供能够放下数字所需要的缓冲区,
数字的顺序,value[0]:0--31位, value[1]--32..63位,依此类推。
width: value缓冲区的按位长度
pnextstr: 返回解析后剩余的字符串首地址
返回值:
>0 : 得到的数字的位数,此时如果返回值比width大,则并不在value中写入值。
否则:出错:
-1; 没有指定宽度的数字太大,缓冲区存不下了
*/
enum TOKEN_STATE {
TOKEN_INITIAL,
TOKEN_NUM,
TOKEN_BASE,
TOKEN_BIN,
TOKEN_OCT,
TOKEN_DEC,
TOKEN_HEX
};
static int actualwidth(unsigned int n)
{
unsigned int c = 1;
int ret = 1;
if (c & 0x80000000)
return 32;
while (c < n) {
c <<= 1;
ret++;
}
return ret;
}
int str2verilognum(const char* str, HDL4SEUINT32* value, int width, const char** pnextstr)
{
enum TOKEN_STATE state;
const char* strt = str;
int w = 0;
int nw = 0;
int aw = 0;
int vlen = (width + 31) / 32;
int b = 10;
unsigned long long n;
int valueindex = 0;
state = TOKEN_INITIAL;
*pnextstr = strt;
while (*strt != 0) {
int ch = *strt;
switch (state) {
case TOKEN_INITIAL: {
if (ch == '\'') {
state = TOKEN_BASE;
}
else if (ch >= '0' && ch <= '9') {
n = ch - '0';
state = TOKEN_NUM;
}
} break;
case TOKEN_NUM: {
if (ch >= '0' && ch <= '9') {
n = n * 10 + ch - '0';
if (n >= (1ll << 32)) {
if (valueindex < vlen) {
value[valueindex++] = n & 0xFFFFFFFF;
}
n >>= 32;
aw += 32;
}
} else if (ch == '\'') {
if (n > 1ll << 32)
return -1;
w = (int)n;
if (w > width) {
return w;
}
state = TOKEN_BASE;
} else {
nw = actualwidth((unsigned int)n);
goto lastnum;
}
}break;
case TOKEN_BASE: {
if (ch == 'b' || ch == 'B') {
b = 2;
n = 0;
nw = 0;
aw = 0;
state = TOKEN_BIN;
} else if (ch == 'h' || ch == 'H') {
b = 16;
nw = 0;
n = 0;
aw = 0;
state = TOKEN_HEX;
} else if(ch == 'o' || ch == 'O') {
b = 8;
nw = 0;
n = 0;
aw = 0;
state = TOKEN_OCT;
} else if (ch == 'd' || ch == 'D') {
b = 10;
n = 0;
aw = 0;
state = TOKEN_DEC;
} else if (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n') {
} else {
return -1;
}
}break;
case TOKEN_BIN: {
if (ch == '0' || ch == '1') {
n <<= 1;
nw++;
n |= ch - '0';
if (nw >= 32) {
if (valueindex < vlen) {
value[valueindex++] = n & 0xFFFFFFFF;
}
n >>= 32;
aw += 32;
nw -= 32;
}
} else if (ch == '_') {
} else {
goto lastnum;
}
}break;
case TOKEN_OCT: {
if (ch >= '0' && ch <= '7') {
n <<= 3;
nw += 3;
n |= ch - '0';
if (nw >= 32) {
if (valueindex < vlen) {
value[valueindex++] = n & 0xFFFFFFFF;
}
n >>= 32;
aw += 32;
nw -= 32;
}
}
else if (ch == '_') {
}
else {
goto lastnum;
}
}break;
case TOKEN_DEC: {
if (ch >= '0' && ch <= '9') {
n = n * 10 + ch - '0';
if (n >= (1ll << 32)) {
if (valueindex < vlen) {
value[valueindex++] = n & 0xFFFFFFFF;
}
n >>= 32;
aw += 32;
}
} else {
nw = actualwidth((unsigned int)n);
goto lastnum;
}
}break;
case TOKEN_HEX: {
if ( (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F')) {
n <<= 4;
nw += 4;
if (ch > '0' && ch <= '9')
n |= ch - '0';
else if (ch > 'a' && ch <= 'f')
n |= ch - 'a' + 10;
else if (ch > 'A' && ch <= 'F')
n |= ch - 'A' + 10;
if (nw >= 32) {
if (valueindex < vlen) {
value[valueindex++] = n & 0xFFFFFFFF;
}
n >>= 32;
aw += 32;
nw -= 32;
}
}
else if (ch == '_') {
}
else {
goto lastnum;
}
}break;
}
strt++;
}
lastnum:
*pnextstr = strt;
if (valueindex < vlen) {
value[valueindex++] = n & 0xFFFFFFFF;
}
aw += nw;
return aw;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册