diff options
author | phk <phk@FreeBSD.org> | 2003-06-15 18:49:46 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2003-06-15 18:49:46 +0000 |
commit | 69776c10822e68c24101edbb82aec156257044a9 (patch) | |
tree | 9326df3513ab712f98602a769930cda4d4984c09 /share | |
parent | 9be0707ac8c67dcef1185ecaba5868f138f4e2ad (diff) | |
download | FreeBSD-src-69776c10822e68c24101edbb82aec156257044a9.zip FreeBSD-src-69776c10822e68c24101edbb82aec156257044a9.tar.gz |
Add my timecounter paper from EuroBSDcon2002
Diffstat (limited to 'share')
-rw-r--r-- | share/doc/papers/timecounter/Makefile | 13 | ||||
-rw-r--r-- | share/doc/papers/timecounter/fig1.eps | 227 | ||||
-rw-r--r-- | share/doc/papers/timecounter/fig2.eps | 150 | ||||
-rw-r--r-- | share/doc/papers/timecounter/fig3.eps | 126 | ||||
-rw-r--r-- | share/doc/papers/timecounter/fig4.eps | 259 | ||||
-rw-r--r-- | share/doc/papers/timecounter/fig5.eps | 211 | ||||
-rw-r--r-- | share/doc/papers/timecounter/gps.ps | 1488 | ||||
-rw-r--r-- | share/doc/papers/timecounter/intr.ps | 1501 | ||||
-rw-r--r-- | share/doc/papers/timecounter/timecounter.ms | 1076 | ||||
-rw-r--r-- | share/doc/papers/timecounter/tmac.usenix | 953 |
10 files changed, 6004 insertions, 0 deletions
diff --git a/share/doc/papers/timecounter/Makefile b/share/doc/papers/timecounter/Makefile new file mode 100644 index 0000000..e866aad --- /dev/null +++ b/share/doc/papers/timecounter/Makefile @@ -0,0 +1,13 @@ +# $FreeBSD$ + +# You really want: +# PRINTERDEVICE=ps +# or you will not get the illustration. +VOLUME= papers +DOC= timecounter +SRCS= tmac.usenix timecounter.ms +USE_PIC=1 +USE_EQN=1 +USE_TBL=1 + +.include <bsd.doc.mk> diff --git a/share/doc/papers/timecounter/fig1.eps b/share/doc/papers/timecounter/fig1.eps new file mode 100644 index 0000000..012fed2 --- /dev/null +++ b/share/doc/papers/timecounter/fig1.eps @@ -0,0 +1,227 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: fig1.eps +%%Creator: fig2dev Version 3.2 Patchlevel 3d +%%CreationDate: $FreeBSD$ +%%For: phk@critter.freebsd.dk (Poul-Henning Kamp) +%%BoundingBox: 0 0 191 194 +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +newpath 0 194 moveto 0 0 lineto 191 0 lineto 191 194 lineto closepath clip newpath +-7.6 201.2 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit + 0.06000 0.06000 sc +% +% Fig objects follow +% +/Times-Roman ff 180.00 scf sf +750 3300 m +gs 1 -1 sc (Imprecise) dup sw pop 2 div neg 0 rm col0 sh gr +15.000 slw +% Ellipse +n 750 750 300 300 0 360 DrawEllipse gs col0 s gr + +% Ellipse +n 750 750 450 450 0 360 DrawEllipse gs col0 s gr + +% Ellipse +n 750 750 600 600 0 360 DrawEllipse gs col0 s gr + +% Ellipse +n 750 2250 150 150 0 360 DrawEllipse gs col0 s gr + +% Ellipse +n 750 2250 300 300 0 360 DrawEllipse gs col0 s gr + +% Ellipse +n 750 2250 450 450 0 360 DrawEllipse gs col0 s gr + +% Ellipse +n 750 2250 600 600 0 360 DrawEllipse gs col0 s gr + +% Ellipse +n 2250 2250 150 150 0 360 DrawEllipse gs col0 s gr + +% Ellipse +n 2250 2250 300 300 0 360 DrawEllipse gs col0 s gr + +% Ellipse +n 2250 2250 450 450 0 360 DrawEllipse gs col0 s gr + +% Ellipse +n 2250 2250 600 600 0 360 DrawEllipse gs col0 s gr + +% Ellipse +n 2250 750 150 150 0 360 DrawEllipse gs col0 s gr + +% Ellipse +n 2250 750 300 300 0 360 DrawEllipse gs col0 s gr + +% Ellipse +n 2250 750 450 450 0 360 DrawEllipse gs col0 s gr + +% Ellipse +n 2250 750 600 600 0 360 DrawEllipse gs col0 s gr + +% Ellipse +n 2280 2197 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +% Ellipse +n 2152 2212 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +% Ellipse +n 2145 2332 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +% Ellipse +n 2265 2325 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +% Ellipse +n 2370 2295 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +% Ellipse +n 292 2002 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +% Ellipse +n 367 1905 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +% Ellipse +n 390 2040 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +% Ellipse +n 180 1950 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +% Ellipse +n 1965 472 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +% Ellipse +n 2355 517 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +% Ellipse +n 2505 870 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +% Ellipse +n 907 1170 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +% Ellipse +n 1282 1305 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +% Ellipse +n 975 825 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +% Ellipse +n 2071 1074 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +% Ellipse +n 2550 600 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +% Ellipse +n 1350 675 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +% Ellipse +n 1350 1050 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +% Ellipse +n 225 2100 38 38 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr + +/Times-Roman ff 180.00 scf sf +3300 750 m +gs 1 -1 sc 90.0 rot (Unstable) dup sw pop 2 div neg 0 rm col0 sh gr +/Times-Roman ff 180.00 scf sf +3300 2250 m +gs 1 -1 sc 90.0 rot (Stable) dup sw pop 2 div neg 0 rm col0 sh gr +/Times-Roman ff 180.00 scf sf +2250 3300 m +gs 1 -1 sc (Precise) dup sw pop 2 div neg 0 rm col0 sh gr +% Ellipse +n 750 750 150 150 0 360 DrawEllipse gs col0 s gr + +$F2psEnd +rs diff --git a/share/doc/papers/timecounter/fig2.eps b/share/doc/papers/timecounter/fig2.eps new file mode 100644 index 0000000..6771435 --- /dev/null +++ b/share/doc/papers/timecounter/fig2.eps @@ -0,0 +1,150 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: fig2.eps +%%Creator: fig2dev Version 3.2 Patchlevel 3d +%%CreationDate: $FreeBSD$ +%%For: phk@critter.freebsd.dk (Poul-Henning Kamp) +%%BoundingBox: 0 0 191 194 +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +newpath 0 194 moveto 0 0 lineto 191 0 lineto 191 194 lineto closepath clip newpath +-7.7 201.2 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit + 0.06000 0.06000 sc +% +% Fig objects follow +% +/Times-Roman ff 180.00 scf sf +750 3300 m +gs 1 -1 sc (Imprecise) dup sw pop 2 div neg 0 rm col0 sh gr +% Polyline +15.000 slw +n 150 750 m + 1350 750 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 1650 150 m + 1650 1350 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 1650 750 m + 2850 750 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 1650 1650 m + 1650 2850 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 1650 2250 m + 2850 2250 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 150 1650 m + 150 2850 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 150 2250 m + 1350 2250 l gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 1665 2205 m 1792 2182 l 1942 2220 l 2100 2295 l 2257 2212 l 2392 2205 l + 2460 2280 l 2520 2295 l 2617 2197 l + 2850 2212 l gs col0 s gr +% Polyline +n 165 2565 m 360 2490 l 487 2362 l 615 2347 l 705 2250 l 825 2212 l + 915 2130 l 1057 2085 l 1155 1980 l 1237 1972 l 1297 1920 l + + 1342 1897 l gs col0 s gr +% Polyline +n 1657 465 m 1770 637 l 1927 705 l 2002 1020 l 2107 862 l 2190 525 l + 2227 652 l 2272 555 l 2362 982 l 2475 1147 l 2512 832 l + 2557 427 l 2587 502 l 2647 277 l 2677 630 l 2775 967 l + + 2850 525 l gs col0 s gr +% Polyline +n 150 232 m 352 307 l 375 637 l 562 577 l 622 982 l 690 622 l + 780 870 l 885 622 l 945 1207 l 1035 952 l 1080 1140 l + 1140 1080 l 1192 1372 l + 1350 1185 l gs col0 s gr +/Times-Roman ff 180.00 scf sf +3300 750 m +gs 1 -1 sc 90.0 rot (Unstable) dup sw pop 2 div neg 0 rm col0 sh gr +/Times-Roman ff 180.00 scf sf +3300 2250 m +gs 1 -1 sc 90.0 rot (Stable) dup sw pop 2 div neg 0 rm col0 sh gr +/Times-Roman ff 180.00 scf sf +2250 3300 m +gs 1 -1 sc (Precise) dup sw pop 2 div neg 0 rm col0 sh gr +% Polyline +n 150 150 m + 150 1350 l gs 0.00 setgray ef gr gs col0 s gr +$F2psEnd +rs diff --git a/share/doc/papers/timecounter/fig3.eps b/share/doc/papers/timecounter/fig3.eps new file mode 100644 index 0000000..9972823 --- /dev/null +++ b/share/doc/papers/timecounter/fig3.eps @@ -0,0 +1,126 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: fig3.eps +%%Creator: fig2dev Version 3.2 Patchlevel 3d +%%CreationDate: $FreeBSD$ +%%For: phk@critter.freebsd.dk (Poul-Henning Kamp) +%%BoundingBox: 0 0 181 56 +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +newpath 0 56 moveto 0 0 lineto 181 0 lineto 181 56 lineto closepath clip newpath +-16.7 81.0 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit + 0.06000 0.06000 sc +% +% Fig objects follow +% +% Polyline +7.500 slw +gs clippath +1740 780 m 1740 720 l 1588 720 l 1708 750 l 1588 780 l cp +eoclip +n 1200 750 m + 1725 750 l gs col0 s gr gr + +% arrowhead +n 1588 780 m 1708 750 l 1588 720 l col0 s +% Arc +n 900.0 750.0 150.0 180.0 0.0 arcn +gs col0 s gr + +% Polyline +15.000 slw +n 300 450 m 1200 450 l 1200 1050 l 300 1050 l + cp gs col0 s gr +% Arc +7.500 slw +n 600.0 750.0 150.0 180.0 0.0 arc +gs col0 s gr + +% Polyline +15.000 slw +n 1725 600 m 3225 600 l 3225 900 l 1725 900 l + cp gs col0 s gr +/Times-Roman ff 180.00 scf sf +1725 1350 m +gs 1 -1 sc (Oscillator + Counter = Clock) dup sw pop 2 div neg 0 rm col0 sh gr +/Helvetica-Bold ff 180.00 scf sf +2475 825 m +gs 1 -1 sc (1 0 3 7 5 4 2 5 0 0) dup sw pop 2 div neg 0 rm col0 sh gr +$F2psEnd +rs diff --git a/share/doc/papers/timecounter/fig4.eps b/share/doc/papers/timecounter/fig4.eps new file mode 100644 index 0000000..7a5684f --- /dev/null +++ b/share/doc/papers/timecounter/fig4.eps @@ -0,0 +1,259 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: fig4.eps +%%Creator: fig2dev Version 3.2 Patchlevel 3d +%%CreationDate: $FreeBSD$ +%%For: phk@critter.freebsd.dk (Poul-Henning Kamp) +%%BoundingBox: 0 0 119 203 +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +newpath 0 203 moveto 0 0 lineto 119 0 lineto 119 203 lineto closepath clip newpath +-8.3 207.7 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit + 0.06000 0.06000 sc +% +% Fig objects follow +% +/Times-Roman ff 180.00 scf sf +300 450 m +gs 1 -1 sc (*volatile timehands;) col0 sh gr +% Polyline +7.500 slw +n 1005 750 m 900 750 900 1095 105 arcto 4 {pop} repeat + 900 1200 1245 1200 105 arcto 4 {pop} repeat + 1350 1200 1350 855 105 arcto 4 {pop} repeat + 1350 750 1005 750 105 arcto 4 {pop} repeat + cp gs col0 s gr +% Polyline +n 1755 750 m 1650 750 1650 1095 105 arcto 4 {pop} repeat + 1650 1200 1995 1200 105 arcto 4 {pop} repeat + 2100 1200 2100 855 105 arcto 4 {pop} repeat + 2100 750 1755 750 105 arcto 4 {pop} repeat + cp gs col0 s gr +% Polyline +n 1755 1500 m 1650 1500 1650 1845 105 arcto 4 {pop} repeat + 1650 1950 1995 1950 105 arcto 4 {pop} repeat + 2100 1950 2100 1605 105 arcto 4 {pop} repeat + 2100 1500 1755 1500 105 arcto 4 {pop} repeat + cp gs col0 s gr +% Polyline +n 1755 2250 m 1650 2250 1650 2595 105 arcto 4 {pop} repeat + 1650 2700 1995 2700 105 arcto 4 {pop} repeat + 2100 2700 2100 2355 105 arcto 4 {pop} repeat + 2100 2250 1755 2250 105 arcto 4 {pop} repeat + cp gs col0 s gr +% Polyline +n 1755 3000 m 1650 3000 1650 3345 105 arcto 4 {pop} repeat + 1650 3450 1995 3450 105 arcto 4 {pop} repeat + 2100 3450 2100 3105 105 arcto 4 {pop} repeat + 2100 3000 1755 3000 105 arcto 4 {pop} repeat + cp gs col0 s gr +% Polyline +n 1005 3000 m 900 3000 900 3345 105 arcto 4 {pop} repeat + 900 3450 1245 3450 105 arcto 4 {pop} repeat + 1350 3450 1350 3105 105 arcto 4 {pop} repeat + 1350 3000 1005 3000 105 arcto 4 {pop} repeat + cp gs col0 s gr +% Polyline +n 255 3000 m 150 3000 150 3345 105 arcto 4 {pop} repeat + 150 3450 495 3450 105 arcto 4 {pop} repeat + 600 3450 600 3105 105 arcto 4 {pop} repeat + 600 3000 255 3000 105 arcto 4 {pop} repeat + cp gs col0 s gr +% Polyline +n 255 2250 m 150 2250 150 2595 105 arcto 4 {pop} repeat + 150 2700 495 2700 105 arcto 4 {pop} repeat + 600 2700 600 2355 105 arcto 4 {pop} repeat + 600 2250 255 2250 105 arcto 4 {pop} repeat + cp gs col0 s gr +% Polyline +n 255 1500 m 150 1500 150 1845 105 arcto 4 {pop} repeat + 150 1950 495 1950 105 arcto 4 {pop} repeat + 600 1950 600 1605 105 arcto 4 {pop} repeat + 600 1500 255 1500 105 arcto 4 {pop} repeat + cp gs col0 s gr +% Polyline +gs clippath +915 1005 m 915 945 l 763 945 l 883 975 l 763 1005 l cp +eoclip +n 600 975 m + 900 975 l gs col0 s gr gr + +% arrowhead +n 763 1005 m 883 975 l 763 945 l col0 s +% Polyline +gs clippath +1665 1005 m 1665 945 l 1513 945 l 1633 975 l 1513 1005 l cp +eoclip +n 1350 975 m + 1650 975 l gs col0 s gr gr + +% arrowhead +n 1513 1005 m 1633 975 l 1513 945 l col0 s +% Polyline +gs clippath +1845 1515 m 1905 1515 l 1905 1363 l 1875 1483 l 1845 1363 l cp +eoclip +n 1875 1200 m + 1875 1500 l gs col0 s gr gr + +% arrowhead +n 1845 1363 m 1875 1483 l 1905 1363 l col0 s +% Polyline +gs clippath +1845 2265 m 1905 2265 l 1905 2113 l 1875 2233 l 1845 2113 l cp +eoclip +n 1875 1950 m + 1875 2250 l gs col0 s gr gr + +% arrowhead +n 1845 2113 m 1875 2233 l 1905 2113 l col0 s +% Polyline +gs clippath +1845 3015 m 1905 3015 l 1905 2863 l 1875 2983 l 1845 2863 l cp +eoclip +n 1875 2700 m + 1875 3000 l gs col0 s gr gr + +% arrowhead +n 1845 2863 m 1875 2983 l 1905 2863 l col0 s +% Polyline +gs clippath +1335 3195 m 1335 3255 l 1487 3255 l 1367 3225 l 1487 3195 l cp +eoclip +n 1650 3225 m + 1350 3225 l gs col0 s gr gr + +% arrowhead +n 1487 3195 m 1367 3225 l 1487 3255 l col0 s +% Polyline +gs clippath +585 3195 m 585 3255 l 737 3255 l 617 3225 l 737 3195 l cp +eoclip +n 900 3225 m + 600 3225 l gs col0 s gr gr + +% arrowhead +n 737 3195 m 617 3225 l 737 3255 l col0 s +% Polyline +gs clippath +405 2685 m 345 2685 l 345 2837 l 375 2717 l 405 2837 l cp +eoclip +n 375 3000 m + 375 2700 l gs col0 s gr gr + +% arrowhead +n 405 2837 m 375 2717 l 345 2837 l col0 s +% Polyline +gs clippath +405 1935 m 345 1935 l 345 2087 l 375 1967 l 405 2087 l cp +eoclip +n 375 2250 m + 375 1950 l gs col0 s gr gr + +% arrowhead +n 405 2087 m 375 1967 l 345 2087 l col0 s +% Polyline +gs clippath +405 1185 m 345 1185 l 345 1337 l 375 1217 l 405 1337 l cp +eoclip +n 375 1500 m + 375 1200 l gs col0 s gr gr + +% arrowhead +n 405 1337 m 375 1217 l 345 1337 l col0 s +% Polyline +gs clippath +1845 765 m 1905 765 l 1905 613 l 1875 733 l 1845 613 l cp +eoclip +n 1800 375 m 1875 375 l + 1875 750 l gs col0 s gr gr + +% arrowhead +n 1845 613 m 1875 733 l 1905 613 l col0 s +/Times-Roman ff 180.00 scf sf +150 225 m +gs 1 -1 sc (struct timehands) col0 sh gr +% Polyline +n 255 750 m 150 750 150 1095 105 arcto 4 {pop} repeat + 150 1200 495 1200 105 arcto 4 {pop} repeat + 600 1200 600 855 105 arcto 4 {pop} repeat + 600 750 255 750 105 arcto 4 {pop} repeat + cp gs col0 s gr +$F2psEnd +rs diff --git a/share/doc/papers/timecounter/fig5.eps b/share/doc/papers/timecounter/fig5.eps new file mode 100644 index 0000000..b6274c1 --- /dev/null +++ b/share/doc/papers/timecounter/fig5.eps @@ -0,0 +1,211 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: fig5.eps +%%Creator: fig2dev Version 3.2 Patchlevel 3d +%%CreationDate: $FreeBSD$ +%%For: phk@critter.freebsd.dk (Poul-Henning Kamp) +%%BoundingBox: 0 0 140 225 +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +newpath 0 225 moveto 0 0 lineto 140 0 lineto 140 225 lineto closepath clip newpath +-7.7 234.7 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit + 0.06000 0.06000 sc +% +% Fig objects follow +% +/Times-Roman ff 180.00 scf sf +1950 600 m +gs 1 -1 sc (PPS#1) col0 sh gr +% Polyline +7.500 slw +gs clippath +915 2130 m 915 2070 l 763 2070 l 883 2100 l 763 2130 l cp +eoclip +n 600 2100 m + 900 2100 l gs col0 s gr gr + +% arrowhead +n 763 2130 m 883 2100 l 763 2070 l col0 s +% Polyline +gs clippath +1665 2130 m 1665 2070 l 1513 2070 l 1633 2100 l 1513 2130 l cp +eoclip +n 1350 2100 m + 1650 2100 l gs col0 s gr gr + +% arrowhead +n 1513 2130 m 1633 2100 l 1513 2070 l col0 s +% Polyline +15.000 slw +n 900 1050 m 1350 1050 l 1350 3000 l 900 3000 l + cp gs col0 s gr +% Polyline +n 1650 1050 m 2100 1050 l 2100 3000 l 1650 3000 l + cp gs col0 s gr +% Polyline +7.500 slw +gs clippath +345 3465 m 405 3465 l 405 3313 l 375 3433 l 345 3313 l cp +eoclip +n 375 3000 m + 375 3450 l gs col0 s gr gr + +% arrowhead +n 345 3313 m 375 3433 l 405 3313 l col0 s +% Polyline +gs clippath +1095 3465 m 1155 3465 l 1155 3313 l 1125 3433 l 1095 3313 l cp +eoclip +n 1125 3000 m + 1125 3450 l gs col0 s gr gr + +% arrowhead +n 1095 3313 m 1125 3433 l 1155 3313 l col0 s +% Polyline +gs clippath +1845 3465 m 1905 3465 l 1905 3313 l 1875 3433 l 1845 3313 l cp +eoclip +n 1875 3000 m + 1875 3450 l gs col0 s gr gr + +% arrowhead +n 1845 3313 m 1875 3433 l 1905 3313 l col0 s +% Polyline +gs clippath +2070 3915 m 2130 3915 l 2130 3763 l 2100 3883 l 2070 3763 l cp +eoclip +n 150 3450 m 2100 3450 l + 2100 3900 l gs col0 s gr gr + +% arrowhead +n 2070 3763 m 2100 3883 l 2130 3763 l col0 s +% Polyline +gs clippath +1845 1065 m 1905 1065 l 1905 913 l 1875 1033 l 1845 913 l cp +eoclip +n 1875 600 m + 1875 1050 l gs col0 s gr gr + +% arrowhead +n 1845 913 m 1875 1033 l 1905 913 l col0 s +% Polyline +gs clippath +1095 1065 m 1155 1065 l 1155 913 l 1125 1033 l 1095 913 l cp +eoclip +n 1125 450 m + 1125 1050 l gs col0 s gr gr + +% arrowhead +n 1095 913 m 1125 1033 l 1155 913 l col0 s +% Polyline +gs clippath +345 1065 m 405 1065 l 405 913 l 375 1033 l 345 913 l cp +eoclip +n 375 300 m + 375 1050 l gs col0 s gr gr + +% arrowhead +n 345 913 m 375 1033 l 405 913 l col0 s +/Times-Roman ff 180.00 scf sf +450 2850 m +gs 1 -1 sc 90.0 rot (26 bit binary counter.) col0 sh gr +/Times-Roman ff 180.00 scf sf +2250 2025 m +gs 1 -1 sc (...) col0 sh gr +/Times-Roman ff 180.00 scf sf +1200 2850 m +gs 1 -1 sc 90.0 rot (26 bit latch) col0 sh gr +/Times-Roman ff 180.00 scf sf +1950 2850 m +gs 1 -1 sc 90.0 rot (26 bit latch) col0 sh gr +/Times-Roman ff 180.00 scf sf +450 3675 m +gs 1 -1 sc (PCI system bus) col0 sh gr +/Times-Roman ff 180.00 scf sf +450 300 m +gs 1 -1 sc (Clock) col0 sh gr +/Times-Roman ff 180.00 scf sf +1200 450 m +gs 1 -1 sc (PPS#0) col0 sh gr +% Polyline +15.000 slw +n 150 1050 m 600 1050 l 600 3000 l 150 3000 l + cp gs col0 s gr +$F2psEnd +rs diff --git a/share/doc/papers/timecounter/gps.ps b/share/doc/papers/timecounter/gps.ps new file mode 100644 index 0000000..aaaae81 --- /dev/null +++ b/share/doc/papers/timecounter/gps.ps @@ -0,0 +1,1488 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: _.ps +%%Creator: gnuplot 3.7 patchlevel 1 +%%CreationDate: $FreeBSD$ +%%DocumentFonts: (atend) +%%BoundingBox: 50 50 266 201 +%%Orientation: Portrait +%%EndComments +/gnudict 256 dict def +gnudict begin +/Color false def +/Solid false def +/gnulinewidth 5.000 def +/userlinewidth gnulinewidth def +/vshift -46 def +/dl {10 mul} def +/hpt_ 31.5 def +/vpt_ 31.5 def +/hpt hpt_ def +/vpt vpt_ def +/M {moveto} bind def +/L {lineto} bind def +/R {rmoveto} bind def +/V {rlineto} bind def +/vpt2 vpt 2 mul def +/hpt2 hpt 2 mul def +/Lshow { currentpoint stroke M + 0 vshift R show } def +/Rshow { currentpoint stroke M + dup stringwidth pop neg vshift R show } def +/Cshow { currentpoint stroke M + dup stringwidth pop -2 div vshift R show } def +/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def + /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def +/DL { Color {setrgbcolor Solid {pop []} if 0 setdash } + {pop pop pop Solid {pop []} if 0 setdash} ifelse } def +/BL { stroke userlinewidth 2 mul setlinewidth } def +/AL { stroke userlinewidth 2 div setlinewidth } def +/UL { dup gnulinewidth mul /userlinewidth exch def + 10 mul /udl exch def } def +/PL { stroke userlinewidth setlinewidth } def +/LTb { BL [] 0 0 0 DL } def +/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def +/LT0 { PL [] 1 0 0 DL } def +/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def +/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def +/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def +/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def +/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def +/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def +/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def +/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def +/Pnt { stroke [] 0 setdash + gsave 1 setlinecap M 0 0 V stroke grestore } def +/Dia { stroke [] 0 setdash 2 copy vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V closepath stroke + Pnt } def +/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V + currentpoint stroke M + hpt neg vpt neg R hpt2 0 V stroke + } def +/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V closepath stroke + Pnt } def +/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M + hpt2 vpt2 neg V currentpoint stroke M + hpt2 neg 0 R hpt2 vpt2 V stroke } def +/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V closepath stroke + Pnt } def +/Star { 2 copy Pls Crs } def +/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V closepath fill } def +/TriUF { stroke [] 0 setdash vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V closepath fill } def +/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V closepath stroke + Pnt } def +/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V closepath fill} def +/DiaF { stroke [] 0 setdash vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V closepath fill } def +/Pent { stroke [] 0 setdash 2 copy gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + closepath stroke grestore Pnt } def +/PentF { stroke [] 0 setdash gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + closepath fill grestore } def +/Circle { stroke [] 0 setdash 2 copy + hpt 0 360 arc stroke Pnt } def +/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def +/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def +/C1 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 90 arc closepath fill + vpt 0 360 arc closepath } bind def +/C2 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 90 180 arc closepath fill + vpt 0 360 arc closepath } bind def +/C3 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 180 arc closepath fill + vpt 0 360 arc closepath } bind def +/C4 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 180 270 arc closepath fill + vpt 0 360 arc closepath } bind def +/C5 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 90 arc + 2 copy moveto + 2 copy vpt 180 270 arc closepath fill + vpt 0 360 arc } bind def +/C6 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 90 270 arc closepath fill + vpt 0 360 arc closepath } bind def +/C7 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 270 arc closepath fill + vpt 0 360 arc closepath } bind def +/C8 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 270 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C9 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 270 450 arc closepath fill + vpt 0 360 arc closepath } bind def +/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill + 2 copy moveto + 2 copy vpt 90 180 arc closepath fill + vpt 0 360 arc closepath } bind def +/C11 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 180 arc closepath fill + 2 copy moveto + 2 copy vpt 270 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C12 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 180 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C13 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 90 arc closepath fill + 2 copy moveto + 2 copy vpt 180 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C14 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 90 360 arc closepath fill + vpt 0 360 arc } bind def +/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } bind def +/Square { dup Rec } bind def +/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def +/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def +/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def +/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def +/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def +/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def +/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill + exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def +/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def +/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill + 2 copy vpt Square fill + Bsquare } bind def +/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def +/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def +/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill + Bsquare } bind def +/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill + Bsquare } bind def +/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def +/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill + 2 copy vpt Square fill Bsquare } bind def +/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill + 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def +/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def +/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def +/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def +/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def +/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def +/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def +/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def +/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def +/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def +/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def +/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def +/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def +/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def +/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def +/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def +/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def +/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def +/DiaE { stroke [] 0 setdash vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V closepath stroke } def +/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V closepath stroke } def +/TriUE { stroke [] 0 setdash vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V closepath stroke } def +/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V closepath stroke } def +/PentE { stroke [] 0 setdash gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + closepath stroke grestore } def +/CircE { stroke [] 0 setdash + hpt 0 360 arc stroke } def +/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def +/DiaW { stroke [] 0 setdash vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V Opaque stroke } def +/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V Opaque stroke } def +/TriUW { stroke [] 0 setdash vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V Opaque stroke } def +/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V Opaque stroke } def +/PentW { stroke [] 0 setdash gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + Opaque stroke grestore } def +/CircW { stroke [] 0 setdash + hpt 0 360 arc Opaque stroke } def +/BoxFill { gsave Rec 1 setgray fill grestore } def +end +%%EndProlog +gnudict begin +gsave +50 50 translate +0.050 0.050 scale +0 setgray +newpath +(Helvetica) findfont 140 scalefont setfont +1.000 UL +LTb +1.000 UL +LTa +630 420 M +3452 0 V +1.000 UL +LTb +630 420 M +63 0 V +3389 0 R +-63 0 V +546 420 M +(-20) Rshow +1.000 UL +LTa +630 826 M +3452 0 V +1.000 UL +LTb +630 826 M +63 0 V +3389 0 R +-63 0 V +546 826 M +(-15) Rshow +1.000 UL +LTa +630 1232 M +3452 0 V +1.000 UL +LTb +630 1232 M +63 0 V +3389 0 R +-63 0 V +-3473 0 R +(-10) Rshow +1.000 UL +LTa +630 1638 M +3452 0 V +1.000 UL +LTb +630 1638 M +63 0 V +3389 0 R +-63 0 V +-3473 0 R +(-5) Rshow +1.000 UL +LTa +630 2044 M +3452 0 V +1.000 UL +LTb +630 2044 M +63 0 V +3389 0 R +-63 0 V +-3473 0 R +(0) Rshow +1.000 UL +LTa +630 2450 M +3452 0 V +1.000 UL +LTb +630 2450 M +63 0 V +3389 0 R +-63 0 V +-3473 0 R +(5) Rshow +1.000 UL +LTa +630 2856 M +3452 0 V +1.000 UL +LTb +630 2856 M +63 0 V +3389 0 R +-63 0 V +-3473 0 R +(10) Rshow +1.000 UL +LTa +630 420 M +0 2436 V +1.000 UL +LTb +630 420 M +0 63 V +0 2373 R +0 -63 V +630 280 M +(0) Cshow +1.000 UL +LTa +975 420 M +0 2436 V +1.000 UL +LTb +975 420 M +0 63 V +0 2373 R +0 -63 V +975 280 M +(100) Cshow +1.000 UL +LTa +1320 420 M +0 2436 V +1.000 UL +LTb +1320 420 M +0 63 V +0 2373 R +0 -63 V +0 -2513 R +(200) Cshow +1.000 UL +LTa +1666 420 M +0 2436 V +1.000 UL +LTb +1666 420 M +0 63 V +0 2373 R +0 -63 V +0 -2513 R +(300) Cshow +1.000 UL +LTa +2011 420 M +0 2436 V +1.000 UL +LTb +2011 420 M +0 63 V +0 2373 R +0 -63 V +0 -2513 R +(400) Cshow +1.000 UL +LTa +2356 420 M +0 2436 V +1.000 UL +LTb +2356 420 M +0 63 V +0 2373 R +0 -63 V +0 -2513 R +(500) Cshow +1.000 UL +LTa +2701 420 M +0 2436 V +1.000 UL +LTb +2701 420 M +0 63 V +0 2373 R +0 -63 V +0 -2513 R +(600) Cshow +1.000 UL +LTa +3046 420 M +0 2436 V +1.000 UL +LTb +3046 420 M +0 63 V +0 2373 R +0 -63 V +0 -2513 R +(700) Cshow +1.000 UL +LTa +3392 420 M +0 2436 V +1.000 UL +LTb +3392 420 M +0 63 V +0 2373 R +0 -63 V +0 -2513 R +(800) Cshow +1.000 UL +LTa +3737 420 M +0 2373 V +0 63 V +1.000 UL +LTb +3737 420 M +0 63 V +0 2373 R +0 -63 V +0 -2513 R +(900) Cshow +1.000 UL +LTa +4082 420 M +0 2436 V +1.000 UL +LTb +4082 420 M +0 63 V +0 2373 R +0 -63 V +0 -2513 R +(1000) Cshow +1.000 UL +LTb +630 420 M +3452 0 V +0 2436 V +-3452 0 V +630 420 L +140 1638 M +currentpoint gsave translate 90 rotate 0 0 M +(nanoseconds) Cshow +grestore +2356 70 M +(seconds) Cshow +1.000 UL +LT0 +631 2125 M +3 -81 V +4 0 V +3 -162 V +4 0 V +3 162 V +3 0 V +4 0 V +3 -244 V +4 0 V +3 244 V +4 -162 V +3 0 V +4 -163 V +3 0 V +4 163 V +3 -163 V +3 0 V +4 731 V +3 -812 V +4 162 V +3 650 V +4 -812 V +3 731 V +4 81 V +3 -731 V +4 650 V +3 -812 V +3 731 V +4 81 V +3 -731 V +4 650 V +3 0 V +4 -82 V +3 82 V +4 81 V +3 -81 V +4 0 V +3 -163 V +3 81 V +4 82 V +3 -163 V +4 0 V +3 -81 V +4 81 V +3 81 V +4 -81 V +3 0 V +3 -81 V +4 0 V +3 81 V +4 -81 V +3 0 V +4 -162 V +3 162 V +4 568 V +3 -568 V +4 0 V +3 568 V +3 -730 V +4 568 V +3 -568 V +4 0 V +3 649 V +4 -731 V +3 569 V +4 162 V +3 -812 V +4 731 V +3 81 V +3 -243 V +4 162 V +3 -731 V +4 569 V +3 81 V +4 -244 V +3 163 V +4 -731 V +3 568 V +3 0 V +4 -243 V +3 162 V +4 0 V +3 -244 V +4 82 V +3 -244 V +4 162 V +3 82 V +4 -244 V +3 81 V +3 -243 V +4 243 V +3 81 V +4 -243 V +3 81 V +4 -162 V +3 162 V +4 81 V +3 -243 V +4 81 V +3 -163 V +3 163 V +4 81 V +3 -162 V +4 81 V +3 -244 V +4 163 V +3 162 V +4 -244 V +3 82 V +3 -163 V +4 81 V +3 163 V +4 -244 V +3 81 V +4 -162 V +3 81 V +4 81 V +3 -162 V +4 0 V +3 -81 V +3 81 V +4 81 V +3 -81 V +4 0 V +3 650 V +4 -569 V +3 0 V +4 -162 V +3 162 V +4 569 V +3 -731 V +3 162 V +4 -162 V +3 81 V +4 812 V +3 0 V +4 -731 V +3 731 V +4 -893 V +3 731 V +4 0 V +3 -650 V +3 812 V +4 0 V +3 -244 V +4 82 V +3 162 V +4 -244 V +3 82 V +4 -244 V +3 81 V +3 163 V +4 -163 V +3 81 V +4 -162 V +3 0 V +4 244 V +3 -244 V +4 81 V +3 -162 V +4 81 V +3 162 V +3 -243 V +4 162 V +3 -162 V +4 0 V +3 162 V +4 -162 V +3 81 V +4 650 V +3 -812 V +4 162 V +3 650 V +3 -731 V +4 649 V +3 -812 V +4 731 V +3 163 V +4 -812 V +3 649 V +4 0 V +3 -81 V +4 162 V +3 -812 V +3 650 V +4 81 V +3 -243 V +4 162 V +3 -812 V +4 650 V +3 162 V +4 -325 V +3 81 V +4 0 V +3 -81 V +3 81 V +4 -243 V +3 162 V +4 0 V +3 -81 V +4 81 V +3 -162 V +4 162 V +3 81 V +3 -162 V +4 81 V +3 -243 V +4 243 V +3 81 V +4 -243 V +3 81 V +4 -162 V +3 162 V +4 0 V +3 -244 V +3 82 V +4 -82 V +3 82 V +4 81 V +3 -163 V +4 0 V +3 -81 V +4 81 V +3 82 V +4 -163 V +3 0 V +3 -162 V +4 162 V +3 0 V +4 -81 V +3 0 V +4 650 V +3 -569 V +4 0 V +3 -162 V +3 81 V +4 650 V +3 -731 V +4 162 V +3 569 V +4 -650 V +3 650 V +4 0 V +3 -569 V +3 569 V +4 162 V +3 -162 V +4 0 V +3 162 V +4 0 V +3 0 V +4 -162 V +3 162 V +4 0 V +3 0 V +3 0 V +4 -162 V +3 162 V +4 0 V +3 0 V +4 0 V +3 -244 V +4 244 V +3 0 V +4 -162 V +3 162 V +3 -162 V +4 162 V +3 -325 V +4 325 V +3 0 V +4 -162 V +3 162 V +4 -244 V +3 244 V +4 0 V +3 -162 V +3 162 V +4 -244 V +3 244 V +4 0 V +3 -162 V +4 162 V +3 -325 V +4 163 V +3 162 V +4 -244 V +3 82 V +3 568 V +4 -650 V +3 82 V +4 649 V +3 -731 V +4 569 V +3 162 V +4 -649 V +3 568 V +3 -731 V +4 569 V +3 162 V +4 -650 V +3 569 V +4 81 V +3 -162 V +4 81 V +3 -650 V +4 650 V +3 81 V +3 -162 V +4 0 V +3 243 V +4 -243 V +3 162 V +4 -162 V +3 0 V +4 243 V +3 -243 V +4 81 V +3 -81 V +3 0 V +4 162 V +3 -162 V +4 81 V +3 -163 V +4 0 V +3 244 V +4 -244 V +3 82 V +3 -82 V +4 0 V +3 163 V +4 -244 V +3 163 V +4 -163 V +3 0 V +4 -81 V +3 81 V +4 81 V +3 -81 V +3 0 V +4 -81 V +3 0 V +4 81 V +3 -81 V +4 -162 V +3 -163 V +4 81 V +3 82 V +4 -244 V +3 0 V +3 -162 V +4 81 V +3 81 V +4 -81 V +3 0 V +4 649 V +3 -649 V +4 0 V +3 -81 V +3 0 V +4 649 V +3 -649 V +4 0 V +3 730 V +4 -812 V +3 650 V +4 244 V +3 -812 V +4 649 V +3 -812 V +3 731 V +4 81 V +3 -731 V +4 650 V +3 81 V +4 -243 V +3 162 V +4 0 V +3 -162 V +4 162 V +3 -244 V +3 244 V +4 0 V +3 -244 V +4 82 V +3 -244 V +4 162 V +3 82 V +4 -163 V +3 81 V +4 -243 V +3 243 V +3 82 V +4 -244 V +3 81 V +4 -162 V +3 162 V +4 81 V +3 569 V +currentpoint stroke M +4 -731 V +3 731 V +3 81 V +4 -731 V +3 650 V +4 -731 V +3 650 V +4 0 V +3 -650 V +4 568 V +3 163 V +4 -163 V +3 0 V +3 163 V +4 -81 V +3 -82 V +4 -81 V +3 81 V +4 82 V +3 -163 V +4 0 V +3 -81 V +4 81 V +3 81 V +3 -162 V +4 0 V +3 0 V +4 0 V +3 81 V +4 -81 V +3 0 V +4 -162 V +3 162 V +4 0 V +3 -162 V +3 0 V +4 -163 V +3 81 V +4 82 V +3 -82 V +4 0 V +3 650 V +4 -731 V +3 163 V +3 649 V +4 -812 V +3 650 V +4 81 V +3 -650 V +4 650 V +3 -812 V +4 650 V +3 81 V +4 -731 V +3 650 V +3 81 V +4 -163 V +3 82 V +4 81 V +3 -163 V +4 82 V +3 -163 V +4 81 V +3 -162 V +4 81 V +3 163 V +3 -244 V +4 81 V +3 -81 V +4 0 V +3 81 V +4 -81 V +3 0 V +4 -244 V +3 244 V +3 0 V +4 -162 V +3 0 V +4 649 V +3 -731 V +4 82 V +3 649 V +4 -812 V +3 650 V +4 81 V +3 -731 V +3 650 V +4 81 V +3 -162 V +4 81 V +3 -731 V +4 650 V +3 0 V +4 -163 V +3 163 V +4 81 V +3 -163 V +3 0 V +4 -162 V +3 81 V +4 81 V +3 -81 V +4 0 V +3 -81 V +4 81 V +3 0 V +3 -81 V +4 0 V +3 -244 V +4 244 V +3 0 V +4 -244 V +3 0 V +4 650 V +3 -650 V +4 0 V +3 731 V +3 -812 V +4 650 V +3 162 V +4 -812 V +3 650 V +4 -812 V +3 731 V +4 162 V +3 0 V +4 -162 V +3 0 V +3 -82 V +4 163 V +3 0 V +4 -163 V +3 0 V +4 -81 V +3 163 V +4 0 V +3 -163 V +4 0 V +3 -81 V +3 81 V +4 81 V +3 -162 V +4 81 V +3 -81 V +4 0 V +3 81 V +4 -81 V +3 0 V +4 650 V +3 0 V +3 -650 V +4 650 V +3 -650 V +4 568 V +3 0 V +4 -568 V +3 650 V +4 0 V +3 -163 V +3 0 V +4 163 V +3 -163 V +4 0 V +3 -81 V +4 0 V +3 162 V +4 -162 V +3 0 V +4 -81 V +3 0 V +3 162 V +4 -325 V +3 82 V +4 -163 V +3 0 V +4 163 V +3 -244 V +4 81 V +3 -81 V +4 0 V +3 81 V +3 569 V +4 -650 V +3 487 V +4 81 V +3 -568 V +4 487 V +3 -731 V +4 650 V +3 0 V +3 -650 V +4 569 V +3 81 V +4 -162 V +3 0 V +4 162 V +3 -162 V +4 0 V +3 -82 V +4 0 V +3 163 V +3 -244 V +4 81 V +3 -162 V +4 0 V +3 162 V +4 -162 V +3 0 V +4 -162 V +3 162 V +4 81 V +3 -243 V +3 162 V +4 487 V +3 -731 V +4 82 V +3 730 V +4 -730 V +3 568 V +4 81 V +3 -731 V +3 650 V +4 81 V +3 -162 V +4 81 V +3 81 V +4 -162 V +3 81 V +4 -244 V +3 82 V +4 162 V +3 -244 V +3 82 V +4 -244 V +3 81 V +4 163 V +3 -163 V +4 81 V +3 -162 V +4 0 V +3 81 V +4 -81 V +3 0 V +3 -244 V +4 82 V +3 162 V +4 -162 V +3 0 V +4 730 V +3 -730 V +4 568 V +3 162 V +3 -812 V +4 650 V +3 162 V +4 -243 V +3 162 V +4 -812 V +3 650 V +4 81 V +3 -162 V +4 81 V +3 0 V +3 -81 V +4 81 V +3 -244 V +4 163 V +3 81 V +4 -163 V +3 82 V +4 -244 V +3 162 V +4 0 V +3 -162 V +3 0 V +4 -244 V +3 244 V +4 0 V +3 -325 V +4 0 V +3 -243 V +4 162 V +3 -81 V +4 -81 V +3 -82 V +3 731 V +4 -649 V +3 0 V +4 649 V +3 -812 V +4 731 V +3 162 V +4 -812 V +3 731 V +3 -812 V +4 731 V +3 162 V +4 -812 V +3 731 V +4 0 V +3 -81 V +4 162 V +3 -812 V +4 650 V +3 81 V +3 -81 V +4 81 V +3 0 V +4 -81 V +3 81 V +4 -243 V +3 162 V +4 162 V +3 -162 V +4 0 V +3 -244 V +3 244 V +4 0 V +3 -162 V +4 162 V +3 -244 V +4 82 V +3 162 V +4 -325 V +3 81 V +3 -162 V +4 81 V +3 163 V +4 -244 V +3 162 V +4 -162 V +3 0 V +4 244 V +3 -244 V +4 162 V +3 -162 V +3 0 V +4 244 V +3 -244 V +4 81 V +3 -81 V +4 0 V +3 162 V +4 -81 V +3 0 V +4 -81 V +3 81 V +3 81 V +4 -81 V +3 0 V +4 -81 V +3 81 V +4 163 V +3 -163 V +4 81 V +3 -162 V +3 81 V +4 650 V +3 -650 V +4 81 V +3 650 V +4 -731 V +3 731 V +4 -731 V +3 81 V +4 569 V +3 -650 V +3 650 V +4 -731 V +3 162 V +4 650 V +3 -731 V +4 650 V +3 81 V +4 -731 V +3 731 V +4 -812 V +3 650 V +3 243 V +4 -812 V +3 650 V +4 0 V +3 -81 V +4 81 V +3 81 V +4 -162 V +3 81 V +4 -244 V +3 163 V +3 0 V +4 -82 V +3 82 V +4 -244 V +3 81 V +4 0 V +3 -81 V +4 -162 V +3 -244 V +3 81 V +4 -81 V +currentpoint stroke M +3 -406 V +4 -325 V +3 0 V +4 325 V +3 0 V +4 -81 V +3 0 V +4 -81 V +3 81 V +3 0 V +4 -163 V +3 -81 V +4 -162 V +3 162 V +4 0 V +3 -81 V +4 81 V +3 -162 V +4 162 V +3 0 V +3 -162 V +4 81 V +3 -162 V +4 162 V +3 81 V +4 -243 V +3 162 V +4 -162 V +3 162 V +3 81 V +4 -162 V +3 81 V +4 812 V +3 -812 V +4 244 V +3 -163 V +4 0 V +3 731 V +4 -731 V +3 81 V +3 731 V +4 -731 V +3 731 V +4 0 V +3 -649 V +4 649 V +3 -731 V +4 731 V +3 0 V +4 -649 V +3 649 V +3 81 V +4 -162 V +3 162 V +4 -730 V +3 730 V +4 82 V +3 -163 V +4 81 V +3 -162 V +3 162 V +4 82 V +3 -163 V +4 81 V +3 -162 V +4 81 V +3 81 V +4 -81 V +3 0 V +4 -81 V +3 162 V +3 0 V +4 -81 V +3 0 V +4 -162 V +3 243 V +4 0 V +3 -81 V +4 81 V +3 -162 V +4 162 V +3 82 V +3 -244 V +4 81 V +3 569 V +4 -650 V +3 81 V +4 569 V +3 -731 V +4 731 V +3 81 V +4 -731 V +3 650 V +3 81 V +4 -81 V +3 0 V +4 -650 V +3 731 V +4 0 V +3 -163 V +4 82 V +3 162 V +3 -81 V +4 0 V +3 -163 V +4 82 V +3 81 V +4 -81 V +3 0 V +4 -163 V +3 81 V +4 82 V +3 -163 V +3 163 V +4 -244 V +3 81 V +4 81 V +3 -81 V +4 81 V +3 -162 V +4 0 V +3 81 V +4 -81 V +3 81 V +3 650 V +4 -731 V +3 81 V +4 -81 V +3 0 V +4 650 V +3 -650 V +4 0 V +3 731 V +4 -731 V +3 568 V +3 82 V +4 -163 V +3 163 V +4 81 V +3 -244 V +4 81 V +3 -162 V +4 81 V +3 81 V +3 -243 V +4 81 V +3 -162 V +4 81 V +3 81 V +4 -244 V +3 82 V +4 -163 V +3 81 V +4 82 V +3 -244 V +3 81 V +4 -243 V +3 243 V +4 81 V +3 -162 V +4 0 V +3 568 V +4 -568 V +3 0 V +4 568 V +3 -730 V +3 649 V +4 81 V +3 -812 V +4 650 V +3 -731 V +4 569 V +3 162 V +4 0 V +3 -162 V +3 81 V +4 -244 V +3 163 V +4 0 V +3 -82 V +4 82 V +3 -244 V +4 162 V +3 82 V +4 -244 V +3 81 V +3 -81 V +4 0 V +3 81 V +4 -81 V +3 0 V +4 568 V +3 -568 V +4 0 V +3 487 V +4 81 V +3 -243 V +3 162 V +4 -731 V +stroke +grestore +end +showpage +%%Trailer +%%DocumentFonts: Helvetica diff --git a/share/doc/papers/timecounter/intr.ps b/share/doc/papers/timecounter/intr.ps new file mode 100644 index 0000000..a6bb7ce --- /dev/null +++ b/share/doc/papers/timecounter/intr.ps @@ -0,0 +1,1501 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: _.ps +%%Creator: gnuplot 3.7 patchlevel 1 +%%CreationDate: $FreeBSD$ +%%DocumentFonts: (atend) +%%BoundingBox: 50 50 266 201 +%%Orientation: Portrait +%%EndComments +/gnudict 256 dict def +gnudict begin +/Color false def +/Solid false def +/gnulinewidth 5.000 def +/userlinewidth gnulinewidth def +/vshift -46 def +/dl {10 mul} def +/hpt_ 31.5 def +/vpt_ 31.5 def +/hpt hpt_ def +/vpt vpt_ def +/M {moveto} bind def +/L {lineto} bind def +/R {rmoveto} bind def +/V {rlineto} bind def +/vpt2 vpt 2 mul def +/hpt2 hpt 2 mul def +/Lshow { currentpoint stroke M + 0 vshift R show } def +/Rshow { currentpoint stroke M + dup stringwidth pop neg vshift R show } def +/Cshow { currentpoint stroke M + dup stringwidth pop -2 div vshift R show } def +/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def + /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def +/DL { Color {setrgbcolor Solid {pop []} if 0 setdash } + {pop pop pop Solid {pop []} if 0 setdash} ifelse } def +/BL { stroke userlinewidth 2 mul setlinewidth } def +/AL { stroke userlinewidth 2 div setlinewidth } def +/UL { dup gnulinewidth mul /userlinewidth exch def + 10 mul /udl exch def } def +/PL { stroke userlinewidth setlinewidth } def +/LTb { BL [] 0 0 0 DL } def +/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def +/LT0 { PL [] 1 0 0 DL } def +/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def +/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def +/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def +/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def +/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def +/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def +/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def +/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def +/Pnt { stroke [] 0 setdash + gsave 1 setlinecap M 0 0 V stroke grestore } def +/Dia { stroke [] 0 setdash 2 copy vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V closepath stroke + Pnt } def +/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V + currentpoint stroke M + hpt neg vpt neg R hpt2 0 V stroke + } def +/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V closepath stroke + Pnt } def +/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M + hpt2 vpt2 neg V currentpoint stroke M + hpt2 neg 0 R hpt2 vpt2 V stroke } def +/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V closepath stroke + Pnt } def +/Star { 2 copy Pls Crs } def +/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V closepath fill } def +/TriUF { stroke [] 0 setdash vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V closepath fill } def +/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V closepath stroke + Pnt } def +/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V closepath fill} def +/DiaF { stroke [] 0 setdash vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V closepath fill } def +/Pent { stroke [] 0 setdash 2 copy gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + closepath stroke grestore Pnt } def +/PentF { stroke [] 0 setdash gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + closepath fill grestore } def +/Circle { stroke [] 0 setdash 2 copy + hpt 0 360 arc stroke Pnt } def +/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def +/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def +/C1 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 90 arc closepath fill + vpt 0 360 arc closepath } bind def +/C2 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 90 180 arc closepath fill + vpt 0 360 arc closepath } bind def +/C3 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 180 arc closepath fill + vpt 0 360 arc closepath } bind def +/C4 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 180 270 arc closepath fill + vpt 0 360 arc closepath } bind def +/C5 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 90 arc + 2 copy moveto + 2 copy vpt 180 270 arc closepath fill + vpt 0 360 arc } bind def +/C6 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 90 270 arc closepath fill + vpt 0 360 arc closepath } bind def +/C7 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 270 arc closepath fill + vpt 0 360 arc closepath } bind def +/C8 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 270 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C9 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 270 450 arc closepath fill + vpt 0 360 arc closepath } bind def +/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill + 2 copy moveto + 2 copy vpt 90 180 arc closepath fill + vpt 0 360 arc closepath } bind def +/C11 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 180 arc closepath fill + 2 copy moveto + 2 copy vpt 270 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C12 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 180 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C13 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 0 90 arc closepath fill + 2 copy moveto + 2 copy vpt 180 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/C14 { BL [] 0 setdash 2 copy moveto + 2 copy vpt 90 360 arc closepath fill + vpt 0 360 arc } bind def +/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill + vpt 0 360 arc closepath } bind def +/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } bind def +/Square { dup Rec } bind def +/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def +/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def +/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def +/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def +/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def +/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def +/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill + exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def +/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def +/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill + 2 copy vpt Square fill + Bsquare } bind def +/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def +/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def +/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill + Bsquare } bind def +/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill + Bsquare } bind def +/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def +/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill + 2 copy vpt Square fill Bsquare } bind def +/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill + 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def +/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def +/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def +/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def +/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def +/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def +/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def +/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def +/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def +/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def +/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def +/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def +/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def +/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def +/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def +/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def +/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def +/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def +/DiaE { stroke [] 0 setdash vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V closepath stroke } def +/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V closepath stroke } def +/TriUE { stroke [] 0 setdash vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V closepath stroke } def +/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V closepath stroke } def +/PentE { stroke [] 0 setdash gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + closepath stroke grestore } def +/CircE { stroke [] 0 setdash + hpt 0 360 arc stroke } def +/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def +/DiaW { stroke [] 0 setdash vpt add M + hpt neg vpt neg V hpt vpt neg V + hpt vpt V hpt neg vpt V Opaque stroke } def +/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M + 0 vpt2 neg V hpt2 0 V 0 vpt2 V + hpt2 neg 0 V Opaque stroke } def +/TriUW { stroke [] 0 setdash vpt 1.12 mul add M + hpt neg vpt -1.62 mul V + hpt 2 mul 0 V + hpt neg vpt 1.62 mul V Opaque stroke } def +/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M + hpt neg vpt 1.62 mul V + hpt 2 mul 0 V + hpt neg vpt -1.62 mul V Opaque stroke } def +/PentW { stroke [] 0 setdash gsave + translate 0 hpt M 4 {72 rotate 0 hpt L} repeat + Opaque stroke grestore } def +/CircW { stroke [] 0 setdash + hpt 0 360 arc Opaque stroke } def +/BoxFill { gsave Rec 1 setgray fill grestore } def +end +%%EndProlog +gnudict begin +gsave +50 50 translate +0.050 0.050 scale +0 setgray +newpath +(Helvetica) findfont 140 scalefont setfont +1.000 UL +LTb +1.000 UL +LTa +882 420 M +3200 0 V +1.000 UL +LTb +882 420 M +63 0 V +3137 0 R +-63 0 V +798 420 M +(0) Rshow +1.000 UL +LTa +882 768 M +3200 0 V +1.000 UL +LTb +882 768 M +63 0 V +3137 0 R +-63 0 V +798 768 M +(20000) Rshow +1.000 UL +LTa +882 1116 M +3200 0 V +1.000 UL +LTb +882 1116 M +63 0 V +3137 0 R +-63 0 V +-3221 0 R +(40000) Rshow +1.000 UL +LTa +882 1464 M +3200 0 V +1.000 UL +LTb +882 1464 M +63 0 V +3137 0 R +-63 0 V +-3221 0 R +(60000) Rshow +1.000 UL +LTa +882 1812 M +3200 0 V +1.000 UL +LTb +882 1812 M +63 0 V +3137 0 R +-63 0 V +-3221 0 R +(80000) Rshow +1.000 UL +LTa +882 2160 M +3200 0 V +1.000 UL +LTb +882 2160 M +63 0 V +3137 0 R +-63 0 V +-3221 0 R +(100000) Rshow +1.000 UL +LTa +882 2508 M +3200 0 V +1.000 UL +LTb +882 2508 M +63 0 V +3137 0 R +-63 0 V +-3221 0 R +(120000) Rshow +1.000 UL +LTa +882 2856 M +3200 0 V +1.000 UL +LTb +882 2856 M +63 0 V +3137 0 R +-63 0 V +-3221 0 R +(140000) Rshow +1.000 UL +LTa +882 420 M +0 2436 V +1.000 UL +LTb +882 420 M +0 63 V +0 2373 R +0 -63 V +882 280 M +(0) Cshow +1.000 UL +LTa +1202 420 M +0 2436 V +1.000 UL +LTb +1202 420 M +0 63 V +0 2373 R +0 -63 V +0 -2513 R +(100) Cshow +1.000 UL +LTa +1522 420 M +0 2436 V +1.000 UL +LTb +1522 420 M +0 63 V +0 2373 R +0 -63 V +0 -2513 R +(200) Cshow +1.000 UL +LTa +1842 420 M +0 2436 V +1.000 UL +LTb +1842 420 M +0 63 V +0 2373 R +0 -63 V +0 -2513 R +(300) Cshow +1.000 UL +LTa +2162 420 M +0 2436 V +1.000 UL +LTb +2162 420 M +0 63 V +0 2373 R +0 -63 V +0 -2513 R +(400) Cshow +1.000 UL +LTa +2482 420 M +0 2436 V +1.000 UL +LTb +2482 420 M +0 63 V +0 2373 R +0 -63 V +0 -2513 R +(500) Cshow +1.000 UL +LTa +2802 420 M +0 2436 V +1.000 UL +LTb +2802 420 M +0 63 V +0 2373 R +0 -63 V +0 -2513 R +(600) Cshow +1.000 UL +LTa +3122 420 M +0 2436 V +1.000 UL +LTb +3122 420 M +0 63 V +0 2373 R +0 -63 V +0 -2513 R +(700) Cshow +1.000 UL +LTa +3442 420 M +0 2373 V +0 63 V +1.000 UL +LTb +3442 420 M +0 63 V +0 2373 R +0 -63 V +0 -2513 R +(800) Cshow +1.000 UL +LTa +3762 420 M +0 2373 V +0 63 V +1.000 UL +LTb +3762 420 M +0 63 V +0 2373 R +0 -63 V +0 -2513 R +(900) Cshow +1.000 UL +LTa +4082 420 M +0 2436 V +1.000 UL +LTb +4082 420 M +0 63 V +0 2373 R +0 -63 V +0 -2513 R +(1000) Cshow +1.000 UL +LTb +882 420 M +3200 0 V +0 2436 V +-3200 0 V +882 420 L +140 1638 M +currentpoint gsave translate 90 rotate 0 0 M +(nanoseconds) Cshow +grestore +2482 70 M +(seconds) Cshow +1.000 UL +LT0 +883 628 M +3 589 V +3 -538 V +3 -63 V +4 51 V +3 -42 V +3 458 V +3 -424 V +3 19 V +4 -31 V +3 30 V +3 10 V +3 65 V +3 -89 V +4 -39 V +3 33 V +3 13 V +3 -10 V +3 23 V +3 -18 V +4 25 V +3 -17 V +3 232 V +3 -248 V +4 19 V +3 -35 V +3 8 V +3 -46 V +3 9 V +4 19 V +3 -17 V +3 9 V +3 243 V +3 -226 V +4 -41 V +3 38 V +3 0 V +3 5 V +3 -40 V +4 571 V +3 823 V +3 -1311 V +3 -44 V +3 7 V +4 4 V +3 9 V +3 11 V +3 13 V +3 -81 V +3 54 V +4 -27 V +3 30 V +3 -8 V +3 -21 V +4 -2 V +3 19 V +3 -14 V +3 13 V +3 -25 V +4 27 V +3 15 V +3 1888 V +3 -1558 V +3 -413 V +4 38 V +3 2 V +3 -6 V +3 15 V +3 -42 V +4 24 V +3 -27 V +3 19 V +3 -8 V +3 1236 V +3 -1232 V +4 3 V +3 -15 V +3 9 V +3 10 V +3 -27 V +4 -31 V +3 40 V +3 17 V +3 -20 V +3 2 V +4 3 V +3 15 V +3 -27 V +3 15 V +4 -37 V +3 42 V +3 1 V +3 -10 V +3 -10 V +4 -22 V +3 11 V +3 34 V +3 -33 V +3 -6 V +4 3 V +3 13 V +3 17 V +3 -30 V +3 13 V +4 15 V +3 -26 V +3 341 V +3 -321 V +3 26 V +4 -25 V +3 39 V +3 -26 V +3 -10 V +3 -23 V +4 14 V +3 24 V +3 -14 V +3 3 V +3 -32 V +3 41 V +4 -24 V +3 18 V +3 -28 V +3 38 V +4 -24 V +3 28 V +3 -30 V +3 5 V +3 -7 V +4 -7 V +3 9 V +3 37 V +3 -43 V +3 19 V +4 -9 V +3 -16 V +3 39 V +3 -22 V +3 -29 V +4 126 V +3 1183 V +3 -1283 V +3 -30 V +3 -6 V +4 20 V +3 -18 V +3 28 V +3 -15 V +3 3 V +3 34 V +4 -27 V +3 18 V +3 -48 V +3 55 V +3 -23 V +4 14 V +3 10 V +3 -21 V +3 22 V +4 -23 V +3 12 V +3 -15 V +3 25 V +3 -49 V +4 54 V +3 -30 V +3 27 V +3 -18 V +3 10 V +4 -24 V +3 58 V +3 -42 V +3 12 V +3 784 V +4 -765 V +3 -15 V +3 56 V +3 -64 V +3 2 V +4 39 V +3 -32 V +3 -11 V +3 26 V +3 -15 V +4 7 V +3 -30 V +3 46 V +3 -7 V +3 16 V +4 -39 V +3 -9 V +3 -7 V +3 22 V +3 -32 V +4 16 V +3 0 V +3 1 V +3 -13 V +3 14 V +4 10 V +3 -39 V +3 10 V +3 -7 V +3 29 V +4 -28 V +3 35 V +3 686 V +3 -531 V +3 -97 V +4 26 V +3 -31 V +3 -58 V +3 45 V +3 27 V +3 -38 V +4 30 V +3 -80 V +3 83 V +3 -7 V +3 20 V +4 -26 V +3 108 V +3 -101 V +3 27 V +4 -49 V +3 41 V +3 -24 V +3 4 V +3 7 V +4 -3 V +3 -7 V +3 26 V +3 -9 V +3 33 V +4 132 V +3 204 V +3 -416 V +3 26 V +3 -37 V +4 23 V +3 1264 V +3 -1299 V +3 7 V +3 -11 V +3 21 V +4 -40 V +3 41 V +3 -28 V +3 28 V +3 -24 V +4 18 V +3 -12 V +3 6 V +3 -3 V +4 5 V +3 -22 V +3 24 V +3 3 V +3 10 V +4 -26 V +3 26 V +3 -16 V +3 12 V +3 -16 V +4 8 V +3 -30 V +3 3 V +3 -1 V +3 28 V +4 0 V +3 -1 V +3 -3 V +3 -28 V +3 341 V +3 -287 V +4 -42 V +3 38 V +3 -22 V +3 20 V +3 -19 V +4 39 V +3 -24 V +3 16 V +3 -9 V +3 20 V +4 -18 V +3 -21 V +3 14 V +3 -37 V +3 47 V +4 -21 V +3 20 V +3 -36 V +3 38 V +4 8 V +3 -20 V +3 -6 V +3 5 V +3 -21 V +4 30 V +3 -29 V +3 5 V +3 -8 V +3 15 V +4 -18 V +3 17 V +3 138 V +3 949 V +3 -1087 V +4 -14 V +3 -4 V +3 17 V +3 -16 V +3 5 V +3 -16 V +4 15 V +3 -7 V +3 23 V +3 -37 V +4 43 V +3 -14 V +3 -2 V +3 -3 V +3 36 V +4 -66 V +3 41 V +3 8 V +3 -17 V +3 16 V +4 2 V +3 9 V +3 -34 V +3 50 V +3 -48 V +4 18 V +3 -10 V +3 6 V +3 -2 V +3 12 V +4 -23 V +3 782 V +3 -758 V +3 50 V +3 -31 V +4 27 V +3 -4 V +3 29 V +3 -32 V +3 -2 V +4 0 V +3 2 V +3 4 V +3 -7 V +3 -48 V +4 15 V +3 -15 V +3 6 V +3 -52 V +3 71 V +4 -15 V +3 12 V +3 -4 V +3 30 V +3 -28 V +4 19 V +3 -21 V +3 15 V +3 -17 V +3 11 V +4 1 V +3 -21 V +3 34 V +3 -27 V +3 140 V +4 1432 V +3 -1456 V +3 -52 V +3 59 V +3 -36 V +3 15 V +4 -9 V +3 15 V +3 -17 V +3 4 V +3 -2 V +4 4 V +3 -4 V +3 -2 V +3 -29 V +3 31 V +4 2 V +3 -2 V +3 21 V +3 -11 V +4 -6 V +3 16 V +3 13 V +3 -34 V +3 39 V +4 -13 V +currentpoint stroke M +3 -21 V +3 54 V +3 -33 V +3 24 V +4 -29 V +3 64 V +3 447 V +3 757 V +3 -1299 V +4 549 V +3 -428 V +3 -128 V +3 0 V +3 14 V +3 -40 V +4 1 V +3 23 V +3 -41 V +3 50 V +4 -21 V +3 20 V +3 -15 V +3 -1 V +3 -6 V +4 -1 V +3 -19 V +3 26 V +3 -9 V +3 21 V +4 -28 V +3 29 V +3 1 V +3 -8 V +3 1 V +4 0 V +3 -7 V +3 12 V +3 -21 V +3 19 V +3 -15 V +4 256 V +3 -228 V +3 2 V +3 -3 V +3 2 V +4 -25 V +3 38 V +3 -3 V +3 21 V +3 -28 V +4 42 V +3 -24 V +3 -10 V +3 -10 V +3 -7 V +4 19 V +3 -14 V +3 7 V +3 -29 V +4 -3 V +3 -4 V +3 28 V +3 -18 V +3 10 V +4 3 V +3 23 V +3 -51 V +3 15 V +3 -29 V +4 36 V +3 -19 V +3 18 V +3 4 V +3 220 V +4 835 V +3 -1079 V +3 -18 V +3 7 V +3 17 V +3 -11 V +4 3 V +3 8 V +3 -11 V +3 24 V +3 -9 V +4 -1 V +3 4 V +3 5 V +3 -15 V +4 6 V +3 8 V +3 26 V +3 -26 V +3 0 V +4 5 V +3 27 V +3 -24 V +3 -2 V +3 3 V +4 -2 V +3 22 V +3 -38 V +3 28 V +3 -36 V +4 29 V +3 -15 V +3 28 V +3 601 V +3 -596 V +4 -36 V +3 6 V +3 27 V +3 -1 V +3 -41 V +3 56 V +4 -67 V +3 16 V +3 -30 V +3 -7 V +3 2108 V +4 -2072 V +3 -28 V +3 10 V +3 20 V +4 1 V +3 -125 V +3 130 V +3 -46 V +3 5 V +4 33 V +3 8 V +3 -21 V +3 -9 V +3 56 V +4 -5 V +3 -38 V +3 36 V +3 -49 V +3 31 V +4 4 V +3 640 V +3 564 V +3 -1162 V +3 46 V +3 -53 V +4 40 V +3 -32 V +3 16 V +3 2 V +3 7 V +4 17 V +3 -26 V +3 4 V +3 -1 V +3 -19 V +4 18 V +3 -13 V +3 35 V +3 -15 V +4 -19 V +3 3 V +3 25 V +3 -34 V +3 37 V +4 -28 V +3 31 V +3 -18 V +3 31 V +3 -56 V +4 -4 V +3 -24 V +3 -30 V +3 20 V +3 33 V +4 1300 V +3 -1283 V +3 1 V +3 6 V +3 -18 V +3 20 V +4 -21 V +3 -10 V +3 35 V +3 -20 V +3 498 V +4 -391 V +3 -145 V +3 3 V +3 8 V +3 -58 V +4 50 V +3 -12 V +3 6 V +3 -1 V +4 -9 V +3 -1 V +3 5 V +3 10 V +3 14 V +4 -23 V +3 20 V +3 -2 V +3 -9 V +3 4 V +4 -1 V +3 -7 V +3 2 V +3 246 V +3 -249 V +4 10 V +3 9 V +3 -28 V +3 47 V +3 -16 V +3 -9 V +4 3 V +3 22 V +3 -26 V +3 21 V +3 -5 V +4 33 V +3 -50 V +3 -21 V +3 40 V +4 -18 V +3 14 V +3 -29 V +3 29 V +3 -24 V +4 29 V +3 -38 V +3 41 V +3 -24 V +3 41 V +4 -49 V +3 19 V +3 -14 V +3 10 V +3 -2 V +4 9 V +3 192 V +3 903 V +3 -1091 V +3 8 V +4 -21 V +3 16 V +3 -13 V +3 12 V +3 -9 V +3 18 V +4 -9 V +3 -7 V +3 4 V +3 12 V +4 -5 V +3 0 V +3 -5 V +3 14 V +3 -11 V +4 26 V +3 -34 V +3 -53 V +3 66 V +3 35 V +4 -39 V +3 16 V +3 4 V +3 -43 V +3 52 V +4 -36 V +3 22 V +3 -26 V +3 28 V +3 -15 V +4 199 V +3 -180 V +3 32 V +3 -19 V +3 -10 V +4 -11 V +3 -39 V +3 48 V +3 -26 V +3 20 V +3 24 V +4 -43 V +3 26 V +3 -36 V +3 22 V +3 3 V +4 -7 V +3 -12 V +3 14 V +3 -24 V +4 16 V +3 -6 V +3 4 V +3 13 V +3 -26 V +4 29 V +3 3 V +3 9 V +3 -16 V +3 4 V +4 22 V +3 -45 V +3 45 V +3 -31 V +3 1300 V +4 -1245 V +3 -27 V +3 29 V +3 -29 V +3 20 V +4 -20 V +3 37 V +3 -32 V +3 42 V +3 -40 V +4 23 V +3 -5 V +3 -70 V +3 32 V +3 24 V +4 -11 V +3 36 V +3 -12 V +3 -17 V +3 1 V +4 7 V +3 -1 V +3 -33 V +3 -3 V +3 -45 V +4 30 V +3 -10 V +3 16 V +3 -1 V +3 -1 V +4 -1 V +3 7 V +3 790 V +3 -631 V +3 -117 V +4 -9 V +3 28 V +3 -15 V +3 28 V +3 -45 V +3 36 V +4 -20 V +3 -22 V +3 47 V +3 -40 V +3 24 V +4 -33 V +3 50 V +3 -20 V +3 453 V +4 46 V +3 -544 V +3 -2 V +3 1 V +3 -6 V +4 -42 V +3 24 V +3 21 V +3 -8 V +3 -2 V +4 -22 V +3 30 V +3 -2 V +3 1 V +3 -20 V +4 -3 V +3 1284 V +3 -1273 V +3 18 V +3 -39 V +3 40 V +4 -3 V +3 -10 V +3 -3 V +3 -16 V +3 15 V +4 5 V +3 11 V +3 -18 V +3 -8 V +4 3 V +3 38 V +3 -43 V +3 24 V +3 -8 V +4 -16 V +3 21 V +3 -16 V +3 -10 V +3 -22 V +4 51 V +currentpoint stroke M +3 -29 V +3 22 V +3 -31 V +3 15 V +4 -10 V +3 30 V +3 -53 V +3 19 V +3 400 V +4 -415 V +3 3 V +3 15 V +3 -14 V +3 -1 V +3 3 V +4 -12 V +3 20 V +3 -2 V +3 -7 V +3 -22 V +4 19 V +3 -4 V +3 22 V +3 -3 V +3 -10 V +4 -1 V +3 -10 V +3 15 V +3 5 V +4 -18 V +3 7 V +3 30 V +3 -18 V +3 19 V +4 -34 V +3 11 V +3 5 V +3 -20 V +3 15 V +4 -31 V +3 34 V +3 224 V +3 1103 V +3 -1388 V +4 47 V +3 -14 V +3 5 V +3 5 V +3 -6 V +4 -14 V +3 22 V +3 -8 V +3 -22 V +3 13 V +4 17 V +3 3 V +3 -18 V +3 -12 V +3 7 V +4 2 V +3 -14 V +3 12 V +3 -2 V +3 -10 V +4 12 V +3 2 V +3 -9 V +3 15 V +3 -6 V +4 -3 V +3 4 V +3 3 V +3 12 V +3 -31 V +4 30 V +3 780 V +3 -707 V +3 -49 V +3 32 V +4 -1 V +3 -18 V +3 1 V +3 -14 V +3 22 V +4 7 V +3 -43 V +3 18 V +3 32 V +3 -17 V +3 1 V +4 -29 V +3 7 V +3 33 V +3 -14 V +4 -35 V +3 -6 V +3 -24 V +3 23 V +3 -6 V +4 -4 V +3 15 V +3 -37 V +3 2 V +3 5 V +4 -9 V +3 29 V +3 -26 V +3 11 V +3 728 V +4 -606 V +3 -32 V +3 -16 V +3 10 V +3 -12 V +3 -2 V +4 28 V +3 -13 V +3 -26 V +3 9 V +4 5 V +3 14 V +3 -18 V +3 32 V +3 -16 V +4 -7 V +3 -20 V +3 24 V +3 -24 V +3 30 V +4 -51 V +3 45 V +3 516 V +3 -101 V +3 -450 V +4 20 V +3 -10 V +3 -20 V +3 7 V +3 1 V +4 3 V +3 13 V +3 45 V +3 1128 V +3 -1227 V +4 -52 V +3 -5 V +3 42 V +3 -11 V +3 15 V +4 -12 V +3 26 V +3 -18 V +3 3 V +3 -10 V +4 -49 V +3 45 V +3 -1 V +3 28 V +3 -22 V +4 1 V +3 1 V +3 -12 V +3 26 V +3 -20 V +4 3 V +3 22 V +3 -20 V +3 9 V +3 -32 V +4 28 V +3 -27 V +3 18 V +3 -9 V +3 14 V +4 -30 V +3 1081 V +3 268 V +3 -1320 V +3 -15 V +4 10 V +3 -20 V +3 44 V +3 -18 V +3 -5 V +3 -17 V +4 10 V +3 5 V +3 -4 V +3 -3 V +3 -9 V +4 4 V +3 9 V +3 12 V +3 -15 V +4 12 V +3 -28 V +3 16 V +3 46 V +3 -45 V +stroke +grestore +end +showpage +%%Trailer +%%DocumentFonts: Helvetica diff --git a/share/doc/papers/timecounter/timecounter.ms b/share/doc/papers/timecounter/timecounter.ms new file mode 100644 index 0000000..5084e50 --- /dev/null +++ b/share/doc/papers/timecounter/timecounter.ms @@ -0,0 +1,1076 @@ +.EQ +delim øø +.EN +.\" +.\" ---------------------------------------------------------------------------- +.\" "THE BEER-WARE LICENSE" (Revision 42): +.\" <phk@login.dknet.dk> wrote this file. As long as you retain this notice you +.\" can do whatever you want with this stuff. If we meet some day, and you think +.\" this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp +.\" ---------------------------------------------------------------------------- +.\" +.\" $FreeBSD$ +.\" +.if n .ND +.TI +Timecounters: Efficient and precise timekeeping in SMP kernels. +.AA +.A "Poul-Henning Kamp" "The FreeBSD Project" +.AB +.PP +The FreeBSD timecounters are an architecture-independent implementation +of a binary timescale using whatever hardware support is at hand +for tracking time. The binary timescale converts using simple +multiplication to canonical timescales based on micro- or nano-seconds +and can interface seamlessly to the NTP PLL/FLL facilities for clock +synchronisation. Timecounters are implemented using lock-less +stable-storage based primitives which scale efficiently in SMP +systems. The math and implementation behind timecounters will +be detailed as well as the mechanisms used for synchronisation. \** +.AE +.FS +This paper was presented at the EuroBSDcon 2002 conference in Amsterdam. +.FE +.SH +Introduction +.PP +Despite digging around for it, I have not been able to positively +identify the first computer which knew the time of day. +The feature probably arrived either from the commercial side +so service centres could bill computer cycles to customers or from +the technical side so computers could timestamp external events, +but I have not been able to conclusively nail the first implementation down. +.LP +But there is no doubt that it happened very early in the development +of computers +and if systems like the ``SAGE'' [SAGE] did not know what time +it was I would be amazed. +.LP +On the other hand, it took a long time for a real time clock to +become a standard feature: +.LP +The ``Apple ]['' computer +had neither in hardware or software any notion what time it was. +.LP +The original ``IBM PC'' did know what time it was, provided you typed +it in when you booted it, but it forgot when you turned it off. +.LP +One of the ``advanced technologies'' in the ``IBM PC/AT'' was a battery +backed CMOS chip which kept track of time even when the computer +was powered off. +.LP +Today we expect our computers to know the time, and with network +protocols like NTP we will usually find that they do, give and +take some milliseconds. +.LP +This article is about the code in the FreeBSD kernel which keeps +track of time. +.SH +Time and timescale basics +.PP +Despite the fact that time is the physical quantity (or maybe entity +?) about which we know the least, it is at the same time [sic!] what we +can measure with the highest precision of all physical quantities. +.LP +The current crop of atomic clocks will neither gain nor loose a +second in the next couple hundred million years, provided we +stick to the preventative maintenance schedules. This is a feat +roughly in line with to knowing the circumference of the Earth +with one micrometer precision, in real time. +.LP +While it is possible to measure time by means other than oscillations, +for instance transport or consumption of a substance at a well-known +rate, such designs play no practical role in time measurement because +their performance is significantly inferior to oscillation based +designs. +.LP +In other words, it is pretty fair to say that all relevant +timekeeping is based on oscillating phenomena: +.TS +center; +l l. +sun-dial Earths rotation about its axis. +calendar Ditto + Earths orbit around the sun. +clockwork Mechanical oscillation of pendulum. +crystals Mechanical resonance in quartz. +atomic Quantum-state transitions in atoms. +.TE +.LP +We can therefore with good fidelity define ``a clock'' to be the +combination of an oscillator and a counting mechanism: +.LP +.PSPIC fig3.eps +.LP +The standard second is currently defined as +.QP +The duration of 9,192,631,770 periods of the radiation corresponding to the transition between the two hyperfine levels of the ground state of the caesium 133 atom. +.LP +and we have frequency standards which are able to mark a sequence of +such seconds +with an error less than ø2 cdot 10 sup{-15}ø [DMK2001] with commercially +available products doing better than ø1 cdot 10 sup{-14}ø [AG2002]. +.LP +Unlike other physical units with a conventionally defined origo, +longitude for instance, the ephemeral nature of time prevents us +from putting a stake in the ground, so to speak, and measure from +there. For measuring time we have to rely on ``dead reckoning'', +just like the navigators before Harrison built his clocks [RGO2002]: +We have to tally how far we went from our reference point, keeping a +running total at all times, and use that as our estimated position. +.LP +The upshot of this is, that we cannot define a timescale by any +other means than some other timescale(s). +.LP +``Relative time'' is a time interval between two events, and for this +we only need to agree on the rate of the oscillator. +.LP +``Absolute time'' consists of a well defined point in time and the +time interval since then, this is a bit more tricky. +.LP +The Internationally agreed upon TAI and the UTC timescales +starts at (from a physics point of view) arbitrary points in time +and progresses in integral intervals of the standard second, with the +difference being that UTC does tricks to the counting to stay roughly +in sync with Earths rotation \**. +.FS +The first atomic based definition actually operated in a different way: +each year would have its own value determined for the frequency of the +caesium resonance, selected so as to match the revolution rate of the +Earth. This resulted in time-intervals being very unwieldy business, +and more and more scientists realized that that the caesium resonance +was many times more stable than the angular momentum of the Earth. +Eventually the new leap-second method were introduced in 1972. +It is interesting to note that the autumn leaves falling on the +northern hemisphere affects the angular momentum enough to change +the Earths rotational rate measurably. +.FE +.LP +TAI is defined as a sequence of standard seconds (the first timescale), +counted from January 1st 1958 (the second timescale). +.LP +UTC is defined basically the same way, but every so often a leap-second +is inserted (or theoretically deleted) to keep UTC synchronised +with Earths rotation. +.LP +Both the implementation of these two, and a few others speciality +timescales are the result of the +combined efforts of several hundred atomic frequency standards in +various laboratories and institutions throughout the world, all +reporting to the BIPM in Paris who calculate the ``paper clock'' which +TAI and UTC really are using a carefully designed weighting algorithm \**. +.FS +The majority of these clocks are model 5071A from Agilent (the test +and measurement company formerly known as ``Hewlett-Packard'') which +count for as much as 85% of the combined weight. +A fact the company deservedly is proud of. +The majority of the remaining weight is assigned to a handful of big +custom-design units like the PTB2 and NIST7. +.FE +.LP +Leap seconds are typically announced six to nine months in advance, +based on precise observations of median transit times of stars and VLBI +radio astronomy of very distant quasars. +.LP +The perceived wisdom of leap-seconds have been gradually decreasing +in recent years, as devices and products with built-in calendar +functionality becomes more and more common and people realize that +user input or software upgrades are necessary to instruct the +calendar functionality about upcoming leap seconds. +.SH +UNIX timescales +.PP +UNIX systems use a timescale which pretends to be UTC, but defined +as the count of standard seconds since 00:00:00 01-01-1970 UTC, +ignoring the leap-seconds. This definition has never been perceived +as wise. +.LP +Ignoring leap seconds means that unless some trickery is performed +when a leap second happens on the UTC scale, UNIX clocks would be +one second off. Another implication is that the length of a +time interval calculated on UNIX time_t variables, can be up to 22 +(and counting) seconds wrong relative to the same time interval +measured on the UTC timescale. +.LP +Recent efforts have tried to make the NTP protocol make up for this +deficiency by transmitting the UTC-TAI offset as part of the protocol. +[MILLS2000A] +.LP +Fractional seconds are represented two ways in UNIX, ``timeval'' and +``timespec''. Both of these formats are two-component structures +which record the number of seconds, and the number of microseconds +or nanoseconds respectively. +.LP +This unfortunate definition makes arithmetic on these two formats +quite expensive to perform in terms of computer instructions: +.DS +.ps -1 +/* Subtract timeval from timespec */ +t3.tv_sec = t1.tv_sec - t2.tv_sec; +t3.tv_nsec = t1.tv_nsec - + t2.tv_usec * 1000; +if (t3.tv_nsec >= 1000000000) { + t3.tv_sec++; + t3.tv_nsec -= 1000000000; +} else if (t3.tv_nsec < 0) { + t3.tv_sec--; + t3.tv_nsec += 1000000000; +} +.ps +1 +.DE +.LP +While nanoseconds will probably be enough for most timestamping +tasks faced by UNIX computers for a number of years, it is an +increasingly uncomfortable situation that CPU clock periods and +instruction timings are already not representable in the standard +time formats available on UNIX for consumer grade hardware, +and the first POSIX mandated API, \fCclock_getres(3)\fP has +already effectively reached end of life as a result of this. +.LP +Hopefully the various standards bodies will address this issue +better in the future. +.SH +Precision, Stability and Resolution +.PP +Three very important terms in timekeeping are ``precision'', +``stability'' and ``resolution''. +While the three words may seem to describe somewhat the +same property in most uses, their use in timekeeping covers three +very distinct and well defined properties of a clock. +.LP +Resolution in clocks is simply a matter of the step-size of the +counter or in other words: the rate at which it steps. +A counter running on a 1 MHz frequency will have a resolution +of 1 microsecond. +.LP +Precision talks about how close to the intended rate the clock runs, +stability about how much the rate varies and resolution about the +size of the smallest timeinterval we can measure. +.LP +From a quality point of view, Stability is a much more +valuable property than precision, this is probably best explained +using a graphic illustration of the difference between the two +concepts: +.LP +.PSPIC fig1.eps +.LP +In the top row we have instability, the bullet holes are spread over +a large fraction of the target area. +In the bottom row, the bullets all hit in a very small area. +.LP +On the left side, we have lack of precision, the holes obviously are +not centred on the target, a systematic offset exists. +In the right side we have precision, the bullets are centred on +the target \**. +.FS +We cannot easily get resolution into this analogy, the obvious +representation as the diameter of the bullet-hole is not correct, +it would have to be the grid or other pattern of locations where +the bullet could possibly penetrate the target material, but this +gets too quantum-mechanical-oid to serve the instructional purpose. +.FE +.LP +Transposing these four targets to actual clocks, the situation +could look like the following plots: +.LP +.PSPIC fig2.eps +.LP +On the x-axis we have time and on the y-axis how wrong the clock +was at a given point in time. +.LP +The reason atomic standards are such a big deal in timekeeping is +that they are incredibly stable: they are able to generate an oscillation +where the period varies by roughly a millionth of a billonth of a +second in long term measurements. +.LP +They are in fact not nearly as precise as they are stable, but as +one can see from the graphic above, a stable clock which is not +precise can be easily corrected for the offset and thus calibrated +is as good as any clock. +.LP +This lack of precision is not necessarily a flaw in these kinds of +devices, once you get into the ø10 cdot 10 sup{-15}ø territory +things like the blackbody spectrum at the particular absolute +temperature of the clocks hardware and general relativistic +effects mostly dependent on the altitude above earths center +has to be corrected for \**. +.FS +This particularly becomes an issue with space-based atomic standards +as those found on the ``Navstar'' GPS satellites. +.FE +.SH +Design goals of timecounters +.PP +After this brief description of the major features of the local +landscape, we can look at the design goals of timecounters in detail: +.LP +.I "Provide timestamps in timeval and timespec formats," +.IP +This is obviously the basic task we have to solve, but as was noted +earlier, this is in no way the performance requirement. +.LP +.I "on both the ``uptime'' and the POSIX timescales," +.IP +The ``uptime'' timescale is convenient for time intervals which are +not anchored in UTC time: the run time of processes, the access +time of disks and similar. +.IP +The uptime timescale counts seconds starting from when the system +is booted. The POSIX/UTC timescale is implemented by adding an +estimate of the POSIX time when the system booted to the uptime +timescale. +.LP +.I "using whatever hardware we have available at the time," +.IP +Which in a subtle way also implies ``be able to switch from one +piece of hardware to another on the fly'' since we may not know +right up front what hardware we have access to and which is +preferable to use. +.LP +.I "while supporting time the NTP PLL/FLL discipline code," +.IP +The NTP kernel PLL/FLL code allows the local clock and timescale +to be synchronised or syntonised to an external timescale either +via network packets or hardware connection. This also implies +that the rate and phase of the timescale must be manoeuvrable +with sufficient resolution. +.LP +.I "and providing support for the RFC 2783 PPS API," +.IP +This is mainly for the benefit of the NTPD daemons communication +with external clock or frequency hardware, but it has many other +interesting uses as well [PHK2001]. +.LP +.I "in a SMP efficient way." +.IP +Timestamps are used many places in the kernel and often at pretty +high rate so it is important that the timekeeping facility +does not become a point of CPU or lock contention. +.SH +Timecounter timestamp format. +.PP +Choosing the fundamental timestamp format for the timecounters is +mostly a question of the resolution and steer-ability requirements. +.LP +There are two basic options on contemporary hardware: use a 32 bit +integer for the fractional part of seconds, or use a 64 bit which +is computationally more expensive. +.LP +The question therefore reduced to the somewhat simpler: can we get +away with using only 32 bit ? +.LP +Since 32 bits fractional seconds have a resolution of slightly +better than quarter of a nanosecond (.2328 nsec) it can obviously +be converted to nanosecond resolution struct timespec timestamps +with no loss of precision, but unfortunately not with pure 32 bit +arithmetic as that would result in unacceptable rounding errors. +.LP +But timecounters also need to represent the clock period of the +chosen hardware and this hardware might be the GHz range CPU-clock. +The list of clock frequencies we could support with 32 bits are: +.TS +center; +l l n l. +ø2 sup{32} / 1ø ø=ø 4.294 GHz +ø2 sup{32} / 2ø ø=ø 2.147 GHz +ø2 sup{32} / 3ø ø=ø 1.432 GHz +\&... +ø2 sup{32} / (2 sup{32}-1)ø ø=ø 1.000 Hz +.TE +We can immediately see that 32 bit is insufficient to faithfully +represent clock frequencies even in the low GHz area, much less in +the range of frequencies which have already been vapourwared by +both IBM, Intel and AMD. +QED: 32 bit fractions are not enough. +.LP +With 64 bit fractions the same table looks like: +.TS +center; +l l r l. +ø2 sup{64} / 1ø ø=ø ø 18.45 cdot 10 sup{9}ø GHz +ø2 sup{64} / 2ø ø=ø ø 9.223 cdot 10 sup{9}ø GHz +\&... +ø2 sup{64} / 2 sup{32}ø ø=ø 4.294 GHz +\&... +ø2 sup{64} / (2 sup{64}-1)ø ø=ø 1.000 Hz +.TE +And the resolution in the 4 GHz frequency range is approximately one Hz. +.LP +The following format have therefore been chosen as the basic format +for timecounters operations: +.DS +.ps -1 +struct bintime { + time_t sec; + uint64_t frac; +}; +.ps +1 +.DE +Notice that the format will adapt to any size of time_t variable, +keeping timecounters safely out of the ``We SHALL prepare for the +Y2.038K problem'' war zone. +.LP +One beauty of the bintime format, compared to the timeval and +timespec formats is that it is a binary number, not a pseudo-decimal +number. If compilers and standards allowed, the representation +would have been ``int128_t'' or at least ``int96_t'', but since this +is currently not possible, we have to express the simple concept +of multiword addition in the C language which has no concept of a +``carry bit''. +.LP +To add two bintime values, the code therefore looks like this \**: +.FS +If the reader suspects the '>' is a typo, further study is suggested. +.FE +.LP +.DS +.ps -1 +uint64_t u; + +u = bt1->frac; +bt3->frac = bt1->frac + bt2->frac; +bt3->sec = bt1->sec + bt2->sec; +if (u > bt3->frac) + bt3->sec += 1; +.ps +1 +.DE +.LP +An important property of the bintime format is that it can be +converted to and from timeval and timespec formats with simple +multiplication and shift operations as shown in these two +actual code fragments: +.DS +.ps -1 +void +bintime2timespec(struct bintime *bt, + struct timespec *ts) +{ + + ts->tv_sec = bt->sec; + ts->tv_nsec = + ((uint64_t)1000000000 * + (uint32_t)(bt->frac >> 32)) >> 32; +} +.ps +1 +.DE +.DS +.ps -1 +void +timespec2bintime(struct timespec *ts, + struct bintime *bt) +{ + + bt->sec = ts->tv_sec; + /* 18446744073 = + int(2^64 / 1000000000) */ + bt->frac = ts->tv_nsec * + (uint64_t)18446744073LL; +} +.ps +1 +.DE +.LP +.SH +How timecounters work +.PP +To produce a current timestamp the timecounter code +reads the hardware counter, subtracts a reference +count to find the number of steps the counter has +progressed since the reference timestamp. +This number of steps is multiplied with a factor +derived from the counters frequency, taking into account +any corrections from the NTP PLL/FLL and this product +is added to the reference timestamp to get a timestamp. +.LP +This timestamp is on the ``uptime'' time scale, so if +UNIX/UTC time is requested, the estimated time of boot is +added to the timestamp and finally it is scaled to the +timeval or timespec if that is the desired format. +.LP +A fairly large number of functions are provided to produce +timestamps, depending on the desired timescale and output +format: +.TS +center; +l r r. +Desired uptime UTC/POSIX +Format timescale timescale +_ +bintime binuptime() bintime() +timespec nanouptime() nanotime() +timeval microuptime() microtime() +.TE +.LP +Some applications need to timestamp events, but are not +particular picky about the precision. +In many cases a precision of tenths or hundreds of +seconds is sufficient. +.LP +A very typical case is UNIX file timestamps: +There is little point in spending computational resources getting an +exact nanosecond timestamp, when the data is written to +a mechanical device which has several milliseconds of unpredictable +delay before the operation is completed. +.LP +Therefore a complementary shadow family of timestamping functions +with the prefix ``get'' have been added. +.LP +These functions return the reference +timestamp from the current timehands structure without going to the +hardware to determine how much time has elapsed since then. +These timestamps are known to be correct to within rate at which +the periodic update runs, which in practice means 1 to 10 milliseconds. +.SH +Timecounter math +.LP +The delta-count operation is straightforward subtraction, but we +need to logically AND the result with a bit-mask with the same number +(or less) bits as the counter implements, +to prevent higher order bits from getting set when the counter rolls over: +.DS +.ce +.EQ +Delta Count = (Count sub{now} - Count sub{ref}) ~ BITAND ~ mask +.EN +.DE +The scaling step is straightforward. +.DS +.ce +.EQ +T sub{now} = Delta Count cdot R sub{counter} + T sub{ref} +.EN +.DE +The scaling factor øR sub{counter}ø will be described below. +.LP +At regular intervals, scheduled by \fChardclock()\fP, a housekeeping +routine is run which does the following: +.LP +A timestamp with associated hardware counter reading is elevated +to be the new reference timecount: +.DS + +.ce +.EQ +Delta Count = (Count sub{now} - Count sub{ref}) ~ BITAND ~ mask +.EN + +.ce +.EQ +T sub{now} = Delta Count cdot R sub{counter} +.EN + +.ce +.EQ +Count sub{ref} = Count sub{now} +.EN + +.ce +.EQ +T sub{ref} = T sub{now} +.EN +.DE +.LP +If a new second has started, the NTP processing routines are called +and the correction they return and the counters frequency is used +to calculate the new scaling factor øR sub{counter}ø: +.DS +.ce +.EQ +R sub{counter} = {2 sup{64} over Freq sub{counter}} cdot ( 1 + R sub{NTP} ) +.EN +.DE +Since we only have access to 64 bit arithmetic, dividing something +into ø2 sup{64}ø is a problem, so in the name of code clarity +and efficiency, we sacrifice the low order bit and instead calculate: +.DS +.ce +.EQ +R sub{counter} = 2 cdot {2 sup{63} over Freq sub{counter}} cdot ( 1 + R sub{NTP} ) +.EN +.DE +The øR sub{NTP}ø correct factor arrives as the signed number of +nanoseconds (with 32 bit binary fractions) to adjust per second. +This quasi-decimal number is a bit of a square peg in our round binary +hole, and a conversion factor is needed. +Ideally we want to multiply this factor by: +.DS +.ce +.EQ +2 sup {64} over {10 sup{9} cdot 2 sup{32}} = 4.294967296 +.EN +.DE +This is not a nice number to work with. +Fortunately, the precision of this correction is not critical, we are +within an factor of a million of the ø10 sup{-15}ø performance level +of state of the art atomic clocks, so we can use an approximation +on this term without anybody noticing. +.LP +Deciding which fraction to use as approximation needs to carefully +consider any possible overflows that could happen. +In this case the correction may be as large as \(+- 5000 PPM which +leaves us room to multiply with about 850 in a multiply-before-divide +setting. +Unfortunately, there are no good fractions which multiply with less +than 850 and at the same time divide by a power of two, which is +desirable since it can be implemented as a binary shift instead of +an expensive full division. +.LP +A divide-before-multiply approximation necessarily results in a loss +of lower order bits, but in this case dividing by 512 and multiplying +by 2199 gives a good approximation where the lower order bit loss is +not a concern: +.DE +.EQ +2199 over 512 = 4.294921875 +.EN +.DE +The resulting error is an systematic under compensation of 10.6PPM +of the requested change, or ø1.06 cdot 10 sup -14ø per nanosecond +of correction. +This is perfectly acceptable. +.LP +Putting it all together, including the one bit we put on the alter for the +Goddess of code clarity, the formula looks like this: +.DS +.ce +.EQ +R sub{counter} = 2 cdot {{2 sup{63} + 2199 cdot {R sub{NTP}} over 1024} over Freq sub{counter}} +.EN +.DE +Presented here in slightly unorthodox format to show the component arithmetic +operations as they are carried out in the code. +.SH +Frequency of the periodic update +.PP +The hardware counter should have a long enough +period, ie, number of distinct counter values divided by +frequency, to not roll over before our periodic update function +has had a chance to update the reference timestamp data. +.LP +The periodic update function is called from \fChardclock()\fP which +runs at a rate which is controlled by the kernel parameter +.I HZ . +.LP +By default HZ is 100 which means that only hardware with a period +longer than 10 msec is usable. +If HZ is configured higher than 1000, an internal divider is +activated to keep the timecounter periodic update running +no more often than 2000 times per second. +.LP +Let us take an example: +At HZ=100 a 16 bit counter can run no faster than: +.DS +.ce +.EQ +2 sup{16} cdot {100 Hz} = 6.5536 MHz +.EN +.DE +Similarly, if the counter runs at 10MHz, the minimum HZ is +.DS +.ce +.EQ +{10 MHz} over {2 sup{16}} = 152.6 Hz +.EN +.DE +.LP +Some amount of margin is of course always advisable, +and a factor two is considered prudent. +.LP +.SH +Locking, lack of ... +.PP +Provided our hardware can be read atomically, that our arithmetic +has enough bits to not roll over and that our clock frequency is +perfectly, or at least sufficiently, stable, we could avoid the +periodic update function, and consequently disregard the entire +issue of locking. +We are seldom that lucky in practice. +.LP +The straightforward way of dealing with meta data updates is to +put a lock of some kind on the data and grab hold of that before +doing anything. +This would however be a very heavy-handed approach. First of +all, the updates are infrequent compared to simple references, +second it is not important which particular state of meta data +a consumer gets hold of, as long as it is consistent: as long +as the øCount sub{ref}ø and øT sub{ref}ø are a matching pair, +and not old enough to cause an ambiguity with hardware counter +rollover, a valid timestamp can be derived from them. +.LP +A pseudo-stable-storage with generation count method has been +chosen instead. +A ring of ten ``timehands'' data structures are used to hold the +state of the timecounter system, the periodic update function +updates the next structure with the new reference data and +scaling factor and makes it the current timehands. +.LP +The beauty of this arrangement lies in the fact that even though +a particular ``timehands'' data structure has been bumped from being +the ``currents state'' by its successor, it still contains valid data +for some amount of time into the future. +.LP +Therefore, a process which has started the timestamping process but +suffered an interrupt which resulted in the above periodic processing +can continue unaware of this afterwards and not suffer corruption +or miscalculation even though it holds no locks on the shared +meta-data. +.PSPIC fig4.eps +.LP +This scheme has an inherent risk that a process may be de-scheduled for +so long time that it will not manage to complete the timestamping +process before the entire ring of timehands have been recycled. +This case is covered by each timehand having a private generation number +which is temporarily set to zero during the periodic processing, to +mark inconsistent data, and incremented to one more than the +previous value when the update has finished and the timehands +is again consistent. +.LP +The timestamping code will grab a copy of this generation number and +compare this copy to the generation in the timehands after completion +and if they differ it will restart the timestamping calculation. +.DS +.ps -1 +do { + th = timehands; + gen = th->th_generation; + /* calculate timestamp */ +} while (gen == 0 || + gen != th->th_generation); +.ps +1 +.DE +.LP +Each hardware device supporting timecounting is represented by a +small data structure called a timecounter, which documents the +frequency, the number of bits implemented by the counter and a method +function to read the counter. +.LP +Part of the state in the timehands structure is a pointer to the +relevant timecounter structure, this makes it possible to change +to a one piece of hardware to another ``on the fly'' by updating +the current timehands pointer in a manner similar to the periodic +update function. +.LP +In practice this can be done with sysctl(8): +.DS +.ps -1 +sysctl kern.timecounter.hardware=TSC +.ps +1 +.DE +.LP +at any time while the system is running. +.SH +Suitable hardware +.PP +A closer look on ``suitable hardware'' is warranted +at this point. +It is obvious from the above description that the ideal hardware +for timecounting is a wide binary counter running at a constant +high frequency +and atomically readable by all CPUs in the system with a fast +instruction(-sequence). +.LP +When looking at the hardware support on the PC platform, one +is somewhat tempted to sigh deeply and mutter ``so much for theory'', +because none of the above parameters seems to have been on the +drawing board together yet. +.LP +All IBM PC derivatives contain a device more or less compatible +with the venerable Intel i8254 chip. +This device contains 3 counters of 16 bits each, +one of which is wired so it can interrupt the CPU when the +programmable terminal count is reached. +.LP +The problem with this device is that it only has 8bit bus-width, +so reading a 16 bit timestamp takes 3 I/O operations: one to latch +the count in an internal register, and two to read the high and +low parts of that register respectively. +.LP +Obviously, on multi-CPU systems this cannot be done without some +kind of locking mechanism preventing the other CPUs from trying +to do the same thing at the same time. +.LP +Less obviously we find it is even worse than that: +Since a low priority kernel thread +might be reading a timestamp when an interrupt comes in, and since +the interrupt thread might also attempt to generate a timestamp, +we need to totally block interrupts out while doing those three +I/O instructions. +.LP +And just to make life even more complicated, FreeBSD uses the same +counter to provide the periodic interrupts which schedule the +\fChardclock()\fP routine, so in addition the code has to deal with the +fact that the counter does not count down from a power of two and +that an interrupt is generated right after the reloading of the +counter when it reaches zero. +.LP +Ohh, and did I mention that the interrupt rate for hardclock() will +be set to a higher frequency if profiling is active ? \** +.FS +I will not even mention the fact that it can be set also to ridiculous +high frequencies in order to be able to use the binary driven ``beep'' +speaker in the PC in a PCM fashion to output ``real sounds''. +.FE +.LP +It hopefully doesn't ever get more complicated than that, but it +shows, in its own bizarre and twisted way, just how little help the +timecounter code needs from the actual hardware. +.LP +The next kind of hardware support to materialise was the ``CPU clock +counter'' called ``TSC'' in official data-sheets. +This is basically a on-CPU counter, which counts at the rate +of the CPU clock. +.LP +Unfortunately, the electrical power needed to run a CPU is pretty +precisely proportional with the clock frequency for the +prevailing CMOS chip technology, so +the advent of computers powered by batteries prompted technologies +like APM, ACPI, SpeedStep and others which varies or throttles the +CPU clock to match computing demand in order to minimise the power +consumption \**. +.FS +This technology also found ways into stationary computers from +two different vectors. +The first vector was technical: Cheaper cooling solutions can be used +for the CPU if they are employed resulting in cheaper commodity +hardware. +The second vector was political: For reasons beyond reason, energy +conservation became an issue with personal computers, despite the fact +that practically all north American households contains 4 to 5 household +items which through inefficient designs waste more power than a +personal computer use. +.FE +.LP +Another wiggle for the TSC is that it is not usable on multi-CPU +systems because the counter is implemented inside the CPU and +not readable from other CPUs in the system. +.LP +The counters on different CPUs are not guaranteed +to run syntonously (ie: show the same count at the same time). +For some architectures like the DEC/alpha architecture they do not even +run synchronously (ie: at the same rate) because the CPU clock frequency +is generated by a small SAW device on the chip which is very sensitive +to temperature changes. +.LP +The ACPI specification finally brings some light: +it postulates the existence of a 24 or 32 bit +counter running at a standardised constant frequency and +specifically notes that this is intended to be used for timekeeping. +.LP +The frequency chosen, 3.5795454... MHz\** +.FS +The reason for this odd-ball frequency has to be sought in the ghastly +colours offered by the original IBM PC Color Graphics Adapter: It +delivered NTSC format output and therefore introduced the NTSC colour +sync frequency into personal computers. +.FE + is not quite as high as one +could have wished for, but it is certainly a big improvement over +the i8254 hardware in terms of access path. +.LP +But trust it to Murphys Law: The majority of implementations so far +have failed to provide latching suitable to avoid meta-stability +problems, and several readings from the counter is necessary to +get a reliable timestamp. +In difference from the i8254 mentioned above, we do not need to +any locking while doing so, since each individual read is atomic. +.LP +An initialization routine tries to test if the ACPI counter is properly +latched by examining the width of a histogram over read delta-values. +.LP +Other architectures are similarly equipped with means for timekeeping, +but generally more carefully thought out compared to the haphazard +developments of the IBM PC architecture. +.LP +One final important wiggle of all this, is that it may not be possible +to determine which piece of hardware is best suited for clock +use until well into or even after the bootstrap process. +.LP +One example of this is the Loran-C receiver designed by Prof. Dave Mills +[MILLS1992] +which is unsuitable as timecounter until the daemon program which +implements the software-half of the receiver has properly initialised +and locked onto a Loran-C signal. +.SH +Ideal timecounter hardware +.LP +As proof of concept, a sort of an existentialist protest against +the sorry state describe above, the author undertook a project to +prove that it is possible to do better than that, since none of +the standard hardware offered a way to fully validate the timecounter +design. +.LP +Using a COTS product, ``HOT1'', from Virtual Computers Corporation +[VCC2002] containing a FPGA chip on a PCI form factor card, a 26 +bit timecounter running at 100MHz was successfully implemented. +.LP +.PSPIC fig5.eps +.LP +.LP +In order to show that timestamping does not necessarily have to +be done using unpredictable and uncalibratable interrupts, an +array of latches were implemented as well, which allow up to 10 +external signals to latch the reading of the counter when +an external PPS signal transitions from logic high to logic +low or vice versa. +.LP +Using this setup, a standard 133 MHz Pentium based PC is able to +timestamp the PPS output of the Motorola UT+ GPS receiver with +a precision of \(+- 10 nanoseconds \(+- one count which in practice +averages out to roughly \(+- 15 nanoseconds\**: +.FS +The reason the plot does not show a very distinct 10 nanosecond +quantization is that the GPS receiver produces the PPS signal from +a clock with a roughly 55 nanosecond period and then predicts in +the serial data stream how many nanoseconds this will be offset +from the ideal time. +This plot shows the timestamps corrected for this ``negative +sawtooth correction''. +.FE +.LP +.PSPIC gps.ps +.LP +It shold be noted that the author is no hardware wizard and +a number of issues in the implementation results in less than +ideal noise performance. +.LP +Now compare this to ``ideal'' timecounter to the normal setup +where the PPS signal is used +to trigger an interrupt via the DCD pin on a serial port, and +the interrupt handler calls \fCnanotime()\fP to timestamp +the external event \**: +.FS +In both cases, the computers clock frequency controlled +with a Rubidium Frequency standard. +The average quality of crystals used for computers would +totally obscure the curves due to their temperature coefficient. +.FE +.LP +.PSPIC intr.ps +.LP +It is painfully obvious that the interrupt latency is the +dominant noise factor in PPS timestamping in the second case. +The asymetric distribution of the noise in the second plot +also more or less entirely invalidates the design assumption +in the NTP PLL/FLL kernel code that timestamps are dominated +by gaussian noise with few spikes. +.SH +Status and availability +.PP +The timecounter code has been developed and used in FreeBSD +for a number of years and has now reached maturity. +The source-code is located almost entirely in the kernel source file +kern_tc.c, with a few necessary adaptations in code which +interfaces to it, primarily the NTP PLL/FLL code. +.LP +The code runs on all FreeBSD platforms including i386, alpha, +PC98, sparc64, ia64 and s/390 and contains no wordsize or +endianess issues not specifically handled in the sourcecode. +.LP +The timecounter implementation is distributed under the ``BSD'' +open source license or the even more free ``Beer-ware'' license. +.LP +While the ability to accurately model and compensate for +inaccuracies typical of atomic frequency standards are not +catering to the larger userbase, but this ability and precision +of the code guarntees solid support for the widespread deployment +of NTP as a time synchronization protocol, without rounding +or accumulative errors. +.LP +Adding support for new hardware and platforms have been +done several times by other developers without any input from the +author, so this particular aspect of timecounters design +seems to work very well. +.SH +Future work +.PP +At this point in time, no specific plans exist for further +development of the timecounters code. +.LP +Various micro-optimizations, mostly to compensate for inadequate +compiler optimization could be contemplated, but the author +resists these on the basis that they significantly decrease +the readability of the source code. +.SH +Acknowledgements +.PP +.EQ +delim ññ +.EN +The author would like to thank: +.LP +Bruce Evans +for his invaluable assistance +in taming the evil i8254 timecounter, as well as the enthusiastic +resistance he has provided throughout. +.PP +Professor Dave Mills of University of Delaware for his work on +NTP, for lending out the neglected twin Loran-C receiver and for +picking up the glove when timecounters made it clear +that the old ``microkernel'' NTP timekeeping code were not up to snuff +[MILLS2000B]. +.PP +Tom Van Baak for helping out, despite the best efforts of the National +Danish Posts center for Customs and Dues to prevent it. +.PP +Corby Dawson for helping with the care and feeding for caesium standards. +.PP +The staff at the NELS Loran-C control station in Bø, Norway for providing +information about step-changes. +.PP +The staff at NELS Loran-C station Eiðe, Faeroe +Islands for permission to tour their installation. +.PP +The FreeBSD users for putting up with ``micro uptime went backwards''. +.SH +References +.LP +[AG2002] +Published specifications for Agilent model 5071A Primary Frequency +Standard on +.br +http://www.agilent.com +.LP +[DMK2001] +"Accuracy Evaluation of a Cesium Fountain Primary Frequency Standard at NIST." +D. M. Meekhof, S. R. Jefferts, M. Stephanovic, and T. E. Parker +IEEE Transactions on instrumentation and measurement, VOL. 50, NO. 2, +APRIL 2001. +.LP +[PHK2001] +"Monitoring Natural Gas Usage" +Poul-Henning Kamp +http://phk.freebsd.dk/Gasdims/ +.LP +[MILLS1992] +"A computer-controlled LORAN-C receiver for precision timekeeping." +Mills, D.L. +Electrical Engineering Department Report 92-3-1, University of Delaware, March 1992, 63 pp. +.LP +[MILLS2000A] +Levine, J., and D. Mills. "Using the Network Time Protocol to transmit International Atomic Time (TAI)". Proc. Precision Time and Time Interval (PTTI) Applications and Planning Meeting (Reston VA, November 2000), 431-439. +.LP +[MILLS2000B] +"The nanokernel." +Mills, D.L., and P.-H. Kamp. +Proc. Precision Time and Time Interval (PTTI) Applications and Planning Meeting (Reston VA, November 2000), 423-430. +.LP +[RGO2002] +For an introduction to Harrison and his clocks, see for +instance +.br +http://www.rog.nmm.ac.uk/museum/harrison/ +.br +or for +a more detailed and possibly better researched account: Dava +Sobels excellent book, "Longitude: The True Story of a Lone +Genius Who Solved the Greatest Scientific Problem of His +Time" Penguin USA (Paper); ISBN: 0140258795. +.LP +[SAGE] +This ``gee-wiz'' kind of article in Dr. Jobbs Journal is a goot place to +start: +.br +http://www.ddj.com/documents/s=1493/ddj0001hc/0085a.htm +.LP +[VCC2002] +Please consult Virtual Computer Corporations homepage: +.br +http://www.vcc.com diff --git a/share/doc/papers/timecounter/tmac.usenix b/share/doc/papers/timecounter/tmac.usenix new file mode 100644 index 0000000..c0c13c2 --- /dev/null +++ b/share/doc/papers/timecounter/tmac.usenix @@ -0,0 +1,953 @@ +.\" $FreeBSD$ +.ds CC " +.nr PS 10 +.nr FU 0.0i \" priniter prints this much too low +.nr VS 11 +.ds Q `\h'-0.02i'` +.ds U '\h'-0.02i'' +.ds `` `\h'-0.02i'` +.ds '' '\h'-0.02i'' +.\" footnote stuff +.nr * 0 1 +.ds [. \|[ +.ds .] ] +.if t .ds [, \s-2\v'-.4m'\f2 +.if n .ds [, [ +.if t .ds ,] \v'.4m'\s+2\fP +.if n .ds ,] ] +.ds * \*([,\\n+*\*(,] +.ds [o `` +.ds [c '' +.ev 1 +.ps \n(PS +.vs \n(VS +.ev +.de pp +.PP +.. +.de PP +.LP +.if t .ti 0.3i +.if n .ti 5 +.. +.de LP +.if t .sp 0.3 +.if n .sp +.ne 1 +.in 0 +.nr Ia 0 +.nr Ic 0 +.fi +.. +.de IP +.if t .sp 0.3 +.if n .sp +.\" Ia = total indent for this guy +.\" Ib = .ti value for this guy +.\" Ic = auxiliary indent +.nr Ib 0.0i +.if \\n(Ia=0 .nr Ia 0.2i +.if !\\$1 \{\ +. nr Ia \w\\$1\ \ u +. nr Ib \\n(Ia +.\} +.if !\\$2 .nr Ia \\$2n +.in \\n(Iau +.in +\\n(Icu +.ti -\\n(Ibu +.if !\\$1 \{\ +\&\\$1\ \ \c +.\} +.. +.de QP +.IP +.. +.de RS +.nr Ic +0.2i +.. +.de RE +.nr Ic -0.2i +.. +.de PN +.rs +'sp |10.4i-\\n(FUu +.rs +'sp |10.4i-\\n(FUu \" how many traps could there be? +.rs +'sp |10.4i-\\n(FUu +.PO +'ie e \{\ +.ev 2 +.\".if t 'tl \s10\f3%\\*(CC\fP\s0 +.ev +'\} +'el \{\ +.ev 2 +.\".if t 'tl \s10\f3\\*(CC%\fP\s0 +.ev +'\} +.po +.wh 0 hh +'bp +.. +.de ff +.nr dn 0 +.if \\nx \{\ +. ev 1 +. vs \\n(VVu +. mk QR +' nr QS 11i+0.5v-1u+\\nyu +' if \\n(QS>\\n(QR 'if t 'sp |\\n(QSu +. nf +. FN \" print the footnotes +. vs +. rm FN +. if \\n(.zfy .br\" end overflow diversion +. if \\n(.zfy .di\" end overflow diversion +. nr x 0 1 +. ev +.\} +.nr N +1 +.if \n(dn .fz \" leftover footnote +.ie \\nN<\\nC \{\ +' if t 'sp |\\nTu +' ns +' po +3.12i \" postition of 2nd column +.\} +.el \{\ +. rF +. PN +. PO +. nr N 0 +.\} +.nr y 0-\\nb +.nr QQ 11i-\\nb +.ch fx +.ch ff +.if t .wh \\n(QQu ff +.if n .wh 66 ff +.wh 12i fx +.ch fx \\n(QQu +.if \\n(dn .fz +.. +.de fz \" get leftover footnote +.FS \& +.nf +.fy +.FE +.. +.de fx \" footnote overflow processing +.if \\nx .di fy +.. +.de FS \" start a footnote +.if \\n(.t<=1.7v .ne 2 +.da FN +.nr YY \\n(.lu +.ev 1 +.if t .ll \\n(YYu +.if n .ll 70 +.if \\n+x=1 .fs +.fi +.ie \\$1 \ \ \*([,\\n*\*(,]\c +.el \ \ \*([,\\$1\*(,]\c +.ps -1 +.vs -1 +.nr VV \\n(.v +.. +.de FE +.br +.ps +1 +.vs +1 +.ev +.da +.nr y -\\n(dn +.nr QR 11i-1v-1u+\\nyu \" y is negative +.ie \\n(nlu+1v<\\n(QRu .ch ff \\n(QRu +.el .ch ff \\n(nlu+1v +.. +.de fs +.br +.vs \\n(VS +\v'-0.4v'\s16\D'l 1.5i 0'\s0 +.sp -0.4v +.vs +.. +.de PO +.if t \{\ +.ie e .po 1.20i +.el .po 1.20i +.\} +.if n .po 0 +.. +.de NC +'PO +.if t 'll \\n(LLu +.if n 'll 78 +'nr N 0 +.. +.de 2C +.br +.nr LL 2.85i +'NC +'nr C 2 +'mk T +'ns +.. +.de 1C +.br +.if t .nr LL 6.5i +.if n .nr LL 78 +.NC +'nr C 1 +'mk T +'ns +.. +.de rF \" reset footer to nominal +.nr b 1.0i+\\n(FUu \" nominal footer place +.. +.rF +'nr x 0 1 \" init: +.nr y 0-\nb +.pl 11i +.nr QQ 11i+\ny +.wh \n(QQu ff +.wh 12i fx +.ch fx \n(QQu +.de hh +'rs +'if t 'sp |0.5i-\\n(FUu +.PO +'ie e \{\ +.ev 2 +'if t 'tl \s10\f3\\*(T2\\*(A2\fP\s0 +.ev +'\} +'el \{\ +.ev 2 +'if t 'tl \s10\f3\\*(A2\\*(T2\fP\s0 +.ev +'\} +'if t 'sp |1i-\\n(FUu +'mk T +'ns +'nr x 0 1 \" number of footnotes +.nr y 0-\\nb +.nr QQ 11i+\\ny +.ch ff +.wh \\n(QQu ff +.ch fx +.wh 12i fx +.ch fx \\n(QQu +.. +.\"------------------- +.de TI +.nh +.rs +.in 0i +.nr % \\$1 +.fi +.nr QS \\n(.lu +.ll 100i +.ps 14 +.vs 17 +.ft 3 +.ds TT \\ +.. +.de AA +.nr DL \w\\*(TT +.nr NN 1 +.nr NL \\n(QSu-1i \" a nice line length for title +.if \\n(NLu*\\n(NNu<\\n(DLu .nr NN +1 +.if \\n(NLu*\\n(NNu<\\n(DLu .nr NN +1 +.if \\n(NLu*\\n(NNu<\\n(DLu .nr NN +1 +.if \\n(NLu*\\n(NNu<\\n(DLu .nr NN +1 +.if \\n(NLu*\\n(NNu<\\n(DLu .nr NN +1 +.nr QR (\\n(DLu/\\n(NNu)+0.75i \" +.75 cuz words don't always balance +.ll \\n(QRu +.di TU +.ad l +\\*(TT +.br +.di +.sp |1.0i-\\n(FUu +.nr NP 0 +.if \\n(QSu>\\n(QRu .nr NP (\\n(QSu-\\n(QRu)/2u +.po +\\n(NPu +.ce 999 +.TU +.ce 0 +.po +.ll \\n(QSu +.sp 0.1i +.ft 1 +.ps 12 +.vs 14 +.sp 0.5 +.. +.de A \" .A "Brian Author" "Affiliation" +.in 0 +.ie !\\$2 \{\ +.ce +\f1\\$1 +.ce +\f2\\$2 +.\} +.el \{\ +.ce +\f1\\$1\f2 +.\} +.. +.de AB +.sp 0.20i +.po +0.5i +.ll -1.125i +.ce +\f3\s12ABSTRACT\s0\f1 +.sp 0.5 +.ps \\n(PS +.vs \\n(VS +.ad b +.fi +.. +.de EA +.sp +.if t .2C +.if n .1C +.hy 14 +.. +.de AE +.EA +.. +.de SH +.br +.in 0 +.di St +.ft 3 +.it 1 S2 +.. +.de SH +.NH "\\$1" "\\$2" "\\$3" +.. +.de S2 +.br +.di +.sp 0.75 +.ne 3 +.ce +.St +.br +.ft 1 +.sp 0.5 +.ns +.. +.de NH +.br +.ne 2 +.in 0 +.nr Ia 0 +.nr Ic 0 +.fi +.nr L 1 +.if !\\$1 .nr L \\$1\" level +.if \\nL1 .ft 3 +.if \\nL2 .ft 3 +.if \\nL3 .ft 2 +.di Nt +.in 0.3i +.ti 0 +.it 1 N2 +.. +.de N2 +.br +.in 0 +.di +.if t .if \\nL1 .sp 0.75 +.if t .if \\nL2 .sp 0.25 +.if t .if \\nL3 .sp 0.25 +.if t .if \\nL4 .sp 0.25 +.if n .sp +.ne 3 +.if \\nL1 .ce +.Nt +.br +.ft 1 +.if t .if \\nL1 .sp 0.50 +.if t .if \\nL2 .sp 0.25 +.if t .if \\nL3 .sp 0.25 +.if t .if \\nL4 .sp 0.25 +.if n .sp +.ns +.. +.de XP +.sp 0.5 +.ne 2 +.in \w[3]\ \ u +.ti 0 +.ns +.. +.de I +.nr PQ \\n(.f +.ft 2 +.if !"\\$1"" \&\\$1\\f\\n(PQ\\$2 +.. +.de R +.ft 1 +.. +.de B +.nr PQ \\n(.f +.ft 3 +.if !\\$1 \&\\$1\\f\\n(PQ\\$2 +.. +.de T +.nr PQ \\n(.f +.if !\\$1 \&\\$3\f(CW\\$1\\f\\n(PQ\\$2 +.. +.de Ds +'sp 0.4 +'nr DY \\n(.i +'in 0.1i +.if !\\$1 .in \\$1 +.ft CW +.nf +.. +.de DS +.br +.Ds \\$1 +.. +.de DE +.br +.De +.. +.de De +'sp 0.4 +.in \\n(DYu +.ft 1 +.fi +.. +.de np +.br +.in \w\(bu\ \ u +.ti -\w\(bu\ \ u +\(bu\ \ \c +.. +.de lp +.br +.in 0 +.. +.de TS +.br +.ul 0 +.sp 0.5 +.. +.de TE +.sp 0.5 +.. +.de RT +.ft 1 +.ce 0 +.ul 0 +.if t 'll \\n(LLu +.if n 'll \\n(LL +.ps \\n(PS +.vs \\n(VS +.in 0 +.\"bd 1 +.ta 5n 10n 15n 20n 25n 30n 35n 40n 45n 50n 55n 60n 65n 70n 75n 80n +.fi +.. +.de KF +'sp 0.4 +.ev 2 +.nr Zs \\n(.s +.nr Zv \\n(.v +.ll \\n(LLu +.in 0 +.. +.de KE +.br +.ps \\n(Zs +.vs \\n(Zvu +.ev +'sp 0.4 +.. +.de UX +\\$3\s-2UNIX\s0\\$1\\$2 +.. +.de SM +.ps -2 +.. +. \" LG - larger +.de LG +.ps +2 +.. +.de EB +.nr QQ 11i-\\nb-\\$1 +.nr b +\\n(QQu +.nr y 0+\\nyu-\\n(QQu +.nr QQ 11i+\\ny +.ch ff +.wh \\n(QQu ff +.ch fx +.wh 12i fx +.ch fx \\n(QQu +.. +.\"============================================== +.de Zz +.if \\nN=1 'ch Zz +'sp 11i +.. +.de Z +.br +.mk Qz +.ev 2 +.nr Qy \\n(.l +.ll 6.5i +.di J +.in 0 +.ft 1 +.. +.de ZZ +.br +.if !\\$1 \{\ +. if !\\$2 .ll \\$2 +. sp 0.4 +. ce +. ft 1 +\\$1 +. ft +. if !\\$2 .ll +.\} +.di +.ev +.nr QQ \\n(.t-\\n(dn-10u +.if \\n(QQ<0 .tm oops -- called Z too late on page \\n%! +.if \\n(QQ<0 .ex +.sp \\n(QQu +.mk Q2 +.ev 2 +.in 0 +.nf +.J +.fi +.rm J +.ll \\n(.lu +.ev +.sp |\\n(Qzu +.nr QQ \\n(Q2-0.8v +.EB \\n(QQu +.. +.\"====================================================== +.de KS +.\".tm KS: Not implemented yet +.. +.de KE +.\".tm KE: Not implemented yet +.. +.de KF +.\".tm KF: Not implemented yet +.. +.ds ' \h'\w'e'u*4/10'\z\(aa\h'-\w'e'u*4/10' +.de BE +.br +.. +.lt 6.5i +.de T1 +.ds T2 \\$1 +.. +.de A1 +.ds A2 \\$1 +.. +.nr P1 1.1i \" picture width +.nr P2 14u*\n(P1u/10u \" picture depth +.de BB +.in 0 +.\".nr QQ \\n(P2+0.1i +.\".ne \\n(QQu +.\".rs +.\".ll -\\n(P1u +.\".ll -0.1i +.\".po +\\n(.lu+0.1i +.\".sp 0.3 +.\" +.\".sp -0.8 +.\"\!H\\n(.o +.\".mk QQ +.\"\!V\\n(QQ +.\"\!DZ \\n(P1 \\n(P2 +.\".ie \\$1 .tm Picture not yet inserted for .BB +.\".el \!P \\$1 +.\".sp -0.3 +.\".po +.\".sp -1 +.\".if \\$1 \{\ +.\"\h'0.1i'\h'\\n(.lu'\D'l \\n(P1u 0'\D'l 0 \\n(P2u'\D'l -\\n(P1u 0'\D'l 0 -\\n(P2u' +.\".sp -1 +.\".\} +.\".sp 0.8 +.\".mk QQ +.\".nr QQ +\\n(P2u +.\".wh \\n(QQu Bb +.\"===== +.\" ::: .sp 1 +.\" ::: .ne 2 +.if \\n(SB=0 \{\ +.NH 1 +Author Information +.\} +.nr SB 1 +.PP +.. +.de Bb +'ch Bb +'ll +\\n(P1u +'ll +0.1i +.. +.de GS +.br +.. +.de GE +.. +.nr SL 0.3 +.nr LI 0.28i +.de BL \" begin list +.br +.sp \\n(SL +.in +\\n(LIu +.ll -0.1i +.if \\n(Ld \{\ +. ds Z\\n(Ld \\*(LT +. af LN 1 +. nr N\\n(Ld \\n(LN +. ds C\\n(Ld \\*(LC +.\} +.nr Ld +1 +.ds LT \\$1\" LT is the List Type: 1, a, or a bulletchar +.if \\$1 .if '\\n(Ld'1'.ds LT \(bu +.if \\$1 .if '\\n(Ld'2'.ds LT \(ci +.if \\$1 .if '\\n(Ld'3'.ds LT \(sq +.if '\\*(LT'1' .af LN \\$1 +.if '\\*(LT'i' .af LN \\$1 +.if '\\*(LT'I' .af LN \\$1 +.if '\\*(LT'a' .af LN \\$1 +.if '\\*(LT'A' .af LN \\$1 +.nr LN 0 \" LN is the list element number +.ds LC\\$2 +.\" LC is the optional bullet trailer... +.. +.de LE \" list element +.br +.ie '\\$1'' .nr LN +1 +.el \{\ +. nr LN 0 +. nr LN \\$1 +.\} +.ds LX \\*(LT\\*(LC +.if \\*(LT1 .ds LX \\n(LN\\*(LC +.if \\*(LTa .ds LX \\n(LN\\*(LC +.if \\*(LTA .ds LX \\n(LN\\*(LC +.if \\*(LTi .ds LX \\n(LN\\*(LC +.if \\*(LTI .ds LX \\n(LN\\*(LC +.if \\n(LN=0 \{\ +. if !'\\$1'' .ds LX \\$1\\*(LC +.\} +.nr QQ 3u*\w' 'u/2u +.ti -\\w'\\*(LX\h'\\n(QQu''u +\\*(LX\h'\\n(QQu'\c +.. +.de EL \" end list +.br +.nr Ld -1 +.if \\n(Ld>=0 \{\ +. ds LT \\*(Z\\n(Ld +. nr LN \\n(N\\n(Ld +. ds LC \\*(C\\n(Ld +.if '\\*(LT'1' .af LN \\*(LT +.if '\\*(LT'i' .af LN \\*(LT +.if '\\*(LT'I' .af LN \\*(LT +.if '\\*(LT'a' .af LN \\*(LT +.if '\\*(LT'A' .af LN \\*(LT +. \} +.in -\\n(LIu +.ll +0.1i +.. +.de F1 +.in 0 +\v'-0.4'\D'l \\n(.lu 0' +.sp -0.7 +.in +.. +.de F2 +.mk QQ +.if !'\\nT'\\n(QQ' \{\ +.in 0 +\v'-0.4'\D'l \\n(.lu 0' +.sp -0.4 +.in +.\} +.. +.de EM +.br +.if o \{\ +.ds A2 +.ds T2 +.rs +.bp +.ch ff +.ch fx +.PO +.rs +.sp |10.4i-\\n(FUu +.mk QQ +'ie e \{\ +. ev 2 +.if t 'tl \s10\f3%\\*(CC\fP\s0 +. ev +' \} +'el \{\ +. ev 2 +.if t 'tl \s10\f3\\*(CC%\fP\s0 +. ev +' \} +.\} +.. +.de RF +.sp 0.1 +.in 0.3i +.ie !\\$1 \{\ +.nr QQ \w'\\$1\ ' +.ti -\\n(QQu +\\$1\ \c +.\} +.el .ti 0 +.. +.de RZ +.sp 0.1 +.in 0.3i +.nr QQ \w'\\$1\ ' +.ti -\\n(QQu +\\$1\ \c +.. +.de zz +.tm note: .zz is not implemented. +.ex +.nr Z1 \\$1 +.nr Z2 \\$2 +.if \\n(.t<\\n(Z2 .tm note that figure ``\\$3'' does not fit at column bottom ------------------------ on page \\n% +.ie '\\n(.z'' \{\ +.sp 0.2 +.ne \\n(Z2u +\\!H\\n(.o +.mk QQ +.nr QQ +0.25v +\\!V\\n(QQ +\\!DZ \\n(Z1 \\n(Z2 +\\!P \\$3 +.rs +.sp \\n(Z2u +.sp 0.2 +.\} +.el \{\ +.sp 0.2 +\\!.z3 \\n(Z1 \\n(Z2 "\\$3" \\n(.o +.sp \\n(Z2u +.sp 0.2 +.\} +.. +.de z2 +.nr Z1 \\$1 +.nr Z2 \\$2 +.sp 0.2 +.ne \\n(Z2u +.nr QQ (\\n(.lu-\\$1)/2u +.sp \\n(Z2u +.vs 0 +.po +\\n(QQu +\X'ps: import \\$3 0 0 1 1 \\n(Z1 \\n(Z2' +.br +.po -\\n(QQu +.vs +.rs +.sp 0.2 +.. +.de sz +.vs \\$1 +.ps \\$1 +.. +.de M +\f2\\$1\f1\|(\\$2)\\$3 +.. +.de B1 +.br +.mk Bz +.. +.de B2 +.br +.mk By +.nr D \\n(Byu-\\n(Bzu +.nr L \\n(.lu+0.2i-\\n(.iu +\h'-0.1i'\v'-0.7v'\D'l \\nLu 0'\D'l 0 -\\nDu'\D'l -\\nLu 0'\D'l 0 \\nDu' +.sp -1 +.. +.de [] +.][ \\$1 +.. +.de ][ +.if \\$1>5 .tm Bad arg to [] +.[\\$1 +.. +.de [5 \" tm style +.FS +\\*([A, \\f2\\*([T\\f1, +.ie \\n(TN \\*([M. +.el Bell Laboratories internal memorandum (\\*([D). +.RT +.FE +.. +.de [0 \" other +.FS +.nr [: 0 +.if !\\*([F .FP \\*([F +.if !\\*([Q \{\ +.nr [: 1 +\\*([Q\c +.\} +.if !\\*([A \{\ +.nr [: 1 +\\*([A\c +.\} +.if !\\*([T \{\ +.if \\n([:>0 , +.nr [: 1 +\f2\\*([T\f1\c +.\} +.if !\\*([S , \\*([S\c +.if !\\*([V , \\*([V\c +.if !\\*([P \{\ +.ie \\n([P>0 , pp. \\*([P\c +.el , p. \\*([P\c +.\} +.if !\\*([C , \\*([C\c +.if !\\*([D , \\*([D\c +.if \\n([:>0 \&. +.if !\\*([O \\*([O +.FE +.. +.de [1 +.FS +.if !\\*([F .FP \\*([F +.if !\\*([Q \\*([Q, +.if !\\*([A \\*([A, +.if !\\*([T \\*([o\\*([T,\\*([c +\f2\\*([J\f1\c +.if !\\*([V , vol. \\*([V\c +.if !\\*([N , no. \\*([N\c +.if !\\*([P \{\ +.ie \\n([P>0 , pp. \\*([P\c +.el , p. \\*([P\c +.\} +.if !\\*([I , \\*([I\c +.if !\\*([C , \\*([C\c +.if !\\*([D , \\*([D\c +\&. +.if !\\*([O \\*([O +.FE +.. +.de [2 \" book +.FS +.if !\\*([F .FP \\*([F +.if !\\*([Q \\*([Q, +.if !\\*([A \\*([A, +.if !\\*([T \f2\\*([T,\f1 +.if !\\*([S \\*([S, +.if !\\*([V \\*([V, +.if !\\*([P \{\ +.ie \\n([P>0 pp. \\*([P, +.el p. \\*([P, +.\} +\\*([I\c +.if !\\*([C , \\*([C\c +.if !\\*([D , \\*([D\c +\&. +.if !\\*([O \\*([O +.FE +.. +.de [4 \" report +.FS +.if !\\*([F .FP \\*([F +.if !\\*([Q \\*([Q, +.if !\\*([A \\*([A, +.if !\\*([T \\*([o\\*([T,\\*([c +.if !\\*([R \\*([R\c +.if !\\*([G \& (\\*([G)\c +.if !\\*([P \{\ +.ie \\n([P>0 , pp. \\*([P\c +.el , p. \\*([P\c +.\} +.if !\\*([I , \\*([I\c +.if !\\*([C , \\*([C\c +.if !\\*([D , \\*([D\c +\&. +.if !\\*([O \\*([O +.FE +.. +.de [3 \" article in book +.FS +.if !\\*([F .FP \\*([F +.if !\\*([Q \\*([Q, +.if !\\*([A \\*([A, +.if !\\*([T \\*([o\\*([T,\\*([c +in \f2\\*([B\f1\c +.if !\\*([E , ed. \\*([E\c +.if !\\*([S , \\*([S\c +.if !\\*([V , vol. \\*([V\c +.if !\\*([P \{\ +.ie \\n([P>0 , pp. \\*([P\c +.el , p. \\*([P\c +.\} +.if !\\*([I , \\*([I\c +.if !\\*([C , \\*([C\c +.if !\\*([D , \\*([D\c +\&. +.if !\\*([O \\*([O +.FE +.. +.de [< +.]> +.. +.de ]< +.SH +References +.LP +.de FP +.\".IP \\\\$1. +.RZ \\\\$1. +\\.. +.rm FS FE +.. +.de [> +.]> +.. +.de ]> +.sp +.. +.de [- +.]- +.. +.de ]- +.rm [Q [A [T [J [B [E [S [V +.rm [N [P [I [C [D [O [R [G +.. +.de FG +.ds QQ \fB\\$1\\fP: \\$2 +.ie \w\\*(QQ>\\n(.l \{\ +.in +0.25i +.ti 0 +\\*(QQ +.in 0 +.\} +.el \{\ +.ce +\\*(QQ +.\} +.. +.1C |