Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
饶先宏
hdl4se
提交
5b61d24f
H
hdl4se
项目概览
饶先宏
/
hdl4se
通知
12
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
H
hdl4se
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
5b61d24f
编写于
5月 20, 2021
作者:
饶先宏
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
202105201151
上级
27057bee
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
514 addition
and
8 deletion
+514
-8
CMakeLists.txt
CMakeLists.txt
+1
-0
bignumber/CMakeLists.txt
bignumber/CMakeLists.txt
+13
-0
bignumber/include/bignumber.h
bignumber/include/bignumber.h
+165
-0
bignumber/src/bignumber.c
bignumber/src/bignumber.c
+42
-0
examples/counter/src/counter.c
examples/counter/src/counter.c
+5
-3
examples/counter/src/main.c
examples/counter/src/main.c
+15
-2
hdl4secell/include/hdl4secell.h
hdl4secell/include/hdl4secell.h
+32
-1
hdl4secell/src/hdl4secell.c
hdl4secell/src/hdl4secell.c
+241
-2
未找到文件。
CMakeLists.txt
浏览文件 @
5b61d24f
...
...
@@ -10,6 +10,7 @@ add_subdirectory ("preprocess")
add_subdirectory
(
"testpreprocess"
)
add_subdirectory
(
"hdl4secell"
)
add_subdirectory
(
"hdl4sesim"
)
add_subdirectory
(
"bignumber"
)
add_subdirectory
(
"examples"
)
...
...
bignumber/CMakeLists.txt
0 → 100644
浏览文件 @
5b61d24f
# 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"
)
bignumber/include/bignumber.h
0 → 100644
浏览文件 @
5b61d24f
/*
** 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
bignumber/src/bignumber.c
0 → 100644
浏览文件 @
5b61d24f
/*
** 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
examples/counter/src/counter.c
浏览文件 @
5b61d24f
...
...
@@ -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"
);
...
...
examples/counter/src/main.c
浏览文件 @
5b61d24f
...
...
@@ -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
hdl4secell/include/hdl4secell.h
浏览文件 @
5b61d24f
...
...
@@ -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 */
...
...
hdl4secell/src/hdl4secell.c
浏览文件 @
5b61d24f
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录