#!/usr/bin/awk -f
# in .sch and/or .sym XSCHEM files
# reduce labels of type AA[7],AA[5],AA[3],AA[1] to AA[7:1:2]
# usage: reduce_even_odd_array_labels.awk *.sym *.sch
# stefan, 20161226

FNR == 1 {
    if (_filename_ != "")
        endfile(_filename_)
    _filename_ = FILENAME
    #print "processing: " FILENAME >"/dev/stderr"
    beginfile(FILENAME)
}

END  { endfile(_filename_) }

###### begin user code ########################

# C {devices/iopin} 270 60 0 0  {name=p311557 lab=AABLEQBL[30],AABLEQBL[28
/^C .devices.*pin\}/{
  l=$0
  sub(/^.*lab=/,"", l)
  sub(/\} *$/,"", l)
  translate()
  if(evenbus) {
    found=1
    sub(/lab=.*/,"", $0)
    $0 = $0 " lab=" newlab "} "
  }
}


# T {nDisturbL[31],nDisturbL[29],nDi..... } 125 1686 0 1 0.2 0.2 {}
# B 5 147.5 -1672.5 152.5 -1667.5 {name=ARBLEQALF[30],ARBLEQALF[28],...,ARBLEQALF[0] dir=inout }


/^T \{/{
  l=$2
  sub(/\{/,"", l)
  sub(/\}$/,"", l)
  translate()
  if(evenbus) {
    found=1
    $2="{" newlab "}"
    $0=$0
  }
}

/^B /{
  l=$7
  sub(/\{name=/,"", l)
  translate()
  if(evenbus) {
    found=1
    $7="{name=" newlab
    $0=$0
  }
}

function translate()
{
  evenbus=0
  nn = split(l,ll,",")
  if(nn>1) {
    evenbus=1
    for(ii=1;ii<=nn;ii++) {
      basename=ll[ii]
      sub(/\[.*/,"",basename)
      if(ii==1) {
        first_basename = basename
      }
      idx = ll[ii]
      sub(/.*\[/,"",idx)
      sub(/\]/,"",idx)
      idx+=0

      if(ii>1 && ( (idx+2!=previdx) || (basename !=first_basename) ) ) {
        evenbus=0
        break
      }
      previdx = idx+0
    }
    if(evenbus) {
      idxlow = idx
      idxhi=idxlow+2*(nn-1)
      newlab = basename "[" idxhi ":" idxlow ":" 2 "]"
    }
  }
}
###### end  user code  ########################


{
 __a[__lines++] = $0
}

function beginfile(f)
{
 __lines=0
 found=0
}

function endfile(f,     i)
{
 if(found)  {
   print "patching: " f >"/dev/stderr"
   for(i=0;i<__lines;i++)
   {
    print __a[i] > f
   }
   close(f)
 }
}

