bignumber.h 13.4 KB
Newer Older
饶先宏's avatar
饶先宏 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
/*
** 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
饶先宏's avatar
饶先宏 已提交
35
    202105260952: rxh, 调整了接口,主要是增加了带符号的计算,另外根据verilog的运算增加了运算符号
饶先宏's avatar
饶先宏 已提交
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
*/

#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
饶先宏's avatar
饶先宏 已提交
53
    int (*GetWidth)(HOBJECT object);
饶先宏's avatar
饶先宏 已提交
54 55 56 57 58
    int (*SetWidth)(HOBJECT object, int width);

    int (*IsUnsigned)(HOBJECT object);
    int (*SetUnsigned)(HOBJECT object, int isunsigned);

59 60 61 62 63
    int (*GetBits32)(HOBJECT object, int ind32, unsigned int* pbits);
    int (*SetBits32)(HOBJECT object, int ind32, unsigned int bits);

    int (*GetBit)(HOBJECT object, int indbit);
    int (*SetBit)(HOBJECT object, int indbit, int bit);
饶先宏's avatar
饶先宏 已提交
64

饶先宏's avatar
饶先宏 已提交
65
    int (*GetInt32)(HOBJECT object, int* pvalue);
饶先宏's avatar
饶先宏 已提交
66
    int (*GetInt64)(HOBJECT object, long long* pvalue);
饶先宏's avatar
饶先宏 已提交
67 68 69
    int (*GetUint32)(HOBJECT object, unsigned int* pvalue);
    int (*GetUint64)(HOBJECT object, unsigned long long* pvalue);

饶先宏's avatar
饶先宏 已提交
70 71 72 73 74
    int (*ReadInt32)(HOBJECT object);
    long long (*ReadInt64)(HOBJECT object);
    unsigned int (*ReadUint32)(HOBJECT object);
    unsigned long long (*ReadUint64)(HOBJECT object);

饶先宏's avatar
饶先宏 已提交
75
    int (*GetStr)(HOBJECT object, int base, char * str, int buflen);
饶先宏's avatar
饶先宏 已提交
76

饶先宏's avatar
饶先宏 已提交
77
    int (*AssignInt32)(HOBJECT object, int value);
饶先宏's avatar
饶先宏 已提交
78
    int (*AssignInt64)(HOBJECT object, long long value);
饶先宏's avatar
饶先宏 已提交
79 80 81
    int (*AssignUint32)(HOBJECT object, unsigned int value);
    int (*AssignUint64)(HOBJECT object, unsigned long long value);

饶先宏's avatar
饶先宏 已提交
82
    int (*AssignStr)(HOBJECT object, const char* str, const char** nstr, int autowidth);
饶先宏's avatar
饶先宏 已提交
83 84

    int (*Clone)(HOBJECT object, HOBJECT src);
饶先宏's avatar
饶先宏 已提交
85
    int (*CloneSubBits)(HOBJECT object, HOBJECT src, int from, int width);
饶先宏's avatar
饶先宏 已提交
86
    int (*Assign)(HOBJECT object, HOBJECT src);
饶先宏's avatar
饶先宏 已提交
87
    int (*AssignSubBits)(HOBJECT object, HOBJECT src, int from, int width);
饶先宏's avatar
饶先宏 已提交
88

饶先宏's avatar
饶先宏 已提交
89 90 91 92 93
    int (*AddInt32)(HOBJECT object, HOBJECT src, int value);
    int (*SubInt32)(HOBJECT object, HOBJECT src, int value);
    int (*MulInt32)(HOBJECT object, HOBJECT src, int value);
    int (*DivInt32)(HOBJECT object, HOBJECT src, int value);
    int (*ModInt32)(HOBJECT object, HOBJECT src, int value);
饶先宏's avatar
饶先宏 已提交
94
    int (*PowInt32)(HOBJECT object, HOBJECT src, int value);
饶先宏's avatar
饶先宏 已提交
95

饶先宏's avatar
饶先宏 已提交
96 97 98 99 100
    int (*AddUint32)(HOBJECT object, HOBJECT src, unsigned int value);
    int (*SubUint32)(HOBJECT object, HOBJECT src, unsigned int value);
    int (*MulUint32)(HOBJECT object, HOBJECT src, unsigned int value);
    int (*DivUint32)(HOBJECT object, HOBJECT src, unsigned int value);
    int (*ModUint32)(HOBJECT object, HOBJECT src, unsigned int value);
