Níveis de lógica do relatório

author-image

Por

Quando você está fechando o timing de um projeto, é frequentemente útil saber quantos níveis de lógica estão em caminhos de falha. O Analisador de temporização exibe o número de níveis de lógica quando você informa o tempo de sincronização de um caminho, mas não há um relatório padrão que lista o número de níveis de lógica para um conjunto de caminhos. Este exemplo de projeto define um procedimento personalizado que você pode usar para criar relatórios que mostram o número de níveis de lógica para conjuntos de caminhos.

O procedimento personalizado suporta os mesmos argumentos que o report_timing comando. Você deve usar as mesmas opções com o procedimento personalizado que você faria com o report_timing comando. O procedimento personalizado também suporta três opções adicionais: -greater_than <value>, -less_than <value> e -file <report file>. Você pode usar as opções -greater_than e -less_than para limitar o relatório a caminhos com mais ou menos do que os níveis de lógica especificados. Você pode usar a opção -file para escrever o relatório em um arquivo.

O procedimento personalizado exibe os números de níveis de lógica para os caminhos com a pior folga de tempo. Ele não necessariamente exibe os caminhos no design com o maior número de níveis de lógica. Os caminhos com a pior folga de tempo nem sempre são os caminhos com o maior número de níveis de lógica, embora isso seja muitas vezes verdade.

Operação do procedimento

O procedimento personalizado usa as seguintes etapas.

  1. Obtenha uma lista de caminhos que atendam aos critérios de relatórios
  2. Obtenha o número de níveis de lógica para cada caminho
  3. Exibir o número de níveis de informações lógicas e de caminho em um gráfico

Etapa 1: obtenha uma lista de caminhos

O procedimento personalizado usa o comando get_timing_paths, que suporta os mesmos argumentos do report_timing comando. Você pode usar qualquer opção para report_timing para controlar a análise de tempo. Por exemplo, você pode restringir o relatório do número de níveis de lógica para caminhos que terminam em um determinado nome de registro. O código Tcl a seguir mostra a definição do procedimento e passa todos os argumentos para o get_timing_paths comando.

proc report_levels_of_logic { args } { Passar todos os argumentos direto para get_timing_paths se
    { [catch { eval get_timing_paths $args } paths_col] } {
        erro post_message-tipo $paths_col
        return }
}

Etapa 2: obtenha o número de níveis de lógica para cada caminho

Use um loop para iterar sobre a coleção de caminhos na variável paths_col e extrair o número de níveis de lógica em cada caminho. Salve informações sobre o caminho em uma estrutura de dados da matriz Tcl que será usada para imprimir os resultados. As informações salvas são o número de níveis de lógica, a folga do caminho e os nomes de nó de origem e destino.

foreach_in_collection path_obj $paths_col {

        # Quantos níveis de lógica existem no caminho?
        set levels_of_logic [get_path_info -num_logic_levels $path_obj] # Adicionar as informações
        
        de caminho a uma matriz.
        $logic_levels_matrix add row [list \
            $levels_of_logic \
            [get_path_info -slack $path_obj] \
            [get_node_info -name [get_path_info -from $path_obj]] \
            [get_node_info -name [get_path_info -to $path_obj]]
    ] ]

Etapa 3: Exibir informações sobre o caminho em um gráfico

Por fim, mostre todas as informações de caminho armazenadas na variável matriz. Este exemplo usa o pacote de relatório Tcl para formatar a matriz para imprimi-la. O código a seguir adiciona uma linha de título à matriz, define o estilo visual do relatório, define o preenchimento da célula e exibe o relatório.

# Coloque na linha de cabeçalho $logic_levels_matrix insert row 0 \ [list "Níveis de lógica" "Slack" "From" "To"] # Precisamos de um estilo definido para imprimir a tabela de captura de resultados
            {
        ::report::rmstyle basicrpt }
        ::report:report::d efstyle basicrpt {{cap_rows 1}} { conjunto de dados        [divisão "[string repeat" [colunas];]]
            top set         [split "[string repeat "+ - " [columns]+"] set inferior      [top get]
            topcapsep set [top get] topdata set [data get] top enable topcapsep enable tcaption bottom enable tcaption $cap_rows } # Crie o relatório, defina as colunas para ter um espaço de preenchimento e # imprima a matriz com a captura do formato   especificado { r destroy         }
        ::report::report r 4 style basicrpt
        para { definir col 0 } { $col < [r colunas]} { incr col } { r pad $col ambos " " } post_message "Níveis de
        lógica\n[r printmatrix $logic_levels_matrix]".

Procedimento personalizado

O código para o procedimento personalizado listado abaixo inclui opções para escrever o relatório em um arquivo e limitar os caminhos relatados, a menos que o número de níveis de lógica seja maior ou menor do que os valores especificados pelo usuário.

Estes são alguns exemplos de como você pode usar o procedimento personalizado.

  • report_levels_of_logic -setup -greater_than 10 a [get_registers dados*] -npaths 1000
  • report_levels_of_logic -hold -from_clock core_50 -npaths 50 -file levels.txt

Para usar o procedimento personalizado, salve o código Tcl abaixo em um arquivo chamado report_levels_of_logic.tcl. Em seguida, use a fonte de comando report_levels_of_logic.tcl no prompt Do analisador de sincronização Tcl. A sourcing do arquivo define o procedimento personalizado. Em seguida, você pode usar o comando recém-definido report_levels_of_logic até sair do analisador de sincronização.

