`timescale 1ns/1ns
module encoder_83(
   input      [7:0]       I   ,
   input                  EI  ,
   
   output wire [2:0]      Y   ,
   output wire            GS  ,
   output wire            EO    
);
assign Y[2] = EI & (I[7] | I[6] | I[5] | I[4]);
assign Y[1] = EI & (I[7] | I[6] | ~I[5]&~I[4]&I[3] | ~I[5]&~I[4]&I[2]);
assign Y[0] = EI & (I[7] | ~I[6]&I[5] | ~I[6]&~I[4]&I[3] | ~I[6]&~I[4]&~I[2]&I[1]);

assign EO = EI&~I[7]&~I[6]&~I[5]&~I[4]&~I[3]&~I[2]&~I[1]&~I[0];

assign GS = EI&(I[7] | I[6] | I[5] | I[4] | I[3] | I[2] | I[1] | I[0]);
//assign GS = EI&(| I);
         
endmodule

module encoder_164(
   input      [15:0]      A   ,
   input                  EI  ,
   
   output wire [3:0]      L   ,
   output wire            GS  ,
   output wire            EO    
);
wire [7:0] in1,in2;
wire [2:0] temp1,temp2;
wire gs1,gs2,eo1,eo2;
assign in1=A[7:0];
assign in2=A[15:8];
encoder_83 u2(.I(in2),.EI(EI),.Y(temp2),.GS(gs2),.EO(eo2));
encoder_83 u1(.I(in1),.EI(eo2),.Y(temp1),.GS(gs1),.EO(eo1));
assign L[3]=gs2;
assign L[2:0]=temp1|temp2;
assign EO=eo1&eo2;
assign GS=gs1|gs2;
endmodule