饶先宏's avatar
饶先宏 已提交
101
    int (*PowUint32)(HOBJECT object, HOBJECT src, unsigned int value);
饶先宏's avatar
饶先宏 已提交
102

饶先宏's avatar
饶先宏 已提交
103 104 105 106 107
    int (*Add)(HOBJECT object, HOBJECT src0, HOBJECT src1);
    int (*Sub)(HOBJECT object, HOBJECT src0, HOBJECT src1);
    int (*Mul)(HOBJECT object, HOBJECT src0, HOBJECT src1);
    int (*Div)(HOBJECT object, HOBJECT src0, HOBJECT src1);
    int (*Mod)(HOBJECT object, HOBJECT src0, HOBJECT src1);
饶先宏's avatar
饶先宏 已提交
108
    int (*Pow)(HOBJECT object, HOBJECT src0, HOBJECT src1);
饶先宏's avatar
饶先宏 已提交
109

饶先宏's avatar
饶先宏 已提交
110
    int (*Neg)(HOBJECT object, HOBJECT src);
111
    int (*Abs)(HOBJECT object, HOBJECT src);
饶先宏's avatar
饶先宏 已提交
112 113 114

    int (*IsGT)(HOBJECT object, HOBJECT src);
    int (*IsGE)(HOBJECT object, HOBJECT src);
饶先宏's avatar
饶先宏 已提交
115
    int (*IsLT)(HOBJECT object, HOBJECT src);
饶先宏's avatar
饶先宏 已提交
116 117 118 119 120 121
    int (*IsLE)(HOBJECT object, HOBJECT src);
    int (*IsEQ)(HOBJECT object, HOBJECT src);
    int (*IsNE)(HOBJECT object, HOBJECT src);

    int (*IsZero)(HOBJECT object);
    int (*IsNotZero)(HOBJECT object);
122
    int (*IsNeg)(HOBJECT object);
饶先宏's avatar
饶先宏 已提交
123 124 125

    int (*AndL)(HOBJECT object, HOBJECT src);
    int (*OrL)(HOBJECT object, HOBJECT src);
126
    int (*NotL)(HOBJECT object);
饶先宏's avatar
饶先宏 已提交
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144

    int (*And)(HOBJECT object, HOBJECT src0, HOBJECT src1);
    int (*Or)(HOBJECT object, HOBJECT src0, HOBJECT src1);
    int (*Xor)(HOBJECT object, HOBJECT src0, HOBJECT src1);
    int (*Not)(HOBJECT object, HOBJECT src);

    int (*uAnd)(HOBJECT object, HOBJECT src);
    int (*uAndNot)(HOBJECT object, HOBJECT src);
    int (*uOr)(HOBJECT object, HOBJECT src);
    int (*uOrNot)(HOBJECT object, HOBJECT src);
    int (*uXor)(HOBJECT object, HOBJECT src);
    int (*uXorNot)(HOBJECT object, HOBJECT src);

    int (*SHL)(HOBJECT object, HOBJECT src, int bits);
    int (*SHR)(HOBJECT object, HOBJECT src, int bits);
    int (*SAL)(HOBJECT object, HOBJECT src, int bits);
    int (*SAR)(HOBJECT object, HOBJECT src, int bits);

饶先宏's avatar
饶先宏 已提交
145 146
}IBigNumber;

饶先宏's avatar
饶先宏 已提交
147 148 149 150
#define BIGNUMBER_VARDECLARE
#define BIGNUMBER_VARINIT(_objptr, _sid)

#define BIGNUMBER_FUNCDECLARE(_obj, _clsid, _localstruct) \
饶先宏's avatar
饶先宏 已提交
151
    static int _obj##_bn_GetWidth(HOBJECT object); \
饶先宏's avatar
饶先宏 已提交
152 153 154
    static int _obj##_bn_SetWidth(HOBJECT object, int width); \
    static int _obj##_bn_IsUnsigned(HOBJECT object); \
    static int _obj##_bn_SetUnsigned(HOBJECT object, int isunsigned); \
155 156 157 158
    static int _obj##_bn_GetBits32(HOBJECT object, int ind32, unsigned int* pbits); \
    static int _obj##_bn_SetBits32(HOBJECT object, int ind32, unsigned int bits); \
    static int _obj##_bn_GetBit(HOBJECT object, int indbit); \
    static int _obj##_bn_SetBit(HOBJECT object, int indbit, int bit); \
