как я могу подсчитать количество установленных битов в uint в specman?

Я хочу подсчитать количество установленных битов в uint в Specman:

var x: uint;
gen x;
var x_set_bits: uint;
x_set_bits = ?;

Как лучше всего это сделать?


person Nathan Fellman    schedule 12.01.2009    source источник


Ответы (2)


Я не знаю Specman, но другой способ, который я видел, выглядит немного дрянным, но имеет тенденцию быть эффективным: держите массив из 256 элементов; каждый элемент массива состоит из числа битов, соответствующих этому значению. Например (псевдокод):

bit_count = [0, 1, 1, 2, 1, ...]

Таким образом, bit_count2 == 1, потому что значение 2 в двоичном формате имеет один бит "1". Аналогично, bit_count[255] == 8.

Затем разбейте uint на байты, используйте значения байтов для индексации массива bit_count и добавьте результаты. Псевдокод:

total = 0
for byte in list_of_bytes
    total = total + bit_count[byte]

ИЗМЕНИТЬ

Эта проблема описана в книге Красивый код, в главе, написанной Генри С. Уоррен. Кроме того, Matt Howells показывает реализацию на языке C, которая эффективно вычисляет количество битов. См. этот ответ.

person Brian Clapper    schedule 12.01.2009
comment
Натан, это может быть более эффективно в скомпилированном коде (поскольку Specman переводится на C или C++), но вам нужно будет проверить, будет ли это более эффективным, чем ответ, который вы опубликовали. Specman реализует некоторые структуры данных очень плохо (по крайней мере, в 6.1). - person Ross Rogers; 14.01.2009
comment
Их реализация словаря очень медленная, когда вы помещаете в него миллион элементов — в 1000 раз медленнее, чем аналогичный словарь в python. Кто знает, как они на самом деле реализуют списки. Если вам нужна скорость, вы должны измерить производительность этих двух алгоритмов. - person Ross Rogers; 14.01.2009
comment
Использование встроенных методов может быть быстрее. Specman может делать сумасшедшие вещи, такие как копирование своего объекта int по ссылке.... Если вы хотите посмотреть код, сгенерированный Specman, найдите sn_compile.sh на этой странице: - person Ross Rogers; 14.01.2009
comment
ldiracdelta.blogspot.com/2008/ 09/ - person Ross Rogers; 14.01.2009

Один из способов, который я видел, это:

x_set_bits = pack(NULL, x).count(it == 1);

pack(NULL, x) преобразует x в список битов.
count действует на список и подсчитывает все элементы, для которых выполняется условие. В этом случае условие состоит в том, что элемент равен 1, что соответствует количеству установленных битов.

person Nathan Fellman    schedule 12.01.2009