File : ffa.adb


   1 ------------------------------------------------------------------------------
   2 ------------------------------------------------------------------------------
   3 -- This file is part of 'Finite Field Arithmetic', aka 'FFA'.               --
   4 --                                                                          --
   5 -- (C) 2019 Stanislav Datskovskiy ( www.loper-os.org )                      --
   6 -- http://wot.deedbot.org/17215D118B7239507FAFED98B98228A001ABFFC7.html     --
   7 --                                                                          --
   8 -- You do not have, nor can you ever acquire the right to use, copy or      --
   9 -- distribute this software ; Should you use this software for any purpose, --
  10 -- or copy and distribute it to anyone or in any manner, you are breaking   --
  11 -- the laws of whatever soi-disant jurisdiction, and you promise to         --
  12 -- continue doing so for the indefinite future. In any case, please         --
  13 -- always : read and understand any software ; verify any PGP signatures    --
  14 -- that you use - for any purpose.                                          --
  15 --                                                                          --
  16 -- See also http://trilema.com/2015/a-new-software-licensing-paradigm .     --
  17 ------------------------------------------------------------------------------
  18 ------------------------------------------------------------------------------
  19 
  20 with FZ_Arith;
  21 with FZ_Shift;
  22 with FZ_Mul;
  23 with FZ_Sqr;
  24 with FZ_GCD;
  25 
  26 
  27 -- Wrapper bodies for routines that we inline, but must enforce preconditions
  28 -- on when called by FFA user.
  29 package body FFA is
  30    
  31    ----------------------------------------------------------------------------
  32    --- FZ Basics
  33    ----------------------------------------------------------------------------
  34    
  35    -- Exchange X and Y
  36    procedure FFA_FZ_Swap(X : in out FZ; Y : in out FZ) is
  37    begin
  38       FZ_Basic.FZ_Swap(X => X, Y => Y);
  39    end FFA_FZ_Swap;
  40    
  41    -- Constant-time MUX: Sel = 0: Result := X; Sel = 1: Result := Y
  42    procedure FFA_FZ_Mux(X : in FZ; Y : in FZ;
  43                         Result : out FZ; Sel : in WBool) is
  44    begin
  45       FZ_Basic.FZ_Mux(X => X, Y => Y, Result => Result, Sel => Sel);
  46    end FFA_FZ_Mux;
  47    
  48    ----------------------------------------------------------------------------
  49    --- Bitwise Operations on FZ
  50    ----------------------------------------------------------------------------
  51    
  52    -- Result := X & Y
  53    procedure FFA_FZ_And(X : in FZ; Y : in FZ; Result : out FZ) is
  54    begin
  55       FZ_BitOp.FZ_And(X => X, Y => Y, Result => Result);
  56    end FFA_FZ_And;
  57    
  58    -- Result := X | Y
  59    procedure FFA_FZ_Or(X : in FZ; Y : in FZ; Result : out FZ) is
  60    begin
  61       FZ_BitOp.FZ_Or(X => X, Y => Y, Result => Result);
  62    end FFA_FZ_Or;
  63    
  64    -- Result := X ^ Y
  65    procedure FFA_FZ_Xor(X : in FZ; Y : in FZ; Result : out FZ) is
  66    begin
  67       FZ_BitOp.FZ_Xor(X => X, Y => Y, Result => Result);
  68    end FFA_FZ_Xor;
  69    
  70    -- NotN := ~N ('ones complement')
  71    procedure FFA_FZ_Not(N : in  FZ; NotN : out FZ) is
  72    begin
  73       FZ_BitOp.FZ_Not(N => N, NotN => NotN);
  74    end FFA_FZ_Not;
  75    
  76    ----------------------------------------------------------------------------
  77    --- Arithmetic on FZ
  78    ----------------------------------------------------------------------------
  79    
  80    -- Sum := X + Y; Overflow := Carry
  81    procedure FFA_FZ_Add(X          : in  FZ;
  82                         Y          : in  FZ;
  83                         Sum        : out FZ;
  84                         Overflow   : out WBool) is
  85    begin
  86       FZ_Arith.FZ_Add(X => X, Y => Y, Sum => Sum, Overflow => Overflow);
  87    end FFA_FZ_Add;
  88    
  89    -- Difference := X - Y; Underflow := Borrow
  90    procedure FFA_FZ_Subtract(X          : in  FZ;
  91                              Y          : in  FZ;
  92                              Difference : out FZ;
  93                              Underflow  : out WBool) is
  94    begin
  95       FZ_Arith.FZ_Sub(X => X, Y => Y, Difference => Difference,
  96                       Underflow => Underflow);
  97    end FFA_FZ_Subtract;
  98    
  99    ----------------------------------------------------------------------------
 100    --- Multiplication on FZ
 101    ----------------------------------------------------------------------------
 102    
 103    procedure FFA_FZ_Multiply(X     : in  FZ;
 104                              Y     : in  FZ;
 105                              XY_Lo : out FZ;
 106                              XY_Hi : out FZ) is
 107    begin
 108       FZ_Mul.FZ_Multiply_Buffered(X     => X,     Y     => Y,
 109                                   XY_Lo => XY_Lo, XY_Hi => XY_Hi);
 110    end FFA_FZ_Multiply;
 111    
 112    
 113    -- Square. Preserves the inputs.
 114    procedure FFA_FZ_Square(X     : in  FZ;
 115                            XX_Lo : out FZ;
 116                            XX_Hi : out FZ) is
 117    begin
 118       FZ_Sqr.FZ_Square_Buffered(X => X, XX_Lo => XX_Lo, XX_Hi => XX_Hi);
 119    end FFA_FZ_Square;
 120    
 121    ----------------------------------------------------------------------------
 122    --- Other Operations on FZ
 123    ----------------------------------------------------------------------------
 124    
 125    -- Find Greatest Common Divisor (GCD) of X and Y.
 126    procedure FFA_FZ_Greatest_Common_Divisor(X      : in  FZ;
 127                                             Y      : in  FZ;
 128                                             Result : out FZ) is
 129    begin
 130       FZ_GCD.FZ_Greatest_Common_Divisor(X => X, Y => Y, Result => Result);
 131    end FFA_FZ_Greatest_Common_Divisor;
 132    
 133 end FFA;