饶先宏's avatar
饶先宏 已提交
159
    static int _obj##_bn_GetInt32(HOBJECT object, int* pvalue); \
饶先宏's avatar
饶先宏 已提交
160
    static int _obj##_bn_GetInt64(HOBJECT object, long long* pvalue); \
饶先宏's avatar
饶先宏 已提交
161 162
    static int _obj##_bn_GetUint32(HOBJECT object, unsigned int* pvalue); \
    static int _obj##_bn_GetUint64(HOBJECT object, unsigned long long* pvalue); \
饶先宏's avatar
饶先宏 已提交
163 164 165 166
    static int _obj##_bn_ReadInt32(HOBJECT object); \
    static long long _obj##_bn_ReadInt64(HOBJECT object); \
    static unsigned int _obj##_bn_ReadUint32(HOBJECT object); \
    static unsigned long long _obj##_bn_ReadUint64(HOBJECT object); \
饶先宏's avatar
饶先宏 已提交
167
    static int _obj##_bn_GetStr(HOBJECT object, int base, char* str, int buflen); \
饶先宏's avatar
饶先宏 已提交
168
    static int _obj##_bn_AssignInt32(HOBJECT object, int value); \
饶先宏's avatar
饶先宏 已提交
169
    static int _obj##_bn_AssignInt64(HOBJECT object, long long value); \
饶先宏's avatar
饶先宏 已提交
170 171
    static int _obj##_bn_AssignUint32(HOBJECT object, unsigned int value); \
    static int _obj##_bn_AssignUint64(HOBJECT object, unsigned long long value); \
饶先宏's avatar
饶先宏 已提交
172
    static int _obj##_bn_AssignStr(HOBJECT object, const char* str, const char** nstr, int autowidth); \
饶先宏's avatar
饶先宏 已提交
173
    static int _obj##_bn_Clone(HOBJECT object, HOBJECT src); \
饶先宏's avatar
饶先宏 已提交
174
    static int _obj##_bn_CloneSubBits(HOBJECT object, HOBJECT src, int from, int width); \
饶先宏's avatar
饶先宏 已提交
175
    static int _obj##_bn_Assign(HOBJECT object, HOBJECT src); \
饶先宏's avatar
饶先宏 已提交
176 177 178 179 180 181
    static int _obj##_bn_AssignSubBits(HOBJECT object, HOBJECT src, int from, int width); \
    static int _obj##_bn_AddInt32(HOBJECT object, HOBJECT src, int value); \
    static int _obj##_bn_SubInt32(HOBJECT object, HOBJECT src, int value); \
    static int _obj##_bn_MulInt32(HOBJECT object, HOBJECT src, int value); \
    static int _obj##_bn_DivInt32(HOBJECT object, HOBJECT src, int value); \
    static int _obj##_bn_ModInt32(HOBJECT object, HOBJECT src, int value); \
饶先宏's avatar
饶先宏 已提交
182
    static int _obj##_bn_PowInt32(HOBJECT object, HOBJECT src, int value); \
饶先宏's avatar
饶先宏 已提交
183 184 185 186 187
    static int _obj##_bn_AddUint32(HOBJECT object, HOBJECT src, unsigned int value); \
    static int _obj##_bn_SubUint32(HOBJECT object, HOBJECT src, unsigned int value); \
    static int _obj##_bn_MulUint32(HOBJECT object, HOBJECT src, unsigned int value); \
    static int _obj##_bn_DivUint32(HOBJECT object, HOBJECT src, unsigned int value); \
    static int _obj##_bn_ModUint32(HOBJECT object, HOBJECT src, unsigned int value); \
饶先宏's avatar
饶先宏 已提交
188
    static int _obj##_bn_PowUint32(HOBJECT object, HOBJECT src, unsigned int value); \
饶先宏's avatar
饶先宏 已提交
189 190 191 192 193
    static int _obj##_bn_Add(HOBJECT object, HOBJECT src0, HOBJECT src1); \
    static int _obj##_bn_Sub(HOBJECT object, HOBJECT src0, HOBJECT src1); \
    static int _obj##_bn_Mul(HOBJECT object, HOBJECT src0, HOBJECT src1); \
    static int _obj##_bn_Div(HOBJECT object, HOBJECT src0, HOBJECT src1); \
    static int _obj##_bn_Mod(HOBJECT object, HOBJECT src0, HOBJECT src1); \