pacote requer pacote cmdline requer struct::pacote de matriz requer relatório proc report_levels_of_logic { args } { opções de conjunto { {"less_than.arg" "" "" "Limite para caminhos com menos que este número" } { "greater_than.arg" "" "" " "Limite para caminhos com maior que este
        número" } { "file.arg" "" "Nome do arquivo de saída" } conjunto de matriz
    optes [:cmdline::getKnownOptions args $options]

    #
    Certifique-se de que o procedimento seja chamado com alguns argumentos se { [string igual a "" $opts(less_than)] && [string igual a "" $opts(greater_than)] } { aviso do tipo post_message "Você deve especificar um valor numérico\ para -less_than ou -greater_than" retornar } # Certifique-se de que o procedimento seja chamado com valores de argumento numéricos
            se {
    ![ string é o dobro $opts(less_than)] } { aviso do tipo post_message "Você deve especificar um valor numérico\ para
            -less_than" de devolução } se
        {
    ![ string é o dobro $opts(greater_than)) } { aviso do tipo post_message "Você deve especificar um valor numérico\ para -greater_than" retornar } # Crie uma matriz para manter informações sobre os caminhos logic_levels_matrix
    [::struct::matrix]
    $logic_levels_matrix adicionar colunas 4 # Passe todos os argumentos desconhecidos direto para get_timing_paths se
    { [catch { eval get_timing_paths $args } paths_col] } { erro do tipo
        post_message -tipo $paths_col
        return
    }
    
    # Ande pela lista de caminhos de sincronização, obtendo informações # sobre os níveis de lógica foreach_in_collection path_obj $paths_col { Assumir que o caminho será relatado, a menos que o número de níveis de lógica # esteja fora dos limites
        especificados.
        definir include_path 1
        
        # Quantos níveis de lógica existem no caminho?
        set levels_of_logic [get_path_info -num_logic_levels $path_obj] # Se especificarmos um limite inferior, não relataremos o caminho se os
        níveis de lógica #são maiores ou iguais ao limite inferior se
        { ! [string igual a "" $opts(less_than)] } { se
            { $levels_of_logic >= $opts(less_than) } { definir include_path 0 } } # Se especificarmos um limite superior, não relataremos o caminho se os
        nºs
        de lógica são menores ou iguais ao limite superior se { ! [string igual a "" $opts(greater_than)] } { se { $levels_of_logic <= $opts(greater_than) } { definir include_path 0 } } # Se o caminho tiver níveis de lógica que se enquadram em nossos limites, # informe sobre ele se
                {
        $include_path } {
        
            $logic_levels_matrix add row [list \
                $levels_of_logic \
                [get_path_info -slack $path_obj] \
                [get_node_info -name [get_path_info -from $path_obj]] \
                [get_node_info -name [get_path_info -to $path_obj]]
        }
    }
    # Terminei de passar por todos os caminhos da get_timing_paths # Se houver alguma linha na matriz, os caminhos corresponderão
    
    aos critérios.
    # Temos que imprimir a tabela com essas informações.
    se { 0 == [$logic_levels_matrix rows] } { # Nenhum caminho atender aos critérios # Imprimir uma mensagem rápida post_message "Nenhum caminho atenderá aos critérios para relatar níveis de lógica" # Se houver um erro abrindo o arquivo, imprima uma mensagem dizendo
        #
        isso. Caso contrário, diga que não há caminhos que atenderão aos
        critérios se { ! [string igual a "" $opts(arquivo)] } { se { [catch { open $opts(file) w } fh] } { erro de tipo post_message "Não foi possível abrir o arquivo: $fh" } mais { coloca $fh captura "Nenhum caminho atenderá aos critérios para relatar níveis de lógica" $fh { fechar } } } mais { # Coloque na linha de cabeçalho
        $logic_levels_matrix insert row 0 \
            [list "Níveis de lógica" "Slack" "From" "To"] #
        Precisamos de um estilo definido para imprimir a tabela de captura de resultados { :: relatório::rmstyle basicrpt }
        ::report::d efstyle basicrpt {{cap_rows 1}} { conjunto de dados        [split "[string repeat "   [colunas];"]
            top set         [split "[string repeat "+ - " [columns]+"] set inferior      [top get]
            topcapsep set [top get] topdata set [data get] top enable topcapsep enable tcaption bottom enable tcaption $cap_rows } # Crie o relatório, defina as colunas para ter um espaço de preenchimento e # imprima a matriz com a captura do formato   especificado { r destroy         }
        ::report::report r 4 style basicrpt
        para { definir col 0 } { $col < [r colunas]} { incr col } { r pad $col ambos " " } post_message "Níveis de
        lógica\n[r printmatrix $logic_levels_matrix]"
        
        #
        Salve o relatório em um arquivo se um nome de arquivo for especificado se { ! [string igual a "" $opts(arquivo)] } { se { [catch { open $opts(file) w } fh] } { erro de tipo post_message "Não foi possível abrir o arquivo: $fh" } outra { coloca $fh "Níveis de
                lógica"
                r printmatrix2channel $logic_levels_matrix $fh
                catch {
fechar $fh } } } } }

O conteúdo desta página é uma combinação de tradução humana e por computador do conteúdo original em inglês. Este conteúdo é fornecido para sua conveniência e apenas para informação geral, e não deve ser considerado completo ou exato. Se houver alguma contradição entre a versão em inglês desta página e a tradução, a versão em inglês prevalecerá e será a determinante. Exibir a versão em inglês desta página.