PS
# GrayCode.m4
gen_init

GrayCode: [
 outer = 4
 inner = 0.75
 nbits = 10

C: circle diam outer
 circle diam inner at C
 sectors = 2^nbits
 lthk = (outer-inner)/2/nbits
 for bit = 1 to nbits do {
   for is = 2^(bit-1) to sectors by 2^(bit+1) do {
     startang = is/sectors*360
     endang = min(startang+(2^bit)/sectors*360,360)
     arcd(C,outer/2-(bit-0.5)*lthk,startang,endang) thick lthk/(1bp__)
     }
   }
]
# Crossbar
Crossbar: [
 circlerad = 0.12
 boxwid = 0.18
 boxht = 0.18
 rathick = 1.5
 rawd = rathick*4 bp__
 raht = rawd*2
 boxdist = boxwid*1.8

define bcoord {($2,-($1))*boxdist}
define redarrow { arrow ht raht wid rawd thick rathick color "red" }

define cbx {
 thinlines_
 n = $+ - 1
 for i=0 to n do {
   line color "blue" from bcoord(i,0) to bcoord(i,n)
   line color "blue" from bcoord(0,i) to bcoord(n,i)
   C[i]: circle invis at bcoord(i,-1.5)
   }
 for i=0 to n do {
   exec sprintf("col = $%g",i+1)
   redarrow from C[i].e right 1.25*boxwid
   redarrow from C[i].w+(-boxwid,0) right raht
   for j=0 to n do {
     B: box outlined "blue" shaded "yellow" at bcoord(i,j)
     if j==col then {
       line color "blue" from B.s to B.e
       line thick rathick color "red" from C[i].e to B.w \
         then to B.n then to (B.x,C[0].y+(2+j*2/3)*boxht)
         continue to (C[j].x-(2+j*2/3)*boxht,Here.y)
         continue to (Here,C[j]) then to C[j].w
       } \
     else {
       line color "blue" from B.n to B.s
       line color "blue" from B.w to B.e
       }
     }
   }
 thicklines_
 for i=0 to n do {
   circle thick 1.5 outlined "blue" shaded "yellow" at C[i] \
     sprintf("iflatex(\large)%g",i)
   }
 }

ifdpic(`
 cbx(3,6,0,5,2,7,1,4)
',`box wid 1 ht 0.75 "Crossbar" "requires" "dpic"')

] with .w at GrayCode.e+(0.2,0)
PE