饶先宏's avatar
饶先宏 已提交
194
    static int _obj##_bn_Pow(HOBJECT object, HOBJECT src0, HOBJECT src1); \
饶先宏's avatar
饶先宏 已提交
195
    static int _obj##_bn_Neg(HOBJECT object, HOBJECT src); \
196
    static int _obj##_bn_Abs(HOBJECT object, HOBJECT src); \
饶先宏's avatar
饶先宏 已提交
197 198
    static int _obj##_bn_IsGT(HOBJECT object, HOBJECT src); \
    static int _obj##_bn_IsGE(HOBJECT object, HOBJECT src); \
饶先宏's avatar
饶先宏 已提交
199
    static int _obj##_bn_IsLT(HOBJECT object, HOBJECT src); \
饶先宏's avatar
饶先宏 已提交
200 201 202 203 204
    static int _obj##_bn_IsLE(HOBJECT object, HOBJECT src); \
    static int _obj##_bn_IsEQ(HOBJECT object, HOBJECT src); \
    static int _obj##_bn_IsNE(HOBJECT object, HOBJECT src); \
    static int _obj##_bn_IsZero(HOBJECT object); \
    static int _obj##_bn_IsNotZero(HOBJECT object); \
205
    static int _obj##_bn_IsNeg(HOBJECT object); \
饶先宏's avatar
饶先宏 已提交
206 207
    static int _obj##_bn_AndL(HOBJECT object, HOBJECT src); \
    static int _obj##_bn_OrL(HOBJECT object, HOBJECT src); \
208
    static int _obj##_bn_NotL(HOBJECT object); \
饶先宏's avatar
饶先宏 已提交
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
    static int _obj##_bn_And(HOBJECT object, HOBJECT src0, HOBJECT src1); \
    static int _obj##_bn_Or(HOBJECT object, HOBJECT src0, HOBJECT src1); \
    static int _obj##_bn_Xor(HOBJECT object, HOBJECT src0, HOBJECT src1); \
    static int _obj##_bn_Not(HOBJECT object, HOBJECT src); \
    static int _obj##_bn_uAnd(HOBJECT object, HOBJECT src); \
    static int _obj##_bn_uAndNot(HOBJECT object, HOBJECT src); \
    static int _obj##_bn_uOr(HOBJECT object, HOBJECT src); \
    static int _obj##_bn_uOrNot(HOBJECT object, HOBJECT src); \
    static int _obj##_bn_uXor(HOBJECT object, HOBJECT src); \
    static int _obj##_bn_uXorNot(HOBJECT object, HOBJECT src); \
    static int _obj##_bn_SHL(HOBJECT object, HOBJECT src, int bits); \
    static int _obj##_bn_SHR(HOBJECT object, HOBJECT src, int bits); \
    static int _obj##_bn_SAL(HOBJECT object, HOBJECT src, int bits); \
    static int _obj##_bn_SAR(HOBJECT object, HOBJECT src, int bits); \
static const IBigNumber _obj##_bn_interface = { \
饶先宏's avatar
饶先宏 已提交
224
   	INTERFACE_HEADER(_obj, IBigNumber, _localstruct) \
饶先宏's avatar
饶先宏 已提交
225 226
        _obj##_bn_GetWidth, \
        _obj##_bn_SetWidth, \
饶先宏's avatar
饶先宏 已提交
227 228
        _obj##_bn_IsUnsigned, \
        _obj##_bn_SetUnsigned, \
饶先宏's avatar
饶先宏 已提交
229 230
        _obj##_bn_GetBits32, \
        _obj##_bn_SetBits32, \
231 232 233
        _obj##_bn_GetBit, \
        _obj##_bn_SetBit, \
       _obj##_bn_GetInt32, \
饶先宏's avatar
饶先宏 已提交
234
        _obj##_bn_GetInt64, \
饶先宏's avatar
饶先宏 已提交
235 236
        _obj##_bn_GetUint32, \
        _obj##_bn_GetUint64, \
饶先宏's avatar
饶先宏 已提交
237
        _obj##_bn_GetStr, \
饶先宏's avatar
饶先宏 已提交
238
        _obj##_bn_AssignInt32, \
饶先宏's avatar
饶先宏 已提交
239
        _obj##_bn_AssignInt64, \
饶先宏's avatar
饶先宏 已提交
240 241 242 243 244
        _obj##_bn_AssignUint32, \
        _obj##_bn_AssignUint64, \
        _obj##_bn_AssignStr, \
        _obj##_bn_Clone, \
        _obj##_bn_CloneSubBits, \
