bignumber.h 13.5 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
/*
** 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
饶先宏's avatar
饶先宏 已提交
52 53
    int (*GetWidth)(HOBJECT object);
    int (*SetWidth)(HOBJECT object, int width, int signexpand);
饶先宏's avatar
饶先宏 已提交
54 55 56
    
    int (*GetBits32)(HOBJECT object, int index, unsigned int* pbits);
    int (*SetBits32)(HOBJECT object, int index, unsigned int bits);
饶先宏's avatar
饶先宏 已提交
57

饶先宏's avatar
饶先宏 已提交
58
    int (*GetInt32)(HOBJECT object, int* pvalue);
饶先宏's avatar
饶先宏 已提交
59
    int (*GetInt64)(HOBJECT object, long long* pvalue);
饶先宏's avatar
饶先宏 已提交
60 61 62
    int (*GetUint32)(HOBJECT object, unsigned int* pvalue);
    int (*GetUint64)(HOBJECT object, unsigned long long* pvalue);

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

饶先宏's avatar
饶先宏 已提交
65
    int (*AssignInt32)(HOBJECT object, int value);
饶先宏's avatar
饶先宏 已提交
66
    int (*AssignInt64)(HOBJECT object, long long value);
饶先宏's avatar
饶先宏 已提交
67 68 69 70 71 72 73
    int (*AssignUint32)(HOBJECT object, unsigned int value);
    int (*AssignUint64)(HOBJECT object, unsigned long long value);

    int (*AssignStr)(HOBJECT object, const char* str, const char** nstr);

    int (*Clone)(HOBJECT object, HOBJECT src);
    int (*CloneSubBits)(HOBJECT object, HOBJECT src, int from, int width);
饶先宏's avatar
饶先宏 已提交
74
    int (*Assign)(HOBJECT object, HOBJECT src);
饶先宏's avatar
饶先宏 已提交
75 76 77
    int (*AssignSubBits)(HOBJECT object, HOBJECT src, int from, int width);
    int (*AssignU)(HOBJECT object, HOBJECT src);
    int (*AssignSubBitsU)(HOBJECT object, HOBJECT src, int from, int width);
饶先宏's avatar
饶先宏 已提交
78

饶先宏's avatar
饶先宏 已提交
79 80 81 82 83
    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
饶先宏 已提交
84

饶先宏's avatar
饶先宏 已提交
85 86 87 88 89
    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
饶先宏 已提交
90

饶先宏's avatar
饶先宏 已提交
91 92 93 94 95
    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
饶先宏 已提交
96

饶先宏's avatar
饶先宏 已提交
97 98 99 100 101 102 103 104 105 106
    int (*AddU)(HOBJECT object, HOBJECT src0, HOBJECT src1);
    int (*SubU)(HOBJECT object, HOBJECT src0, HOBJECT src1);
    int (*MulU)(HOBJECT object, HOBJECT src0, HOBJECT src1);
    int (*DivU)(HOBJECT object, HOBJECT src0, HOBJECT src1);
    int (*ModU)(HOBJECT object, HOBJECT src0, HOBJECT src1);

    int (*Neg)(HOBJECT object, HOBJECT src);

    int (*IsGT)(HOBJECT object, HOBJECT src);
    int (*IsGE)(HOBJECT object, HOBJECT src);
饶先宏's avatar
饶先宏 已提交
107
    int (*IsLT)(HOBJECT object, HOBJECT src);
饶先宏's avatar
饶先宏 已提交
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
    int (*IsLE)(HOBJECT object, HOBJECT src);
    int (*IsEQ)(HOBJECT object, HOBJECT src);
    int (*IsNE)(HOBJECT object, HOBJECT src);

    int (*IsGTU)(HOBJECT object, HOBJECT src);
    int (*IsGEU)(HOBJECT object, HOBJECT src);
    int (*IsLTU)(HOBJECT object, HOBJECT src);
    int (*IsLEU)(HOBJECT object, HOBJECT src);
    int (*IsEQU)(HOBJECT object, HOBJECT src);
    int (*IsNEU)(HOBJECT object, HOBJECT src);

    int (*IsZero)(HOBJECT object);
    int (*IsNotZero)(HOBJECT object);

    int (*AndL)(HOBJECT object, HOBJECT src);
    int (*OrL)(HOBJECT object, HOBJECT src);
    int (*NotL)(HOBJECT object, HOBJECT src);

    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
饶先宏 已提交
143 144
}IBigNumber;

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

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

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

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

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

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

#ifdef __cplusplus
}
#endif

#endif /* __BIGNUMBER_H */