+ peripherial comparison script

This commit is contained in:
Vovanium 2021-11-08 19:37:12 +03:00
parent c3d24fd01f
commit 95717fd1f9
2 changed files with 136 additions and 1 deletions

135
tools/compare_regs.awk Normal file
View file

@ -0,0 +1,135 @@
#!/usr/bin/awk -f
# This script compares different versions of modules
BEGIN {
nfiles = 0;
}
FNR == 1 {
nfiles = nfiles + 1;
fn = FILENAME;
sub("^\\./", "", fn);
FILE[nfiles] = fn;
}
$1 == "REGISTER" {
name = $2;
address = sprintf("%6s", substr($4, 3));
size = $5;
REGNAME[nfiles, address] = name;
REGSIZE[nfiles, address] = size;
ADDR[address] = 1;
}
$1 == "-" && $3 == ":" && $5 == ".." {
name = $2;
low = $4;
high = $6;
for(i = low; i <= high; i = i + 1) {
FIELDNAME[nfiles, address, i] = name;
}
}
END {
# trying to group equal
ngroups = 1;
GROUPSIZE[1] = 1;
GROUP[1] = 1;
FILEG[1, 1] = 1;
max_groupsize = 1;
for(f = 2; f <= nfiles; f = f + 1) {
for(g = 1; g <= ngroups; g = g + 1) {
fg = FILEG[g, 1];
#print f " vs " fg " (" g ")" > "/dev/stderr"
equal = 1;
for(address in ADDR) {
if(REGNAME[f, address] != REGNAME[fg, address] || REGSIZE[f, address] != REGSIZE[fg, address]) {
equal = 0;
} else {
for(b = 0; b < REGSIZE[f, address]; b = b + 1) {
if(FIELDNAME[f, address, b] != FIELDNAME[fg, address, b]) {
equal = 0;
break;
}
}
}
}
if(equal == 1) {
GROUPSIZE[g] = GROUPSIZE[g] + 1;
GROUP[f] = g;
FILEG[g, GROUPSIZE[g]] = f;
if(GROUPSIZE[g] > max_groupsize) {
max_groupsize = GROUPSIZE[g];
}
break;
}
}
if(equal == 0) {
ngroups = ngroups + 1;
GROUPSIZE[ngroups] = 1;
GROUP[f] = ngroups;
FILEG[ngroups, 1] = f;
}
}
if(ngroups == 1) {
print "All identical";
exit;
}
column = 10; delim = " ";
fc = 6;
print "max_groupsize " max_groupsize;
printf("g %-"fc"."fc"s", "---");
for(g = 1; g <= ngroups; g = g + 1) {
printf(delim "%-"column"."column"s", g);
}
printf("\n");
for(n = 1; n <= max_groupsize; n = n + 1) {
printf("f %-"fc"."fc"s", "---");
for(g = 1; g <= ngroups; g = g + 1) {
f = FILEG[g, n];
printf(delim "%-"column"."column"s", FILE[f]);
}
printf("\n");
}
n = asorti(ADDR);
for(a = 1; a <= n; a = a + 1) {
address = ADDR[a];
printf("R %-"fc"."fc"s", address);
equal = 1;
max_size = 0;
for(g = 1; g <= ngroups; g = g + 1) {
f = FILEG[g, 1];
printf(delim "%-"column"."column"s", REGNAME[f, address]);
if(REGSIZE[f, address] > max_size) {
max_size = REGSIZE[f, address]
}
if(REGSIZE[f, address] != REGSIZE[1, address]) {
#print "Size mismatch " REGNAME[f, address] > "/dev/stderr"
equal = 0;
} else {
for(b = 0; b < REGSIZE[f, address]; b = b + 1) {
if(FIELDNAME[f, address, b] != FIELDNAME[1, address, b]) {
equal = 0;
#print "Field mismatch " f " " address " " b " " REGNAME[f, address] "." FIELDNAME[f, address, b] " " FIELDNAME[1, address, b]> "/dev/stderr";
break;
}
}
}
}
printf("\n");
#print "equal " equal > "/dev/stderr"
if(equal == 0) {
for(b = 0; b < max_size; b = b + 1) {
printf(" % "fc"."fc"s", b);
for(g = 1; g <= ngroups; g = g + 1) {
f = FILEG[g, 1];
printf(delim "%-"column"."column"s", FIELDNAME[f, address, b]);
}
printf("\n");
}
}
}
}

View file

@ -7,7 +7,7 @@
<xsl:template name="peripheral">
<xsl:for-each select="registers/register">
<xsl:sort select="addressOffset"/>
REGISTER <xsl:value-of select="name"/> @ <xsl:value-of select="addressOffset"/>, <xsl:call-template name="cvalue">
REGISTER <xsl:value-of select="name"/> @ <xsl:value-of select="addressOffset"/><xsl:text> </xsl:text><xsl:call-template name="cvalue">
<xsl:with-param name="string"><xsl:value-of select="size"/></xsl:with-param>
</xsl:call-template>
<xsl:for-each select="fields/field">