basetype Coord;	

atom arc :- string->float->[Coord&Coord];
atom line :- string->[Coord&Coord];
atom rect :- string->[Coord&Coord];
atom triangle :- string->[Coord&Coord&Coord];
atom text :- string->string->[Coord&Coord];


atom trans :- float->float->[Coord&Coord];	
atom xyproj :- [?Coord&?Coord&!Coord];		
atom polar :- float->float->[Coord&Coord];	
atom pcir :- float->[Coord&Coord&Coord];	 
atom between :- float->[Coord&Coord&Coord];	
atom dir :- float->[Coord&Coord&Coord];		



def R :- [Coord&Coord];
    R [a,b] =
    {
	between 0.5 [a,b,m],
	dir 1 [m,a,a1],
	dir 1 [m,b,b1],
	line "line" [a,a1],	
	line "line" [b,b1],	
	($[a,b,c].{ pcir 90 [a,b,cd], dir 0.5 [a,cd,c] }) [a1,a,abot],
	($[a,b,c].{ pcir 90 [a,b,cd], dir -0.5 [a,cd,c] }) [a1,a,atop],
	($[a,b,c].{ pcir 90 [a,b,cd], dir 0.5 [a,cd,c] }) [b1,b,btop],
	($[a,b,c].{ pcir 90 [a,b,cd], dir -0.5 [a,cd,c] }) [b1,b,bbot],
	line "line" [abot,atop],
	line "line" [bbot,btop],
	line "line" [atop,btop],
	line "line" [abot,bbot]
    };



def coilturn :- [Coord&Coord];
    coilturn [a,b] = { between 0.5 [a,b,c], arc "line" 180 [c,b] };

def L :- [Coord&Coord];
    L [a,b] =
    {
	between 0.5 [a,b,m2],
	dir 0.6 [m2,a,m1],
	dir 0.6 [m1,a,m0],
	dir 0.6 [m2,b,m3],
	dir 0.6 [m3,b,m4],
	line "line" [a,m0],	
	line "line" [b,m4],	
	coilturn [m0,m1],
	coilturn [m1,m2],
	coilturn [m2,m3],
	coilturn [m3,m4]
    };

def C :- [Coord&Coord];
    C [a,b] =
    {
	between 0.5 [a,b,m],
	dir 0.2 [m,a,a1],
	dir 0.2 [m,b,b1],
	line "line" [a,a1],	
	line "line" [b,b1],	
	($[a,b,c].{ pcir 90 [a,b,cd], dir 0.7 [a,cd,c] }) [a1,a,abot],
	($[a,b,c].{ pcir 90 [a,b,cd], dir -0.7 [a,cd,c] }) [a1,a,atop],
	($[a,b,c].{ pcir 90 [a,b,cd], dir 0.7 [a,cd,c] }) [b1,b,btop],
	($[a,b,c].{ pcir 90 [a,b,cd], dir -0.7 [a,cd,c] }) [b1,b,bbot],
	line "thickline" [abot,atop],
	line "thickline" [bbot,btop]
    };

def D :- [Coord&Coord];
    D [a,b] =
    {
	between 0.5 [a,b,m],
	dir 0.6 [m,a,a1],
	dir 0.6 [m,b,b1],
	line "line" [a,a1],	
	line "line" [b,b1],	
	($[a,b,c].{ pcir 90 [a,b,cd], dir 0.6 [a,cd,c] }) [b1,b,btop],
	($[a,b,c].{ pcir 90 [a,b,cd], dir -0.6 [a,cd,c] }) [b1,b,bbot],
	($[a,b,c].{ pcir 90 [a,b,cd], dir 0.6 [a,cd,c] }) [a1,a,atop],
	($[a,b,c].{ pcir 90 [a,b,cd], dir -0.6 [a,cd,c] }) [a1,a,abot],
	triangle "filled" [atop,abot,b1],
	line "thickline" [bbot,btop]
    };


def emittor :- [Coord&Coord];
    emittor [a,b] =
    {
	between 0.5 [a,b,m],
	dir 0.4 [m,a,a1],
	dir 0.4 [m,b,b1],
	($[a,b,c].{ pcir 90 [a,b,cd], dir 0.4 [a,cd,c] }) [a1,a,arrtop],
	($[a,b,c].{ pcir 90 [a,b,cd], dir -0.4 [a,cd,c] }) [a1,a,arrbot],
	triangle "filled" [arrtop,arrbot,b1],
	line "line" [a,b]
    };


def Qn_left :- [Coord&Coord&Coord];
    Qn_left [c,b,e] =
    {
	between 0.5 [c,e,m],
	dir 1.8 [m,e,e1],
	dir 1.8 [m,c,c1],
	line "line" [e,e1],
	line "line" [c,c1],
	($[a,b,c].{ pcir 90 [a,b,cd], dir 1.5 [a,cd,c] }) [e1,e,be],
	($[a,b,c].{ pcir 90 [a,b,cd], dir -1.5 [a,cd,c] }) [c1,c,bc],
	between 0.5 [bc,be,b],
        line "thickline" [bc,be],
	dir 0.3 [b,be,e2],
	dir 0.3 [b,bc,c2],
	emittor [e2,e1],
	line "line" [c2,c1]
    };


