//////////////////////////
//      arithmetic      //
//////////////////////////

module \$alu (A, B, CI, BI, X, Y, CO);

parameter A_SIGNED = 0;
parameter B_SIGNED = 0;
parameter A_WIDTH = 1;
parameter B_WIDTH = 1;
parameter Y_WIDTH = 1;

input [A_WIDTH-1:0] A;
input [B_WIDTH-1:0] B;
output [Y_WIDTH:0] X, Y;

input CI, BI;
output [Y_WIDTH:0] CO;

wire [Y_WIDTH-1:0] AA, BB;
wire [1024:0] _TECHMAP_DO_ = "splitnets CARRY; clean";

generate
	if (A_SIGNED && B_SIGNED) begin:BLOCK1
		assign AA = $signed(A), BB = BI ? ~$signed(B) : $signed(B);
	end else begin:BLOCK2
		assign AA = $unsigned(A), BB = BI ? ~$unsigned(B) : $unsigned(B);
	end
endgenerate

   wire [Y_WIDTH: 0 ] CARRY;
   assign CARRY[0] = CI;

   genvar i;
   generate for (i = 0; i < Y_WIDTH - 1; i = i+1) begin:gen3
     adder my_adder (
       .cin		(CARRY[i]),
       .cout	(CARRY[i+1]),
       .a		(AA[i]),
       .b		(BB[i]),
       .sumout	(Y[i])
     );
   end endgenerate

   generate if ((Y_WIDTH -1) % 20 == 0) begin:gen4
     assign Y[Y_WIDTH-1] = CARRY[Y_WIDTH-1];
   end else begin:gen5
     adder my_adder (
       .cin		(CARRY[Y_WIDTH - 1]),
       .cout	(CARRY[Y_WIDTH]),
       .a		(1'b0),
       .b		(1'b0),
       .sumout	(Y[Y_WIDTH -1])
     );
   end
   endgenerate
 endmodule

//---------------------------------------------------------

module \$fa (A, B, C, X, Y);

parameter A_SIGNED = 0;
parameter B_SIGNED = 0;
parameter A_WIDTH = 1;
parameter B_WIDTH = 1;
parameter Y_WIDTH = 1;

input [A_WIDTH-1:0] A;
input [B_WIDTH-1:0] B;
input C;
output [Y_WIDTH:0] X, Y;

wire [Y_WIDTH-1:0] AA, BB;
wire [1024:0] _TECHMAP_DO_ = "splitnets CARRY; clean";

generate
	if (A_SIGNED && B_SIGNED) begin:BLOCK1
		assign AA = $signed(A), BB = $signed(B);
	end else begin:BLOCK2
		assign AA = $unsigned(A), BB = $unsigned(B);
	end
endgenerate

   wire [Y_WIDTH: 0 ] CARRY;
   assign CARRY[0] = C;

   genvar i;
   generate for (i = 0; i < Y_WIDTH - 1; i = i+1) begin:gen3
     adder my_adder (
       .cin		(CARRY[i]),
       .cout	(CARRY[i+1]),
       .a		(AA[i]),
       .b		(BB[i]),
       .sumout	(Y[i])
     );
   end endgenerate

   generate if ((Y_WIDTH -1) % 20 == 0) begin:gen4
     assign Y[Y_WIDTH-1] = CARRY[Y_WIDTH-1];
   end else begin:gen5
     adder my_adder (
       .cin		(CARRY[Y_WIDTH - 1]),
       .cout	(CARRY[Y_WIDTH]),
       .a		(1'b0),
       .b		(1'b0),
       .sumout	(Y[Y_WIDTH -1])
     );
   end
   endgenerate
 endmodule

//---------------------------------------------------------

module \$add (A, B, Y);

parameter A_SIGNED = 0;
parameter B_SIGNED = 0;
parameter A_WIDTH = 1;
parameter B_WIDTH = 1;
parameter Y_WIDTH = 1;

input [A_WIDTH-1:0] A;
input [B_WIDTH-1:0] B;
output [Y_WIDTH:0] Y;

wire [Y_WIDTH-1:0] AA, BB;
wire [1024:0] _TECHMAP_DO_ = "splitnets CARRY; clean";

generate
	if (A_SIGNED && B_SIGNED) begin:BLOCK1
		assign AA = $signed(A), BB = $signed(B);
	end else begin:BLOCK2
		assign AA = $unsigned(A), BB = $unsigned(B);
	end
endgenerate

   wire [Y_WIDTH: 0 ] CARRY;
   assign CARRY[0] = 1'b0;

   genvar i;
   generate for (i = 0; i < Y_WIDTH - 1; i = i+1) begin:gen3
     adder my_adder (
       .cin		(CARRY[i]),
       .cout	(CARRY[i+1]),
       .a		(AA[i]),
       .b		(BB[i]),
       .sumout	(Y[i])
     );
   end endgenerate

   generate if ((Y_WIDTH -1) % 20 == 0) begin:gen4
     assign Y[Y_WIDTH-1] = CARRY[Y_WIDTH-1];
   end else begin:gen5
     adder my_adder (
       .cin		(CARRY[Y_WIDTH - 1]),
       .cout	(CARRY[Y_WIDTH]),
       .a		(1'b0),
       .b		(1'b0),
       .sumout	(Y[Y_WIDTH -1])
     );
   end
   endgenerate
 endmodule