Como posso contar o número de bits definidos em um UINT em Specman?
-
10-07-2019 - |
Pergunta
Eu quero contar o número de bits definidos em um UINT em Specman:
var x: uint;
gen x;
var x_set_bits: uint;
x_set_bits = ?;
Qual é a melhor forma de fazer isso?
Solução
Não conheço Specman, mas outra maneira de ver isso feito parece um pouco extravagante, mas tende a ser eficiente: mantenha uma matriz de 256 elementos; Cada elemento da matriz consiste no número de bits correspondentes a esse valor. Por exemplo (pseudocode):
bit_count = [0, 1, 1, 2, 1, ...]
Assim, bit_count2 == 1, porque o valor 2, em binário, tem um único bit "1". Simiarmente, bit_count [255] == 8.
Em seguida, divida o UINT em bytes, use os valores de bytes para indexar na matriz bit_count e adicione os resultados. Pseudo-código:
total = 0
for byte in list_of_bytes
total = total + bit_count[byte]
EDITAR
Esta edição aparece no livro Belo código, no capítulo de Henry S. Warren. Além disso, Matt Howells mostra uma implementação em língua C que calcula com eficiência uma contagem de bits. Ver esta resposta.
Outras dicas
Uma maneira que eu vi é:
x_set_bits = pack(NULL, x).count(it == 1);
pack(NULL, x)
convertidos x
para uma lista de bits.
count
Atua na lista e conta com todos os elementos para os quais a condição se mantém. Nesse caso, a condição é que o elemento é igual a 1, que sai para o número de bits definidos.