.PS
# Decoder.m4
log_init

  define(`nlines',3) # OK for nlines from 1 to approximately 4

  define(`ndata',`eval(2**nlines-1)')
  for_(0,nlines-1,1,
   `{right_; A`'m4x: dot(at rsvec_(0,m4x*AND_ht))
     "$A_{m4x}$" at last [].w rjust}')

  for_(0,ndata,1,
   `define(`m4y',m4x) down_
    G`'m4y: AND_gate(nlines) \
      at A0+svec_(AND_ht*3/2,(m4y+1/2)*AND_ht*3/2)
     line down linewid/3; dot; "$\;D_{m4y}$" at last [].s below
    for_(0,nlines-1,1,
     `ifelse(eval(m4y/2**m4x%2),0,
      `up_; NOT_circle with .s at',`move to') G`'m4y.In`'eval(nlines-m4x)
       line to (Here,A`'m4x) ifelse(m4y,ndata,`then to A`'m4x',`; dot')
     ')
   ')

.PE