饶先宏's avatar
饶先宏 已提交
245
        _obj##_bn_Assign, \
饶先宏's avatar
饶先宏 已提交
246 247 248 249 250 251
        _obj##_bn_AssignSubBits, \
        _obj##_bn_AddInt32, \
        _obj##_bn_SubInt32, \
        _obj##_bn_MulInt32, \
        _obj##_bn_DivInt32, \
        _obj##_bn_ModInt32, \
饶先宏's avatar
饶先宏 已提交
252
        _obj##_bn_PowInt32, \
饶先宏's avatar
饶先宏 已提交
253 254 255
        _obj##_bn_AddUint32, \
        _obj##_bn_SubUint32, \
        _obj##_bn_MulUint32, \
256
        _obj##_bn_DivUint32, \
饶先宏's avatar
饶先宏 已提交
257
        _obj##_bn_ModUint32, \
饶先宏's avatar
饶先宏 已提交
258
        _obj##_bn_PowUint32, \
饶先宏's avatar
饶先宏 已提交
259 260 261 262
        _obj##_bn_Add, \
        _obj##_bn_Sub, \
        _obj##_bn_Mul, \
        _obj##_bn_Div, \
饶先宏's avatar
饶先宏 已提交
263
        _obj##_bn_Mod, \
饶先宏's avatar
饶先宏 已提交
264
        _obj##_bn_Pow, \
饶先宏's avatar
饶先宏 已提交
265
        _obj##_bn_Neg, \
266
        _obj##_bn_Abs, \
饶先宏's avatar
饶先宏 已提交
267 268 269 270 271 272 273 274
        _obj##_bn_IsGT, \
        _obj##_bn_IsGE, \
        _obj##_bn_IsLT, \
        _obj##_bn_IsLE, \
        _obj##_bn_IsEQ, \
        _obj##_bn_IsNE, \
        _obj##_bn_IsZero, \
        _obj##_bn_IsNotZero, \
275
        _obj##_bn_IsNeg, \
饶先宏's avatar
饶先宏 已提交
276 277 278 279 280 281
        _obj##_bn_AndL, \
        _obj##_bn_OrL, \
        _obj##_bn_NotL, \
        _obj##_bn_And, \
        _obj##_bn_Or, \
        _obj##_bn_Xor, \
饶先宏's avatar
饶先宏 已提交
282 283
        _obj##_bn_Not, \
        _obj##_bn_uAnd, \
饶先宏's avatar
饶先宏 已提交
284
        _obj##_bn_uAndNot, \
饶先宏's avatar
饶先宏 已提交
285
        _obj##_bn_uOr, \
饶先宏's avatar
饶先宏 已提交
286
        _obj##_bn_uOrNot, \
饶先宏's avatar
饶先宏 已提交
287
        _obj##_bn_uXor, \
饶先宏's avatar
饶先宏 已提交
288 289 290 291 292
        _obj##_bn_uXorNot, \
        _obj##_bn_SHL, \
        _obj##_bn_SHR, \
        _obj##_bn_SAL, \
        _obj##_bn_SAR, \
饶先宏's avatar
饶先宏 已提交
293 294
    };

饶先宏's avatar
饶先宏 已提交
295 296

DEFINE_GUID(CLSID_BIGINTEGER, 0xabde0235, 0x8f00, 0x4f30, 0x92, 0xbf, 0x95, 0x2e, 0x35, 0x8b, 0x1a, 0xeb);
饶先宏's avatar
饶先宏 已提交
297
DEFINE_GUID(PARAMID_BIGINTEGERWIDTH, 0xb3a21034, 0x27d5, 0x4e09, 0xba, 0xfd, 0x2, 0xeb, 0x0, 0xfc, 0x28, 0xfb);
饶先宏's avatar
饶先宏 已提交
298

饶先宏's avatar
饶先宏 已提交
299
IBigNumber** bigintegerCreate(int width);
饶先宏's avatar
饶先宏 已提交
300
IBigNumber** bigintegerCreate2(int width, int isunsigned);
饶先宏's avatar
饶先宏 已提交
301

饶先宏's avatar
饶先宏 已提交
302 303 304 305 306 307 308
#endif /* _ASMLANGUAGE */

#ifdef __cplusplus
}
#endif

#endif /* __BIGNUMBER_H */