-- This is the interface for the BigNum abstract data type, which supports
-- arithmetic with VERY LARGE natural values.  The operations provided
-- work as one would expect for natural numbers.

package BigNumPkg is
   type BigNum is private;

   Zero : constant BigNum;
   One  : constant BigNum;

   First : constant BigNum;
   Last  : constant BigNum;

   BigNumOverFlow : exception;

   function toString(X: BigNum) return String;

   function "<"  (X, Y : BigNum) return Boolean;
   function ">"  (X, Y : BigNum) return Boolean;
   function "<=" (X, Y : BigNum) return Boolean;
   function ">=" (X, Y : BigNum) return Boolean;

   function "+" (X, Y : BigNum) return BigNum;
   function "*" (X, Y : BigNum) return BigNum;

   -- need to think about this one
   procedure plus_ov (X, Y : BigNum; Result : out BigNum; Overflow : out Boolean);

   procedure Get (Item : out BigNum);
   procedure Put (Item : BigNum; Width : Natural := 1);
private
   Size : constant Positive := 50;
   type BigNum is array(0..Size - 1) of Integer;

   Zero  : constant BigNum := (others => 0);
   One   : constant BigNum := (Size-1 => 1, others => 0);

        --  Only valid for base 10
   First : constant BigNum := (others => 0);
   Last  : constant BigNum := (others => 9);
end BigNumPkg;