package body FZ_BitOp is
   
   -- Result := X & Y
   procedure FZ_And(X : in FZ; Y : in FZ; Result : out FZ) is
   begin
      for i in X'Range loop
         Result(i) := X(i) and Y(i);
      end loop;
   end FZ_And;
   pragma Inline_Always(FZ_And);
   
   
   -- N := N & W, W is a word
   procedure FZ_And_W(N : in out FZ; W : in Word) is
   begin
      N(N'First) := N(N'First) and W;
   end FZ_And_W;
   pragma Inline_Always(FZ_And_W);
   
   
   -- Result := X | Y
   procedure FZ_Or(X : in FZ; Y : in FZ; Result : out FZ) is
   begin
      for i in X'Range loop
         Result(i) := X(i) or Y(i);
      end loop;
   end FZ_Or;
   pragma Inline_Always(FZ_Or);
   
   
   -- N := N | W, W is a word
   procedure FZ_Or_W(N : in out FZ; W : in Word) is
   begin
      N(N'First) := N(N'First) or W;
   end FZ_Or_W;
   pragma Inline_Always(FZ_Or_W);
   
   
   -- Result := X ^ Y
   procedure FZ_Xor(X : in FZ; Y : in FZ; Result : out FZ) is
   begin
      for i in X'Range loop
         Result(i) := X(i) xor Y(i);
      end loop;
   end FZ_Xor;
   pragma Inline_Always(FZ_Xor);
   
   
   -- N := N ^ W, W is a word
   procedure FZ_Xor_W(N : in out FZ; W : in Word) is
   begin
      N(N'First) := N(N'First) xor W;
   end FZ_Xor_W;
   pragma Inline_Always(FZ_Xor_W);
   
   
   -- NotN := ~N
   procedure FZ_Neg(N    : in FZ;
                    NotN : out FZ) is
   begin
      for i in N'Range loop
         NotN(i) := not N(i);
      end loop;
   end FZ_Neg;
   pragma Inline_Always(FZ_Neg);
   
end FZ_BitOp;
