Niveles de lógica de informe

author-image

Por

Cuando se cierra la sincronización en un diseño, a menudo es útil saber cuántos niveles de lógica se encuentran en las rutas de acceso con fallas. El analizador de sincronización muestra el número de niveles de lógica cuando se informa la sincronización de una ruta, pero no hay un informe predeterminado que enumera el número de niveles de lógica para un conjunto de rutas. Este ejemplo de diseño define un procedimiento personalizado que se puede utilizar para crear informes que muestran la cantidad de niveles de lógica para conjuntos de rutas de acceso.

El procedimiento personalizado admite los mismos argumentos que el comando report_timing. Debe utilizar las mismas opciones con el procedimiento personalizado que haría con el comando report_timing. El procedimiento personalizado también admite tres opciones adicionales: -greater_than <value>, -less_than <value> y -file <report file>. Puede utilizar las opciones -greater_than y -less_than para limitar los informes a rutas con niveles superiores o inferiores a los niveles de lógica especificados. Puede utilizar la opción -file para escribir el informe en un archivo.

El procedimiento personalizado muestra los números de niveles de lógica de las rutas con el peor tiempo flojo. No necesariamente se muestran las rutas en el diseño con el mayor número de niveles de lógica. Los caminos con el peor tiempo flojo no siempre son los caminos con el mayor número de niveles de lógica, aunque eso a menudo es cierto.

Operación del procedimiento

El procedimiento personalizado utiliza los pasos siguientes.

  1. Obtenga una lista de rutas que cumplen con los criterios de creación de informes
  2. Obtenga el número de niveles de lógica de cada ruta
  3. Mostrar el número de niveles de información de lógica y ruta en un gráfico

Paso 1: Obtenga una lista de rutas

El procedimiento personalizado utiliza el comando get_timing_paths, que admite los mismos argumentos que el comando report_timing. Puede utilizar cualquier opción para report_timing para controlar el análisis de la sincronización. Por ejemplo, podría restringir el informe del número de niveles de lógica a las rutas que terminan en un nombre de registro determinado. El siguiente código Tcl muestra la definición de procedimiento y pasa todos los argumentos al comando get_timing_paths.

proc report_levels_of_logic { preconfigurar } {
    
    # Pasar todos los argumentos directos a get_timing_paths si {
    [catch { eval get_timing_paths $args } paths_col] } {
        post_message error -type $paths_col
        return }
}

Paso 2: Obtenga el número de niveles de lógica de cada ruta

Utilice un bucle para iterar sobre la colección de rutas en la variable paths_col y extraiga el número de niveles de lógica en cada ruta de acceso. Guarde la información sobre la ruta en una estructura de datos de matriz de Tcl que se utilizará para imprimir los resultados. La información que se guarda es el número de niveles de lógica, la vago de la ruta y los nombres de los nodos de origen y destino.

foreach_in_collection path_obj $paths_col {

        # ¿Cuántos niveles de lógica hay en la ruta de acceso?
        establezca levels_of_logic [get_path_info -num_logic_levels $path_érica] # Agregue
        
        la información de ruta a una matriz.
        $logic_levels_matrix agregar fila [list \
            $levels_of_logic \
            [get_path_info -slack $path_ preconfigur] \
            \ [get_node_info -name [get_path_info -from $path_pic]] \
            [get_node_info -name [get_path_info -to $path_personal]] ]
    }

Paso 3: Mostrar información de ruta en un gráfico

Por último, muestre toda la información de ruta almacenada en la variable de matriz. Este ejemplo utiliza el paquete de informe Tcl para formatear la matriz a fin de imprimirla. El siguiente código agrega una fila de encabezado a la matriz, define el estilo visual del informe, establece la barra de diálogo de celdas y muestra el informe.

# Colocar en la fila de encabezado
        $logic_levels_matrix insert row 0 \
            [list "Levels of logic" "Slack" "From" "To"]
    
        # Necesitamos un estilo definido para imprimir la tabla de resultados catch {
        ::report::rmivo basicrpt }
        ::report::d ef femenino basicrpt {{cap_rows 1}} { conjunto de
            datos        [split "[string repeat " "   [columns];"]
            top         set [dividir "[string repeat "+ - " [columns]+"]
            bottom set      [top get]
            topcapsep   set [top get]
            topdata set     [data get]
            topcapsep   enable bottom enable
            tcaption    $cap_rows
        } # Crear el
        
        informe, establecer las columnas para que tengan un espacio de resguardo, y
        # imprimir la matriz con el formato especificado catch { r destroy }
        ::report::report r 4 estilo basicrptpt
        para { establecer col 0 } { $col < [r columnas]} { incr col } {
            r pad $col ambas " " } post_message
        "Niveles de lógica\n[r printmatrix $logic_levels_matrix]"

Procedimiento personalizado

El código para el procedimiento personalizado que se muestra a continuación incluye opciones para escribir el informe en un archivo y limitar las rutas de acceso informadas a menos que el número de niveles de lógica sea mayor que o inferior a los valores especificados por el usuario.

Estos son algunos ejemplos de cómo puede utilizar el procedimiento personalizado.

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

Para utilizar el procedimiento personalizado, guarde el código Tcl a continuación en un archivo denominado report_levels_of_logic.tcl. A continuación, utilice la fuente de comandos report_levels_of_logic.tcl en el indicador de Timing Analyzer Tcl. Abastecimiento del archivo define el procedimiento personalizado. A continuación, puede utilizar el comando recientemente definido report_levels_of_logic hasta que salga del analizador de sincronización.

