объединить биты С++

Я ищу элегантный С++, использующий SystemC для объединения битов.

Пример System Verilog в одной красивой строке:

bool my_variable;
uint bits_combination = {8'b0, {8{my_variable}}, 8'b1, 4'b0, 2'b1, 2'b0};

Мое лучшее решение для С++:

bool my_variable;
sc_uint<32> bits_combination;
bits_combination.range(31,24) = 0;
bits_combination.range(23,16) = my_variable ? (1 << 8)-1  : 0;
bits_combination.range(15,8)  = (1 << 8)-1;
bits_combination.range(7,4)   = 0;
bits_combination.range(3,2)   = (1 << 2)-1;
bits_combination.range(1,0)   = 0;

Улучшение этой строки до нетернарного оператора также поможет:

my_variable ? (1 << 8)-1  : 0

person Noa Yehezkel    schedule 22.02.2017    source источник
comment
Остальные биты постоянны? uint в примере системного verilog имеет 34 бита? Если остальные не меняются, это как маска и или в (255 ‹‹ 16), если моя переменная истинна?   -  person Colin    schedule 22.02.2017


Ответы (2)


В SystemC оператор запятой перегружен для конкатенации. Но нет такого оператора репликации, как {8{my_variable}}.

Но вы можете написать функцию, которая будет выполнять репликацию. Например:

template <int N, int M>
sc_uint<N*M> replicate( sc_uint<M> val) {
    sc_uint<N*M> res = 0;
    for (int i = 0; i < N; ++i)
        res = (res << M) | val;
    return res;
};

Таким образом, версия SystemC вашего образца SystemVerilog может выглядеть так:

sc_uint<1> my_variable = 1;
sc_uint<32> bits_concatenation = (sc_uint<8>(0), replicate<8>(my_variable), sc_uint<8>(1), sc_uint<4>(0), sc_uint<2>(1), sc_uint<4>(0) );
person random    schedule 23.02.2017
comment
Есть ли способ преобразовать sc_lv в sc_uint? Если это так, нам не нужна функция репликации. - person Noa Yehezkel; 27.02.2017
comment
Я не совсем понял идею sc_lv. Не могли бы вы уточнить это в деталях? В общем, я думаю, что можно написать шаблонную функцию репликации, которая будет поддерживать различные типы данных. - person random; 28.02.2017
comment
sc_lv — это логический тип произвольной ширины, это документация sc_lv lysium.de /docs/systemc-2.2/docs/html/classsc__dt_1_1sc__lv.html имеет c'tor для инициализации всех битов одним и тем же значением: template‹int W› sc_dt::sc_lv‹ W ›::sc_lv ( bool инициал_значение) - person Noa Yehezkel; 28.02.2017
comment
Да, но что, если вы хотите воспроизвести какой-то шаблон? Как повторить 010 3 раза, чтобы получить 010010010? - person random; 28.02.2017
comment
Также могу порекомендовать типы AC mentor.com/hls-lp/downloads/ac- типы данных для целых чисел произвольной ширины, фиксированных и с плавающей запятой. - person random; 28.02.2017
comment
Ваше решение более общее, мне не нужно копировать шаблоны только один раз. Кстати, в вашем решении вам также необходимо использовать функцию шаблона replicate для sc_uint‹8›(1) и sc_uint‹2›(1). иначе у вас будет 00000001 и 01 вместо 11111111 и 11 - person Noa Yehezkel; 28.02.2017

Похоже

  0b0000'0000'0000'0000'1111'1111'0000'1100 | 
( 0b0000'0000'1111'1111'0000'0000'0000'0000 * myVariable )
person MSalters    schedule 22.02.2017