+ peripherial comparison script
This commit is contained in:
parent
c3d24fd01f
commit
95717fd1f9
135
tools/compare_regs.awk
Normal file
135
tools/compare_regs.awk
Normal 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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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">
|
||||
|
|
Loading…
Reference in a new issue