.PS
# `XORDPV.m4'
# Realizations of the XOR function
log_init
scale = 2.54

define(`gatelineth',1.6) # gate line thickness
define(`lineth',0.8)     # connection thickness

define(`labels',`
 "svg_it(A)" at last [].InA above wid 0.25
 "svg_it(B)" at last [].InB above wid 0.25
 "svg_it(A) O`'svg_sup(+,100,0,-1.4ex) svg_it(B)" at last [].Out ljust wid 1.2
#"svg_it(A) svg_font(Latin,,,"O")`'svg_sup(+,100,0,-1.4ex) svg_it(B)" at last [].Out ljust
')

#                           single gate
  XOR: Autologix(Xor(A,B))
  labels

#                           canonical form
  Autologix(Or(And(A,Not(B)),And(Not(A),B))) \
    with .nw at last [].sw+(0,-1)
  labels

#                           mixed gates
  Autologix(And(Nand(A,B),Or(A,B))) \
    with .nw at last [].nw+(8,0)
  labels

#                           nand realization
  Autologix(Nand(Nand(Nand(A,A),B),Nand(Nand(B,B),A))) \
    with .nw at 2nd last [].sw+(0,-1)
  labels

#                           nor realization
  Autologix(Nor(Nor(Nor(A,A),Nor(B,B)),Nor(A,B))) \
    with .nw at last [].nw+(8,0)
  labels

# These functions contain topologies in common so write a macro
define(`customAB',
   `S: Autologix(N`$1'(N`$1'(A,B1),N`$1'(B1,B)),N) with .Out at Here
    line thick lineth from S.In2 to S.In3; InAB: dot(at last line.c)
    line thick lineth from InAB left 2*L_unit
    TN: Autologix(N`$1'(A,B)) with .Out at Here
    line thick lineth from TN.InA up 3*L_unit; InA: Here
    line thick lineth from TN.InB up 3*L_unit; InB: Here
    line thick lineth from S.In4 to (InB,S.In4) then to (InB,TN.In2); dot
    line thick lineth from S.In1 to (InA,S.In1); dot')

  [ customAB(and)
    Out: S.Out
    ] with .nw at 2nd last [].sw+(0,-1)
  labels

  [ linethick = gatelineth
    H: NOR_gate(2); linethick = lineth
    L:dot(at H.w-(2*L_unit,0))
    line from H.In1 to (L,H.In1) then to (L,H.In2) then to H.In2
    line from L left 2*L_unit
    customAB(or)
    Out: H.Out
   ] with .nw at last [].nw+(8,0)
  labels

.PE
