Como posso contar o número de bits definidos em um UINT em Specman?

StackOverflow https://stackoverflow.com/questions/435188

  •  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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top