Adding my SOC design with CPU and RAM
diff --git a/README.md b/README.md
index 3077244..bbd3ee7 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,9 @@
-# Caravel User Project
+# ISA 16-bit microprocessor
 
-[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![UPRJ_CI](https://github.com/efabless/caravel_project_example/actions/workflows/user_project_ci.yml/badge.svg)](https://github.com/efabless/caravel_project_example/actions/workflows/user_project_ci.yml) [![Caravel Build](https://github.com/efabless/caravel_project_example/actions/workflows/caravel_build.yml/badge.svg)](https://github.com/efabless/caravel_project_example/actions/workflows/caravel_build.yml)
+This is the next version of the SOC. 1KB of memory has been added.
+The memory can be loadded via logic analyzer bus from management core.
+Then the program and data can be used from memory.
 
-| :exclamation: Important Note            |
-|-----------------------------------------|
-
-## Please fill in your project documentation in this README.md file 
-
-Refer to [README](docs/source/quickstart.rst) for a quick start of how to use caravel_user_project
-
-Refer to [README](docs/source/index.rst) for this sample project documentation. 
+The clock can be chosen from wishbone clock or user_clock2 or external.
+The reset can be chosen from wishbone reset or external pin.
+A soc configuration block has been aceated to control memory and cpu.
diff --git a/openlane/cpu/config.tcl b/openlane/cpu/config.tcl
new file mode 100755
index 0000000..4c4f528
--- /dev/null
+++ b/openlane/cpu/config.tcl
@@ -0,0 +1,55 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+
+set ::env(PDK) $::env(PDK)
+set ::env(STD_CELL_LIBRARY) "sky130_fd_sc_hd"
+
+set script_dir [file dirname [file normalize [info script]]]
+
+set ::env(DESIGN_NAME) cpu
+
+set ::env(VERILOG_FILES) "\
+	$::env(CARAVEL_ROOT)/verilog/rtl/defines.v \
+	$script_dir/../../verilog/rtl/cpu.v"
+
+set ::env(DESIGN_IS_CORE) 0
+
+set ::env(CLOCK_PORT) "clk"
+#set ::env(CLOCK_NET) "counter.clk"
+set ::env(CLOCK_PERIOD) "10"
+
+set ::env(FP_SIZING) absolute
+set ::env(DIE_AREA) "0 0 420 280"
+
+#set ::env(FP_PIN_ORDER_CFG) $script_dir/pin_order.cfg
+
+set ::env(PL_BASIC_PLACEMENT) 0
+set ::env(FP_CORE_UTIL) 5
+set ::env(PL_TARGET_DENSITY) 0.1
+
+# Maximum layer used for routing is metal 4.
+# This is because this macro will be inserted in a top level (user_project_wrapper) 
+# where the PDN is planned on metal 5. So, to avoid having shorts between routes
+# in this macro and the top level metal 5 stripes, we have to restrict routes to metal4.  
+# 
+set ::env(RT_MAX_LAYER) {met4}
+
+# You can draw more power domains if you need to 
+set ::env(VDD_NETS) [list {vccd1}]
+set ::env(GND_NETS) [list {vssd1}]
+
+set ::env(DIODE_INSERTION_STRATEGY) 4 
+# If you're going to use multiple power domains, then disable cvc run.
+set ::env(RUN_CVC) 1
diff --git a/openlane/cpu/pin_order.cfg b/openlane/cpu/pin_order.cfg
new file mode 100644
index 0000000..2fda806
--- /dev/null
+++ b/openlane/cpu/pin_order.cfg
@@ -0,0 +1,10 @@
+#BUS_SORT
+
+#S
+wb_.*
+wbs_.*
+la_.*
+irq.*
+
+#N
+io_.*
diff --git a/openlane/soc_config/config.tcl b/openlane/soc_config/config.tcl
new file mode 100755
index 0000000..124aede
--- /dev/null
+++ b/openlane/soc_config/config.tcl
@@ -0,0 +1,57 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+
+set ::env(PDK) $::env(PDK)
+set ::env(STD_CELL_LIBRARY) "sky130_fd_sc_hd"
+
+set script_dir [file dirname [file normalize [info script]]]
+
+set ::env(DESIGN_NAME) soc_config
+
+set ::env(VERILOG_FILES) "\
+	$::env(CARAVEL_ROOT)/verilog/rtl/defines.v \
+	$script_dir/../../verilog/rtl/soc_config.v"
+
+set ::env(DESIGN_IS_CORE) 0
+
+set ::env(CLOCK_PORT) "user_clock2"
+set ::env(CLOCK_PORT) "wb_clk_i"
+set ::env(CLOCK_PORT) "io_in\[19\]"
+set ::env(CLOCK_NET) "soc_clk"
+set ::env(CLOCK_PERIOD) "10"
+
+set ::env(FP_SIZING) absolute
+set ::env(DIE_AREA) "0 0 330 220"
+
+set ::env(FP_PIN_ORDER_CFG) $script_dir/pin_order.cfg
+
+set ::env(PL_BASIC_PLACEMENT) 0
+set ::env(FP_CORE_UTIL) 5
+set ::env(PL_TARGET_DENSITY) 0.1
+
+# Maximum layer used for routing is metal 4.
+# This is because this macro will be inserted in a top level (user_project_wrapper) 
+# where the PDN is planned on metal 5. So, to avoid having shorts between routes
+# in this macro and the top level metal 5 stripes, we have to restrict routes to metal4.  
+# 
+set ::env(RT_MAX_LAYER) {met4}
+
+# You can draw more power domains if you need to 
+set ::env(VDD_NETS) [list {vccd1}]
+set ::env(GND_NETS) [list {vssd1}]
+
+set ::env(DIODE_INSERTION_STRATEGY) 4 
+# If you're going to use multiple power domains, then disable cvc run.
+set ::env(RUN_CVC) 1
diff --git a/openlane/soc_config/pin_order.cfg b/openlane/soc_config/pin_order.cfg
new file mode 100644
index 0000000..99cd3b3
--- /dev/null
+++ b/openlane/soc_config/pin_order.cfg
@@ -0,0 +1,17 @@
+#BUS_SORT
+
+#S
+wb_.*
+wbs_.*
+la_.*
+irq.*
+
+#N
+io_.*
+
+en_.*
+addr_.*
+data_.*
+rw_.*
+soc_.*
+user_.*
diff --git a/openlane/user_project_wrapper/config.tcl b/openlane/user_project_wrapper/config.tcl
index 2b03104..ec7c34b 100755
--- a/openlane/user_project_wrapper/config.tcl
+++ b/openlane/user_project_wrapper/config.tcl
@@ -46,7 +46,10 @@
 ## Internal Macros
 ### Macro PDN Connections
 set ::env(FP_PDN_MACRO_HOOKS) "\
-	mprj vccd1 vssd1 vccd1 vssd1"
+	mprj vccd1 vssd1 vccd1 vssd1 \
+	cpu0 vccd1 vssd1 vccd1 vssd1 \
+	memLword vccd1 vssd1 vccd1 vssd1 \
+	memLword vccd1 vssd1 vccd1 vssd1"
 
 ### Macro Placement
 set ::env(MACRO_PLACEMENT_CFG) $script_dir/macro.cfg
@@ -54,13 +57,19 @@
 ### Black-box verilog and views
 set ::env(VERILOG_FILES_BLACKBOX) "\
 	$::env(CARAVEL_ROOT)/verilog/rtl/defines.v \
-	$script_dir/../../verilog/rtl/user_proj_example.v"
+	$script_dir/../../verilog/rtl/cpu.v \
+	$script_dir/../../verilog/rtl/soc_config.v \
+	$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_sram_macros/verilog/sky130_sram_1kbyte_1rw1r_8x1024_8.v"
 
 set ::env(EXTRA_LEFS) "\
-	$script_dir/../../lef/user_proj_example.lef"
+	$script_dir/../../lef/cpu.lef \
+	$script_dir/../../lef/soc_config.lef \
+	$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_sram_macros/lef/sky130_sram_1kbyte_1rw1r_8x1024_8.lef"
 
 set ::env(EXTRA_GDS_FILES) "\
-	$script_dir/../../gds/user_proj_example.gds"
+	$script_dir/../../gds/cpu.gds \
+	$script_dir/../../gds/soc_config.gds \
+	$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_sram_macros/gds/sky130_sram_1kbyte_1rw1r_8x1024_8.gds"
 
 # set ::env(GLB_RT_MAXLAYER) 5
 set ::env(RT_MAX_LAYER) {met4}
@@ -85,4 +94,7 @@
 set ::env(TAP_DECAP_INSERTION) 0
 set ::env(CLOCK_TREE_SYNTH) 0
 
-
+set ::env(RUN_KLAYOUT_DRC) 0
+set ::env(RUN_MAGIC_DRC) 0
+set ::env(LVS_INSERT_POWER_PINS) 0
+set ::env(QUIT_ON_LVS_ERROR) 0
diff --git a/openlane/user_project_wrapper/macro.cfg b/openlane/user_project_wrapper/macro.cfg
index a7365ab..332952a 100644
--- a/openlane/user_project_wrapper/macro.cfg
+++ b/openlane/user_project_wrapper/macro.cfg
@@ -1 +1,4 @@
 mprj 1175 1690 N
+cpu0 1300 500 N
+memLword 500 2500 N
+memHword 1900 2500 N
diff --git a/verilog/rtl/cpu.v b/verilog/rtl/cpu.v
new file mode 100644
index 0000000..d70816c
--- /dev/null
+++ b/verilog/rtl/cpu.v
@@ -0,0 +1,196 @@
+module cpu (
+`ifdef USE_POWER_PINS
+  vccd1,
+  vssd1,
+`endif
+  clk,
+  addr,
+  datain,
+  dataout,
+  en_inp,
+  en_out,
+  rdwr,
+  en,
+  rst,
+  keyboard,
+  display
+);
+
+`ifdef USE_POWER_PINS
+  inout vccd1; // User area 1 1.8V power
+  inout vssd1; // User area 1 digital ground
+`endif
+
+  input [15:0] datain;
+  output [15:0] dataout;
+  output [11:0] addr;
+  input clk, en_inp, en_out, rst;
+  output en, rdwr;
+  input [7:0] keyboard;
+  output [7:0] display;
+
+  reg e, ac0,ac15;
+  reg [15:0] ir, ac, dr;
+  reg [11:0] pc, addr;
+  reg [10:0] t;
+  wire [7:0] d;
+  wire rstEn, rstT;
+  wire rdwr, en;
+
+`ifdef DEBUG
+  debug debug1(.of(e), .lcd(display), .dcod(d), .fsm(t), .ar(addr), .prgctr(pc), .datr(dr), .accu(ac), .instr(ir));
+`endif
+
+  assign dataout = (t[4] && d[3]) ? ac : 16'hzzzz;
+  assign dataout = (t[4] && d[5]) ? {4'h0, pc} : 16'hzzzz;
+  assign dataout = (t[6] && d[6]) ? dr : 16'hzzzz;
+
+  assign display = (t[3] && d[7] && ir[10] && ir[15] && en_out) ? ac[7:0] : display;
+
+  DECODER decode2 (
+    .d(d),
+    .a(ir[14:12]),
+    .e(1'b1)
+  );
+
+  assign rstT =  rst || (t[4] && d[7] && !ir[6] && !ir[7]) || (!ir[15] && ((t[4] && d[4]) || (t[5] && d[3]))) || (t[5] && d[7] && (ir[6] || ir[7])) || (ir[15] && t[7] && d[4]) || (!ir[15] && t[7] && (d[0] || d[1] || d[2] || d[5])) || (t[7] && d[3]) || (t[9] && (d[0] || d[1] || d[2])) || (t[10] && d[6]);
+  always @(posedge clk or posedge rstT) begin
+    if (rstT) begin
+      t <= 1;
+    end else begin
+      t <= t << 1;
+    end
+  end
+
+  assign en =  (t[1] || (t[6] && !d[7] && ir[15]) || (t[4] && (d[0] || d[1] || d[2] || d[3] || d[5] || d[6])) || (ir[15] && t[4] && d[4]) || (t[6] && d[6]));
+  assign rdwr =  (!ir[15] && t[4] && (d[3] || d[5])) || (!ir[15] && t[6] && d[6]) || (ir[15] && t[8] && d[6]);
+  always @(posedge clk or posedge rst) begin
+    if (rst) begin
+      pc <= 0;
+    end else if ( t[0] ||
+                 (t[6] && d[5]) ||
+                 (!ir[15] && t[7] && d[6] && !dr) ||
+                 (t[9] && d[6] && ir[15] && !dr) ||
+	         (t[3] && d[7] && ((ir[15] && ((ir[8] && en_out) ||
+		                               (ir[9] && en_inp))) ||
+		                   (!ir[15] && ((ir[1] && !e) ||
+				                (ir[2] && !ac) ||
+					        (ir[3] && ac[15]) ||
+					        (ir[4] && !ac[15]))))))
+    begin
+      pc <= pc + 1;
+    end else if ((t[4] && d[4]) || (t[5] && d[5]) || (ir[15] && t[6] && d[4])) begin
+      pc <= addr;
+    end
+  end
+
+  always @(posedge clk or posedge rst) begin
+    if (rst) begin
+      ir <= 0;
+    end else if (!rdwr && t[2]) begin
+      ir <= datain;
+    end
+  end
+
+  always @(posedge clk or posedge rst) begin
+    if (rst) begin
+      dr <= 0;
+    end else if (!rdwr && ((!d[5] && t[5]) || (t[7] && ir[15]))) begin
+      dr <= datain;
+    end else if ((!ir[15] && t[6] && d[6]) || (ir[15] && t[8] && d[6])) begin
+      dr <= dr + 1;
+    end
+  end
+
+  always @(posedge clk or posedge rst) begin
+    if (rst) begin
+      addr <= 0;
+    end else if (t[0]) begin
+      addr <= pc;
+    end else if (t[3]) begin
+      addr <= ir[11:0];
+    end else if (!rdwr && (t[4] || (t[5] && ir[15]))) begin
+      addr <= datain;
+    end
+  end
+
+  always @(posedge clk or posedge rst) begin
+    if (rst) begin
+      e <= 0;
+      ac <= 0;
+      ac0 <= 0;
+      ac15 <= 0;
+    end else if (t[3]) begin
+      if (d[7]) begin
+////////////////////////*  input/output instructions  */////////////////////////
+        if (ir[15]) begin
+          if (ir[11] && en_inp) begin
+            ac[7:0] <= keyboard;
+          end
+            
+////////////////////*  REGISTER REFERENCE INSTRUCTIONS  *///////////////////////
+        end else begin
+          if (ir[5]) ac <= ac + 1;
+          if (ir[6]) begin
+	    ac15 <= ac[15];
+            ac <= ac << 1;
+            ac[0] <= e;
+            //e <= ac15;
+          end
+          if (ir[7]) begin
+	    ac0 <= ac[0];
+            ac <= ac >> 1;
+            ac[15] <= e;
+            //e <= ac0;
+          end
+          if (ir[8]) e <= ~e;
+          if (ir[9]) ac <= ~ac;
+          if (ir[10]) e <= 0;
+          if (ir[11]) ac <= 0;
+        end
+      end
+    end else if (t[4]) begin
+      if (d[7]) begin
+        if (!ir[15]) begin
+          if (ir[6]) begin
+            e <= ac15;
+          end
+          if (ir[7]) begin
+            e <= ac0;
+          end
+        end
+      end
+    end else if (t[8] || (!ir[15] && t[6])) begin
+      if (d[0]) begin
+        ac <= (ac & dr);
+      end
+      if (d[1]) begin
+        {e, ac} <= ac + dr;
+      end
+      if (d[2]) begin
+        ac <= dr;
+      end
+    end
+  end
+
+endmodule
+
+module DECODER (
+  d,
+  e,
+  a
+);
+  input [2:0] a;
+  input e;
+  output [7:0] d;
+
+  assign d[0] = ~a[2] & ~a[1] & ~a[0] & e;
+  assign d[1] = ~a[2] & ~a[1] &  a[0] & e;
+  assign d[2] = ~a[2] &  a[1] & ~a[0] & e;
+  assign d[3] = ~a[2] &  a[1] &  a[0] & e;
+  assign d[4] =  a[2] & ~a[1] & ~a[0] & e;
+  assign d[5] =  a[2] & ~a[1] &  a[0] & e;
+  assign d[6] =  a[2] &  a[1] & ~a[0] & e;
+  assign d[7] =  a[2] &  a[1] &  a[0] & e;
+
+endmodule
diff --git a/verilog/rtl/soc_config.v b/verilog/rtl/soc_config.v
new file mode 100644
index 0000000..7bb26c1
--- /dev/null
+++ b/verilog/rtl/soc_config.v
@@ -0,0 +1,109 @@
+// SPDX-FileCopyrightText: 2020 Efabless Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+
+`default_nettype none
+/*
+ *-------------------------------------------------------------
+ *
+ *
+ *-------------------------------------------------------------
+ */
+
+module soc_config #(
+    parameter BITS = 32
+)(
+`ifdef USE_POWER_PINS
+    inout vccd1,	// User area 1 1.8V supply
+    inout vssd1,	// User area 1 digital ground
+`endif
+
+    input user_clock2,
+    // Wishbone Slave ports (WB MI A)
+    input wb_clk_i,
+    input wb_rst_i,
+    input wbs_stb_i,
+    input wbs_cyc_i,
+    input wbs_we_i,
+    input [3:0] wbs_sel_i,
+    input [31:0] wbs_dat_i,
+    input [31:0] wbs_adr_i,
+    output wbs_ack_o,
+    output [31:0] wbs_dat_o,
+
+    // Logic Analyzer Signals
+    input  [127:0] la_data_in,
+    output [127:0] la_data_out,
+    input  [127:0] la_oenb,
+
+    // IOs
+    input  [`MPRJ_IO_PADS-1:0] io_in,
+    output [`MPRJ_IO_PADS-1:0] io_out,
+    output [`MPRJ_IO_PADS-1:0] io_oeb,
+
+    // IRQ
+    output [2:0] irq,
+
+    // CPU specific
+    input rw_from_cpu,
+    input en_from_cpu,
+    input [11:0] addr_from_cpu,
+    input [15:0] data_from_cpu,
+    output [15:0] data_to_cpu,
+    input [15:0] data_from_mem,
+    output [15:0] data_to_mem,
+    output [9:0] addr_to_mem,
+    output rw_to_mem,
+    output en_to_mem,
+    output en_keyboard,
+    output en_display,
+    output soc_rst,
+    output soc_clk
+);
+    wire rst;
+
+    wire [`MPRJ_IO_PADS-1:0] io_in;
+    wire [`MPRJ_IO_PADS-1:0] io_out;
+    wire [`MPRJ_IO_PADS-1:0] io_oeb;
+
+    wire rw, n;
+
+    // IRQ
+    assign irq = 3'b000;	// Unused
+
+    // IO
+    assign io_oeb[37:30] = 8'hFF; // input
+    assign io_oeb[29:22] = 8'h00; // output
+    assign io_oeb[21:18] = 8'hFF; // input
+
+    // LA
+    // if la_data_in[0] is input, then wbclk or usrclk can be used. Else io_in[19] is the clock
+    assign soc_clk = la_oenb[0] ? (la_data_in[0] ? user_clock2 : wb_clk_i) : io_in[19];
+    // if la_data_in[1] is input, then wbrst or io_in[18] can be used. Else io_in[18] is the reset
+    assign soc_rst = la_oenb[1] ? (la_data_in[1] ? io_in[18] : wb_rst_i) : io_in[18];
+    // Enable display and keyboard by LA or io_in 21/20
+    assign en_keyboard = la_oenb[2] ? la_data_in[2] : io_in[21];
+    assign en_display = la_oenb[3] ? la_data_in[3] : io_in[20];
+
+    // Provision to read/write ram from LA
+    assign data_to_mem = la_data_in[127] ? la_data_in[126:111] : data_from_cpu;
+    assign addr_to_mem = la_data_in[127] ? la_data_in[110:101] : addr_from_cpu[9:0];
+    assign rw_to_mem = la_data_in[127] ? la_data_in[100] : ~rw_from_cpu; // active low for openram
+    assign en_to_mem = la_data_in[127] ? la_data_in[99] : ~en_from_cpu; // active low for openram
+    assign data_to_cpu = data_from_mem;
+    assign la_data_out[98:83] = data_from_mem;
+
+endmodule
+
+`default_nettype wire
diff --git a/verilog/rtl/user_project_wrapper.v b/verilog/rtl/user_project_wrapper.v
index 5ee1cee..0300942 100644
--- a/verilog/rtl/user_project_wrapper.v
+++ b/verilog/rtl/user_project_wrapper.v
@@ -78,16 +78,22 @@
     output [2:0] user_irq
 );
 
+wire [9:0] adr_mem;
+wire [11:0] adr_cpu;
+wire [15:0] cpdatin, cpdatout, memdatin, memdatout;
+wire cpuen, cpurw, memrw, memen, enkbd, endisp, rst, clk;
+
 /*--------------------------------------*/
 /* User project is instantiated  here   */
 /*--------------------------------------*/
 
-user_proj_example mprj (
+soc_config mprj (
 `ifdef USE_POWER_PINS
-	.vccd1(vccd1),	// User area 1 1.8V power
-	.vssd1(vssd1),	// User area 1 digital ground
+    .vccd1(vccd1),	// User area 1 1.8V power
+    .vssd1(vssd1),	// User area 1 digital ground
 `endif
 
+    .user_clock2(user_clock2),
     .wb_clk_i(wb_clk_i),
     .wb_rst_i(wb_rst_i),
 
@@ -114,10 +120,73 @@
     .io_out(io_out),
     .io_oeb(io_oeb),
 
+    // CPU specific
+    .addr_from_cpu(adr_cpu),
+    .data_from_cpu(cpdatout),
+    .data_to_cpu(cpdatin),
+    .addr_to_mem(adr_mem),
+    .data_from_mem(memdatin),
+    .data_to_mem(memdatout),
+    .rw_from_cpu(cpurw),
+    .en_from_cpu(cpuen),
+    .rw_to_mem(memrw),
+    .en_to_mem(memen),
+    .en_keyboard(enkbd),
+    .en_display(endisp),
+    .soc_clk(clk),
+    .soc_rst(rst),
+
     // IRQ
     .irq(user_irq)
 );
 
+cpu cpu0 (
+`ifdef USE_POWER_PINS
+    .vccd1(vccd1),	// User area 1 1.8V power
+    .vssd1(vssd1),	// User area 1 digital ground
+`endif
+
+    .clk(clk),
+    .addr(adr_cpu),
+    .datain(cpdatin), 
+    .dataout(cpdatout),
+    .en_inp(enkbd),
+    .en_out(endisp),
+    .rdwr(cpurw),
+    .en(cpuen),
+    .rst(rst),
+    .keyboard(io_in[37:30]),
+    .display(io_out[29:22]) 
+);
+
+sky130_sram_1kbyte_1rw1r_8x1024_8 #(.NUM_WMASKS(2)) memLword (
+`ifdef USE_POWER_PINS
+    .vccd1(vccd1),	// User area 1 1.8V power
+    .vssd1(vssd1),	// User area 1 digital ground
+`endif
+    .clk0(clk),
+    .addr0(adr_mem),
+    .din0(memdatout[7:0]),
+    .dout0(memdatin[7:0]),
+    .web0(memrw),
+    .csb0(memen),
+    .wmask0({cpuen, cpuen})
+);
+
+    sky130_sram_1kbyte_1rw1r_8x1024_8 #(.NUM_WMASKS(2)) memHword (
+`ifdef USE_POWER_PINS
+    .vccd1(vccd1),	// User area 1 1.8V power
+    .vssd1(vssd1),	// User area 1 digital ground
+`endif
+    .clk0(clk),
+    .addr0(adr_mem),
+    .din0(memdatout[15:8]),
+    .dout0(memdatin[15:8]),
+    .web0(memrw),
+    .csb0(memen),
+    .wmask0({cpuen, cpuen})
+);
+
 endmodule	// user_project_wrapper
 
 `default_nettype wire