def Qp_left :- [Coord&Coord&Coord];
    Qp_left [c,b,e] =
    {
	between 0.5 [c,e,m],
	dir 1.8 [m,e,e1],
	dir 1.8 [m,c,c1],
	line "line" [e,e1],
	line "line" [c,c1],
	($[a,b,c].{ pcir 90 [a,b,cd], dir 1.5 [a,cd,c] }) [e1,e,be],
	($[a,b,c].{ pcir 90 [a,b,cd], dir -1.5 [a,cd,c] }) [c1,c,bc],
	between 0.5 [bc,be,b],
        line "thickline" [bc,be],
	dir 0.3 [b,be,e2],
	dir 0.3 [b,bc,c2],
	emittor [e1,e2],
	line "line" [c2,c1]
    };


def Qn_right :- [Coord&Coord&Coord];
    Qn_right [c,b,e] =
    {
	between 0.5 [c,e,m],
	dir 1.8 [m,e,e1],
	dir 1.8 [m,c,c1],
	line "line" [e,e1],
	line "line" [c,c1],
	($[a,b,c].{ pcir 90 [a,b,cd], dir -1.5 [a,cd,c] }) [e1,e,be],
	($[a,b,c].{ pcir 90 [a,b,cd], dir 1.5 [a,cd,c] }) [c1,c,bc],
	between 0.5 [bc,be,b],
        line "thickline" [bc,be],
	dir 0.3 [b,be,e2],
	dir 0.3 [b,bc,c2],
	emittor [e2,e1],
	line "line" [c2,c1]
    };


def Qp_right :- [Coord&Coord&Coord];
    Qp_right [c,b,e] =
    {
	between 0.5 [c,e,m],
	dir 1.8 [m,e,e1],
	dir 1.8 [m,c,c1],
	line "line" [e,e1],
	line "line" [c,c1],
	($[a,b,c].{ pcir 90 [a,b,cd], dir -1.5 [a,cd,c] }) [e1,e,be],
	($[a,b,c].{ pcir 90 [a,b,cd], dir 1.5 [a,cd,c] }) [c1,c,bc],
	between 0.5 [bc,be,b],
        line "thickline" [bc,be],
	dir 0.3 [b,be,e2],
	dir 0.3 [b,bc,c2],
	emittor [e1,e2],
	line "line" [c2,c1]
    };


def Jn_left :- [Coord&Coord&Coord];
    Jn_left [s,d,g] =
    {
	between 0.5 [s,d,m],
	dir 1.2 [m,s,s1],
	dir 1.2 [m,d,d1],
	line "line" [s,s1],
	line "line" [d,d1],
	($[a,b,c].{ pcir 90 [a,b,cd], dir 1.5 [a,cd,c] }) [m,s,g],
	($[a,b,c].{ pcir 90 [a,b,cd], dir -1.6 [a,cd,c] }) [g,m,g1],
	($[a,b,c].{ pcir 90 [a,b,cd], dir 1.6 [a,cd,c] }) [g,m,g2],
        line "thickline" [g1,g2],
	dir 1.2 [g,g1,d2],
	dir 1.2 [g,g2,s2],
	emittor [s2,s1],
	line "line" [d2,d1]
    };


def Jp_left :- [Coord&Coord&Coord];
    Jp_left [s,d,g] =
    {
	between 0.5 [s,d,m],
	dir 1.2 [m,s,s1],
	dir 1.2 [m,d,d1],
	line "line" [s,s1],
	line "line" [d,d1],
	($[a,b,c].{ pcir 90 [a,b,cd], dir 1.5 [a,cd,c] }) [m,s,g],
	($[a,b,c].{ pcir 90 [a,b,cd], dir -1.6 [a,cd,c] }) [g,m,g1],
	($[a,b,c].{ pcir 90 [a,b,cd], dir 1.6 [a,cd,c] }) [g,m,g2],
        line "thickline" [g1,g2],
	dir 1.2 [g,g1,d2],
	dir 1.2 [g,g2,s2],
	emittor [s1,s2],
	line "line" [d2,d1]
    };


def Jn_right :- [Coord&Coord&Coord];
    Jn_right [s,d,g] =
    {
	between 0.5 [s,d,m],
	dir 1.2 [m,s,s1],
	dir 1.2 [m,d,d1],
	line "line" [s,s1],
	line "line" [d,d1],
	($[a,b,c].{ pcir 90 [a,b,cd], dir -1.5 [a,cd,c] }) [m,s,g],
	($[a,b,c].{ pcir 90 [a,b,cd], dir 1.6 [a,cd,c] }) [g,m,g1],
	($[a,b,c].{ pcir 90 [a,b,cd], dir -1.6 [a,cd,c] }) [g,m,g2],
        line "thickline" [g1,g2],
	dir 1.2 [g,g1,d2],
	dir 1.2 [g,g2,s2],
	emittor [s2,s1],
	line "line" [d2,d1]
    };


