1 /****************************************************************************** 2 * Copyright (c) 2022 Telink Semiconductor (Shanghai) Co., Ltd. ("TELINK") 3 * All rights reserved. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 *****************************************************************************/ 18 19 /******************************************************************************************************** 20 * @file bit.h 21 * 22 * @brief This is the header file for B91 23 * 24 * @author Driver Group 25 * 26 *******************************************************************************************************/ 27 #ifndef BIT_H_ 28 #define BIT_H_ 29 30 #ifndef BIT 31 #define BIT(n) ( 1<<(n)) 32 #endif 33 #define BIT_MASK_LEN(len) (BIT(len)-1) 34 #define BIT_RNG(s, e) (BIT_MASK_LEN((e)-(s)+1) << (s)) 35 36 #define BM_CLR_MASK_V(x, mask) ( (x) & ~(mask) ) 37 38 39 #define BM_SET(x, mask) ( (x) |= (mask) ) 40 #define BM_CLR(x, mask) ( (x) &= ~(mask) ) 41 #define BM_IS_SET(x, mask) ( (x) & (mask) ) 42 #define BM_IS_CLR(x, mask) ( (~x) & (mask) ) 43 #define BM_FLIP(x, mask) ( (x) ^= (mask) ) 44 45 /** 46 * define Reg operations 47 */ 48 49 // Return the bit index of the lowest 1 in y. ex: 0b00110111000 --> 3 50 #define BIT_LOW_BIT(y) (((y) & BIT(0))?0:(((y) & BIT(1))?1:(((y) & BIT(2))?2:(((y) & BIT(3))?3: \ 51 (((y) & BIT(4))?4:(((y) & BIT(5))?5:(((y) & BIT(6))?6:(((y) & BIT(7))?7: \ 52 (((y) & BIT(8))?8:(((y) & BIT(9))?9:(((y) & BIT(10))?10:(((y) & BIT(11))?11: \ 53 (((y) & BIT(12))?12:(((y) & BIT(13))?13:(((y) & BIT(14))?14:(((y) & BIT(15))?15: \ 54 (((y) & BIT(16))?16:(((y) & BIT(17))?17:(((y) & BIT(18))?18:(((y) & BIT(19))?19: \ 55 (((y) & BIT(20))?20:(((y) & BIT(21))?21:(((y) & BIT(22))?22:(((y) & BIT(23))?23: \ 56 (((y) & BIT(24))?24:(((y) & BIT(25))?25:(((y) & BIT(26))?26:(((y) & BIT(27))?27: \ 57 (((y) & BIT(28))?28:(((y) & BIT(29))?29:(((y) & BIT(30))?30:(((y) & BIT(31))?31:32 \ 58 )))))))))))))))))))))))))))))))) 59 60 // Return the bit index of the highest 1 in (y). ex: 0b00110111000 --> 8 61 #define BIT_HIGH_BIT(y) (((y) & BIT(31))?31:(((y) & BIT(30))?30:(((y) & BIT(29))?29:(((y) & BIT(28))?28: \ 62 (((y) & BIT(27))?27:(((y) & BIT(26))?26:(((y) & BIT(25))?25:(((y) & BIT(24))?24: \ 63 (((y) & BIT(23))?23:(((y) & BIT(22))?22:(((y) & BIT(21))?21:(((y) & BIT(20))?20: \ 64 (((y) & BIT(19))?19:(((y) & BIT(18))?18:(((y) & BIT(17))?17:(((y) & BIT(16))?16: \ 65 (((y) & BIT(15))?15:(((y) & BIT(14))?14:(((y) & BIT(13))?13:(((y) & BIT(12))?12: \ 66 (((y) & BIT(11))?11:(((y) & BIT(10))?10:(((y) & BIT(9))?9:(((y) & BIT(8))?8: \ 67 (((y) & BIT(7))?7:(((y) & BIT(6))?6:(((y) & BIT(5))?5:(((y) & BIT(4))?4: \ 68 (((y) & BIT(3))?3:(((y) & BIT(2))?2:(((y) & BIT(1))?1:(((y) & BIT(0))?0:32 \ 69 )))))))))))))))))))))))))))))))) 70 71 #define COUNT_ARGS_IMPL2(_1, _2, _3, _4, _5, _6, _7, _8 , _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, N, ...) N 72 #define COUNT_ARGS_IMPL(args) COUNT_ARGS_IMPL2 args 73 #define COUNT_ARGS(...) COUNT_ARGS_IMPL((__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)) 74 75 #define MACRO_CHOOSE_HELPER2(base, count) base##count 76 #define MACRO_CHOOSE_HELPER1(base, count) MACRO_CHOOSE_HELPER2(base, count) 77 #define MACRO_CHOOSE_HELPER(base, count) MACRO_CHOOSE_HELPER1(base, count) 78 79 #define MACRO_GLUE(x, y) x y 80 #define VARARG(base, ...) MACRO_GLUE(MACRO_CHOOSE_HELPER(base, COUNT_ARGS(__VA_ARGS__)),(__VA_ARGS__)) 81 82 #define MV(m, v) (((v) << BIT_LOW_BIT(m)) & (m)) 83 84 // warning MASK_VALn are internal used macro, please use MASK_VAL instead 85 #define MASK_VAL2(m, v) (MV(m,v)) 86 #define MASK_VAL4(m1,v1,m2,v2) (MV(m1,v1)|MV(m2,v2)) 87 #define MASK_VAL6(m1,v1,m2,v2,m3,v3) (MV(m1,v1)|MV(m2,v2)|MV(m3,v3)) 88 #define MASK_VAL8(m1,v1,m2,v2,m3,v3,m4,v4) (MV(m1,v1)|MV(m2,v2)|MV(m3,v3)|MV(m4,v4)) 89 #define MASK_VAL10(m1,v1,m2,v2,m3,v3,m4,v4,m5,v5) (MV(m1,v1)|MV(m2,v2)|MV(m3,v3)|MV(m4,v4)|MV(m5,v5)) 90 #define MASK_VAL12(m1,v1,m2,v2,m3,v3,m4,v4,m5,v5,m6,v6) (MV(m1,v1)|MV(m2,v2)|MV(m3,v3)|MV(m4,v4)|MV(m5,v5)|MV(m6,v6)) 91 #define MASK_VAL14(m1,v1,m2,v2,m3,v3,m4,v4,m5,v5,m6,v6,m7,v7) (MV(m1,v1)|MV(m2,v2)|MV(m3,v3)|MV(m4,v4)|MV(m5,v5)|MV(m6,v6)|MV(m7,v7)) 92 #define MASK_VAL16(m1,v1,m2,v2,m3,v3,m4,v4,m5,v5,m6,v6,m7,v7,m8,v8) (MV(m1,v1)|MV(m2,v2)|MV(m3,v3)|MV(m4,v4)|MV(m5,v5)|MV(m6,v6)|MV(m7,v7)|MV(m8,v8)) 93 94 #define MASK_VAL(...) VARARG(MASK_VAL, __VA_ARGS__) 95 96 97 #endif 98