summaryrefslogtreecommitdiff
path: root/graphics/circuit_macros/examples/svg/CrossbarSVG.m4
blob: 12bb2d72c31a0dbccb053a3ed7f65619ac3e3ea2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
.PS
# Crossbar switch
gen_init(svg_font(sans-serif,11bp__))
  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 color "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("ifpostscript(,ifsvg(,\large))%g",i)
    }
  }

[
  cbx(3,6,0,5,2,7,1,4)
  ] at 4,4

 command "</g>" # end font
.PE