home *** CD-ROM | disk | FTP | other *** search
/ Programmer's ROM - The Computer Language Library / programmersrom.iso / ada / piwg / a000093.ada < prev    next >
Encoding:
Text File  |  1988-05-03  |  18.9 KB  |  540 lines

  1. -- Ada version of Whetstone Benchmark Program
  2. -- using standardized math routines for the measurements
  3. -- The math routines are physically included
  4.  
  5. --------------------------------------------------------------------------
  6. --                                                                      --
  7. --     WHETADA.ADA    distributed as A000093.ADA                        --
  8. --                                                                      --
  9. --   Ada version of the Whetstone Benchmark Program.                    --
  10. --   Reference: "Computer Journal" February 1976, pages 43-49           --
  11. --              for description of benchmark and ALGOL60 version.       --
  12. -- Note: Procedure POUT is omitted.                                     --
  13. --                                                                      --
  14. -- From Timing Studies using a synthetic Whetstone Benchmark            --
  15. --      by Sam Harbaugh and John A. Forakis                             --
  16. --                                                                      --
  17. --------------------------------------------------------------------------
  18. --                                                                      --
  19. -- Authors Disclaimer                                                   --
  20. -- "   The Whetstone measure deals only with the most basic scientific/ --
  21. --  computational aspects of the languages and computers and no general --
  22. --  conclusions should be drawn from this work. Application specific    --
  23. --  benchmarks should be written and run by anyone needing to draw      --
  24. --  conclusions reguarding suitability of languages, compilers and      --
  25. --  hardware. This data is reported to stimulate interest and work in   --
  26. --  run time benchmarking and in no way is meant to influence anyone's  --
  27. --  choice of languages or software in any situation "                  --
  28. --                                                                      --
  29. --------------------------------------------------------------------------
  30. --                                                                      --
  31. -- All references to DATA_FILE and associated OPEN and PUT's are removed--
  32. -- This was not in the timing loop.                                     --
  33. --                                                                      --
  34. --------------------------------------------------------------------------
  35.  
  36. with CPU_TIME_CLOCK ;
  37. with TEXT_IO;   use TEXT_IO;
  38.  
  39. procedure A000093 is
  40.  --pragma SUPPRESS(ACCESS_CHECK);
  41.  --pragma SUPPRESS(DISCRIMINANT_CHECK);
  42.  --pragma SUPPRESS(INDEX_CHECK);
  43.  --pragma SUPPRESS(LENGTH_CHECK);
  44.  --pragma SUPPRESS(RANGE_CHECK);
  45.  --pragma SUPPRESS(DIVISION_CHECK);
  46.  --pragma SUPPRESS(OVERFLOW_CHECK);
  47.  --pragma SUPPRESS(STORAGE_CHECK);
  48.  --pragma SUPPRESS(ELABORATION_CHECK);
  49.  
  50.   package INT_IO is new INTEGER_IO(INTEGER);  use INT_IO;
  51.   package REAL_IO is new FLOAT_IO(FLOAT);  use REAL_IO;
  52.  
  53.  
  54. -- This is a standard Ada inplementation of the required math routines
  55. -- that is Copyright Westinghouse Electric Corporation 1983,1984,1985.
  56. -- These routines are provided for use by ACM SIGAda PIWG for making
  57. -- measurements. These routines are copyrighted and may only be used for
  58. -- performance measurements. These math routines must not be distributed
  59. -- without this notice. No permission is granted to any party to modify,
  60. -- to redistribute, to sell, to give away, or to otherwise use or
  61. -- transmit these math routines without express written permission from
  62. -- Westinghous Electric Corporation, c/o Jon Squire, P.O. Box 746 MS1615,
  63. -- Baltimore, MD 21203.
  64.  
  65.   PI_2 : constant FLOAT := 1.5707963267949 ;
  66.   PI : constant FLOAT := 2.0 * PI_2 ;
  67.  
  68.   function SIN ( X : FLOAT ) return FLOAT is -- Copyright Westinghouse 1985
  69.  
  70.     C1 : constant FLOAT := 1.57079631847 ;
  71.     C3 : constant FLOAT := - 0.64596371106 ;
  72.     C5 : constant FLOAT := 0.07968967928 ;
  73.     C7 : constant FLOAT := - 0.00467376557 ;
  74.     C9 : constant FLOAT := 0.00015148419 ;
  75.     X_NORM : FLOAT ;
  76.     X_INT : FLOAT ;
  77.     X_2 : FLOAT ;
  78.     Y : FLOAT ;
  79.   begin
  80.     X_NORM := X / PI_2 ;
  81.     if abs ( X_NORM ) > 4.0 then  -- REDUCE TO  -2 PI .. 2 PI
  82.       X_INT := FLOAT ( INTEGER( X_NORM / 4.0 )) ;
  83.       X_NORM := X_NORM - 4.0 * X_INT ;
  84.     end if ;
  85.     if X_NORM > 2.0 then  -- REDUCE TO  -PI .. PI
  86.       X_NORM := 2.0 - X_NORM ;
  87.     elsif X_NORM < - 2.0 then
  88.       X_NORM := - 2.0 - X_NORM ;
  89.     end if ;
  90.     if X_NORM > 1.0 then  -- REDUCE TO  -PI/2 .. PI/2
  91.       X_NORM := 2.0 - X_NORM ;
  92.     elsif X_NORM < - 1.0 then
  93.       X_NORM := - 2.0 - X_NORM ;
  94.     end if ;
  95.     X_2 := X_NORM * X_NORM ;
  96.     Y := ( C1 +( C3 +( C5 +( C7 + C9 * X_2 ) * X_2) * X_2) * X_2) * X_NORM ;
  97.     return Y ;
  98.   end SIN ;
  99.  
  100.   function COS ( X : FLOAT ) return FLOAT is
  101.  
  102.   begin
  103.     return SIN ( X + PI_2 ) ;
  104.   end COS ;
  105.  
  106.  
  107.   function ATAN ( X : FLOAT ) return FLOAT is -- Copyright Westinghouse 1985
  108.  
  109.     C1 : constant FLOAT := 0.9999993329 ;
  110.     C3 : constant FLOAT := - 0.3332985605 ;
  111.     C5 : constant FLOAT := 0.1994653599 ;
  112.     C7 : constant FLOAT := - 0.1390853351 ;
  113.     C9 : constant FLOAT := 0.0964200441 ;
  114.     C11 : constant FLOAT := - 0.0559098861 ;
  115.     C13 : constant FLOAT := 0.0218612288 ;
  116.     C15 : constant FLOAT := - 0.0040540580 ;
  117.     A_2 : FLOAT ;
  118.     Y : FLOAT ;
  119.     A : FLOAT ;
  120.   begin
  121.     A := X ;
  122.     if abs ( A ) > 1.0 then
  123.       A := 1.0 / A ;
  124.     end if ;
  125.     A_2 := A * A ;
  126.     Y := ( C1 +( C3 +( C5 +( C7 +( C9 +( C11 +( C13 + C15 * A_2 ) * A_2) * A_2
  127.        ) * A_2) * A_2) * A_2) * A_2) * A ;
  128.     if abs ( X ) >= 1.0 then
  129.       if X < 0.0 then
  130.         Y := - ( PI_2 + Y ) ;
  131.       else
  132.         Y := PI_2 - Y ;
  133.       end if ;
  134.     end if ;
  135.     return Y ;
  136.   end ATAN ;
  137.  
  138.  
  139.   function SQRT ( X : FLOAT ) return FLOAT is -- Copyright Westinghouse 1985
  140.  
  141.     Y , ROOT_PWR , X_NORM : FLOAT ;
  142.     A : constant FLOAT := 2.1902 ;
  143.     B : constant FLOAT := - 3.0339 ;
  144.     C : constant FLOAT := 1.5451 ;
  145.   begin
  146.     X_NORM := X ;
  147.     ROOT_PWR := 1.0 ;
  148.     if X <= 0.0 then
  149.       return 0.0 ;
  150.     end if ;
  151.     if X > 1.0 then -- REDUCE TO 0.25 .. 1.0
  152.       while X_NORM > 1.0 loop
  153.         ROOT_PWR := ROOT_PWR * 2.0 ;
  154.         X_NORM := X_NORM * 0.25 ;
  155.       end loop ;
  156.     else
  157.       while X_NORM < 0.25 loop
  158.         ROOT_PWR := ROOT_PWR * 0.5 ;
  159.         X_NORM := X_NORM * 4.0 ;
  160.       end loop ;
  161.     end if ;
  162.     Y := A + B / ( C + X_NORM ) ;
  163.     Y := 0.5 * ( Y + X_NORM / Y ) ;
  164.     Y := 0.5 * ( Y + X_NORM / Y ) ;
  165.     Y := Y * ROOT_PWR ;
  166.     return Y ;
  167.   end SQRT ;
  168.  
  169.   function EXP ( X : FLOAT ) return FLOAT is -- Copyright Westinghouse 1985
  170.  
  171.     C1 : constant FLOAT := 9.99999900943303E-01 ;
  172.     C2 : constant FLOAT := 5.00006347344554E-01 ;
  173.     C3 : constant FLOAT := 1.66667985598315E-01 ;
  174.     C4 : constant FLOAT := 4.16350120350139E-02 ;
  175.     C5 : constant FLOAT := 8.32859610677671E-03 ;
  176.     C6 : constant FLOAT := 1.43927433449119E-03 ;
  177.     C7 : constant FLOAT := 2.04699933614437E-04 ;
  178.  
  179. --         4.01169746699903E-07 = MAX_ERROR APPROXIMATION-FUNCTION
  180.     X1 : FLOAT ;
  181.     Y : FLOAT ;
  182.     E_PWR : FLOAT := 1.0 ;
  183.     E : FLOAT := 2.71828182845905 ;
  184.   begin
  185.     if X > 88.0 then
  186.       raise NUMERIC_ERROR ;
  187.     end if ;
  188.     X1 := abs ( X ) ;
  189.     if X1 > 88.0 then
  190.       return 0.0 ;
  191.     end if ;
  192.     while X1 >= 1.0 loop
  193.       E_PWR := E_PWR * E * E ;
  194.       X1 := X1 - 2.0 ;
  195.     end loop ;
  196.     Y := 1.0 + ( C1 +( C2 +( C3 +( C4 +( C5 +( C6 + C7 * X1 ) * X1) * X1) * X1
  197.        ) * X1) * X1) * X1 ;
  198.     Y := Y * E_PWR ;
  199.     if X < 0.0 then
  200.       Y := 1.0 / Y ;
  201.     end if ;
  202.     return Y ;
  203.   end EXP ;
  204.  
  205.   function LOG10 ( X : FLOAT ) return FLOAT is -- Copyright Westinghouse 1985
  206.  
  207.     C1 : constant FLOAT := 0.868591718 ;
  208.     C3 : constant FLOAT := 0.289335524 ;
  209.     C5 : constant FLOAT := 0.177522071 ;
  210.     C7 : constant FLOAT := 0.094376476 ;
  211.     C9 : constant FLOAT := 0.191337714 ;
  212.     C_R10 : constant FLOAT := 3.1622777 ;
  213.     Y : FLOAT ;
  214.     X_NORM : FLOAT ;
  215.     X_LOG : FLOAT ;
  216.     FRAC : FLOAT ;
  217.     FRAC_2 : FLOAT ;
  218.   begin
  219.     X_LOG := 0.5 ;
  220.     X_NORM := X ;
  221.     if X <= 0.0 then
  222.       return 0.0 ;
  223.     end if ;
  224.     if X >= 10.0 then
  225.       while X_NORM >= 10.0  -- REDUCE TO 1.0 .. 10.0
  226.           loop
  227.         X_LOG := X_LOG + 1.0 ;
  228.         X_NORM := X_NORM * 0.1 ;
  229.       end loop ;
  230.     else
  231.       while X_NORM < 1.0  -- REDUCE TO 1.0 .. 10.0
  232.           loop
  233.         X_LOG := X_LOG - 1.0 ;
  234.         X_NORM := X_NORM * 10.0 ;
  235.       end loop ;
  236.     end if ;
  237.     FRAC := ( X_NORM - C_R10 ) / ( X_NORM + C_R10 ) ;
  238.     FRAC_2 := FRAC * FRAC ;
  239.     Y := ( C1 +( C3 +( C5 +( C7 + C9 * FRAC_2 ) * FRAC_2) * FRAC_2) * FRAC_2)
  240.         * FRAC ;
  241.     return Y + X_LOG ;
  242.   end LOG10 ; -- end of copyrighted section
  243.  
  244.   function LOG ( X : FLOAT ) return FLOAT is 
  245.  
  246.   begin
  247.     return 2.302585093 * LOG10 ( X ) ;
  248.   end LOG ;
  249.  
  250.  
  251.      procedure WHETSTONE(I, NO_OF_CYCLES : in INTEGER;
  252.                          START_TIME,STOP_TIME: out FLOAT) is
  253.  
  254.      -- Calling procedure provides the loop count weight factor, I, and
  255.      -- the encompassing loop count, NO_OF_CYCLES.
  256.  
  257.         type VECTOR is array (INTEGER range <>) of FLOAT;
  258.         X1,X2,X3,X4,X,Y,Z,T,T1,T2 : FLOAT;
  259.         E1 : VECTOR(1..4);
  260.         J,K,L,N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11 : INTEGER;
  261.  
  262.         procedure PA(E: in out VECTOR) is
  263.         -- tests computations with an array as a parameter
  264.            J : INTEGER;
  265.            -- T,T2 : FLOAT are global variables
  266.            begin
  267.              J:=0;
  268.              <<LAB>>
  269.              E(1) := (E(1) + E(2) + E(3) - E(4)) * T;
  270.              E(2) := (E(1) + E(2) - E(3) + E(4)) * T;
  271.              E(3) := (E(1) - E(2) + E(3) + E(4)) * T;
  272.              E(4) := (-E(1) + E(2) + E(3) + E(4)) / T2;
  273.              J := J + 1;
  274.              if J < 6 then
  275.                 goto LAB;
  276.              end if;
  277.         end PA;
  278.  
  279.  
  280.         procedure P0 is
  281.         -- tests computations with no parameters
  282.         -- T1,T2 : FLOAT are global
  283.         -- E1 : VECTOR(1..4) is global
  284.         -- J,K,L : INTEGER are global
  285.            begin
  286.              E1(J) := E1(K);
  287.              E1(K) := E1(L);
  288.              E1(L) := E1(J);
  289.            end P0;
  290.  
  291.  
  292.         procedure P3(X,Y: in out FLOAT;  Z : out FLOAT) is
  293.         -- tests computations with simple identifiers as parameters
  294.         -- T,T2 : FLOAT are global
  295.            begin
  296.              X := T * (X + Y);
  297.              Y := T * (X + Y);
  298.              Z := (X + Y) / T2;
  299.            end P3;
  300.  
  301.  
  302.         begin
  303.           -- Set constants
  304.           T := 0.499975;
  305.           T1 := 0.50025;
  306.           T2 := 2.0;
  307.           -- Compute the execution frequency for the benchmark modules
  308.           N1 := 0;      --Module 1 not executed
  309.           N2 := 12 * I;
  310.           N3 := 14 * I;
  311.           N4 := 345*I;
  312.           N5 := 0;      -- Module 5 not executed
  313.           N6 := 210*I;
  314.           N7 := 32*I;
  315.           N8 := 899*I;
  316.           N9 := 616*I;
  317.           N10:= 0;      -- Module 10 not executed
  318.           N11:= 93*I;
  319.  
  320.           START_TIME := FLOAT(CPU_TIME_CLOCK);  --Get Whetstone start time
  321.  
  322.           CYCLE_LOOP:
  323.           for CYCLE_NO in 1..NO_OF_CYCLES loop
  324.              -- Module 1 : computations with simple identifiers
  325.                 X1 := 1.0;
  326.                 X2 := -1.0;
  327.                 X3 := -1.0;
  328.                 X4 := -1.0;
  329.                 for I in 1..N1 loop
  330.                    X1 := (X1 + X2 + X3 - X4) * T;
  331.                    X2 := (X1 + X2 - X3 + X4) * T;
  332.                    X3 := (X1 + X2 + X3 + X4) * T;
  333.                    X4 := (-X1 + X2 + X3 + X4) * T;
  334.                 end loop;
  335.              -- end Module 1
  336.  
  337.              -- Module 2: computations with array elements
  338.                 E1(1) := 1.0;
  339.                 E1(2) := -1.0;
  340.                 E1(3) := -1.0;
  341.                 E1(4) := -1.0;
  342.                 for I in 1..N2 loop
  343.                    E1(1) := (E1(1) + E1(2) + E1(3) - E1(4)) * T;
  344.                    E1(2) := (E1(1) + E1(2) - E1(3) + E1(4)) * T;
  345.                    E1(3) := (E1(1) - E1(2) + E1(3) + E1(4)) * T;
  346.                    E1(4) := (-E1(1) + E1(2) + E1(3) + E1(4)) * T;
  347.                 end loop;
  348.              -- end Module 2
  349.  
  350.              -- Module 3 : passing an array as a parmeter
  351.                 for I in 1..N3 loop
  352.                      PA(E1);
  353.                 end loop;
  354.              -- end Module 3
  355.  
  356.              -- Module 4 : performing conditional jumps
  357.                 J := 1;
  358.                 for I in 1..N4 loop
  359.                    if J=1 then
  360.                        J := 2;
  361.                    else
  362.                        J := 3;
  363.                    end if;
  364.                    if J>2 then
  365.                        J := 0;
  366.                    else
  367.                        J := 1;
  368.                    end if;
  369.                    if J<1 then
  370.                        J := 1;
  371.                    else
  372.                        J := 0;
  373.                    end if;
  374.                 end loop;
  375.              --end Module 4
  376.  
  377.              -- Module 5 : omitted
  378.  
  379.              -- Module 6 : performing integer arithmetic
  380.                 J := 1;
  381.                 K := 2;
  382.                 L := 3;
  383.                 for I in 1..N6 loop
  384.                    J := J * (K-J) * (L-K);
  385.                    K := L*K - (L-J) * K;
  386.                    L := (L-K) * (K+J);
  387.                    E1(L-1) := FLOAT(J+K+L);
  388.                    E1(K-1) := FLOAT(J*K*L);
  389.                 end loop;
  390.              -- end Module 6
  391.  
  392.              -- Module 7 : performing computations using trigonometric
  393.              --            functions
  394.                 X := 0.5;
  395.                 Y := 0.5;
  396.                 for I in 1..N7 loop
  397.                   X := T*ATAN(T2*SIN(X)*COS(X)/(COS(X+Y)+COS(X-Y)-1.0));
  398.                   Y := T*ATAN(T2*SIN(Y)*COS(Y)/(COS(X+Y)+COS(X-Y)-1.0));
  399.                 end loop;
  400.              -- end Module 7
  401.  
  402.              -- Module 8 : procedure calls with simple identifiers as
  403.              --            parameters
  404.                 X := 1.0;
  405.                 Y := 1.0;
  406.                 Z := 1.0;
  407.                 for I in 1..N8 loop
  408.                    P3(X,Y,Z);
  409.                 end loop;
  410.              -- end Module 8
  411.  
  412.              -- Module 9 : array reference and procedure calls with no
  413.              --            parameters
  414.                 J := 1;
  415.                 K := 2;
  416.                 L := 3;
  417.                 E1(1) := 1.0;
  418.                 E1(2) := 2.0;
  419.                 E1(3) := 3.0;
  420.                 for I in 1..N9 loop
  421.                    P0;
  422.                 end loop;
  423.              -- end Module 9
  424.  
  425.              -- Module 10 : integer arithmetic
  426.                 J := 2;
  427.                 K := 3;
  428.                 for I in 1..N10 loop
  429.                    J := J + K;
  430.                    K := K + J;
  431.                    J := K - J;
  432.                    K := K - J - J;
  433.                 end loop;
  434.              -- end Module 10
  435.  
  436.              -- Module 11 : performing computations using standard
  437.              --            mathematical functions
  438.                 X := 0.75;
  439.                 for I in 1..N11 loop
  440.                    X := SQRT(EXP(LOG(X)/T1));
  441.                 end loop;
  442.              -- end Moudle 11
  443.  
  444.           end loop CYCLE_LOOP;
  445.  
  446.           STOP_TIME := FLOAT(CPU_TIME_CLOCK);    --Get Whetstone stop time
  447.     end WHETSTONE;
  448.  
  449.     procedure COMPUTE_WHETSTONE_KIPS is
  450.        -- Variables used to control execution of benchmark and to
  451.        -- compute the Whetstone rating :
  452.  
  453.           NO_OF_RUNS : INTEGER;   -- Number of times the benchmark is executed
  454.           NO_OF_CYCLES : INTEGER; -- Number of times the group of benchmark
  455.                                   -- modules is executed
  456.           I : INTEGER;
  457.              -- Factor weighting number of times each module loops
  458.              -- A value of ten gives a total weight for modules of
  459.              -- approximately one million Whetstone instructions
  460.           START_TIME : FLOAT;
  461.                      -- Time at which execution of benchmark modules begins
  462.           STOP_TIME : FLOAT;
  463.                     -- Time at which execution of benchmark modules ends
  464.                     -- (time for NO_OF_CYCLES)
  465.           ELAPSED_TIME : FLOAT;
  466.                        -- Time between START_TIME and STOP_TIME
  467.           MEAN_TIME : FLOAT;     -- Average time per cycle
  468.           RATING : FLOAT;    -- Thousands of Whetstone instructions per sec
  469.           MEAN_RATING : FLOAT;     -- Average Whetstone rating
  470.           INT_RATING : INTEGER;    -- Integer value of KWIPS
  471.  
  472.           begin
  473.             NEW_LINE; PUT_LINE("ADA Whetstone benchmark"); NEW_LINE;
  474.             PUT_LINE("A000093 using standard internal math routines");
  475.             NEW_LINE;
  476.  
  477.             MEAN_TIME := 0.0;
  478.             MEAN_RATING := 0.0;
  479.             NO_OF_CYCLES := 10;
  480.             NO_OF_RUNS := 5;
  481.             I := 10;
  482.  
  483.             RUN_LOOP:
  484.             for RUN_NO in 1..NO_OF_RUNS loop
  485.                -- Call the Whetstone benchmark parocedure
  486.                WHETSTONE(I,NO_OF_CYCLES,START_TIME,STOP_TIME);
  487.  
  488.                -- Write the Whetstone start time
  489.                NEW_LINE; PUT("Whetstone start time: "); PUT(START_TIME,5,2,0);
  490.                PUT_LINE(" seconds");
  491.  
  492.                -- Write the Whetstone stop time
  493.                NEW_LINE;   PUT("Whetstone stop time : ");
  494.                PUT(STOP_TIME,5,2,0);     PUT_LINE(" seconds ");
  495.  
  496.                -- Compute and write elapsed time
  497.                ELAPSED_TIME := STOP_TIME - START_TIME;
  498.  
  499.                NEW_LINE;  PUT("Elapsed time for "); PUT(NO_OF_CYCLES,3);
  500.                PUT(" cycles : ");  PUT(ELAPSED_TIME,5,2,0);
  501.                PUT_LINE(" seconds");
  502.  
  503.                -- Sum time in milliseconds per cycle
  504.                MEAN_TIME := MEAN_TIME + (ELAPSED_TIME*1000.0)/FLOAT(NO_OF_CYCLES);
  505.  
  506.                -- Calculate the Whetstone rating based on the time for
  507.                -- the number of cycles just executed and write
  508.                RATING := (1000.0 * FLOAT(NO_OF_CYCLES))/ELAPSED_TIME;
  509.  
  510.                -- Sum Whetstone rating
  511.                MEAN_RATING := MEAN_RATING + RATING;
  512.                INT_RATING := INTEGER(RATING);
  513.  
  514.                NEW_LINE;  PUT("Whetstone rating : ");  PUT(INT_RATING);
  515.                PUT_LINE(" KWIPS");  NEW_LINE;
  516.  
  517.                -- Reset NO_OF_CYCLES for next run using ten cycles more
  518.                NO_OF_CYCLES := NO_OF_CYCLES + 10;
  519.             end loop RUN_LOOP;
  520.  
  521.             -- Compute average time in millieseconds per cycle and write
  522.             MEAN_TIME := MEAN_TIME/FLOAT(NO_OF_RUNS);
  523.  
  524.             NEW_LINE;  PUT("Average time per cycle : ");
  525.             PUT(MEAN_TIME,5,2,0);   PUT_LINE(" milliseconds");
  526.  
  527.             -- Calculate average Whetstone rating and write
  528.             MEAN_RATING := MEAN_RATING/FLOAT(NO_OF_RUNS);
  529.             INT_RATING := INTEGER(MEAN_RATING);
  530.  
  531.             NEW_LINE;  PUT(" Average Whetstone rating : ");
  532.             PUT(INT_RATING);  PUT_LINE(" KWIPS");
  533.             NEW_LINE; NEW_LINE;
  534.  
  535.          end COMPUTE_WHETSTONE_KIPS;
  536.  
  537.          begin
  538.             COMPUTE_WHETSTONE_KIPS;
  539.          end A000093;
  540.