add README
diff --git a/README.md b/README.md
index b6dd62f..4b98435 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,5 @@
 # Pre-Trained Neural Network for MNIST
 
-This project implements a pre-trained neural network for hand-written digits from MNIST dataset.
\ No newline at end of file
+This project implements a pre-trained fully connected neural network (FCNN) for hand-written digits from MNIST dataset. It takes images from MNIST dataset (28x28) and output single digit prediction. All parameters (weights and bias) are pre-trained and hard-coded.
+
+This repository contains a Verilog implementation of the FCNN, targeting the OpenLane flow for the Skywater 130nm process and is an entry for the Google/Efabless MPW-3 shuttle.
\ No newline at end of file
diff --git a/verilog/rtl/LICENSE b/verilog/rtl/LICENSE
new file mode 100644
index 0000000..7190840
--- /dev/null
+++ b/verilog/rtl/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 Vipin Kizheppatt
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/verilog/rtl/user_proj_example.v b/verilog/rtl/user_proj_example.v
index 351d409..65ca516 100644
--- a/verilog/rtl/user_proj_example.v
+++ b/verilog/rtl/user_proj_example.v
@@ -244,200 +244,6 @@
         end
     end
 
-    // wire [`numNeuronLayer2-1:0] o2_valid;
-    // wire [`numNeuronLayer2*`dataWidth-1:0] x2_out;
-    // reg [`numNeuronLayer2*`dataWidth-1:0] holdData_2;
-    // reg [`dataWidth-1:0] out_data_2;
-    // reg data_out_valid_2;
-
-    // Layer_2 #(.NN(`numNeuronLayer2),.numWeight(`numWeightLayer2),.dataWidth(`dataWidth),.layerNum(2),.sigmoidSize(`sigmoidSize),.weightIntWidth(`weightIntWidth),.actType(`Layer2ActType)) l2(
-    //     .clk(clk),
-    //     .rst(reset),
-    // //	.weightValid(weightValid),
-    // //	.biasValid(biasValid),
-    // //	.weightValue(weightValue),
-    // //	.biasValue(biasValue),
-    // //	.config_layer_num(config_layer_num),
-    // //	.config_neuron_num(config_neuron_num),
-    //     .x_valid(data_out_valid_1),
-    //     .x_in(out_data_1),
-    //     .o_valid(o2_valid),
-    //     .x_out(x2_out)
-    // );
-
-    // //State machine for data pipelining
-
-    // reg       state_2;
-    // integer   count_2;
-    // always @(posedge clk)
-    // begin
-    //     if(reset)
-    //     begin
-    //         state_2 <= IDLE;
-    //         count_2 <= 0;
-    //         data_out_valid_2 <=0;
-    //     end
-    //     else
-    //     begin
-    //         case(state_2)
-    //             IDLE: begin
-    //                 count_2 <= 0;
-    //                 data_out_valid_2 <=0;
-    //                 if (o2_valid[0] == 1'b1)
-    //                 begin
-    //                     holdData_2 <= x2_out;
-    //                     state_2 <= SEND;
-    //                 end
-    //             end
-    //             SEND: begin
-    //                 out_data_2 <= holdData_2[`dataWidth-1:0];
-    //                 holdData_2 <= holdData_2>>`dataWidth;
-    //                 count_2 <= count_2 +1;
-    //                 data_out_valid_2 <= 1;
-    //                 if (count_2 == `numNeuronLayer2)
-    //                 begin
-    //                     state_2 <= IDLE;
-    //                     data_out_valid_2 <= 0;
-    //                 end
-    //             end
-    //         endcase
-    //     end
-    // end
-
-    // wire [`numNeuronLayer3-1:0] o3_valid;
-    // wire [`numNeuronLayer3*`dataWidth-1:0] x3_out;
-    // reg [`numNeuronLayer3*`dataWidth-1:0] holdData_3;
-    // reg [`dataWidth-1:0] out_data_3;
-    // reg data_out_valid_3;
-
-    // Layer_3 #(.NN(`numNeuronLayer3),.numWeight(`numWeightLayer3),.dataWidth(`dataWidth),.layerNum(3),.sigmoidSize(`sigmoidSize),.weightIntWidth(`weightIntWidth),.actType(`Layer3ActType)) l3(
-    //     .clk(clk),
-    //     .rst(reset),
-    // //	.weightValid(weightValid),
-    // //	.biasValid(biasValid),
-    // //	.weightValue(weightValue),
-    // //	.biasValue(biasValue),
-    // //	.config_layer_num(config_layer_num),
-    // //	.config_neuron_num(config_neuron_num),
-    //     .x_valid(data_out_valid_2),
-    //     .x_in(out_data_2),
-    //     .o_valid(o3_valid),
-    //     .x_out(x3_out)
-    // );
-
-    // //State machine for data pipelining
-
-    // reg       state_3;
-    // integer   count_3;
-    // always @(posedge clk)
-    // begin
-    //     if(reset)
-    //     begin
-    //         state_3 <= IDLE;
-    //         count_3 <= 0;
-    //         data_out_valid_3 <=0;
-    //     end
-    //     else
-    //     begin
-    //         case(state_3)
-    //             IDLE: begin
-    //                 count_3 <= 0;
-    //                 data_out_valid_3 <=0;
-    //                 if (o3_valid[0] == 1'b1)
-    //                 begin
-    //                     holdData_3 <= x3_out;
-    //                     state_3 <= SEND;
-    //                 end
-    //             end
-    //             SEND: begin
-    //                 out_data_3 <= holdData_3[`dataWidth-1:0];
-    //                 holdData_3 <= holdData_3>>`dataWidth;
-    //                 count_3 <= count_3 +1;
-    //                 data_out_valid_3 <= 1;
-    //                 if (count_3 == `numNeuronLayer3)
-    //                 begin
-    //                     state_3 <= IDLE;
-    //                     data_out_valid_3 <= 0;
-    //                 end
-    //             end
-    //         endcase
-    //     end
-    // end
-
-    // wire [`numNeuronLayer4-1:0] o4_valid;
-    // wire [`numNeuronLayer4*`dataWidth-1:0] x4_out;
-    // reg [`numNeuronLayer4*`dataWidth-1:0] holdData_4;
-    // reg [`dataWidth-1:0] out_data_4;
-    // reg data_out_valid_4;
-
-    // Layer_4 #(.NN(`numNeuronLayer4),.numWeight(`numWeightLayer4),.dataWidth(`dataWidth),.layerNum(4),.sigmoidSize(`sigmoidSize),.weightIntWidth(`weightIntWidth),.actType(`Layer4ActType)) l4(
-    //     .clk(clk),
-    //     .rst(reset),
-    // //	.weightValid(weightValid),
-    // //	.biasValid(biasValid),
-    // //	.weightValue(weightValue),
-    // //	.biasValue(biasValue),
-    // //	.config_layer_num(config_layer_num),
-    // //	.config_neuron_num(config_neuron_num),
-    //     .x_valid(data_out_valid_1),
-    //     .x_in(out_data_1),
-    //     .o_valid(o4_valid),
-    //     .x_out(x4_out)
-    // );
-
-    // //State machine for data pipelining
-
-    // reg       state_4;
-    // integer   count_4;
-    // always @(posedge clk)
-    // begin
-    //     if(reset)
-    //     begin
-    //         state_4 <= IDLE;
-    //         count_4 <= 0;
-    //         data_out_valid_4 <=0;
-    //     end
-    //     else
-    //     begin
-    //         case(state_4)
-    //             IDLE: begin
-    //                 count_4 <= 0;
-    //                 data_out_valid_4 <=0;
-    //                 if (o4_valid[0] == 1'b1)
-    //                 begin
-    //                     holdData_4 <= x4_out;
-    //                     state_4 <= SEND;
-    //                 end
-    //             end
-    //             SEND: begin
-    //                 out_data_4 <= holdData_4[`dataWidth-1:0];
-    //                 holdData_4 <= holdData_4>>`dataWidth;
-    //                 count_4 <= count_4 +1;
-    //                 data_out_valid_4 <= 1;
-    //                 if (count_4 == `numNeuronLayer4)
-    //                 begin
-    //                     state_4 <= IDLE;
-    //                     data_out_valid_4 <= 0;
-    //                 end
-    //             end
-    //         endcase
-    //     end
-    // end
-
-    // reg [`numNeuronLayer4*`dataWidth-1:0] holdData_5;
-    // assign rdata = holdData_5[`dataWidth-1:0];
-
-    // always @(posedge clk)
-    //     begin
-    //         if (o4_valid[0] == 1'b1)
-    //             holdData_5 <= x4_out;
-    //         else if(!ready)
-    //         begin
-    //             holdData_5 <= holdData_5>>`dataWidth;
-    //         end
-    //     end
-
-
     maxFinder #(.numInput(`numNeuronLayer1),.inputWidth(`dataWidth))
         mFind(
             .i_clk(clk),
@@ -447,91 +253,6 @@
             .o_data_valid(out_valid)
         );
 
