module fm_3d_interp_e (
    clk_core,
    rst_x,
    i_en,
    i_wf,
    i_a,
    i_iwa,
    i_b,
    i_iwb,
    i_t,
    i_w,
    o_c
);

////////////////////////////
// I/O definition
////////////////////////////
    input         clk_core;
    input         rst_x;
    input         i_en;
    input         i_wf;
    input  [21:0] i_a;
    input  [21:0] i_iwa;
    input  [21:0] i_b;
    input  [21:0] i_iwb;
    input  [21:0] i_t;
    input  [21:0] i_w;
    output [21:0] o_c;          // result


///////////////////////////////////////////
//  wire 
///////////////////////////////////////////
    wire [21:0]  w_aiw;
    wire [21:0]  w_biw;

    wire [21:0]  w_aiw_s;
    wire [21:0]  w_biw_s;


    wire [21:0]  w_td;
    wire [21:0]  w_td_s;
    wire [21:0]  w_wd;

    wire [21:0]  w_wdd;
////////////////////////////
// assign
////////////////////////////
    assign w_aiw_s = (i_wf) ? w_aiw : i_a;
    assign w_biw_s = (i_wf) ? w_biw : i_b;
    assign w_td_s  = (i_wf) ? w_td : i_t;


////////////////////////////
// module instance
////////////////////////////

    // stage1-3

    fm_3d_fmul mul_aiw (
        .clk_core(clk_core),
        .i_en(i_en),
        .i_a(i_a),
        .i_b(i_iwa),
        .o_c(w_aiw)
    );

    fm_3d_fmul mul_biw (
        .clk_core(clk_core),
        .i_en(i_en),
        .i_a(i_b),
        .i_b(i_iwb),
        .o_c(w_biw)
    );

    fm_3d_delay #(22,3) delay_t (
        .clk_core(clk_core),
        .i_en(i_en),
        .i_data(i_t),
        .o_data(w_td)
    );

    fm_3d_delay #(22,2) delay_w (
        .clk_core(clk_core),
        .i_en(i_en),
        .i_data(i_w),
        .o_data(w_wd)
    );

    // stage4-12 (interpolate)

    fm_3d_interp interp (
        .clk_core(clk_core),
        .i_en(i_en),
        .i_a(w_aiw_s),
        .i_b(w_biw_s),
        .i_t(w_td_s),
        .o_c(o_c)
    );

endmodule