A los nodos de la lista de redes de temporización Quartus II se les hace referencia con identificadores, que son enteros positivos. Cada nodo tiene un nombre, el nombre en la lista de conexiones posteriores a la adaptación. Cuando trabaja con la lista de temporización netlist con comandos en el paquete::quartus::advanced_timing, es común buscar un nodo basado en su nombre. Por ejemplo, es posible que desee rastrear el ventilador de un pin de E/S determinado. Para ello, debe encontrar el IDENTIFICADOR de nodo que tiene el nombre de pin del que desea rastrear. El siguiente procedimiento de ejemplo busca en todos los nodos de sincronización en la lista de redes el nombre que especifique y devolver el IDENTIFICADOR del nodo coincidente, o -1 si no existe.
paquete require ::quartus::advanced_timing proc find { name } { foreach_in_collection node_id [get_timing_nodes -type all] { set node_name [get_timing_node_info -info name $node_id] if { [string equal $name $node_name ] } { return $node_id } return -1 }
En un script de Tcl, puede llamar a ese procedimiento como se muestra en el siguiente ejemplo:
set id [encontrar clk_33MHz] si { $id == -1 } { post_message advertencia de tipo "No se pudo encontrar el nodo del pin del reloj" }
Mejora del código de muestra
Hay una variedad de maneras en que se puede mejorar el código de ejemplo.
- Agregar compatibilidad con la resocuperación y múltiples identificadores devueltos
- Filtrado de tipo de nodo
Agregar compatibilidad con la resocuperación y múltiples identificadores devueltos
La necesidad de una coincidencia exacta se vuelve inconveniente para los nombres con rutas de jerarquía largas. Si se cambia el ejemplo para admitir coincidencias de valores, se facilita la búsqueda de nodos con vías de jerarquía extensas. Con una modificación adicional para devolver varios identificadores de nodo para todas las coincidencias, puede utilizar el script para devolver grupos de identificadores de nodos. Esto facilita la iteración en todos los bits de un bus, por ejemplo.
Debido a que una opción de constelación puede coincidir con más de un nombre, es necesario admitir varios identificadores devueltos. Una forma fácil de hacer es devolver una lista de todos los identificadores de nodos con nombres que coincidan con el patrón. Si no hay nombres que coincidan con el patrón, se devuelve una lista vacía.
El siguiente ejemplo busca en todos los nodos de la lista de redes de temporización y devuelve una lista con cada ID de nodo que tiene un nombre que coincida con el patrón. En este ejemplo, se utiliza la equiparación de estilo Tcl glob, con compatibilidad para marcas de insoborno (*), signos de pregunta (?) y pinzas cuadradas ([]).
paquete require ::quartus::advanced_timing proc find { pattern } { set return_ids {} foreach_in_collection node_id [get_timing_nodes -type all] { set node_name [get_timing_node_info -info name $node_id] if { [string match $pattern $node_name ] } { lappend return_ids $node_id } } return $return_ids }
Recuerde que Tcl utiliza pinzas cuadradas para delimitar los caracteres que coincidan en la coincidencia de cadena de comando. Al llamar al comando, encuentre como se muestra en el siguiente ejemplo, coincida con addr1 y addr0, no con addr[10]!
establecer coincidencias [find addr[10]]
Dado que los nombres de bus utilizan rondas cuadradas para indicar bits individuales, debe huir de las patrones con soportes cuadradas que se incluyen como selectores de bits de bus. Al llamar al comando encuentra como se muestra en el siguiente ejemplo, con el comando escape_brackets, devuelve el ID de nodo para el nodo denominado addr[10].
establecer coincidencias [encontrar [escape_brackets addr[10]]
Siempre que tenga que utilizar el comando escape_brackets para huir de las patrones que pasen al comando, encuentren un mínimo que tenga la intención de utilizar técnicas cuadradas para indicar un rango de caracteres que coincida.
Filtrado de tipo de nodo
Es posible que desee restringir los tipos de nodos que se buscan en busca de un nombre coincidente. Esto puede acelerar la búsqueda en un diseño con una gran lista de redes de temporización. Puede utilizar la opción -tipo para el comando get_timing_nodes para restringir los nodos de la colección devuelta a pines, registros, relojes y varios otros tipos de nodos.
El siguiente ejemplo se basa en el ejemplo anterior de coincidencia de patrones. Si no se especifica ningún patrón, el valor predeterminado es *, para que coincida con todo. Hay una opción para restringir el tipo de nodo, que es el valor predeterminado para todos.
Este ejemplo utiliza el paquete cmdline Tcl, incluido con el software Quartus II, para configurar una forma sencilla de pasar argumentos al procedimiento de una forma automática documentada.
paquete que requiere::quartus::advanced_timing paquete requiere que cmdline proc find { ándanos } { opciones de conjunto {\ { "pattern.pu" "*" "Patrón para buscar" } \ { "type.pus" "all" "Tipo de nodo para buscar" } \ } conjunto de matrices opts [::cmdline::getindex return_ids {} $options foreach_in_collection node_id [get_timing_nodes -type $opts(type)] { set node_name [get_timing_node_info -info name $node_id] if { [string match $opts(pattern) $node_name ] } { lappend return_ids $node_id } } return $return_ids }
El siguiente código muestra algunas maneras de utilizar el ejemplo anterior.
# Id. de cada devuelve de nodo en la lista de redes de temporización. # Pattern defaults to * # Type defaults to all find # Returns node IDs of all pins in the timing netlist # Pattern defaults to * find -type pin # Returns node IDs of pins que comienzan con addr find -pattern addr* -type pin # Returns node ID de registros en el bit 0 de un bus find -pattern [escape_brackets *[0]] -type reg]