-    // always @(posedge clk) begin
-    //     if(rst)
-    //         count <= 32'b0;
-    //     else if(wbs_stb_i && wbs_cyc_i && wbs_we_i && wbs_adr_i == USER_ADDRESS) begin
-    //         count <= wbs_dat_i;
-    //     end
-    // end
-
-    // // acks
-    // always @(posedge clk) begin
-    //     if(rst)
-    //         wack <= 0;
-    //     else
-    //         // return ack immediately
-    //         wack <= (wbs_stb_i && wbs_adr_i == USER_ADDRESS);
-    // end
-
 endmodule
 
-
-//     reg ready;
-//     reg [BITS-1:0] count;
-//     reg [BITS-1:0] rdata;
-
-//     always @(posedge clk) begin
-//         if (reset) begin
-//             count <= 0;
-//             ready <= 0;
-//         end else begin
-//             ready <= 1'b0;
-//             count <= count + 1;
-
-//             if (valid && !ready) begin
-//                 ready <= 1'b1;
-//                 rdata <= count;
-//                 if (wstrb[0]) count[7:0]   <= wdata[7:0];
-//                 if (wstrb[1]) count[15:8]  <= wdata[15:8];
-//                 if (wstrb[2]) count[23:16] <= wdata[23:16];
-//                 if (wstrb[3]) count[31:24] <= wdata[31:24];
-//             end
-//         end
-//     end
-
-// endmodule
-
-// module counter #(
-//     parameter BITS = 32
-// )(
-//     input clk,
-//     input reset,
-//     input valid,
-//     input [3:0] wstrb,
-//     input [BITS-1:0] wdata,
-//     input [BITS-1:0] la_write,
-//     input [BITS-1:0] la_input,
-//     output ready,
-//     output [BITS-1:0] rdata,
-//     output [BITS-1:0] count
-// );
-//     reg ready;
-//     reg [BITS-1:0] count;
-//     reg [BITS-1:0] rdata;
-
-//     always @(posedge clk) begin
-//         if (reset) begin
-//             count <= 0;
-//             ready <= 0;
-//         end else begin
-//             ready <= 1'b0;
-//             if (~|la_write) begin
-//                 count <= count + 1;
-//             end
-//             if (valid && !ready) begin
-//                 ready <= 1'b1;
-//                 rdata <= count;
-//                 if (wstrb[0]) count[7:0]   <= wdata[7:0];
-//                 if (wstrb[1]) count[15:8]  <= wdata[15:8];
-//                 if (wstrb[2]) count[23:16] <= wdata[23:16];
-//                 if (wstrb[3]) count[31:24] <= wdata[31:24];
-//             end else if (|la_write) begin
-//                 count <= la_write & la_input;
-//             end
-//         end
-//     end
-
-// endmodule
-
 `default_nettype wire