separate (Manpower)
procedure Get_Staff_Profile (Profile : in Profile_Type;
                             Accel_Increment : in Accurate_Float) is
    ----------------------------------------------------------------------
    --| NAME : GET_STAFF_PROFILE
    --|
    --| OVERVIEW:
    --|   This procedure calculates the manpower staffing estimates by month
    --|   of various acceleration rates.  The acceleration rates tested start
    --|   at ACCEL_INCREMENT and are incremented by ACCEL_INCREMENT for each
    --|   successive test.  GRAPH_IT is called to plot a graph of the
    --|   distribution for each acceleration rate tested.
    --|
    --| HISTORY:
    --|   written by Bonnie Burkhardt     March 1985
    --|
    --| EXCEPTIONS HANDLED:
    --|   others   An error message is printed and processng continues.
    --|
    ----------------------------------------------------------------------

    Down_Hill : Boolean := False;

begin
    Accel_Rate := 0.0;

    Outer_Loop:
        loop
            Accel_Rate := Accel_Rate + Accel_Increment;
            Month := Month_Type'First;
            Tdev := Sqrt (1.0 / (2.0 * Accel_Rate));
            Staffing := (others => 0.0);  -- reset array

            -- the inner loop will calculate the manpower (staffing) estimates at
            -- each time period (1 month increments) with a constant acceleration
            -- rate 'ACCEL_RATE'
            Inner_Loop:
                loop
                    Param := -Accel_Rate * (Float (Month) ** 2);
                    Staffing (Month) := 2.0 * Man_Months * Accel_Rate *
                                           Float (Month) * Exp (Param);
                    Down_Hill := Staffing (Month) < Staffing (Month - 1);

                    if Down_Hill and Staffing (Month) < 2.0 then
                        exit Inner_Loop;
                    end if;

                    Month := Month + 1;
                end loop Inner_Loop;

            -- graph the appropriate profile
            if Profile = Nominal then
                if (Float (Month) <= Td_Nominal + 0.5) then
                    Graph_It
                       ("Nominal     Schedule");   -- nominal schedule has been found
                    exit Outer_Loop;
                end if;
            else
                if Float (Month) <= Td_Nominal then
                    Graph_It ("COMPRESSED  SCHEDULE");
                else
                    Graph_It ("EXTENDED    SCHEDULE");
                end if;

                exit when Staffing (Integer (Imp_Region)) < 2.0;
            end if;
        end loop Outer_Loop;

exception
    when others =>
        Put_Line ("exception raised in GET_STAFF_PROFILE");
end Get_Staff_Profile;