1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* -*- mode: C; c-basic-offset: 3; -*- */
2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#ifndef VBITS_H
4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define VBITS_H
5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdint.h>
7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdio.h>
8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef uint64_t uint128_t[2];
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef uint64_t uint256_t[4];
11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* A type to represent V-bits */
13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef struct {
14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   unsigned num_bits;
15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   union {
16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      uint8_t   u8;
17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      uint16_t  u16;
18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      uint32_t  u32;
19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      uint64_t  u64;
20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      uint128_t u128;
21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      uint256_t u256;
22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } bits;
23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} vbits_t;
24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* A type large enough to hold any IRtype'd value. At this point
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   we do not expect to test with specific floating point values.
28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   So we don't need to represent them. */
29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef union {
30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   uint8_t   u8;
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   uint16_t  u16;
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   uint32_t  u32;
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   uint64_t  u64;
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   uint128_t u128;
35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   uint256_t u256;
36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} value_t;
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid    print_vbits(FILE *, vbits_t);
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvbits_t undefined_vbits(unsigned num_bits);
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvbits_t defined_vbits(unsigned num_bits);
42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint     equal_vbits(vbits_t, vbits_t);
43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvbits_t truncate_vbits(vbits_t, unsigned num_bits);
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvbits_t left_vbits(vbits_t, unsigned num_bits);
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvbits_t or_vbits(vbits_t, vbits_t);
46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvbits_t and_vbits(vbits_t, vbits_t);
47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvbits_t concat_vbits(vbits_t, vbits_t);
48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvbits_t upper_vbits(vbits_t);
49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvbits_t sextend_vbits(vbits_t, unsigned num_bits);
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvbits_t zextend_vbits(vbits_t, unsigned num_bits);
51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvbits_t onehot_vbits(unsigned bitno, unsigned num_bits);
52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvbits_t shl_vbits(vbits_t, unsigned amount);
53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvbits_t shr_vbits(vbits_t, unsigned amount);
54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvbits_t sar_vbits(vbits_t, unsigned amount);
55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint     completely_defined_vbits(vbits_t);
56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvbits_t cmpord_vbits(unsigned v1_num_bits, unsigned v2_num_bits);
57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif // VBITS_H
59