paquete require cmdline
package require struct::matrix
package require report proc report_levels_of_logic {

exclamar } { set options {
        { "less_than...."" "" "Limit to paths with less than this number" } { "greater_than.pu" "" "Limit to paths with less than this number" } { "greater_than.re cmdline package require cmdline package require struct::matrix package require report proc report_levels_of_logic
        { Limitar a las rutas con un número superior a este número" }
        { "file.router" "" "Output file name" } } el conjunto de
    matrices opts [::cmdline::getKnown Matrices $options]

    # Asegúrese de que se llame al procedimiento con algunos argumentos
    if { [cadena igual a "" $opts(less_than)] && [cadena igual a "" $opts(greater_than)] } {
        post_message advertencia de tipo -type "Debe especificar un valor numérico\ para la devolución
            -less_than o -greater_than" } Cantidad Asegúrese de que se llame al procedimiento con valores de
        argumento numérico if {
    ![ cadena es doble $opts(less_than)] } {
        post_message advertencia de tipo -type "Debe especificar un valor numérico\ para la devolución
            -less_than"
        } si {
    ![ cadena es doble $opts(greater_than)] } {
        post_message advertencia de tipo -type "Debe especificar un valor numérico\ para el retorno
            -greater_than"
        } Crear una matriz para contener información sobre las rutas de acceso
    
    falladas
    establecidas logic_levels_matrix [::struct::matrix]
    $logic_levels_matrix agregar columnas 4

    # Pasar todos los argumentos desconocidos directamente a get_timing_paths
    if { [catch { eval get_timing_paths $args } paths_col] } {
        post_message -type error $paths_col
        return
    }
    
    # Avanzar por la lista de rutas de tiempo, obtener información
    sobre los niveles de la lógica
    foreach_in_collection path_obj $paths_col {
    
        # Suponer que la ruta se notificará, a menos que el número de niveles de
        # lógica esté fuera de los límites especificados.
        establezca include_path 1
        
        # ¿Cuántos niveles de lógica hay en la ruta?
        establezca levels_of_logic [get_path_info -num_logic_levels $path_pic]
        
        # Si especificamos un límite inferior, no informamos la ruta si
        los niveles # de lógica son mayores que o iguales al límite inferior
        if { ! [cadena igual a "" $opts(less_than)] } {
            if { $levels_of_logic >= $opts(less_than) } {
                establecido include_path 0 } } }
        Si
        
        especificamos un límite superior, no informamos la ruta si
        los niveles de cantidad de lógica son inferiores o iguales al límite superior
        if { ! [cadena igual a "" $opts(greater_than)] } {
            if { $levels_of_logic <= $opts(greater_than) } {
                establecer include_path 0 } } } Cantidad si la ruta tiene niveles de lógica que están dentro de nuestros
        
        límites,
        # informe sobre él si {
        $include_path } {
        
            $logic_levels_matrix add row [list \
                $levels_of_logic \
                [get_path_info -slack $path_érica] \
                [get_node_info -name [get_path_info -from $path_ preconfigur]] \
                [get_node_info -name [get_path_info -to $path_ pista]]
        }
    # Terminó de recorrer todas las rutas de get_timing_paths
    
    # Si hay filas en la matriz, las rutas coinciden con los criterios.
    # Tenemos que imprimir la tabla con esa información.
    if { 0 == [$logic_levels_matrix rows] } {
    
        # No hay rutas que cumplan con los criterios # Imprima un mensaje rápido post_message
        "Ninguna ruta cumple con los criterios para informar los niveles de lógica" # Si hay un error al
        
        abrir el archivo, imprima un mensaje que dice
        # eso. De lo contrario, indique que no hay rutas que cumplan con los criterios
        si { ! [cadena igual a "" $opts(archivo)] } {
            if { [catch { open $opts(file) w } fh] } {
                error de tipo de post_message "No se pudo abrir un archivo: $fh"
            } más { pone $fh
                "No hay rutas que cumplan con los criterios para informar los niveles de lógica" catch { cerrar $fh $opts } } } else { # Colocar en la fila de
                encabezado
        $logic_levels_matrix insert row 0 \
            [list "Levels of logic" "Slack" "From" "To"]
    
        # Necesitamos un estilo definido para imprimir la tabla de resultados catch {
        :: report::rm exclamar basicrpt }
        ::report::d ef femenino basicrpt {{cap_rows 1}} { conjunto de
            datos        [dividir "[cadena de repetición " "   [columnas];"]
            top         set [dividir "[string repeat "+ - " [columns]+"]
            bottom set      [top get]
            topcapsep   set [top get]
            topdata set     [data get]
            topcapsep   enable bottom enable
            tcaption    $cap_rows
        } # Crear el
        
        informe, establecer las columnas para que tengan un espacio de resguardo, y
        # imprimir la matriz con el formato especificado catch { r destroy }
        ::report::report r 4 estilo basicrptpt
        para { set col 0 } { $col < [r columns]} { incr col } {
            r pad $col both " } post_message
        "Levels of logic\n[r printmatrix $logic_levels_matrix]" # Guarde el informe en
        
        un archivo si se especifica un nombre de archivo
        if { ! [cadena igual a "" $opts(file)] } {
            if { [catch { open $opts(file) w } fh] } {
                error de tipo post_message "No se pudo abrir un archivo: $fh"
            } más { pone $fh
                "Niveles de lógica"
                r printmatrix2channel $logic_levels_matrix $fh
                catch { cerrar $fh } } } } }
}

El contenido de esta página es una combinación de la traducción humana y automática del contenido original en inglés. Este contenido se ofrece únicamente para su comodidad como información general y no debe considerarse completa o precisa. Si hay alguna contradicción entre la versión en inglés de esta página y la traducción, prevalecerá la versión en inglés. Consulte la versión en inglés de esta página.