xschem/src/label_compactor.awk

131 lines
2.5 KiB
Awk
Executable File

#!/bin/sh
# label compactor on cad schematic files generated by make_sch_from_vhdl
# a[3],a[2],gnd,a[1],a[0] --> a[3:2],gnd,a[1:0]
# Note: only works on lists of single bits does not compact things like:
# a[8:3],a[2:1],gnd,b[3],b[2]
# also only works on lists of signals that can be represented as decreasing vectors:
# a[3],a[2],a[1],gnd --> ok
# a[0],a[1],a[2],gnd --> not ok
awk '
FNR == 1 {
if (_filename_ != "")
endfile(_filename_)
_filename_ = FILENAME
print "processing: " FILENAME
beginfile(FILENAME)
}
END { endfile(_filename_) }
# user code
/^C .*lab=/{
lab=$0
sub(/^.*lab=/,"",lab)
sub(/ *\}.*$/,"",lab)
if(lab ~ /,/ && lab !~ /:/) {
newlab=compact_label(lab)
sub(/lab=.* *\}/,"lab=" newlab "}", $0)
}
}
function compact_label(lab)
{
n=split(lab,lab_array,",")
startbus=-1
start=-1
newlab=""
for(i=1;i<=n;i++) {
if(lab_array[i] ~ /\[/) {
bus_current=lab_index(lab_array[i])
if( start!=-1 && lab_array[i] != name )
print_signal()
if( (startbus!=-1) && (lab_name(lab_array[i]) != busname) )
print_bus()
# 09032004 fix for errors on buses like D[5],D[4],D[2],D[1]
if( (startbus!=-1) && (lab_name(lab_array[i]) == busname) && (bus_current+1!=last) )
print_bus()
if(startbus==-1) { busname=lab_name(lab_array[i]); startbus=bus_current; last=bus_current }
else if(lab_name(lab_array[i])==busname && bus_current+1==last) { last=bus_current }
if( (startbus!=-1) && i==n )
print_bus()
}
else {
if(lab_name(lab_array[i]) != busname&& startbus!=-1)
print_bus()
if( (start!=-1) && ( lab_array[i] != name) )
print_signal()
if(start==-1) { name=lab_array[i] ; start++ }
else if(lab_array[i] == name) { start++ }
if( (start!=-1) && i==n )
print_signal()
}
}
sub(/,$/,"",newlab)
return newlab
}
function print_bus() {
if(startbus>last)
newlab=newlab busname "[" startbus ":" last "],"
else
newlab=newlab busname "[" startbus "],"
startbus=-1
}
function print_signal() {
if(start>0)
newlab = newlab start+1 "*" name ","
else
newlab = newlab name ","
start=-1
}
function lab_name(lab)
{
sub(/\[.*/,"",lab)
return lab
}
function lab_index(lab)
{
sub(/.*\[/,"",lab)
sub(/\].*/,"",lab)
return lab+0
}
# end user code
{
a[lines++] = $0
}
function beginfile(f)
{
print compact_label("D[5],D[4],D[2],D[1]")
lines=0
}
function endfile(f)
{
for(i=0;i<lines;i++)
{
print a[i] > f
}
close(f)
}
' $@