--  Package for Signed Bignums

package BigNumPkg.Signed is

   type Signed_BigNum is new Bignum;

   first : Constant Signed_Bignum;
   last : Constant Signed_Bignum;

   Minus_One  : constant Signed_BigNum;
   Zero : Constant Signed_Bignum := Signed_Bignum (BignumPkg.Zero);
   One : Constant Signed_Bignum := Signed_Bignum (BignumPkg.One);

   Signed_BigNumOverFlow : exception;

   --  Removes leading zeros
   function toString(X: Signed_BigNum) return String;

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

   --  Returns the negative of X
   function negate (X : Signed_BigNum) return Signed_BigNum;

   --  Return absolute value of X
   function abs_val (X : Signed_BigNum) return Signed_BigNum;

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

   procedure Put (Item : Signed_BigNum; Width : Natural := 1);

   --  Get reads positive and negative numbers
   --  Negative numbers are preceded by a minus sign (ie '-')
   procedure Get (Item : out Signed_BigNum);

private
   minus_one : Constant Signed_Bignum := (0 => 5, size - 1 => 1, others => 0);

   --  Only valid for base 10
   first : Constant Signed_Bignum := (others => 9);
   last : Constant Signed_Bignum := (0 => 4, others => 9);
end BigNumPkg.Signed;