def Jp_right :- [Coord&Coord&Coord];
    Jp_right [s,d,g] =
    {
	between 0.5 [s,d,m],
	dir 1.2 [m,s,s1],
	dir 1.2 [m,d,d1],
	line "line" [s,s1],
	line "line" [d,d1],
	($[a,b,c].{ pcir 90 [a,b,cd], dir -1.5 [a,cd,c] }) [m,s,g],
	($[a,b,c].{ pcir 90 [a,b,cd], dir 1.6 [a,cd,c] }) [g,m,g1],
	($[a,b,c].{ pcir 90 [a,b,cd], dir -1.6 [a,cd,c] }) [g,m,g2],
        line "thickline" [g1,g2],
	dir 1.2 [g,g1,d2],
	dir 1.2 [g,g2,s2],
	emittor [s1,s2],
	line "line" [d2,d1]
    };



def grid :- [Coord&(Coord&Coord)&Coord&Coord];
    grid [b,[t1,t2],p1,p2] =
    {
	*[ b, t1 ],
	trans 5 0 [t1,t2],
	trans 0 2.5 [b,g00],
	trans 2.5 2.5 [g00,p1],
	trans 5 2.5 [p1,p2],
	trans 2.5 0 [g00,g10],
	trans 2.5 0 [g10,g20],
	trans 2.5 0 [g20,g30],
	trans 2.5 0 [g30,g40],
	trans 0 2.5 [g00,g01],
	trans 0 2.5 [g01,g02],
	trans 0 2.5 [g02,g03],
	trans 0 2.5 [g03,g04],
	trans 2.5 0 [g04,g14],
	trans 2.5 0 [g14,g24],
	trans 2.5 0 [g24,g34],
	trans 2.5 0 [g34,g44],
	trans 0 2.5 [g40,g41],
	trans 0 2.5 [g41,g42],
	trans 0 2.5 [g42,g43],
	line "bgline" [g00,g40],
	line "bgline" [g01,g41],
	line "bgline" [g02,g42],
	line "bgline" [g03,g43],
	line "bgline" [g04,g44],
	line "bgline" [g00,g04],
	line "bgline" [g10,g14],
	line "bgline" [g20,g24],
	line "bgline" [g30,g34],
	line "bgline" [g40,g44]
    };

def fan :- [Coord&Coord];
    fan [r,l] =
    {
	between 0.5 [r,l,m],
	polar   0 5 [m,a0], D [a0,m],
	polar  45 5 [m,a1], D [a1,m],
	polar  90 5 [m,a3], D [a3,m],
	polar 135 5 [m,a4], D [a4,m],
	polar 180 5 [m,a6], D [a6,m]
    };

def top :- <>;
    top [] =
    {
	trans 0 18 [g00,g10],
	trans 0 18 [g10,g20],
	trans 0 18 [g20,g30],
	trans 13 0 [g00,g01],
	trans 13 0 [g01,g02],
	trans 13 0 [g02,g03],
	trans 13 0 [g10,g11],
	trans 13 0 [g11,g12],
	trans 13 0 [g12,g13],
	trans 13 0 [g20,g21],
	trans 13 0 [g21,g22],
	trans 13 0 [g22,g23],
	trans 13 0 [g30,g31],
	trans 13 0 [g31,g32],
	trans 13 0 [g32,g33],
	trans 20 20 [bottom,g00],
 	grid [g00,t00,r001,r002], R [r001,r002],
	text "normal" "R [a,b]" t00,
 	grid [g01,t01,r011,r012], C [r011,r012],
	text "normal" "C [a,b]" t01,
 	grid [g02,t02,r021,r022], L [r021,r022],
	text "normal" "L [a,b]" t02,
 	grid [g03,t03,r031,r032], D [r031,r032],
	text "normal" "D [k,a]" t03,
 	grid [g10,t10,r101,r102], Qn_left [r101,b10,r102],
	text "normal" "Qn_left [c,b,e]" t10,
 	grid [g11,t11,r111,r112], Qn_right [r111,b11,r112],
	text "normal" "Qn_right [c,b,e]" t11,
 	grid [g12,t12,r121,r122], Qp_left [r121,b12,r122],
	text "normal" "Qp_left [c,b,e]" t12,
	grid [g13,t13,r131,r132], Qp_right [r131,b13,r132],
	text "normal" "Qp_right [c,b,e]" t13,
	grid [g20,t20,r201,r202], Jn_left [r201,r202,gate20],
	text "normal" "Jn_left [s,d,g]" t20,
	grid [g21,t21,r211,r212], Jn_right [r211,r212,gate21],
	text "normal" "Jn_right [s,d,g]" t21,
	grid [g22,t22,r221,r222], Jp_left [r221,r222,gate22],
	text "normal" "Jp_left [s,d,g]" t22,
	grid [g23,t23,r231,r232], Jp_right [r231,r232,gate23],
	text "normal" "Jp_right [s,d,g]" t23,
	fan [g31,g33]
    };

