`timescale 1ns/1ns

module stateio_wrapper
#(parameter
    DEVICE      = "EF5",//"EF5" "EF4" "EF3" "EF2"
    DATA_SIZE   = 8,
    HOLD_Z_EN   = 0     //set hold state: 1:hold z or low level;    0:hold high level or low level
)(
    input                       statehold_en_n,//0:user ctrl; 1:hold state
    input   [DATA_SIZE-1:0]     user_dout,
    output  [DATA_SIZE-1:0]     io_din,
    inout   [DATA_SIZE-1:0]     stateio
);

wire [DATA_SIZE-1:0]    mux_latch;

genvar i;
generate 

if(DEVICE == "EF5")begin
        for (i = 0;i< DATA_SIZE;i=i+1)begin:GENZ_LOOP
            if(HOLD_Z_EN == 1)begin
                assign mux_latch[i] = statehold_en_n ? io_din[i] : user_dout[i];
                EF5_LOGIC_IOTRIBUF u_stateio(
                    .i ( 1'b0         ),    
                    .t ( mux_latch[i] ),
                    .o ( io_din[i]    ),
                    .io( stateio[i]   )
                );
            end else begin
                assign mux_latch[i] = statehold_en_n ? io_din[i] : user_dout[i];
                EF5_LOGIC_IOTRIBUF u_stateio(
                    .i ( mux_latch[i] ),    
                    .t ( 1'b0         ),
                    .o ( io_din[i]    ),
                    .io( stateio[i]   )
                );
            end 
         end 
end
                
if(DEVICE == "EF3")begin
        for (i = 0;i< DATA_SIZE;i=i+1)begin:GENZ_LOOP
            if(HOLD_Z_EN == 1)begin
                assign mux_latch[i] = statehold_en_n ? io_din[i] : user_dout[i];
                EF3_LOGIC_IOTRIBUF u_stateio(
                    .i ( 1'b0         ),    
                    .t ( mux_latch[i] ),
                    .o ( io_din[i]    ),
                    .io( stateio[i]   )
                );
            end else begin
                assign mux_latch[i] = statehold_en_n ? io_din[i] : user_dout[i];
                EF3_LOGIC_IOTRIBUF u_stateio(
                    .i ( mux_latch[i] ),    
                    .t ( 1'b0         ),
                    .o ( io_din[i]    ),
                    .io( stateio[i]   )
                );
            end 
         end 
end           
                
if(DEVICE == "EF4")begin
        for (i = 0;i< DATA_SIZE;i=i+1)begin:GENZ_LOOP
            if(HOLD_Z_EN == 1)begin
                assign mux_latch[i] = statehold_en_n ? io_din[i] : user_dout[i];
                EF4_LOGIC_IOTRIBUF u_stateio(
                    .i ( 1'b0         ),    
                    .t ( mux_latch[i] ),
                    .o ( io_din[i]    ),
                    .io( stateio[i]   )
                );
            end else begin
                assign mux_latch[i] = statehold_en_n ? io_din[i] : user_dout[i];
                EF4_LOGIC_IOTRIBUF u_stateio(
                    .i ( mux_latch[i] ),    
                    .t ( 1'b0         ),
                    .o ( io_din[i]    ),
                    .io( stateio[i]   )
                );
            end 
         end 
end                
                
if(DEVICE == "EF2")begin
        for (i = 0;i< DATA_SIZE;i=i+1)begin:GENZ_LOOP
            if(HOLD_Z_EN == 1)begin
                assign mux_latch[i] = statehold_en_n ? io_din[i] : user_dout[i];
                EF2_LOGIC_IOTRIBUF u_stateio(
                    .i ( 1'b0         ),    
                    .t ( mux_latch[i] ),
                    .o ( io_din[i]    ),
                    .io( stateio[i]   )
                );
            end else begin
                assign mux_latch[i] = statehold_en_n ? io_din[i] : user_dout[i];
                EF2_LOGIC_IOTRIBUF u_stateio(
                    .i ( mux_latch[i] ),    
                    .t ( 1'b0         ),
                    .o ( io_din[i]    ),
                    .io( stateio[i]   )
                );
            end 
         end 
end        
 
endgenerate

endmodule           
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                