Introducción
Un diseño de bloque (block design) dentro de un proyecto de Vivado está representado por un archivo cuyo nombre tiene el sufijo .bd, por ejemplo vivado_system.bd. Este archivo contiene toda la información sobre el diseño de bloque en un formato textual y legible por humanos. En las versiones antiguas de Vivado, este archivo estaba escrito en formato XML. Hoy en día se utiliza el formato JSON para representar un diseño de bloque.
Gracias al formato textual, es posible comparar dos archivos de diseño de bloque con herramientas conocidas de comparación textual (diff y herramientas gráficas similares). Esto permite hacer un seguimiento de qué cambios se han realizado en el diseño de bloque.
Sin embargo, el formato JSON tiene un inconveniente importante en relación con la comparación de archivos de texto: en las definiciones de los objetos, las propiedades y sus valores pueden aparecer en un orden arbitrario. Por lo tanto, herramientas como diff pueden mostrar que el contenido textual de dos archivos JSON es considerablemente distinto aunque contengan exactamente la misma información.
Desgraciadamente, algunas partes de los archivos de diseño de bloque que genera Vivado sufren este problema. Como resultado, una comparación textual entre dos archivos .bd muestra muchas diferencias engañosas, que se deben a la ordenación inconsistente de la información.
Canonicalización de un archivo JSON
La solución natural a la ordenación aleatoria de un archivo textual consiste en llevar ese archivo a una forma canónica. En RFC 8785 existe una definición estricta de cómo realizar esa canonicalización, aunque no es necesario seguir ese estándar para el propósito de comparar dos archivos. Con evitar la reordenación aleatoria basta.
Una solución sencilla es ordenar alfabéticamente las propiedades de los objetos, según el nombre de las propiedades. Esto garantiza una representación coherente de la información dentro de un archivo JSON. Sin embargo, reordenar la información de esta manera tiene un inconveniente. Normalmente, las propiedades se enumeran en un orden que facilita la lectura del archivo: las propiedades importantes suelen ponerse al principio, y las propiedades se agrupan según su significado. Por tanto, resulta algo más difícil leer un archivo JSON en forma canónica.
Un script en Perl
Gracias al módulo JSON de Perl, es fácil escribir un script en Perl que realice la canonicalización de un archivo JSON:
#!/usr/bin/perl
use warnings;
use strict;
use JSON;
local $/; # Slurp mode
my $json = JSON->new->allow_nonref->space_after->indent->canonical;
my $in = <>;
my $h = $json->decode($in);
my $out = $json->encode($h);
print $out;
Utiliza este script con un comando como este:
$ ./jsonize.pl vivado_system.bd > canonicalized.bd
Para comparar diseños de bloque, realiza una comparación textual de dos archivos JSON canonicalizados.