Merge branch 'develop_newscl' into develop
diff --git a/.gitmodules b/.gitmodules
index 5144d93..1fd508b 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,4 +1,3 @@
 [submodule "pdks/ef-skywater-s8"]
 	path = pdks/ef-skywater-s8
 	url = git@gitlab.com:efabless/ef-pdk/ef-skywater-s8.git
-	branch = dev
diff --git a/README.md b/README.md
index e8d5594..a8592f4 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@
     |     ||  o  )  [_ |  _  || |    |  o  ||  _  | /  [_
     |  O  ||   _/    _]|  |  || |___ |     ||  |  ||    _]
     |     ||  | |   [_ |  |  ||     ||  _  ||  |  ||   [_
-     \___/ |__| |_____||__|__||_____||__|__||__|__||_____| ver 0.95
+     \___/ |__| |_____||__|__||_____||__|__||__|__||_____| ver 0.981
      
 
 ## Table of contents
diff --git a/configuration/floorplan.tcl b/configuration/floorplan.tcl
index 6a4fc1a..1e68d89 100644
--- a/configuration/floorplan.tcl
+++ b/configuration/floorplan.tcl
@@ -4,7 +4,7 @@
 
 set ::env(FP_SIZING) relative
 set ::env(FP_CORE_UTIL) 50
-set ::env(FP_CORE_MARGIN) 3.36
+set ::env(FP_CORE_MARGIN) 5.52
 set ::env(FP_ASPECT_RATIO) 1
 
 set ::env(FP_PDN_VOFFSET) 16.32
@@ -12,7 +12,7 @@
 set ::env(FP_PDN_HOFFSET) 16.65
 set ::env(FP_PDN_HPITCH) 153.18
 
-set ::env(FP_IO_VEXTEND) -1
-set ::env(FP_IO_HEXTEND) -1
-set ::env(FP_IO_VTHICKNESS_MULT) 1
-set ::env(FP_IO_HTHICKNESS_MULT) 1
+set ::env(FP_IO_VEXTEND) 2
+set ::env(FP_IO_HEXTEND) 2
+set ::env(FP_IO_VTHICKNESS_MULT) 2
+set ::env(FP_IO_HTHICKNESS_MULT) 2
diff --git a/configuration/general.tcl b/configuration/general.tcl
index 6f5a56c..f11aa93 100644
--- a/configuration/general.tcl
+++ b/configuration/general.tcl
@@ -1,6 +1,6 @@
 # default pdk 
 set ::env(PDK) "EFS8A/"
-set ::env(PDK_VARIANT) "efs8hd"
+set ::env(PDK_VARIANT) "scs8hd"
 set ::env(PDK_ROOT) $::env(OPENLANE_ROOT)/pdks/
 set ::env(USE_GPIO_PADS) 0
 
diff --git a/configuration/routing.tcl b/configuration/routing.tcl
index e5ef760..327f57c 100644
--- a/configuration/routing.tcl
+++ b/configuration/routing.tcl
@@ -1,7 +1,7 @@
 # Routing defaults
 set ::env(GLB_RT_OLD_FR) 0
 set ::env(GLB_RT_ADJUSTMENT) 0.15
-set ::env(GLB_RT_LI1_ADJUSTMENT) 0
+set ::env(GLB_RT_LI1_ADJUSTMENT) 0.85
 set ::env(GLB_RT_MET1_ADJUSTMENT) 0
 set ::env(GLB_RT_MINLAYER) 1
 set ::env(GLB_RT_MAXLAYER) 6
diff --git a/designs/digital_pll/src/cells.v b/designs/digital_pll/src/cells.v
index b84aa50..1b6b0bd 100644
--- a/designs/digital_pll/src/cells.v
+++ b/designs/digital_pll/src/cells.v
@@ -1,32 +1,32 @@
 (* blackbox *)
-module efs8hd_dfrbp_2  (output QN, input D, input CLK, output Q, input RESETB); endmodule   
+module scs8hd_dfrbp_1  (output QN, input D, input CLK, output Q, input RESETB); endmodule
 (* blackbox *)
-module efs8hd_inv_4 (input A, output Y); endmodule   
+module scs8hd_inv_4 (input A, output Y); endmodule
 (* blackbox *)
-module efs8hd_buf_1(input A, output X); endmodule   
+module scs8hd_buf_1(input A, output X); endmodule
 (* blackbox *)
-module efs8hd_clkbuf_1(input A, output X); endmodule
+module scs8hd_clkbuf_1(input A, output X); endmodule
 (* blackbox *)
-module efs8hd_clkbuf_2(input A, output X); endmodule
+module scs8hd_clkbuf_2(input A, output X); endmodule
 (* blackbox *)
-module efs8hd_clkinv_1(input A, output Y); endmodule
+module scs8hd_clkinv_1(input A, output Y); endmodule
 (* blackbox *)
-module efs8hd_clkinv_2(input A, output Y); endmodule
+module scs8hd_clkinv_2(input A, output Y); endmodule
 (* blackbox *)
-module efs8hd_clkinv_4(input A, output Y); endmodule
+module scs8hd_clkinv_4(input A, output Y); endmodule
 (* blackbox *)
-module efs8hd_clkinv_8(input A, output Y); endmodule
+module scs8hd_clkinv_8(input A, output Y); endmodule
 (* blackbox *)
-module efs8hd_conb_1(output HI, output LO); endmodule
+module scs8hd_conb_1(output HI, output LO); endmodule
 (* blackbox *)
-module efs8hd_dfbbp_1(input CLK, input D, output Q, output QN, input RESETB, input SETB); endmodule
+module scs8hd_dfbbp_1(input CLK, input D, output Q, output QN, input RESETB, input SETB); endmodule
 (* blackbox *)
-module efs8hd_einvn_4(input A, input TEB, output Z); endmodule
+module scs8hd_einvn_4(input A, input TEB, output Z); endmodule
 (* blackbox *)
-module efs8hd_einvn_8(input A, input TEB, output Z); endmodule
+module scs8hd_einvn_8(input A, input TEB, output Z); endmodule
 (* blackbox *)
-module efs8hd_einvp_1(input A, input TE, output Z); endmodule
+module scs8hd_einvp_1(input A, input TE, output Z); endmodule
 (* blackbox *)
-module efs8hd_einvp_2(input A, input TE, output Z); endmodule
+module scs8hd_einvp_2(input A, input TE, output Z); endmodule
 (* blackbox *)
-module efs8hd_or2_2(input A, B, output X); endmodule
+module scs8hd_or2_2(input A, B, output X); endmodule
diff --git a/designs/digital_pll/src/digital_pll.v b/designs/digital_pll/src/digital_pll.v
index 75d46b6..ca249af 100644
--- a/designs/digital_pll/src/digital_pll.v
+++ b/designs/digital_pll/src/digital_pll.v
@@ -34,7 +34,7 @@
 
     // Derive negative-sense reset from the input positive-sense reset
 
-    efs8hd_inv_4 irb (
+    scs8hd_inv_4 irb (
 	.A(reset),
 	.Y(resetb)
     );
@@ -42,8 +42,8 @@
     // Create divided down clocks.  The inverted output only comes
     // with digital standard cells with inverted resets, so the
     // reset has to be inverted as well.
- 
-    efs8hd_dfrbp_2 idiv2 (
+
+    scs8hd_dfrbp_1 idiv2 (
 	.CLK(clockp[1]),
 	.D(clockd[0]),
 	.Q(nint[0]),
@@ -51,7 +51,7 @@
 	.RESETB(resetb)
     );
 
-    efs8hd_dfrbp_2 idiv4 (
+    scs8hd_dfrbp_1 idiv4 (
 	.CLK(clockd[0]),
 	.D(clockd[1]),
 	.Q(nint[1]),
@@ -59,7 +59,7 @@
 	.RESETB(resetb)
     );
 
-    efs8hd_dfrbp_2 idiv8 (
+    scs8hd_dfrbp_1 idiv8 (
 	.CLK(clockd[1]),
 	.D(clockd[2]),
 	.Q(nint[2]),
@@ -67,7 +67,7 @@
 	.RESETB(resetb)
     );
 
-    efs8hd_dfrbp_2 idiv16 (
+    scs8hd_dfrbp_1 idiv16 (
 	.CLK(clockd[2]),
 	.D(clockd[3]),
 	.Q(nint[3]),
diff --git a/designs/digital_pll/src/ring_osc2x13.v b/designs/digital_pll/src/ring_osc2x13.v
index eca5acf..bf405dd 100755
--- a/designs/digital_pll/src/ring_osc2x13.v
+++ b/designs/digital_pll/src/ring_osc2x13.v
@@ -10,40 +10,40 @@
 
     wire d0, d1, d2;
 
-    efs8hd_clkbuf_2 delaybuf0 (
+    scs8hd_clkbuf_2 delaybuf0 (
 	.A(in),
 	.X(ts)
     );
 
-    efs8hd_clkbuf_1 delaybuf1 (
+    scs8hd_clkbuf_1 delaybuf1 (
 	.A(ts),
 	.X(d0)
     );
 
-    efs8hd_einvp_2 delayen1 (
+    scs8hd_einvp_2 delayen1 (
 	.A(d0),
 	.TE(trim[1]),
 	.Z(d1)
     );
 
-    efs8hd_einvn_4 delayenb1 (
+    scs8hd_einvn_4 delayenb1 (
 	.A(ts),
 	.TEB(trim[1]),
 	.Z(d1)
     );
 
-    efs8hd_clkinv_1 delayint0 (
+    scs8hd_clkinv_1 delayint0 (
 	.A(d1),
 	.Y(d2)
     );
 
-    efs8hd_einvp_2 delayen0 (
+    scs8hd_einvp_2 delayen0 (
 	.A(d2),
 	.TE(trim[0]),
 	.Z(out)
     );
 
-    efs8hd_einvn_8 delayenb0 (
+    scs8hd_einvn_8 delayenb0 (
 	.A(ts),
 	.TEB(trim[0]),
 	.Z(out)
@@ -59,29 +59,29 @@
 
     wire d0, d1, d2, ctrl0, one;
 
-    efs8hd_clkbuf_1 delaybuf0 (
+    scs8hd_clkbuf_1 delaybuf0 (
 	.A(in),
 	.X(d0)
     );
 
-    efs8hd_einvp_2 delayen1 (
+    scs8hd_einvp_2 delayen1 (
 	.A(d0),
 	.TE(trim[1]),
 	.Z(d1)
     );
 
-    efs8hd_einvn_4 delayenb1 (
+    scs8hd_einvn_4 delayenb1 (
 	.A(in),
 	.TEB(trim[1]),
 	.Z(d1)
     );
 
-    efs8hd_clkinv_1 delayint0 (
+    scs8hd_clkinv_1 delayint0 (
 	.A(d1),
 	.Y(d2)
     );
 
-    efs8hd_einvp_2 delayen0 (
+    scs8hd_einvp_2 delayen0 (
 	.A(d2),
 	.TE(trim[0]),
 	.Z(out)
@@ -93,19 +93,19 @@
 	.Z(out)
     );
 
-    efs8hd_einvp_1 reseten0 (
+    scs8hd_einvp_1 reseten0 (
 	.A(one),
 	.TE(reset),
 	.Z(out)
     );
 
-    efs8hd_or2_2 ctrlen0 (
+    scs8hd_or2_2 ctrlen0 (
 	.A(reset),
 	.B(trim[0]),
 	.X(ctrl0)
     );
 
-    efs8hd_conb_1 const1 (
+    scs8hd_conb_1 const1 (
 	.HI(one),
 	.LO()
     );
@@ -136,7 +136,7 @@
     wire [1:0] c;
 
     // Main oscillator loop stages
- 
+
     genvar i;
     generate
 	for (i = 0; i < 12; i = i + 1) begin : dstage
@@ -149,7 +149,7 @@
     endgenerate
 
     // Reset/startup stage
- 
+
     start_stage iss (
 	.in(d[12]),
 	.trim({trim[25], trim[12]}),
@@ -159,19 +159,19 @@
 
     // Buffered outputs a 0 and 90 degrees phase (approximately)
 
-    efs8hd_clkinv_2 ibufp00 (
+    scs8hd_clkinv_2 ibufp00 (
 	.A(d[0]),
 	.Y(c[0])
     );
-    efs8hd_clkinv_8 ibufp01 (
+    scs8hd_clkinv_8 ibufp01 (
 	.A(c[0]),
 	.Y(clockp[0])
     );
-    efs8hd_clkinv_2 ibufp10 (
+    scs8hd_clkinv_2 ibufp10 (
 	.A(d[6]),
 	.Y(c[1])
     );
-    efs8hd_clkinv_8 ibufp11 (
+    scs8hd_clkinv_8 ibufp11 (
 	.A(c[1]),
 	.Y(clockp[1])
     );
diff --git a/designs/openstriVe_soc/src/openstriVe_soc.v b/designs/openstriVe_soc/src/openstriVe_soc.v
deleted file mode 100644
index 1409be9..0000000
--- a/designs/openstriVe_soc/src/openstriVe_soc.v
+++ /dev/null
@@ -1,763 +0,0 @@
-/*
- *  PicoSoC - A simple example SoC using PicoRV32
- *
- *  Copyright (C) 2017  Clifford Wolf <clifford@clifford.at>
- *
- *  Permission to use, copy, modify, and/or distribute this software for any
- *  purpose with or without fee is hereby granted, provided that the above
- *  copyright notice and this permission notice appear in all copies.
- *
- *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- *  Revision 1,  July 2019:  Added signals to drive flash_clk and flash_csb
- *  output enable (inverted), tied to reset so that the flash is completely
- *  isolated from the processor when the processor is in reset.
- *
- *  Also: Made ram_wenb a 4-bit bus so that the memory access can be made
- *  byte-wide for byte-wide instructions.
- */
-
-`ifdef PICORV32_V
-`error "openstriVe_soc.v must be read before picorv32.v!"
-`endif
-
-/* Note:  Synthesize register memory from flops */
-/* Inefficient, but not terribly so */
-
-/* Also note:  To avoid having a hard macro in the place & route	 */
-/* (method not finished yet in qflow), SRAM pins are brought out to	 */
-/* the openstriVe_soc I/O so that openstriVe_soc.v itself is fully synthesizable */
-/* and routable with qflow as-is.					*/
-
-`define PICORV32_REGS openstriVe_soc_regs
-
-module openstriVe_soc (
-`ifdef LVS
-	inout vdd1v8,	    /* 1.8V domain */
-	inout vss,
-`endif
-	input pll_clk,
-	input ext_clk,
-	input ext_clk_sel,
-	input ext_reset,
-	input reset,
-
-	// Main SRAM, including clk and resetn above
-	// (Not used:  RAM is synthesized in this version)
-	/*
-	output [3:0] ram_wenb,
-	output [9:0] ram_addr,
-	output [31:0] ram_wdata,
-	input  [31:0] ram_rdata,
-	*/
-
-	// Memory mapped I/O signals
-	output [15:0] gpio_out,		// Connect to out on gpio pad
-	input  [15:0] gpio_in,		// Connect to in on gpio pad
-	output [15:0] gpio_pullupb,	// Connect to pullupb on gpio pad
-	output [15:0] gpio_pulldownb,	// Connect to pulldownb on gpio pad
-	output [15:0] gpio_outenb,	// Connect to outenb on gpio pad
-
-	output 	      adc0_ena,
-	output 	      adc0_convert,
-	input  [9:0]  adc0_data,
-	input  	      adc0_done,
-	output	      adc0_clk,
-	output [1:0]  adc0_inputsrc,
-	output 	      adc1_ena,
-	output 	      adc1_convert,
-	output	      adc1_clk,
-	output [1:0]  adc1_inputsrc,
-	input  [9:0]  adc1_data,
-	input  	      adc1_done,
-
-	output	      dac_ena,
-	output [9:0]  dac_value,
-
-	output	      analog_out_sel,	// Analog output select (DAC or bandgap)
-	output	      opamp_ena,	// Op-amp enable for analog output
-	output	      opamp_bias_ena,	// Op-amp bias enable for analog output
-	output	      bg_ena,		// Bandgap enable
-
-	output	      comp_ena,
-	output [1:0]  comp_ninputsrc,
-	output [1:0]  comp_pinputsrc,
-	output	      rcosc_ena,
-
-	output	      overtemp_ena,
-	input	      overtemp,
-	input	      rcosc_in,		// RC oscillator output
-	input	      xtal_in,		// crystal oscillator output
-	input	      comp_in,		// comparator output
-	input	      spi_sck,
-
-	input [7:0]   spi_ro_config,
-	input 	      spi_ro_xtal_ena,
-	input 	      spi_ro_reg_ena,
-	input 	      spi_ro_pll_cp_ena,
-	input 	      spi_ro_pll_vco_ena,
-	input 	      spi_ro_pll_bias_ena,
-	input [3:0]   spi_ro_pll_trim,
-
-	input [11:0]  spi_ro_mfgr_id,
-	input [7:0]   spi_ro_prod_id,
-	input [3:0]   spi_ro_mask_rev,
-
-	output ser_tx,
-	input  ser_rx,
-
-	// IRQ
-	input  irq_pin,		// dedicated IRQ pin
-	input  irq_spi,		// IRQ from standalone SPI
-
-	// trap
-	output trap,
-
-	// Flash memory control (SPI master)
-	output flash_csb,
-	output flash_clk,
-
-	output flash_csb_oeb,
-	output flash_clk_oeb,
-
-	output flash_io0_oeb,
-	output flash_io1_oeb,
-	output flash_io2_oeb,
-	output flash_io3_oeb,
-
-	output flash_io0_do,
-	output flash_io1_do,
-	output flash_io2_do,
-	output flash_io3_do,
-
-	input  flash_io0_di,
-	input  flash_io1_di,
-	input  flash_io2_di,
-	input  flash_io3_di
-);
-	/* parameter integer MEM_WORDS = 256; */
-	/* Increase scratchpad memory to 1K words */
-	parameter integer MEM_WORDS = 256;
-	parameter [31:0] STACKADDR = (4*MEM_WORDS);       // end of memory
-	parameter [31:0] PROGADDR_RESET = 32'h 0010_0000; // 1 MB into flash
-
-	wire	      resetn;
-	wire	      clk;
-
-	wire          iomem_valid;
-	reg           iomem_ready;
-	wire   [ 3:0] iomem_wstrb;
-	wire   [31:0] iomem_addr;
-	wire   [31:0] iomem_wdata;
-	reg    [31:0] iomem_rdata;
-
-	// memory-mapped I/O control registers
-
-	reg    [15:0] gpio;		// GPIO output data
-	reg    [15:0] gpio_pu;		// GPIO pull-up enable
-	reg    [15:0] gpio_pd;		// GPIO pull-down enable
-	reg    [15:0] gpio_oeb;		// GPIO output enable (sense negative)
-	reg 	      adc0_ena;		// ADC0 enable
-	reg 	      adc0_convert;	// ADC0 convert
-	reg    [1:0]  adc0_clksrc;	// ADC0 clock source
-	reg    [1:0]  adc0_inputsrc;	// ADC0 input source
-	reg 	      adc1_ena;		// ADC1 enable
-	reg 	      adc1_convert;	// ADC1 convert
-	reg    [1:0]  adc1_clksrc;	// ADC1 clock source
-	reg    [1:0]  adc1_inputsrc;	// ADC1 input source
-	reg	      dac_ena;		// DAC enable
-	reg    [9:0]  dac_value;	// DAC output value
-	reg	      comp_ena;		// Comparator enable
-	reg    [1:0]  comp_ninputsrc;	// Comparator negative input source
-	reg    [1:0]  comp_pinputsrc;	// Comparator positive input source
-	reg	      rcosc_ena;	// RC oscillator enable
-	reg	      overtemp_ena;	// Over-temperature alarm enable
-	reg    [1:0]  comp_output_dest; // Comparator output destination
-	reg    [1:0]  rcosc_output_dest; // RC oscillator output destination
-	reg    [1:0]  overtemp_dest;	// Over-temperature alarm destination
-	reg    [1:0]  pll_output_dest;	// PLL clock output destination
-	reg    [1:0]  xtal_output_dest; // Crystal oscillator output destination
-	reg    [1:0]  trap_output_dest; // Trap signal output destination
-	reg    [1:0]  irq_7_inputsrc;	// IRQ 5 source
-	reg    [1:0]  irq_8_inputsrc;	// IRQ 6 source
-	reg	      analog_out_sel;	// Analog output select
- 	reg	      opamp_ena;	// Analog output op-amp enable
- 	reg	      opamp_bias_ena;	// Analog output op-amp bias enable
- 	reg	      bg_ena;		// Bandgap enable
-	wire	      adc0_clk;		// ADC0 clock (multiplexed)
-	wire	      adc1_clk;		// ADC1 clock (multiplexed)
-
-	wire [3:0] ram_wenb;
-	wire [9:0] ram_addr;
-	wire [31:0] ram_wdata;
-
-	// Clock assignment (to do:  make this glitch-free)
-	assign clk = (ext_clk_sel == 1'b1) ? ext_clk : pll_clk;
-
-	// Reset assignment.  "reset" comes from POR, while "ext_reset"
-	// comes from standalone SPI (and is normally zero unless
-	// activated from the SPI).
-
-	// Staged-delay reset
-	reg [2:0] reset_delay;
-
-	always @(posedge clk or posedge reset) begin
-	    if (reset == 1'b1) begin
-		reset_delay <= 3'b111;
-	    end else begin
-		reset_delay <= {1'b0, reset_delay[2:1]};
-	    end
-	end
-
-	assign resetn = ~(reset_delay[0] | ext_reset);
-
-	// ADC clock assignments
-	
-	assign adc0_clk = (adc0_clksrc == 2'b00) ? rcosc_in :
-			  (adc0_clksrc == 2'b01) ? spi_sck :
-			  (adc0_clksrc == 2'b10) ? xtal_in :
-			  ext_clk;
-
-	assign adc1_clk = (adc1_clksrc == 2'b00) ? rcosc_in :
-			  (adc1_clksrc == 2'b01) ? spi_sck :
-			  (adc1_clksrc == 2'b10) ? xtal_in :
-			  ext_clk;
-
-	// GPIO assignments
-
-	assign gpio_out[0] = (comp_output_dest == 2'b01) ? comp_in : gpio[0];
-	assign gpio_out[1] = (comp_output_dest == 2'b10) ? comp_in : gpio[1];
-	assign gpio_out[2] = (rcosc_output_dest == 2'b01) ? rcosc_in : gpio[2];
-	assign gpio_out[3] = (rcosc_output_dest == 2'b10) ? rcosc_in : gpio[3];
-	assign gpio_out[4] = (rcosc_output_dest == 2'b11) ? rcosc_in : gpio[4];
-	assign gpio_out[5] = (xtal_output_dest == 2'b01) ? xtal_in : gpio[5]; 
-	assign gpio_out[6] = (xtal_output_dest == 2'b10) ? xtal_in : gpio[6]; 
-	assign gpio_out[7] = (xtal_output_dest == 2'b11) ? xtal_in : gpio[7]; 
-	assign gpio_out[8] = (pll_output_dest == 2'b01) ? pll_clk : gpio[8];
-	assign gpio_out[9] = (pll_output_dest == 2'b10) ? pll_clk : gpio[9];
-	assign gpio_out[10] = (pll_output_dest == 2'b11) ? clk : gpio[10];
-	assign gpio_out[11] = (trap_output_dest == 2'b01) ? trap : gpio[11];
-	assign gpio_out[12] = (trap_output_dest == 2'b10) ? trap : gpio[12];
-	assign gpio_out[13] = (trap_output_dest == 2'b11) ? trap : gpio[13];
-	assign gpio_out[14] = (overtemp_dest == 2'b01) ? overtemp : gpio[14];
-	assign gpio_out[15] = (overtemp_dest == 2'b10) ? overtemp : gpio[15];
-
-	assign gpio_outenb[0] = (comp_output_dest == 2'b00)  ? gpio_oeb[0] : 1'b0;
-	assign gpio_outenb[1] = (comp_output_dest == 2'b00)  ? gpio_oeb[1] : 1'b0;
-	assign gpio_outenb[2] = (rcosc_output_dest == 2'b00) ? gpio_oeb[2] : 1'b0; 
-	assign gpio_outenb[3] = (rcosc_output_dest == 2'b00) ? gpio_oeb[3] : 1'b0;
-	assign gpio_outenb[4] = (rcosc_output_dest == 2'b00) ? gpio_oeb[4] : 1'b0;
-	assign gpio_outenb[5] = (xtal_output_dest == 2'b00)  ? gpio_oeb[5] : 1'b0;
-	assign gpio_outenb[6] = (xtal_output_dest == 2'b00)  ? gpio_oeb[6] : 1'b0;
-	assign gpio_outenb[7] = (xtal_output_dest == 2'b00)  ? gpio_oeb[7] : 1'b0;
-	assign gpio_outenb[8] = (pll_output_dest == 2'b00)   ? gpio_oeb[8] : 1'b0;
-	assign gpio_outenb[9] = (pll_output_dest == 2'b00)   ? gpio_oeb[9] : 1'b0;
-	assign gpio_outenb[10] = (pll_output_dest == 2'b00)  ? gpio_oeb[10] : 1'b0;
-	assign gpio_outenb[11] = (trap_output_dest == 2'b00) ? gpio_oeb[11] : 1'b0;
-	assign gpio_outenb[12] = (trap_output_dest == 2'b00) ? gpio_oeb[12] : 1'b0;
-	assign gpio_outenb[13] = (trap_output_dest == 2'b00) ? gpio_oeb[13] : 1'b0;
-	assign gpio_outenb[14] = (overtemp_dest == 2'b00)    ? gpio_oeb[14] : 1'b0;
-	assign gpio_outenb[15] = (overtemp_dest == 2'b00)    ? gpio_oeb[15] : 1'b0;
-
-	assign gpio_pullupb[0] = (comp_output_dest == 2'b00)  ? ~gpio_pu[0] : 1'b1;
-	assign gpio_pullupb[1] = (comp_output_dest == 2'b00)  ? ~gpio_pu[1] : 1'b1;
-	assign gpio_pullupb[2] = (rcosc_output_dest == 2'b00) ? ~gpio_pu[2] : 1'b1; 
-	assign gpio_pullupb[3] = (rcosc_output_dest == 2'b00) ? ~gpio_pu[3] : 1'b1;
-	assign gpio_pullupb[4] = (rcosc_output_dest == 2'b00) ? ~gpio_pu[4] : 1'b1;
-	assign gpio_pullupb[5] = (xtal_output_dest == 2'b00)  ? ~gpio_pu[5] : 1'b1;
-	assign gpio_pullupb[6] = (xtal_output_dest == 2'b00)  ? ~gpio_pu[6] : 1'b1;
-	assign gpio_pullupb[7] = (xtal_output_dest == 2'b00)  ? ~gpio_pu[7] : 1'b1;
-	assign gpio_pullupb[8] = (pll_output_dest == 2'b00)   ? ~gpio_pu[8] : 1'b1;
-	assign gpio_pullupb[9] = (pll_output_dest == 2'b00)   ? ~gpio_pu[9] : 1'b1;
-	assign gpio_pullupb[10] = (pll_output_dest == 2'b00)  ? ~gpio_pu[10] : 1'b1;
-	assign gpio_pullupb[11] = (trap_output_dest == 2'b00) ? ~gpio_pu[11] : 1'b1;
-	assign gpio_pullupb[12] = (trap_output_dest == 2'b00) ? ~gpio_pu[12] : 1'b1;
-	assign gpio_pullupb[13] = (trap_output_dest == 2'b00) ? ~gpio_pu[13] : 1'b1;
-	assign gpio_pullupb[14] = (overtemp_dest == 2'b00)    ? ~gpio_pu[14] : 1'b1;
-	assign gpio_pullupb[15] = (overtemp_dest == 2'b00)    ? ~gpio_pu[15] : 1'b1;
-
-	assign gpio_pulldownb[0] = (comp_output_dest == 2'b00)  ? ~gpio_pd[0] : 1'b1;
-	assign gpio_pulldownb[1] = (comp_output_dest == 2'b00)  ? ~gpio_pd[1] : 1'b1;
-	assign gpio_pulldownb[2] = (rcosc_output_dest == 2'b00) ? ~gpio_pd[2] : 1'b1; 
-	assign gpio_pulldownb[3] = (rcosc_output_dest == 2'b00) ? ~gpio_pd[3] : 1'b1;
-	assign gpio_pulldownb[4] = (rcosc_output_dest == 2'b00) ? ~gpio_pd[4] : 1'b1;
-	assign gpio_pulldownb[5] = (xtal_output_dest == 2'b00)  ? ~gpio_pd[5] : 1'b1;
-	assign gpio_pulldownb[6] = (xtal_output_dest == 2'b00)  ? ~gpio_pd[6] : 1'b1;
-	assign gpio_pulldownb[7] = (xtal_output_dest == 2'b00)  ? ~gpio_pd[7] : 1'b1;
-	assign gpio_pulldownb[8] = (pll_output_dest == 2'b00)   ? ~gpio_pd[8] : 1'b1;
-	assign gpio_pulldownb[9] = (pll_output_dest == 2'b00)   ? ~gpio_pd[9] : 1'b1;
-	assign gpio_pulldownb[10] = (pll_output_dest == 2'b00)  ? ~gpio_pd[10] : 1'b1;
-	assign gpio_pulldownb[11] = (trap_output_dest == 2'b00) ? ~gpio_pd[11] : 1'b1;
-	assign gpio_pulldownb[12] = (trap_output_dest == 2'b00) ? ~gpio_pd[12] : 1'b1;
-	assign gpio_pulldownb[13] = (trap_output_dest == 2'b00) ? ~gpio_pd[13] : 1'b1;
-	assign gpio_pulldownb[14] = (overtemp_dest == 2'b00)    ? ~gpio_pd[14] : 1'b1;
-	assign gpio_pulldownb[15] = (overtemp_dest == 2'b00)    ? ~gpio_pd[15] : 1'b1;
-
-	wire irq_7, irq_8;
-
-	assign irq_7 = (irq_7_inputsrc == 2'b01) ? gpio_in[0] :
-		       (irq_7_inputsrc == 2'b10) ? gpio_in[1] :
-		       (irq_7_inputsrc == 2'b11) ? gpio_in[2] : 1'b0;
-	assign irq_8 = (irq_8_inputsrc == 2'b01) ? gpio_in[3] :
-		       (irq_8_inputsrc == 2'b10) ? gpio_in[4] :
-		       (irq_8_inputsrc == 2'b11) ? gpio_in[5] : 1'b0;
-
-	assign ram_wenb = (mem_valid && !mem_ready && mem_addr < 4*MEM_WORDS) ?
-		{~mem_wstrb[3], ~mem_wstrb[2], ~mem_wstrb[1], ~mem_wstrb[0]} : 4'b1111;
-        assign ram_addr = mem_addr[11:2];
-	assign ram_wdata = mem_wdata;		// Just for naming conventions.
-
-	reg [31:0] irq;
-	wire irq_stall = 0;
-	wire irq_uart = 0;
-
-	always @* begin
-		irq = 0;
-		irq[3] = irq_stall;
-		irq[4] = irq_uart;
-		irq[5] = irq_pin;
-		irq[6] = irq_spi;
-		irq[7] = irq_7;
-		irq[8] = irq_8;
-		irq[9] = comp_output_dest[0] & comp_output_dest[1] & comp_in;
-		irq[10] = overtemp_dest[0] & overtemp_dest[1] & overtemp;
-	end
-
-	wire mem_valid;
-	wire mem_instr;
-	wire mem_ready;
-	wire [31:0] mem_addr;
-	wire [31:0] mem_wdata;
-	wire [3:0] mem_wstrb;
-	wire [31:0] mem_rdata;
-
-	wire spimem_ready;
-	wire [31:0] spimem_rdata;
-
-	reg ram_ready;
-	wire [31:0] ram_rdata;
-
-	assign iomem_valid = mem_valid && (mem_addr[31:24] > 8'h 01);
-	assign iomem_wstrb = mem_wstrb;
-	assign iomem_addr = mem_addr;
-	assign iomem_wdata = mem_wdata;
-
-	wire spimemio_cfgreg_sel = mem_valid && (mem_addr == 32'h 0200_0000);
-	wire [31:0] spimemio_cfgreg_do;
-
-	wire        simpleuart_reg_div_sel = mem_valid && (mem_addr == 32'h 0200_0004);
-	wire [31:0] simpleuart_reg_div_do;
-
-	wire        simpleuart_reg_dat_sel = mem_valid && (mem_addr == 32'h 0200_0008);
-	wire [31:0] simpleuart_reg_dat_do;
-	wire        simpleuart_reg_dat_wait;
-
-	assign mem_ready = (iomem_valid && iomem_ready) || spimem_ready || ram_ready || spimemio_cfgreg_sel ||
-			simpleuart_reg_div_sel || (simpleuart_reg_dat_sel && !simpleuart_reg_dat_wait);
-
-	assign mem_rdata = (iomem_valid && iomem_ready) ? iomem_rdata : spimem_ready ? spimem_rdata : ram_ready ? ram_rdata :
-			spimemio_cfgreg_sel ? spimemio_cfgreg_do : simpleuart_reg_div_sel ? simpleuart_reg_div_do :
-			simpleuart_reg_dat_sel ? simpleuart_reg_dat_do : 32'h 0000_0000;
-
-	picorv32 #(
-		.STACKADDR(STACKADDR),
-		.PROGADDR_RESET(PROGADDR_RESET),
-		.PROGADDR_IRQ(32'h 0000_0000),
-		.BARREL_SHIFTER(1),
-		.COMPRESSED_ISA(1),
-		.ENABLE_MUL(1),
-		.ENABLE_DIV(1),
-		.ENABLE_IRQ(1),
-		.ENABLE_IRQ_QREGS(0)
-	) cpu (
-		.clk         (clk        ),
-		.resetn      (resetn     ),
-		.mem_valid   (mem_valid  ),
-		.mem_instr   (mem_instr  ),
-		.mem_ready   (mem_ready  ),
-		.mem_addr    (mem_addr   ),
-		.mem_wdata   (mem_wdata  ),
-		.mem_wstrb   (mem_wstrb  ),
-		.mem_rdata   (mem_rdata  ),
-		.irq         (irq        ),
-		.trap        (trap       )
-	);
-
-	spimemio spimemio (
-		.clk    (clk),
-		.resetn (resetn),
-		.valid  (mem_valid && mem_addr >= 4*MEM_WORDS && mem_addr < 32'h 0200_0000),
-		.ready  (spimem_ready),
-		.addr   (mem_addr[23:0]),
-		.rdata  (spimem_rdata),
-
-		.flash_csb    (flash_csb   ),
-		.flash_clk    (flash_clk   ),
-
-		.flash_csb_oeb (flash_csb_oeb),
-		.flash_clk_oeb (flash_clk_oeb),
-
-		.flash_io0_oeb (flash_io0_oeb),
-		.flash_io1_oeb (flash_io1_oeb),
-		.flash_io2_oeb (flash_io2_oeb),
-		.flash_io3_oeb (flash_io3_oeb),
-
-		.flash_io0_do (flash_io0_do),
-		.flash_io1_do (flash_io1_do),
-		.flash_io2_do (flash_io2_do),
-		.flash_io3_do (flash_io3_do),
-
-		.flash_io0_di (flash_io0_di),
-		.flash_io1_di (flash_io1_di),
-		.flash_io2_di (flash_io2_di),
-		.flash_io3_di (flash_io3_di),
-
-		.cfgreg_we(spimemio_cfgreg_sel ? mem_wstrb : 4'b 0000),
-		.cfgreg_di(mem_wdata),
-		.cfgreg_do(spimemio_cfgreg_do)
-	);
-
-	simpleuart simpleuart (
-		.clk         (clk         ),
-		.resetn      (resetn      ),
-
-		.ser_tx      (ser_tx      ),
-		.ser_rx      (ser_rx      ),
-
-		.reg_div_we  (simpleuart_reg_div_sel ? mem_wstrb : 4'b 0000),
-		.reg_div_di  (mem_wdata),
-		.reg_div_do  (simpleuart_reg_div_do),
-
-		.reg_dat_we  (simpleuart_reg_dat_sel ? mem_wstrb[0] : 1'b 0),
-		.reg_dat_re  (simpleuart_reg_dat_sel && !mem_wstrb),
-		.reg_dat_di  (mem_wdata),
-		.reg_dat_do  (simpleuart_reg_dat_do),
-		.reg_dat_wait(simpleuart_reg_dat_wait)
-	);
-
-	always @(posedge clk)
-		ram_ready <= mem_valid && !mem_ready && mem_addr < 4*MEM_WORDS;
-
-	// PicoSoC memory mapped IP
-	// 2 ADCs (1 multiplexed from internal signals, including core 1.8V VDD,
-	//	DAC output, comparator input, external input)
-	// 1 DAC
-	// 1 comparator (1 end tied to DAC, other could be shared w/ADC input)
-	// 1 RC oscillator (output can be tied to one or both ADC clocks)
-	// 1 crystal oscillator (output to level-shift-down = 3V buffer powered at 1.8V)
-	// 1 1.8V regulator (sets VDD on padframe)
-	// 1 bandgap
-	// 1 power-on-reset (POR)
-	// 1 temperature alarm
-	
-	// NOTE: Signals affecting critical core functions are controlled through
-	// an independent SPI having read-only access through the picorv32 core.
-	// SPI pins are independent of picorv32 SPI master.  Signals controlled by
-	// the SPI are:
-	// 1) crystal oscillator enable (default on)
-	// 2) 1.8V regulator enable (default on)
-	// 3) bandgap enable (default on)
-	// 4) picorv32 internal debug signals (TBD)
-	// 5) additional picorv32 IRQ (TBD)
-	// 6) PLL enables (default on)
-	// 7) PLL trim (default TBD)
-	// NOTE:  SPI should have a pass-through mode that configures SDO as a
-	// copy of a chosen signal for as long as CSB is held low.  This can be
-	// an SPI command, allows other internal signals to be passed to the
-	// output and viewed, including the RC oscillator output, comparator output,
-	// and other edge-based signals.
-
-	// Memory map:
-	// NOTE:
-
-	// SPI master:	0x02000000	(control)
-	// UART:	0x02000004-8	(clock, data)
-	// GPIO:	0x03000000	(in/out, pu/pd, data)
-	// ADC0:	0x03000020
-	// ADC1:	0x03000040
-	// DAC:		0x03000060
-	// comparator:	0x03000080
-	// RC osc:	0x030000a0
-	// SPI slave:	0x030000c0	(read-only)
-
-	// Memory map details:
-	// GPIO:	32 channels total.  
-	//		addr 0x03000000		data (16 bits)
-	//		addr 0x03000001		out (=1) or in (=0) (default 0)
-	//		addr 0x03000002		pu (=1) or none (=0) (default 0)
-	//		addr 0x03000003		pd (=1) or none (=0) (default 0)
-	//		addr 0x03000004-f 	reserved (may be used for other pad I/O)
-	//
-	// ADC0:	addr 0x03000020		enable
-	// 		addr 0x03000021		data (read-only)
-	//      	addr 0x03000022		done (read-only)
-	//		addr 0x03000023		start conversion
-	//		addr 0x03000024		clock source (RC osc, SPI clk, xtal, core)
-	//		addr 0x03000025		input source (core VDD, ext, DAC, comp in)
-	//
-	// ADC1:	addr 0x03000040		enable
-	// 		addr 0x03000041		data (read-only)
-	//      	addr 0x03000042		done (read-only)
-	//		addr 0x03000043		start conversion
-	//		addr 0x03000044		clock source (RC osc, SPI clk, xtal, core)
-	//		addr 0x03000045		input source (bg, ext, I/O vdd, gnd)
-	//
-	// DAC:		addr 0x03000060		enable
-	//     		addr 0x03000061		value
-	//
-	// comparator:  addr 0x03000080		enable
-	//		addr 0x03000081		value
-	//		addr 0x03000082		input source (DAC, bg, core VDD, ext)
-	//		addr 0x03000083		output dest (ext gpio pin 0-1, IRQ, none)
-	//
-	// bandgap:	addr 0x03000090		enable
-	//
-	// RC osc:	addr 0x030000a0		enable
-	//		addr 0x030000a1		output dest (ext gpio pin 2-4)
-	//
-	// SPI slave:	addr 0x030000c0		SPI configuration
-	//		addr 0x030000c1		xtal osc, reg, bg enables
-	// 		addr 0x030000c2		PLL enables, trim
-	// 		addr 0x030000c3		manufacturer ID
-	// 		addr 0x030000c4		product ID
-	// 		addr 0x030000c5		product mask revision
-	// Xtal mon:	addr 0x030000c6		xtal osc output dest (ext gpio pin 5-7)
-	// PLL mon:	addr 0x030000c7		PLL output dest (ext gpio pin 8-10)
-	// trap mon:	addr 0x030000c8		trap output dest (ext gpio pin 11-13)
-	// IRQ7 src:	addr 0x030000c9		IRQ 7 source (ext gpio pin 0-3)
-	// IRQ8 src:	addr 0x030000ca		IRQ 8 source (ext gpio pin 4-7)
-	// Analog:	addr 0x030000cb		analog output select (DAC, bg)
-	//
-	// Overtemp:	addr 0x030000e0		over-temperature alarm enable
-	//		addr 0x030000e1		over-temperature alarm data
-	//		addr 0x030000e2		output dest (ext gpio pin 14-15, IRQ)
-
-	always @(posedge clk) begin
-		if (!resetn) begin
-			gpio <= 0;
-			gpio_oeb <= 16'hffff;
-			gpio_pu <= 0;
-			gpio_pd <= 0;
-			adc0_ena <= 0;
-			adc0_convert <= 0;
-			adc0_clksrc <= 0;
-			adc0_inputsrc <= 0;
-			adc1_ena <= 0;
-			adc1_convert <= 0;
-			adc1_clksrc <= 0;
-			adc1_inputsrc <= 0;
-			dac_ena <= 0;
-			dac_value <= 0;
-			comp_ena <= 0;
-			comp_ninputsrc <= 0;
-			comp_pinputsrc <= 0;
-			rcosc_ena <= 0;
-			comp_output_dest <= 0;
-			rcosc_output_dest <= 0;
-			overtemp_dest <= 0;
-			overtemp_ena <= 0;
-			pll_output_dest <= 0;
-			xtal_output_dest <= 0;
-			trap_output_dest <= 0;
-			irq_7_inputsrc <= 0;
-			irq_8_inputsrc <= 0;
-			analog_out_sel <= 0;
-			opamp_ena <= 0;
-			opamp_bias_ena <= 0;
-			bg_ena <= 0;
-
-		end else begin
-			iomem_ready <= 0;
-			if (iomem_valid && !iomem_ready && iomem_addr[31:8] == 24'h030000) begin
-				iomem_ready <= 1;
-				if (iomem_addr[7:0] == 8'h00) begin
-					iomem_rdata <= {gpio_out, gpio_in};
-					if (iomem_wstrb[0]) gpio[ 7: 0] <= iomem_wdata[ 7: 0];
-					if (iomem_wstrb[1]) gpio[15: 8] <= iomem_wdata[15: 8];
-				end else if (iomem_addr[7:0] == 8'h04) begin
-					iomem_rdata <= {16'd0, gpio_oeb};
-					if (iomem_wstrb[0]) gpio_oeb[ 7: 0] <= iomem_wdata[ 7: 0];
-					if (iomem_wstrb[1]) gpio_oeb[15: 8] <= iomem_wdata[15: 8];
-				end else if (iomem_addr[7:0] == 8'h08) begin
-					iomem_rdata <= {16'd0, gpio_pu};
-					if (iomem_wstrb[0]) gpio_pu[ 7: 0] <= iomem_wdata[ 7: 0];
-					if (iomem_wstrb[1]) gpio_pu[15: 8] <= iomem_wdata[15: 8];
-				end else if (iomem_addr[7:0] == 8'h0c) begin
-					iomem_rdata <= {16'd0, gpio_pu};
-					if (iomem_wstrb[0]) gpio_pd[ 7: 0] <= iomem_wdata[ 7: 0];
-					if (iomem_wstrb[1]) gpio_pd[15: 8] <= iomem_wdata[15: 8];
-				end else if (iomem_addr[7:0] == 8'h10) begin
-					iomem_rdata <= {31'd0, adc0_ena};
-					if (iomem_wstrb[0]) adc0_ena <= iomem_wdata[0];
-				end else if (iomem_addr[7:0] == 8'h14) begin
-					iomem_rdata <= {22'd0, adc0_data};
-				end else if (iomem_addr[7:0] == 8'h18) begin
-					iomem_rdata <= {31'd0, adc0_done};
-				end else if (iomem_addr[7:0] == 8'h1c) begin
-					iomem_rdata <= {31'd0, adc0_convert};
-					if (iomem_wstrb[0]) adc0_convert <= iomem_wdata[0];
-				end else if (iomem_addr[7:0] == 8'h20) begin
-					iomem_rdata <= {30'd0, adc0_clksrc};
-					if (iomem_wstrb[0]) adc0_clksrc <= iomem_wdata[1:0];
-				end else if (iomem_addr[7:0] == 8'h24) begin
-					iomem_rdata <= {30'd0, adc0_inputsrc};
-					if (iomem_wstrb[0]) adc0_inputsrc <= iomem_wdata[1:0];
-				end else if (iomem_addr[7:0] == 8'h30) begin
-					iomem_rdata <= {31'd0, adc1_ena};
-					if (iomem_wstrb[0]) adc1_ena <= iomem_wdata[0];
-				end else if (iomem_addr[7:0] == 8'h34) begin
-					iomem_rdata <= {22'd0, adc1_data};
-				end else if (iomem_addr[7:0] == 8'h38) begin
-					iomem_rdata <= {31'd0, adc1_done};
-				end else if (iomem_addr[7:0] == 8'h3c) begin
-					iomem_rdata <= {31'd0, adc1_convert};
-					if (iomem_wstrb[0]) adc1_convert <= iomem_wdata[0];
-				end else if (iomem_addr[7:0] == 8'h40) begin
-					iomem_rdata <= {30'd0, adc1_clksrc};
-					if (iomem_wstrb[0]) adc1_clksrc <= iomem_wdata[1:0];
-				end else if (iomem_addr[7:0] == 8'h44) begin
-					iomem_rdata <= {30'd0, adc1_inputsrc};
-					if (iomem_wstrb[0]) adc1_inputsrc <= iomem_wdata[1:0];
-				end else if (iomem_addr[7:0] == 8'h50) begin
-					iomem_rdata <= {31'd0, dac_ena};
-					if (iomem_wstrb[0]) dac_ena <= iomem_wdata[0];
-				end else if (iomem_addr[7:0] == 8'h54) begin
-					iomem_rdata <= {22'd0, dac_value};
-					if (iomem_wstrb[0]) dac_value[7:0] <= iomem_wdata[7:0];
-					if (iomem_wstrb[1]) dac_value[9:8] <= iomem_wdata[9:8];
-				end else if (iomem_addr[7:0] == 8'h60) begin
-					iomem_rdata <= {31'd0, comp_ena};
-					if (iomem_wstrb[0]) comp_ena <= iomem_wdata[0];
-				end else if (iomem_addr[7:0] == 8'h64) begin
-					iomem_rdata <= {30'd0, comp_ninputsrc};
-					if (iomem_wstrb[0]) comp_ninputsrc <= iomem_wdata[1:0];
-				end else if (iomem_addr[7:0] == 8'h68) begin
-					iomem_rdata <= {30'd0, comp_pinputsrc};
-					if (iomem_wstrb[0]) comp_pinputsrc <= iomem_wdata[1:0];
-				end else if (iomem_addr[7:0] == 8'h6c) begin
-					iomem_rdata <= {30'd0, comp_output_dest};
-					if (iomem_wstrb[0]) comp_output_dest <= iomem_wdata[1:0];
-				end else if (iomem_addr[7:0] == 8'h70) begin
-					iomem_rdata <= {31'd0, rcosc_ena};
-					if (iomem_wstrb[0]) rcosc_ena <= iomem_wdata[0];
-				end else if (iomem_addr[7:0] == 8'h74) begin
-					iomem_rdata <= {30'd0, rcosc_output_dest};
-					if (iomem_wstrb[0]) rcosc_output_dest <= iomem_wdata[1:0];
-				end else if (iomem_addr[7:0] == 8'h80) begin
-					iomem_rdata <= {24'd0, spi_ro_config};
-				end else if (iomem_addr[7:0] == 8'h84) begin
-					iomem_rdata <= {30'd0, spi_ro_xtal_ena, spi_ro_reg_ena};
-				end else if (iomem_addr[7:0] == 8'h88) begin
-					iomem_rdata <= {25'd0, spi_ro_pll_trim, spi_ro_pll_cp_ena, spi_ro_pll_vco_ena, spi_ro_pll_bias_ena};
-				end else if (iomem_addr[7:0] == 8'h8c) begin
-					iomem_rdata <= {20'd0, spi_ro_mfgr_id};
-				end else if (iomem_addr[7:0] == 8'h90) begin
-					iomem_rdata <= {24'd0, spi_ro_prod_id};
-				end else if (iomem_addr[7:0] == 8'h94) begin
-					iomem_rdata <= {28'd0, spi_ro_mask_rev};
-				end else if (iomem_addr[7:0] == 8'h98) begin
-					iomem_rdata <= {31'd0, ext_clk_sel};
-				end else if (iomem_addr[7:0] == 8'ha0) begin
-					iomem_rdata <= {30'd0, xtal_output_dest};
-					if (iomem_wstrb[0]) xtal_output_dest <= iomem_wdata[1:0];
-				end else if (iomem_addr[7:0] == 8'ha4) begin
-					iomem_rdata <= {30'd0, pll_output_dest};
-					if (iomem_wstrb[0]) pll_output_dest <= iomem_wdata[1:0];
-				end else if (iomem_addr[7:0] == 8'ha8) begin
-					iomem_rdata <= {30'd0, trap_output_dest};
-					if (iomem_wstrb[0]) trap_output_dest <= iomem_wdata[1:0];
-				end else if (iomem_addr[7:0] == 8'hb0) begin
-					iomem_rdata <= {30'd0, irq_7_inputsrc};
-					if (iomem_wstrb[0]) irq_7_inputsrc <= iomem_wdata[1:0];
-				end else if (iomem_addr[7:0] == 8'hb4) begin
-					iomem_rdata <= {30'd0, irq_8_inputsrc};
-					if (iomem_wstrb[0]) irq_8_inputsrc <= iomem_wdata[1:0];
-				end else if (iomem_addr[7:0] == 8'hc0) begin
-					iomem_rdata <= {31'd0, analog_out_sel};
-					if (iomem_wstrb[0]) analog_out_sel <= iomem_wdata[0];
-				end else if (iomem_addr[7:0] == 8'hc4) begin
-					iomem_rdata <= {31'd0, opamp_bias_ena};
-					if (iomem_wstrb[0]) opamp_bias_ena <= iomem_wdata[0];
-				end else if (iomem_addr[7:0] == 8'hc8) begin
-					iomem_rdata <= {31'd0, opamp_ena};
-					if (iomem_wstrb[0]) opamp_ena <= iomem_wdata[0];
-				end else if (iomem_addr[7:0] == 8'hd0) begin
-					iomem_rdata <= {31'd0, bg_ena};
-					if (iomem_wstrb[0]) bg_ena <= iomem_wdata[0];
-				end else if (iomem_addr[7:0] == 8'he0) begin
-					iomem_rdata <= {31'd0, overtemp_ena};
-					if (iomem_wstrb[0]) overtemp_ena <= iomem_wdata[0];
-				end else if (iomem_addr[7:0] == 8'he4) begin
-					iomem_rdata <= {31'd0, overtemp};
-				end else if (iomem_addr[7:0] == 8'he8) begin
-					iomem_rdata <= {30'd0, overtemp_dest};
-					if (iomem_wstrb[0]) overtemp_dest <= iomem_wdata[1:0];
-				end
-			end
-		end
-	end
-
-	openstriVe_soc_mem #(.WORDS(MEM_WORDS)) picomem (
-		.clk(clk),
-		.ena(resetn),
-		.wen((mem_valid && !mem_ready && mem_addr < 4*MEM_WORDS) ? mem_wstrb : 4'b0),
-		.addr(mem_addr[23:2]),
-		.wdata(mem_wdata),
-		.rdata(ram_rdata)
-	);
-endmodule
-
-`include "picorv32.v"
-`include "spimemio.v"
-`include "simpleuart.v"
-
-// Implementation note:
-// Replace the following two modules with wrappers for your SRAM cells.
-
-module openstriVe_soc_regs (
-	input clk, wen,
-	input [5:0] waddr,
-	input [5:0] raddr1,
-	input [5:0] raddr2,
-	input [31:0] wdata,
-	output [31:0] rdata1,
-	output [31:0] rdata2
-);
-	reg [31:0] regs [0:31];
-
-	always @(posedge clk)
-		if (wen) regs[waddr[4:0]] <= wdata;
-
-	assign rdata1 = regs[raddr1[4:0]];
-	assign rdata2 = regs[raddr2[4:0]];
-endmodule
-
-module openstriVe_soc_mem #(
-	parameter integer WORDS = 256
-) (
-	input clk,
-	input ena,
-	input [3:0] wen,
-	input [21:0] addr,
-	input [31:0] wdata,
-	output reg [31:0] rdata
-);
-	reg [31:0] mem [0:WORDS-1];
-
-	always @(posedge clk) begin
-		if (ena == 1'b1) begin
-			rdata <= mem[addr];
-			if (wen[0]) mem[addr][ 7: 0] <= wdata[ 7: 0];
-			if (wen[1]) mem[addr][15: 8] <= wdata[15: 8];
-			if (wen[2]) mem[addr][23:16] <= wdata[23:16];
-			if (wen[3]) mem[addr][31:24] <= wdata[31:24];
-		end
-	end
-endmodule
-
diff --git a/designs/striVe_flat/src/digital_pll/cells.v b/designs/striVe_flat/src/digital_pll/cells.v
deleted file mode 100644
index b84aa50..0000000
--- a/designs/striVe_flat/src/digital_pll/cells.v
+++ /dev/null
@@ -1,32 +0,0 @@
-(* blackbox *)
-module efs8hd_dfrbp_2  (output QN, input D, input CLK, output Q, input RESETB); endmodule   
-(* blackbox *)
-module efs8hd_inv_4 (input A, output Y); endmodule   
-(* blackbox *)
-module efs8hd_buf_1(input A, output X); endmodule   
-(* blackbox *)
-module efs8hd_clkbuf_1(input A, output X); endmodule
-(* blackbox *)
-module efs8hd_clkbuf_2(input A, output X); endmodule
-(* blackbox *)
-module efs8hd_clkinv_1(input A, output Y); endmodule
-(* blackbox *)
-module efs8hd_clkinv_2(input A, output Y); endmodule
-(* blackbox *)
-module efs8hd_clkinv_4(input A, output Y); endmodule
-(* blackbox *)
-module efs8hd_clkinv_8(input A, output Y); endmodule
-(* blackbox *)
-module efs8hd_conb_1(output HI, output LO); endmodule
-(* blackbox *)
-module efs8hd_dfbbp_1(input CLK, input D, output Q, output QN, input RESETB, input SETB); endmodule
-(* blackbox *)
-module efs8hd_einvn_4(input A, input TEB, output Z); endmodule
-(* blackbox *)
-module efs8hd_einvn_8(input A, input TEB, output Z); endmodule
-(* blackbox *)
-module efs8hd_einvp_1(input A, input TE, output Z); endmodule
-(* blackbox *)
-module efs8hd_einvp_2(input A, input TE, output Z); endmodule
-(* blackbox *)
-module efs8hd_or2_2(input A, B, output X); endmodule
diff --git a/designs/striVe_flat/src/digital_pll/digital_pll_controller.v b/designs/striVe_flat/src/digital_pll/digital_pll_controller.v
deleted file mode 100755
index b88cc33..0000000
--- a/designs/striVe_flat/src/digital_pll/digital_pll_controller.v
+++ /dev/null
@@ -1,115 +0,0 @@
-// (True) digital PLL
-//
-// Output goes to a trimmable ring oscillator (see documentation).
-// Ring oscillator should be trimmable to above and below maximum
-// ranges of the input.
-//
-// Input "osc" comes from a fixed clock source (e.g., crystal oscillator
-// output).
-//
-// Input "div" is the target number of clock cycles per oscillator cycle.
-// e.g., if div == 8 then this is an 8X PLL.
-//
-// Clock "clock" is the PLL output being trimmed.
-// (NOTE:  To be done:  Pass-through enable)
-//
-// Algorithm:
-//
-// 1) Trim is done by thermometer code.  Reset to the highest value
-//    in case the fastest rate clock is too fast for the logic.
-//
-// 2) Count the number of contiguous 1s and 0s in "osc"
-//    periods of the master clock.  If the count maxes out, it does
-//    not roll over.
-//
-// 3) Add the two counts together.
-//
-// 4) If the sum is less than div, then the clock is too slow, so
-//    decrease the trim code.  If the sum is greater than div, the
-//    clock is too fast, so increase the trim code.  If the sum
-//    is equal to div, the the trim code does not change.
-//
-
-module digital_pll_controller(reset, clock, osc, div, trim);
-    input reset;
-    input clock;
-    input osc;
-    input [4:0] div;
-    output [25:0] trim;		// Use ring_osc2x13, with 26 trim bits
-
-    wire [25:0] trim;
-    reg [2:0] oscbuf;
-    reg [2:0] prep;
-
-    reg [4:0] count0;
-    reg [4:0] count1;
-    reg [6:0] tval;	// Includes 2 bits fractional
-    wire [4:0] tint;	// Integer part of the above
-
-    wire [5:0] sum;
-
-    assign sum = count0 + count1;
- 
-    // Integer to thermometer code (maybe there's an algorithmic way?)
-    assign tint = tval[6:2];
-                                     // |<--second-->|<-- first-->|
-    assign trim = (tint == 5'd0)  ? 26'b0000000000000_0000000000000 :
-		  (tint == 5'd1)  ? 26'b0000000000000_0000000000001 :
-		  (tint == 5'd2)  ? 26'b0000000000000_0000001000001 :
-		  (tint == 5'd3)  ? 26'b0000000000000_0010001000001 :
-		  (tint == 5'd4)  ? 26'b0000000000000_0010001001001 :
-		  (tint == 5'd5)  ? 26'b0000000000000_0010101001001 :
-		  (tint == 5'd6)  ? 26'b0000000000000_1010101001001 :
-		  (tint == 5'd7)  ? 26'b0000000000000_1010101101001 :
-		  (tint == 5'd8)  ? 26'b0000000000000_1010101101101 :
-		  (tint == 5'd9)  ? 26'b0000000000000_1011101101101 :
-		  (tint == 5'd10) ? 26'b0000000000000_1011101111101 :
-		  (tint == 5'd11) ? 26'b0000000000000_1111101111101 :
-		  (tint == 5'd12) ? 26'b0000000000000_1111101111111 :
-		  (tint == 5'd13) ? 26'b0000000000000_1111111111111 :
-		  (tint == 5'd14) ? 26'b0000000000001_1111111111111 :
-		  (tint == 5'd15) ? 26'b0000001000001_1111111111111 :
-		  (tint == 5'd16) ? 26'b0010001000001_1111111111111 :
-		  (tint == 5'd17) ? 26'b0010001001001_1111111111111 :
-		  (tint == 5'd18) ? 26'b0010101001001_1111111111111 :
-		  (tint == 5'd19) ? 26'b1010101001001_1111111111111 :
-		  (tint == 5'd20) ? 26'b1010101101001_1111111111111 :
-		  (tint == 5'd21) ? 26'b1010101101101_1111111111111 :
-		  (tint == 5'd22) ? 26'b1011101101101_1111111111111 :
-		  (tint == 5'd23) ? 26'b1011101111101_1111111111111 :
-		  (tint == 5'd24) ? 26'b1111101111101_1111111111111 :
-		  (tint == 5'd25) ? 26'b1111101111111_1111111111111 :
-				    26'b1111111111111_1111111111111;
-   
-    always @(posedge clock or posedge reset) begin
-	if (reset == 1'b1) begin
-	    tval <= 7'd0;	// Note:  trim[0] must be zero for startup to work.
-	    oscbuf <= 3'd0;
-	    prep <= 3'd0;
-	    count0 <= 5'd0;
-	    count1 <= 5'd0;
-
-	end else begin
-	    oscbuf <= {oscbuf[1:0], osc};
-
-	    if (oscbuf[2] != oscbuf[1]) begin
-		count1 <= count0;
-		count0 <= 5'b00001;
-		prep <= {prep[1:0], 1'b1};
-
-		if (prep == 3'b111) begin
-		    if (sum > div) begin
-			tval <= tval + 1;
-		    end else if (sum < div) begin
-			tval <= tval - 1;
-		    end
-		end
-	    end else begin
-		if (count0 != 5'b11111) begin
-	            count0 <= count0 + 1;
-		end
-	    end
-	end
-    end
-
-endmodule	// digital_pll_controller
diff --git a/designs/striVe_flat/src/digital_pll/ring_osc2x13.v b/designs/striVe_flat/src/digital_pll/ring_osc2x13.v
deleted file mode 100755
index eca5acf..0000000
--- a/designs/striVe_flat/src/digital_pll/ring_osc2x13.v
+++ /dev/null
@@ -1,179 +0,0 @@
-// Tunable ring oscillator---synthesizable (physical) version.
-//
-// NOTE:  This netlist cannot be simulated correctly due to lack
-// of accurate timing in the digital cell verilog models.
-
-module delay_stage(in, trim, out);
-    input in;
-    input [1:0] trim;
-    output out;
-
-    wire d0, d1, d2;
-
-    efs8hd_clkbuf_2 delaybuf0 (
-	.A(in),
-	.X(ts)
-    );
-
-    efs8hd_clkbuf_1 delaybuf1 (
-	.A(ts),
-	.X(d0)
-    );
-
-    efs8hd_einvp_2 delayen1 (
-	.A(d0),
-	.TE(trim[1]),
-	.Z(d1)
-    );
-
-    efs8hd_einvn_4 delayenb1 (
-	.A(ts),
-	.TEB(trim[1]),
-	.Z(d1)
-    );
-
-    efs8hd_clkinv_1 delayint0 (
-	.A(d1),
-	.Y(d2)
-    );
-
-    efs8hd_einvp_2 delayen0 (
-	.A(d2),
-	.TE(trim[0]),
-	.Z(out)
-    );
-
-    efs8hd_einvn_8 delayenb0 (
-	.A(ts),
-	.TEB(trim[0]),
-	.Z(out)
-    );
-
-endmodule
-
-module start_stage(in, trim, reset, out);
-    input in;
-    input [1:0] trim;
-    input reset;
-    output out;
-
-    wire d0, d1, d2, ctrl0, one;
-
-    efs8hd_clkbuf_1 delaybuf0 (
-	.A(in),
-	.X(d0)
-    );
-
-    efs8hd_einvp_2 delayen1 (
-	.A(d0),
-	.TE(trim[1]),
-	.Z(d1)
-    );
-
-    efs8hd_einvn_4 delayenb1 (
-	.A(in),
-	.TEB(trim[1]),
-	.Z(d1)
-    );
-
-    efs8hd_clkinv_1 delayint0 (
-	.A(d1),
-	.Y(d2)
-    );
-
-    efs8hd_einvp_2 delayen0 (
-	.A(d2),
-	.TE(trim[0]),
-	.Z(out)
-    );
-
-    efs8hd_einvn_8 delayenb0 (
-	.A(in),
-	.TEB(ctrl0),
-	.Z(out)
-    );
-
-    efs8hd_einvp_1 reseten0 (
-	.A(one),
-	.TE(reset),
-	.Z(out)
-    );
-
-    efs8hd_or2_2 ctrlen0 (
-	.A(reset),
-	.B(trim[0]),
-	.X(ctrl0)
-    );
-
-    efs8hd_conb_1 const1 (
-	.HI(one),
-	.LO()
-    );
-
-endmodule
-
-// Ring oscillator with 13 stages, each with two trim bits delay
-// (see above).  Trim is not binary:  For trim[1:0], lower bit
-// trim[0] is primary trim and must be applied first;  upper
-// bit trim[1] is secondary trim and should only be applied
-// after the primary trim is applied, or it has no effect.
-//
-// Total effective number of inverter stages in this oscillator
-// ranges from 13 at trim 0 to 65 at trim 24.  The intention is
-// to cover a range greater than 2x so that the midrange can be
-// reached over all PVT conditions.
-//
-// Frequency of this ring oscillator under SPICE simulations at
-// nominal PVT is maximum 214 MHz (trim 0), minimum 90 MHz (trim 24).
-
-module ring_osc2x13(reset, trim, clockp);
-    input reset;
-    input [25:0] trim;
-    output[1:0] clockp;
-
-    wire [12:0] d;
-    wire [1:0] clockp;
-    wire [1:0] c;
-
-    // Main oscillator loop stages
- 
-    genvar i;
-    generate
-	for (i = 0; i < 12; i = i + 1) begin : dstage
-	    delay_stage id (
-		.in(d[i]),
-		.trim({trim[i+13], trim[i]}),
-		.out(d[i+1])
-	    );
-	end
-    endgenerate
-
-    // Reset/startup stage
- 
-    start_stage iss (
-	.in(d[12]),
-	.trim({trim[25], trim[12]}),
-	.reset(reset),
-	.out(d[0])
-    );
-
-    // Buffered outputs a 0 and 90 degrees phase (approximately)
-
-    efs8hd_clkinv_2 ibufp00 (
-	.A(d[0]),
-	.Y(c[0])
-    );
-    efs8hd_clkinv_8 ibufp01 (
-	.A(c[0]),
-	.Y(clockp[0])
-    );
-    efs8hd_clkinv_2 ibufp10 (
-	.A(d[6]),
-	.Y(c[1])
-    );
-    efs8hd_clkinv_8 ibufp11 (
-	.A(c[1]),
-	.Y(clockp[1])
-    );
-
-endmodule
diff --git a/designs/striVe_flat/src/openstriVe_soc/openstriVe_soc.v b/designs/striVe_flat/src/openstriVe_soc/striVe_soc.v
similarity index 81%
rename from designs/striVe_flat/src/openstriVe_soc/openstriVe_soc.v
rename to designs/striVe_flat/src/openstriVe_soc/striVe_soc.v
index 32e8eab..41dd8dc 100644
--- a/designs/striVe_flat/src/openstriVe_soc/openstriVe_soc.v
+++ b/designs/striVe_flat/src/openstriVe_soc/striVe_soc.v
@@ -57,11 +57,12 @@
 	*/
 
 	// Memory mapped I/O signals
-	output [15:0] gpio_out,		// Connect to out on gpio pad
-	input  [15:0] gpio_in,		// Connect to in on gpio pad
-	output [15:0] gpio_pullupb,	// Connect to pullupb on gpio pad
-	output [15:0] gpio_pulldownb,	// Connect to pulldownb on gpio pad
-	output [15:0] gpio_outenb,	// Connect to outenb on gpio pad
+	output [15:0] gpio_out_pad,		// Connect to out on gpio pad
+	input  [15:0] gpio_in_pad,		// Connect to in on gpio pad
+	output [15:0] gpio_mode0_pad,		// Connect to dm[0] on gpio pad
+	output [15:0] gpio_mode1_pad,		// Connect to dm[2] on gpio pad
+	output [15:0] gpio_outenb_pad,		// Connect to oe_n on gpio pad
+	output [15:0] gpio_inenb_pad,		// Connect to inp_dis on gpio pad
 
 	output 	      adc0_ena,
 	output 	      adc0_convert,
@@ -130,6 +131,14 @@
 	output flash_io2_oeb,
 	output flash_io3_oeb,
 
+	output flash_csb_ieb,
+	output flash_clk_ieb,
+
+	output flash_io0_ieb,
+	output flash_io1_ieb,
+	output flash_io2_ieb,
+	output flash_io3_ieb,
+
 	output flash_io0_do,
 	output flash_io1_do,
 	output flash_io2_do,
@@ -140,8 +149,9 @@
 	input  flash_io2_di,
 	input  flash_io3_di
 );
-	/* parameter integer MEM_WORDS = 256; */
 	/* Increase scratchpad memory to 1K words */
+	/* parameter integer MEM_WORDS = 1024; */
+	/* Memory reverted back to 256 words while memory has to be synthesized */
 	parameter integer MEM_WORDS = 256;
 	parameter [31:0] STACKADDR = (4*MEM_WORDS);       // end of memory
 	parameter [31:0] PROGADDR_RESET = 32'h 0010_0000; // 1 MB into flash
@@ -158,6 +168,11 @@
 
 	// memory-mapped I/O control registers
 
+        wire   [15:0] gpio_pullup;      // Intermediate GPIO pullup
+        wire   [15:0] gpio_pulldown;    // Intermediate GPIO pulldown
+        wire   [15:0] gpio_outenb;      // Intermediate GPIO out enable (bar)
+        wire   [15:0] gpio_out;         // Intermediate GPIO output
+
 	reg    [15:0] gpio;		// GPIO output data
 	reg    [15:0] gpio_pu;		// GPIO pull-up enable
 	reg    [15:0] gpio_pd;		// GPIO pull-down enable
@@ -217,7 +232,7 @@
 	assign resetn = ~(reset_delay[0] | ext_reset);
 
 	// ADC clock assignments
-	
+
 	assign adc0_clk = (adc0_clksrc == 2'b00) ? rcosc_in :
 			  (adc0_clksrc == 2'b01) ? spi_sck :
 			  (adc0_clksrc == 2'b10) ? xtal_in :
@@ -235,9 +250,9 @@
 	assign gpio_out[2] = (rcosc_output_dest == 2'b01) ? rcosc_in : gpio[2];
 	assign gpio_out[3] = (rcosc_output_dest == 2'b10) ? rcosc_in : gpio[3];
 	assign gpio_out[4] = (rcosc_output_dest == 2'b11) ? rcosc_in : gpio[4];
-	assign gpio_out[5] = (xtal_output_dest == 2'b01) ? xtal_in : gpio[5]; 
-	assign gpio_out[6] = (xtal_output_dest == 2'b10) ? xtal_in : gpio[6]; 
-	assign gpio_out[7] = (xtal_output_dest == 2'b11) ? xtal_in : gpio[7]; 
+	assign gpio_out[5] = (xtal_output_dest == 2'b01) ? xtal_in : gpio[5];
+	assign gpio_out[6] = (xtal_output_dest == 2'b10) ? xtal_in : gpio[6];
+	assign gpio_out[7] = (xtal_output_dest == 2'b11) ? xtal_in : gpio[7];
 	assign gpio_out[8] = (pll_output_dest == 2'b01) ? pll_clk : gpio[8];
 	assign gpio_out[9] = (pll_output_dest == 2'b10) ? pll_clk : gpio[9];
 	assign gpio_out[10] = (pll_output_dest == 2'b11) ? clk : gpio[10];
@@ -249,7 +264,7 @@
 
 	assign gpio_outenb[0] = (comp_output_dest == 2'b00)  ? gpio_oeb[0] : 1'b0;
 	assign gpio_outenb[1] = (comp_output_dest == 2'b00)  ? gpio_oeb[1] : 1'b0;
-	assign gpio_outenb[2] = (rcosc_output_dest == 2'b00) ? gpio_oeb[2] : 1'b0; 
+	assign gpio_outenb[2] = (rcosc_output_dest == 2'b00) ? gpio_oeb[2] : 1'b0;
 	assign gpio_outenb[3] = (rcosc_output_dest == 2'b00) ? gpio_oeb[3] : 1'b0;
 	assign gpio_outenb[4] = (rcosc_output_dest == 2'b00) ? gpio_oeb[4] : 1'b0;
 	assign gpio_outenb[5] = (xtal_output_dest == 2'b00)  ? gpio_oeb[5] : 1'b0;
@@ -264,48 +279,61 @@
 	assign gpio_outenb[14] = (overtemp_dest == 2'b00)    ? gpio_oeb[14] : 1'b0;
 	assign gpio_outenb[15] = (overtemp_dest == 2'b00)    ? gpio_oeb[15] : 1'b0;
 
-	assign gpio_pullupb[0] = (comp_output_dest == 2'b00)  ? ~gpio_pu[0] : 1'b1;
-	assign gpio_pullupb[1] = (comp_output_dest == 2'b00)  ? ~gpio_pu[1] : 1'b1;
-	assign gpio_pullupb[2] = (rcosc_output_dest == 2'b00) ? ~gpio_pu[2] : 1'b1; 
-	assign gpio_pullupb[3] = (rcosc_output_dest == 2'b00) ? ~gpio_pu[3] : 1'b1;
-	assign gpio_pullupb[4] = (rcosc_output_dest == 2'b00) ? ~gpio_pu[4] : 1'b1;
-	assign gpio_pullupb[5] = (xtal_output_dest == 2'b00)  ? ~gpio_pu[5] : 1'b1;
-	assign gpio_pullupb[6] = (xtal_output_dest == 2'b00)  ? ~gpio_pu[6] : 1'b1;
-	assign gpio_pullupb[7] = (xtal_output_dest == 2'b00)  ? ~gpio_pu[7] : 1'b1;
-	assign gpio_pullupb[8] = (pll_output_dest == 2'b00)   ? ~gpio_pu[8] : 1'b1;
-	assign gpio_pullupb[9] = (pll_output_dest == 2'b00)   ? ~gpio_pu[9] : 1'b1;
-	assign gpio_pullupb[10] = (pll_output_dest == 2'b00)  ? ~gpio_pu[10] : 1'b1;
-	assign gpio_pullupb[11] = (trap_output_dest == 2'b00) ? ~gpio_pu[11] : 1'b1;
-	assign gpio_pullupb[12] = (trap_output_dest == 2'b00) ? ~gpio_pu[12] : 1'b1;
-	assign gpio_pullupb[13] = (trap_output_dest == 2'b00) ? ~gpio_pu[13] : 1'b1;
-	assign gpio_pullupb[14] = (overtemp_dest == 2'b00)    ? ~gpio_pu[14] : 1'b1;
-	assign gpio_pullupb[15] = (overtemp_dest == 2'b00)    ? ~gpio_pu[15] : 1'b1;
+	assign gpio_pullup[0] = (comp_output_dest == 2'b00)  ? gpio_pu[0] : 1'b0;
+	assign gpio_pullup[1] = (comp_output_dest == 2'b00)  ? gpio_pu[1] : 1'b0;
+	assign gpio_pullup[2] = (rcosc_output_dest == 2'b00) ? gpio_pu[2] : 1'b0;
+	assign gpio_pullup[3] = (rcosc_output_dest == 2'b00) ? gpio_pu[3] : 1'b0;
+	assign gpio_pullup[4] = (rcosc_output_dest == 2'b00) ? gpio_pu[4] : 1'b0;
+	assign gpio_pullup[5] = (xtal_output_dest == 2'b00)  ? gpio_pu[5] : 1'b0;
+	assign gpio_pullup[6] = (xtal_output_dest == 2'b00)  ? gpio_pu[6] : 1'b0;
+	assign gpio_pullup[7] = (xtal_output_dest == 2'b00)  ? gpio_pu[7] : 1'b0;
+	assign gpio_pullup[8] = (pll_output_dest == 2'b00)   ? gpio_pu[8] : 1'b0;
+	assign gpio_pullup[9] = (pll_output_dest == 2'b00)   ? gpio_pu[9] : 1'b0;
+	assign gpio_pullup[10] = (pll_output_dest == 2'b00)  ? gpio_pu[10] : 1'b0;
+	assign gpio_pullup[11] = (trap_output_dest == 2'b00) ? gpio_pu[11] : 1'b0;
+	assign gpio_pullup[12] = (trap_output_dest == 2'b00) ? gpio_pu[12] : 1'b0;
+	assign gpio_pullup[13] = (trap_output_dest == 2'b00) ? gpio_pu[13] : 1'b0;
+	assign gpio_pullup[14] = (overtemp_dest == 2'b00)    ? gpio_pu[14] : 1'b0;
+	assign gpio_pullup[15] = (overtemp_dest == 2'b00)    ? gpio_pu[15] : 1'b0;
 
-	assign gpio_pulldownb[0] = (comp_output_dest == 2'b00)  ? ~gpio_pd[0] : 1'b1;
-	assign gpio_pulldownb[1] = (comp_output_dest == 2'b00)  ? ~gpio_pd[1] : 1'b1;
-	assign gpio_pulldownb[2] = (rcosc_output_dest == 2'b00) ? ~gpio_pd[2] : 1'b1; 
-	assign gpio_pulldownb[3] = (rcosc_output_dest == 2'b00) ? ~gpio_pd[3] : 1'b1;
-	assign gpio_pulldownb[4] = (rcosc_output_dest == 2'b00) ? ~gpio_pd[4] : 1'b1;
-	assign gpio_pulldownb[5] = (xtal_output_dest == 2'b00)  ? ~gpio_pd[5] : 1'b1;
-	assign gpio_pulldownb[6] = (xtal_output_dest == 2'b00)  ? ~gpio_pd[6] : 1'b1;
-	assign gpio_pulldownb[7] = (xtal_output_dest == 2'b00)  ? ~gpio_pd[7] : 1'b1;
-	assign gpio_pulldownb[8] = (pll_output_dest == 2'b00)   ? ~gpio_pd[8] : 1'b1;
-	assign gpio_pulldownb[9] = (pll_output_dest == 2'b00)   ? ~gpio_pd[9] : 1'b1;
-	assign gpio_pulldownb[10] = (pll_output_dest == 2'b00)  ? ~gpio_pd[10] : 1'b1;
-	assign gpio_pulldownb[11] = (trap_output_dest == 2'b00) ? ~gpio_pd[11] : 1'b1;
-	assign gpio_pulldownb[12] = (trap_output_dest == 2'b00) ? ~gpio_pd[12] : 1'b1;
-	assign gpio_pulldownb[13] = (trap_output_dest == 2'b00) ? ~gpio_pd[13] : 1'b1;
-	assign gpio_pulldownb[14] = (overtemp_dest == 2'b00)    ? ~gpio_pd[14] : 1'b1;
-	assign gpio_pulldownb[15] = (overtemp_dest == 2'b00)    ? ~gpio_pd[15] : 1'b1;
+	assign gpio_pulldown[0] = (comp_output_dest == 2'b00)  ? gpio_pd[0] : 1'b0;
+	assign gpio_pulldown[1] = (comp_output_dest == 2'b00)  ? gpio_pd[1] : 1'b0;
+	assign gpio_pulldown[2] = (rcosc_output_dest == 2'b00) ? gpio_pd[2] : 1'b0;
+	assign gpio_pulldown[3] = (rcosc_output_dest == 2'b00) ? gpio_pd[3] : 1'b0;
+	assign gpio_pulldown[4] = (rcosc_output_dest == 2'b00) ? gpio_pd[4] : 1'b0;
+	assign gpio_pulldown[5] = (xtal_output_dest == 2'b00)  ? gpio_pd[5] : 1'b0;
+	assign gpio_pulldown[6] = (xtal_output_dest == 2'b00)  ? gpio_pd[6] : 1'b0;
+	assign gpio_pulldown[7] = (xtal_output_dest == 2'b00)  ? gpio_pd[7] : 1'b0;
+	assign gpio_pulldown[8] = (pll_output_dest == 2'b00)   ? gpio_pd[8] : 1'b0;
+	assign gpio_pulldown[9] = (pll_output_dest == 2'b00)   ? gpio_pd[9] : 1'b0;
+	assign gpio_pulldown[10] = (pll_output_dest == 2'b00)  ? gpio_pd[10] : 1'b0;
+	assign gpio_pulldown[11] = (trap_output_dest == 2'b00) ? gpio_pd[11] : 1'b0;
+	assign gpio_pulldown[12] = (trap_output_dest == 2'b00) ? gpio_pd[12] : 1'b0;
+	assign gpio_pulldown[13] = (trap_output_dest == 2'b00) ? gpio_pd[13] : 1'b0;
+	assign gpio_pulldown[14] = (overtemp_dest == 2'b00)    ? gpio_pd[14] : 1'b0;
+	assign gpio_pulldown[15] = (overtemp_dest == 2'b00)    ? gpio_pd[15] : 1'b0;
+
+        // Convert GPIO signals to s8 pad signals
+        convert_gpio_sigs convert_gpio_bit [15:0] (
+            .gpio_out(gpio_out),
+            .gpio_outenb(gpio_outenb),
+            .gpio_pu(gpio_pullup),
+            .gpio_pd(gpio_pulldown),
+            .gpio_out_pad(gpio_out_pad),
+            .gpio_outenb_pad(gpio_outenb_pad),
+            .gpio_inenb_pad(gpio_inenb_pad),
+            .gpio_mode1_pad(gpio_mode1_pad),
+            .gpio_mode0_pad(gpio_mode0_pad)
+        );
 
 	wire irq_7, irq_8;
 
-	assign irq_7 = (irq_7_inputsrc == 2'b01) ? gpio_in[0] :
-		       (irq_7_inputsrc == 2'b10) ? gpio_in[1] :
-		       (irq_7_inputsrc == 2'b11) ? gpio_in[2] : 1'b0;
-	assign irq_8 = (irq_8_inputsrc == 2'b01) ? gpio_in[3] :
-		       (irq_8_inputsrc == 2'b10) ? gpio_in[4] :
-		       (irq_8_inputsrc == 2'b11) ? gpio_in[5] : 1'b0;
+	assign irq_7 = (irq_7_inputsrc == 2'b01) ? gpio_in_pad[0] :
+		       (irq_7_inputsrc == 2'b10) ? gpio_in_pad[1] :
+		       (irq_7_inputsrc == 2'b11) ? gpio_in_pad[2] : 1'b0;
+	assign irq_8 = (irq_8_inputsrc == 2'b01) ? gpio_in_pad[3] :
+		       (irq_8_inputsrc == 2'b10) ? gpio_in_pad[4] :
+		       (irq_8_inputsrc == 2'b11) ? gpio_in_pad[5] : 1'b0;
 
 	assign ram_wenb = (mem_valid && !mem_ready && mem_addr < 4*MEM_WORDS) ?
 		{~mem_wstrb[3], ~mem_wstrb[2], ~mem_wstrb[1], ~mem_wstrb[0]} : 4'b1111;
@@ -407,6 +435,14 @@
 		.flash_io2_oeb (flash_io2_oeb),
 		.flash_io3_oeb (flash_io3_oeb),
 
+		.flash_csb_ieb (flash_csb_oeb),
+		.flash_clk_ieb (flash_clk_oeb),
+
+		.flash_io0_ieb (flash_io0_ieb),
+		.flash_io1_ieb (flash_io1_ieb),
+		.flash_io2_ieb (flash_io2_ieb),
+		.flash_io3_ieb (flash_io3_ieb),
+
 		.flash_io0_do (flash_io0_do),
 		.flash_io1_do (flash_io1_do),
 		.flash_io2_do (flash_io2_do),
@@ -454,7 +490,7 @@
 	// 1 bandgap
 	// 1 power-on-reset (POR)
 	// 1 temperature alarm
-	
+
 	// NOTE: Signals affecting critical core functions are controlled through
 	// an independent SPI having read-only access through the picorv32 core.
 	// SPI pins are independent of picorv32 SPI master.  Signals controlled by
@@ -486,7 +522,7 @@
 	// SPI slave:	0x030000c0	(read-only)
 
 	// Memory map details:
-	// GPIO:	32 channels total.  
+	// GPIO:	32 channels total.
 	//		addr 0x03000000		data (16 bits)
 	//		addr 0x03000001		out (=1) or in (=0) (default 0)
 	//		addr 0x03000002		pu (=1) or none (=0) (default 0)
@@ -576,7 +612,7 @@
 			if (iomem_valid && !iomem_ready && iomem_addr[31:8] == 24'h030000) begin
 				iomem_ready <= 1;
 				if (iomem_addr[7:0] == 8'h00) begin
-					iomem_rdata <= {gpio_out, gpio_in};
+					iomem_rdata <= {gpio_out, gpio_in_pad};
 					if (iomem_wstrb[0]) gpio[ 7: 0] <= iomem_wdata[ 7: 0];
 					if (iomem_wstrb[1]) gpio[15: 8] <= iomem_wdata[15: 8];
 				end else if (iomem_addr[7:0] == 8'h04) begin
@@ -757,3 +793,36 @@
 	end
 endmodule
 
+/* Convert the standard set of GPIO signals: input, output, output_enb,
+ * pullup, and pulldown into the set needed by the s8 GPIO pads:
+ * input, output, output_enb, input_enb, mode.  Note that dm[2] on
+ * thepads is always equal to dm[1] in this setup, so mode is shown as
+ * only a 2-bit signal.
+ *
+ * This module is bit-sliced.  Instantiate once for each GPIO pad.
+ */
+
+module convert_gpio_sigs (
+    input        gpio_out,
+    input        gpio_outenb,
+    input        gpio_pu,
+    input        gpio_pd,
+    output       gpio_out_pad,
+    output       gpio_outenb_pad,
+    output       gpio_inenb_pad,
+    output       gpio_mode1_pad,
+    output       gpio_mode0_pad
+);
+
+    assign gpio_out_pad = (gpio_pu == 1'b0 && gpio_pd == 1'b0) ? gpio_out :
+            (gpio_pu == 1'b1) ? 1 : 0;
+
+    assign gpio_outenb_pad = (gpio_outenb == 1'b0) ? 0 :
+            (gpio_pu == 1'b1 || gpio_pd == 1'b1) ? 0 : 1;
+
+    assign gpio_inenb_pad = ~gpio_outenb;
+
+    assign gpio_mode1_pad = ~gpio_outenb_pad;
+    assign gpio_mode0_pad = ~gpio_outenb;
+
+endmodule
diff --git a/designs/striVe_flat/src/striVe_spi/cells.v b/designs/striVe_flat/src/striVe_spi/cells.v
deleted file mode 100644
index c0d3ca6..0000000
--- a/designs/striVe_flat/src/striVe_spi/cells.v
+++ /dev/null
@@ -1,4 +0,0 @@
-(* blackbox *)
-module scs8hvl_lsbufhv2lv_1(input A, output X); endmodule   
-(* blackbox *)
-module scs8hvl_lsbuflv2hv_1(input A, output X); endmodule   
diff --git a/designs/openstriVe_soc/config.tcl b/designs/striVe_soc/config.tcl
similarity index 78%
rename from designs/openstriVe_soc/config.tcl
rename to designs/striVe_soc/config.tcl
index 44b47e8..660f280 100644
--- a/designs/openstriVe_soc/config.tcl
+++ b/designs/striVe_soc/config.tcl
@@ -1,6 +1,6 @@
-set ::env(DESIGN_NAME) "openstriVe_soc"
+set ::env(DESIGN_NAME) "striVe_soc"
 
-set ::env(VERILOG_FILES) "./designs/openstriVe_soc/src/openstriVe_soc.v"
+set ::env(VERILOG_FILES) "./designs/striVe_soc/src/striVe_soc.v"
 
 set ::env(CLOCK_PERIOD) "10"
 # which clock port ??
diff --git a/designs/openstriVe_soc/src/picorv32.v b/designs/striVe_soc/src/picorv32.v
similarity index 100%
rename from designs/openstriVe_soc/src/picorv32.v
rename to designs/striVe_soc/src/picorv32.v
diff --git a/designs/openstriVe_soc/src/simpleuart.v b/designs/striVe_soc/src/simpleuart.v
similarity index 100%
rename from designs/openstriVe_soc/src/simpleuart.v
rename to designs/striVe_soc/src/simpleuart.v
diff --git a/designs/openstriVe_soc/src/spimemio.v b/designs/striVe_soc/src/spimemio.v
similarity index 100%
rename from designs/openstriVe_soc/src/spimemio.v
rename to designs/striVe_soc/src/spimemio.v
diff --git a/designs/striVe_flat/src/openstriVe_soc/openstriVe_soc.v b/designs/striVe_soc/src/striVe_soc.v
similarity index 81%
copy from designs/striVe_flat/src/openstriVe_soc/openstriVe_soc.v
copy to designs/striVe_soc/src/striVe_soc.v
index 32e8eab..9fe97d8 100644
--- a/designs/striVe_flat/src/openstriVe_soc/openstriVe_soc.v
+++ b/designs/striVe_soc/src/striVe_soc.v
@@ -24,6 +24,7 @@
  */
 
 `ifdef PICORV32_V
+`error "openstriVe_soc.v must be read before picorv32.v!"
 `endif
 
 /* Note:  Synthesize register memory from flops */
@@ -36,7 +37,7 @@
 
 `define PICORV32_REGS openstriVe_soc_regs
 
-module openstriVe_soc (
+module striVe_soc (
 `ifdef LVS
 	inout vdd1v8,	    /* 1.8V domain */
 	inout vss,
@@ -57,11 +58,12 @@
 	*/
 
 	// Memory mapped I/O signals
-	output [15:0] gpio_out,		// Connect to out on gpio pad
-	input  [15:0] gpio_in,		// Connect to in on gpio pad
-	output [15:0] gpio_pullupb,	// Connect to pullupb on gpio pad
-	output [15:0] gpio_pulldownb,	// Connect to pulldownb on gpio pad
-	output [15:0] gpio_outenb,	// Connect to outenb on gpio pad
+	output [15:0] gpio_out_pad,		// Connect to out on gpio pad
+	input  [15:0] gpio_in_pad,		// Connect to in on gpio pad
+	output [15:0] gpio_mode0_pad,		// Connect to dm[0] on gpio pad
+	output [15:0] gpio_mode1_pad,		// Connect to dm[2] on gpio pad
+	output [15:0] gpio_outenb_pad,		// Connect to oe_n on gpio pad
+	output [15:0] gpio_inenb_pad,		// Connect to inp_dis on gpio pad
 
 	output 	      adc0_ena,
 	output 	      adc0_convert,
@@ -130,6 +132,14 @@
 	output flash_io2_oeb,
 	output flash_io3_oeb,
 
+	output flash_csb_ieb,
+	output flash_clk_ieb,
+
+	output flash_io0_ieb,
+	output flash_io1_ieb,
+	output flash_io2_ieb,
+	output flash_io3_ieb,
+
 	output flash_io0_do,
 	output flash_io1_do,
 	output flash_io2_do,
@@ -140,8 +150,9 @@
 	input  flash_io2_di,
 	input  flash_io3_di
 );
-	/* parameter integer MEM_WORDS = 256; */
 	/* Increase scratchpad memory to 1K words */
+	/* parameter integer MEM_WORDS = 1024; */
+	/* Memory reverted back to 256 words while memory has to be synthesized */
 	parameter integer MEM_WORDS = 256;
 	parameter [31:0] STACKADDR = (4*MEM_WORDS);       // end of memory
 	parameter [31:0] PROGADDR_RESET = 32'h 0010_0000; // 1 MB into flash
@@ -158,6 +169,11 @@
 
 	// memory-mapped I/O control registers
 
+        wire   [15:0] gpio_pullup;      // Intermediate GPIO pullup
+        wire   [15:0] gpio_pulldown;    // Intermediate GPIO pulldown
+        wire   [15:0] gpio_outenb;      // Intermediate GPIO out enable (bar)
+        wire   [15:0] gpio_out;         // Intermediate GPIO output
+
 	reg    [15:0] gpio;		// GPIO output data
 	reg    [15:0] gpio_pu;		// GPIO pull-up enable
 	reg    [15:0] gpio_pd;		// GPIO pull-down enable
@@ -264,48 +280,61 @@
 	assign gpio_outenb[14] = (overtemp_dest == 2'b00)    ? gpio_oeb[14] : 1'b0;
 	assign gpio_outenb[15] = (overtemp_dest == 2'b00)    ? gpio_oeb[15] : 1'b0;
 
-	assign gpio_pullupb[0] = (comp_output_dest == 2'b00)  ? ~gpio_pu[0] : 1'b1;
-	assign gpio_pullupb[1] = (comp_output_dest == 2'b00)  ? ~gpio_pu[1] : 1'b1;
-	assign gpio_pullupb[2] = (rcosc_output_dest == 2'b00) ? ~gpio_pu[2] : 1'b1; 
-	assign gpio_pullupb[3] = (rcosc_output_dest == 2'b00) ? ~gpio_pu[3] : 1'b1;
-	assign gpio_pullupb[4] = (rcosc_output_dest == 2'b00) ? ~gpio_pu[4] : 1'b1;
-	assign gpio_pullupb[5] = (xtal_output_dest == 2'b00)  ? ~gpio_pu[5] : 1'b1;
-	assign gpio_pullupb[6] = (xtal_output_dest == 2'b00)  ? ~gpio_pu[6] : 1'b1;
-	assign gpio_pullupb[7] = (xtal_output_dest == 2'b00)  ? ~gpio_pu[7] : 1'b1;
-	assign gpio_pullupb[8] = (pll_output_dest == 2'b00)   ? ~gpio_pu[8] : 1'b1;
-	assign gpio_pullupb[9] = (pll_output_dest == 2'b00)   ? ~gpio_pu[9] : 1'b1;
-	assign gpio_pullupb[10] = (pll_output_dest == 2'b00)  ? ~gpio_pu[10] : 1'b1;
-	assign gpio_pullupb[11] = (trap_output_dest == 2'b00) ? ~gpio_pu[11] : 1'b1;
-	assign gpio_pullupb[12] = (trap_output_dest == 2'b00) ? ~gpio_pu[12] : 1'b1;
-	assign gpio_pullupb[13] = (trap_output_dest == 2'b00) ? ~gpio_pu[13] : 1'b1;
-	assign gpio_pullupb[14] = (overtemp_dest == 2'b00)    ? ~gpio_pu[14] : 1'b1;
-	assign gpio_pullupb[15] = (overtemp_dest == 2'b00)    ? ~gpio_pu[15] : 1'b1;
+	assign gpio_pullup[0] = (comp_output_dest == 2'b00)  ? gpio_pu[0] : 1'b0;
+	assign gpio_pullup[1] = (comp_output_dest == 2'b00)  ? gpio_pu[1] : 1'b0;
+	assign gpio_pullup[2] = (rcosc_output_dest == 2'b00) ? gpio_pu[2] : 1'b0; 
+	assign gpio_pullup[3] = (rcosc_output_dest == 2'b00) ? gpio_pu[3] : 1'b0;
+	assign gpio_pullup[4] = (rcosc_output_dest == 2'b00) ? gpio_pu[4] : 1'b0;
+	assign gpio_pullup[5] = (xtal_output_dest == 2'b00)  ? gpio_pu[5] : 1'b0;
+	assign gpio_pullup[6] = (xtal_output_dest == 2'b00)  ? gpio_pu[6] : 1'b0;
+	assign gpio_pullup[7] = (xtal_output_dest == 2'b00)  ? gpio_pu[7] : 1'b0;
+	assign gpio_pullup[8] = (pll_output_dest == 2'b00)   ? gpio_pu[8] : 1'b0;
+	assign gpio_pullup[9] = (pll_output_dest == 2'b00)   ? gpio_pu[9] : 1'b0;
+	assign gpio_pullup[10] = (pll_output_dest == 2'b00)  ? gpio_pu[10] : 1'b0;
+	assign gpio_pullup[11] = (trap_output_dest == 2'b00) ? gpio_pu[11] : 1'b0;
+	assign gpio_pullup[12] = (trap_output_dest == 2'b00) ? gpio_pu[12] : 1'b0;
+	assign gpio_pullup[13] = (trap_output_dest == 2'b00) ? gpio_pu[13] : 1'b0;
+	assign gpio_pullup[14] = (overtemp_dest == 2'b00)    ? gpio_pu[14] : 1'b0;
+	assign gpio_pullup[15] = (overtemp_dest == 2'b00)    ? gpio_pu[15] : 1'b0;
 
-	assign gpio_pulldownb[0] = (comp_output_dest == 2'b00)  ? ~gpio_pd[0] : 1'b1;
-	assign gpio_pulldownb[1] = (comp_output_dest == 2'b00)  ? ~gpio_pd[1] : 1'b1;
-	assign gpio_pulldownb[2] = (rcosc_output_dest == 2'b00) ? ~gpio_pd[2] : 1'b1; 
-	assign gpio_pulldownb[3] = (rcosc_output_dest == 2'b00) ? ~gpio_pd[3] : 1'b1;
-	assign gpio_pulldownb[4] = (rcosc_output_dest == 2'b00) ? ~gpio_pd[4] : 1'b1;
-	assign gpio_pulldownb[5] = (xtal_output_dest == 2'b00)  ? ~gpio_pd[5] : 1'b1;
-	assign gpio_pulldownb[6] = (xtal_output_dest == 2'b00)  ? ~gpio_pd[6] : 1'b1;
-	assign gpio_pulldownb[7] = (xtal_output_dest == 2'b00)  ? ~gpio_pd[7] : 1'b1;
-	assign gpio_pulldownb[8] = (pll_output_dest == 2'b00)   ? ~gpio_pd[8] : 1'b1;
-	assign gpio_pulldownb[9] = (pll_output_dest == 2'b00)   ? ~gpio_pd[9] : 1'b1;
-	assign gpio_pulldownb[10] = (pll_output_dest == 2'b00)  ? ~gpio_pd[10] : 1'b1;
-	assign gpio_pulldownb[11] = (trap_output_dest == 2'b00) ? ~gpio_pd[11] : 1'b1;
-	assign gpio_pulldownb[12] = (trap_output_dest == 2'b00) ? ~gpio_pd[12] : 1'b1;
-	assign gpio_pulldownb[13] = (trap_output_dest == 2'b00) ? ~gpio_pd[13] : 1'b1;
-	assign gpio_pulldownb[14] = (overtemp_dest == 2'b00)    ? ~gpio_pd[14] : 1'b1;
-	assign gpio_pulldownb[15] = (overtemp_dest == 2'b00)    ? ~gpio_pd[15] : 1'b1;
+	assign gpio_pulldown[0] = (comp_output_dest == 2'b00)  ? gpio_pd[0] : 1'b0;
+	assign gpio_pulldown[1] = (comp_output_dest == 2'b00)  ? gpio_pd[1] : 1'b0;
+	assign gpio_pulldown[2] = (rcosc_output_dest == 2'b00) ? gpio_pd[2] : 1'b0; 
+	assign gpio_pulldown[3] = (rcosc_output_dest == 2'b00) ? gpio_pd[3] : 1'b0;
+	assign gpio_pulldown[4] = (rcosc_output_dest == 2'b00) ? gpio_pd[4] : 1'b0;
+	assign gpio_pulldown[5] = (xtal_output_dest == 2'b00)  ? gpio_pd[5] : 1'b0;
+	assign gpio_pulldown[6] = (xtal_output_dest == 2'b00)  ? gpio_pd[6] : 1'b0;
+	assign gpio_pulldown[7] = (xtal_output_dest == 2'b00)  ? gpio_pd[7] : 1'b0;
+	assign gpio_pulldown[8] = (pll_output_dest == 2'b00)   ? gpio_pd[8] : 1'b0;
+	assign gpio_pulldown[9] = (pll_output_dest == 2'b00)   ? gpio_pd[9] : 1'b0;
+	assign gpio_pulldown[10] = (pll_output_dest == 2'b00)  ? gpio_pd[10] : 1'b0;
+	assign gpio_pulldown[11] = (trap_output_dest == 2'b00) ? gpio_pd[11] : 1'b0;
+	assign gpio_pulldown[12] = (trap_output_dest == 2'b00) ? gpio_pd[12] : 1'b0;
+	assign gpio_pulldown[13] = (trap_output_dest == 2'b00) ? gpio_pd[13] : 1'b0;
+	assign gpio_pulldown[14] = (overtemp_dest == 2'b00)    ? gpio_pd[14] : 1'b0;
+	assign gpio_pulldown[15] = (overtemp_dest == 2'b00)    ? gpio_pd[15] : 1'b0;
+
+        // Convert GPIO signals to s8 pad signals
+        convert_gpio_sigs convert_gpio_bit [15:0] (
+            .gpio_out(gpio_out),
+            .gpio_outenb(gpio_outenb),
+            .gpio_pu(gpio_pullup),
+            .gpio_pd(gpio_pulldown),
+            .gpio_out_pad(gpio_out_pad),
+            .gpio_outenb_pad(gpio_outenb_pad),
+            .gpio_inenb_pad(gpio_inenb_pad),
+            .gpio_mode1_pad(gpio_mode1_pad),
+            .gpio_mode0_pad(gpio_mode0_pad)
+        );
 
 	wire irq_7, irq_8;
 
-	assign irq_7 = (irq_7_inputsrc == 2'b01) ? gpio_in[0] :
-		       (irq_7_inputsrc == 2'b10) ? gpio_in[1] :
-		       (irq_7_inputsrc == 2'b11) ? gpio_in[2] : 1'b0;
-	assign irq_8 = (irq_8_inputsrc == 2'b01) ? gpio_in[3] :
-		       (irq_8_inputsrc == 2'b10) ? gpio_in[4] :
-		       (irq_8_inputsrc == 2'b11) ? gpio_in[5] : 1'b0;
+	assign irq_7 = (irq_7_inputsrc == 2'b01) ? gpio_in_pad[0] :
+		       (irq_7_inputsrc == 2'b10) ? gpio_in_pad[1] :
+		       (irq_7_inputsrc == 2'b11) ? gpio_in_pad[2] : 1'b0;
+	assign irq_8 = (irq_8_inputsrc == 2'b01) ? gpio_in_pad[3] :
+		       (irq_8_inputsrc == 2'b10) ? gpio_in_pad[4] :
+		       (irq_8_inputsrc == 2'b11) ? gpio_in_pad[5] : 1'b0;
 
 	assign ram_wenb = (mem_valid && !mem_ready && mem_addr < 4*MEM_WORDS) ?
 		{~mem_wstrb[3], ~mem_wstrb[2], ~mem_wstrb[1], ~mem_wstrb[0]} : 4'b1111;
@@ -407,6 +436,14 @@
 		.flash_io2_oeb (flash_io2_oeb),
 		.flash_io3_oeb (flash_io3_oeb),
 
+		.flash_csb_ieb (flash_csb_ieb),
+		.flash_clk_ieb (flash_clk_ieb),
+
+		.flash_io0_ieb (flash_io0_ieb),
+		.flash_io1_ieb (flash_io1_ieb),
+		.flash_io2_ieb (flash_io2_ieb),
+		.flash_io3_ieb (flash_io3_ieb),
+
 		.flash_io0_do (flash_io0_do),
 		.flash_io1_do (flash_io1_do),
 		.flash_io2_do (flash_io2_do),
@@ -576,7 +613,7 @@
 			if (iomem_valid && !iomem_ready && iomem_addr[31:8] == 24'h030000) begin
 				iomem_ready <= 1;
 				if (iomem_addr[7:0] == 8'h00) begin
-					iomem_rdata <= {gpio_out, gpio_in};
+					iomem_rdata <= {gpio_out, gpio_in_pad};
 					if (iomem_wstrb[0]) gpio[ 7: 0] <= iomem_wdata[ 7: 0];
 					if (iomem_wstrb[1]) gpio[15: 8] <= iomem_wdata[15: 8];
 				end else if (iomem_addr[7:0] == 8'h04) begin
@@ -712,6 +749,9 @@
 	);
 endmodule
 
+`include "picorv32.v"
+`include "spimemio.v"
+`include "simpleuart.v"
 
 // Implementation note:
 // Replace the following two modules with wrappers for your SRAM cells.
@@ -757,3 +797,37 @@
 	end
 endmodule
 
+/* Convert the standard set of GPIO signals: input, output, output_enb,
+ * pullup, and pulldown into the set needed by the s8 GPIO pads:
+ * input, output, output_enb, input_enb, mode.  Note that dm[2] on
+ * thepads is always equal to dm[1] in this setup, so mode is shown as
+ * only a 2-bit signal.
+ *
+ * This module is bit-sliced.  Instantiate once for each GPIO pad.
+ */
+
+module convert_gpio_sigs (
+    input        gpio_out,
+    input        gpio_outenb,
+    input        gpio_pu,
+    input        gpio_pd,
+    output       gpio_out_pad,
+    output       gpio_outenb_pad,
+    output       gpio_inenb_pad,
+    output       gpio_mode1_pad,
+    output       gpio_mode0_pad
+);
+
+    assign gpio_out_pad = (gpio_pu == 1'b0 && gpio_pd == 1'b0) ? gpio_out :
+            (gpio_pu == 1'b1) ? 1 : 0;
+
+    assign gpio_outenb_pad = (gpio_outenb == 1'b0) ? 0 :
+            (gpio_pu == 1'b1 || gpio_pd == 1'b1) ? 0 : 1;
+
+    assign gpio_inenb_pad = ~gpio_outenb;
+
+    assign gpio_mode1_pad = ~gpio_outenb_pad;
+    assign gpio_mode0_pad = ~gpio_outenb;
+
+endmodule
+
diff --git a/pdks/ef-skywater-s8 b/pdks/ef-skywater-s8
index a5c75cd..dd3855f 160000
--- a/pdks/ef-skywater-s8
+++ b/pdks/ef-skywater-s8
@@ -1 +1 @@
-Subproject commit a5c75cd19720acfdbb2b50e1fc115c27ac01ec3f
+Subproject commit dd3855ffdb9023efe04ab0f9f4877e5a5e0f17d8
diff --git a/scripts/libtrim.pl b/scripts/libtrim.pl
index ce40891..0c5a647 100755
--- a/scripts/libtrim.pl
+++ b/scripts/libtrim.pl
@@ -10,188 +10,187 @@
 open (LIB, $ARGV[1]) ;
 my $prefix = $ARGV[0];
 my @cells = (
-"xnor2_4",
-"dfstp_2",
-"xor3_4",
-"or2b_2",
-"xnor3_2",
-"sdfbbn_2",
-"sdfxtp_2",
-"dfxtp_2",
-"xor2_2",
-"o311ai_2",
-"nand2_2",
-"sdfrtp_2",
-"and4_2",
-"dfsbp_2",
-"or4_2",
-"inv_2",
-"dfrbp_2",
-"buf_8",
-"dlymetal6s4s_1",
-"xor2_4",
-"inv_4",
-"o31ai_2",
-"bufbuf_16",
-"dlygate4sd3_1",
-"o22ai_2",
-"o32ai_2",
-"and3_2",
-"o2111ai_2",
-"dlrbp_2",
-"and4bb_2",
-"nand3b_2",
-"buf_6",
-"and4b_2",
-"a2bb2oi_2",
-"buf_12",
-"and2_2",
-"dlxbn_2",
-"dlrtp_2",
-"xor3_1",
-"a21oi_2",
-"inv_12",
-"o21ai_2",
-"a311oi_2",
-"buf_4",
-"o21bai_2",
-"nand3_2",
-"dlygate4sd2_1",
-"o211ai_2",
-"or4b_2",
-"and3b_2",
-"or4bb_2",
-"sdfrbp_2",
-"o2bb2ai_2",
-"bufinv_16",
-"xor3_2",
-"o41ai_2",
-"or3b_2",
-"inv_8",
-"or2_2",
-"dfrtp_2",
-"bufbuf_8",
-"bufinv_8",
-"buf_16",
-"buf_2",
-"inv_6",
-"xnor3_4",
-"inv_16",
-"and2b_2",
-"a2111oi_2",
-"dfxbp_2",
-"xnor3_1",
-"dlymetal6s6s_1",
-"dfbbn_2",
-"o221ai_2",
-"sdfstp_2",
-"a31oi_2",
-"a211oi_2",
-"nand2b_2",
-"a22oi_2",
-"dlymetal6s2s_1",
-"dlxtn_2",
-"a21boi_2",
-"dlrtn_2",
-"a221oi_2",
-"or3_2",
-"sdfsbp_2",
-"xnor2_2",
-"sdfxbp_2"
-#              # conb - 1
-#              'conb_1',
-#
-#              # AND - 9
-#              'and2_1','and2_2','and2_4',
-#              'and3_1','and3_2','and3_4',
-#              'and4_1','and4_2','and4_4',
-#
-#              # Buffer - 5
-#              'buf_1','buf_2','buf_4','buf_8','buf_16',
-#
-#              # Clock Buffer - 5
-#              #'clkbuf_1','clkbuf_2','clkbuf_4','clkbuf_8','clkbuf_16',
-#
-#              # Inverters - 5
-#              'inv_1','inv_2','inv_4','inv_8','inv_16',
-#
-#              # Majority - 3
-#              'maj3_1','maj3_2','maj3_4',
-#
-#              # Multiplexors - 10
-#              'mux2_1','mux2_2','mux2_4','mux2_8',
-#              'mux2i_1','mux2i_2','mux2i_4',
-#              'mux4_1','mux4_2','mux4_4',
-#
-#              # NAND - 10
-#              'nand2_1','nand2_2','nand2_4','nand2_8',
-#              'nand3_1','nand3_2','nand3_4',
-#              'nand4_1','nand4_2','nand4_4',
-#
-#              # NOR - 10
-#              'nor2_1','nor2_2','nor2_4','nor2_8',
-#              'nor3_1','nor3_2','nor3_4',
-#              'nor4_1','nor4_2','nor4_4',
-#
-#              # OR - 9
-#              'or2_1','or2_2','or2_4',
-#              'or3_1','or3_2','or3_4',
-#              'or4_1','or4_2','or4_4',
-#
-#              # XOR - 4
-#              'xor2_1','xor2_2','xor2_4',
-#              'xor3_1',
-#
-#              # XNOR - 4
-#              'xnor2_1','xnor2_2','xnor2_4',
-#              'xnor3_1',
-#
-#              # OA & OAI - 24
-#              'o41a_1', 'o41a_2', 'o41a_4',
-#              'o41ai_1', 'o41ai_2', 'o41ai_4',
-#              'o32a_1', 'o32a_2', 'o32a_4',
-#              'o32ai_1', 'o32ai_2', 'o32ai_4',
-#              #'o22a_1',
-#              'o22a_2', 'o22a_4',
-#              #'o22ai_1',
-#              'o22ai_2', 'o22ai_4',
-#              #'o21a_1',
-#              'o21a_2', 'o21a_4',
-#              #'o21ai_1',
-#              'o21ai_2', 'o21ai_4',
-#
-#              # AO & AOI - 48
-#              'a41o_1', 'a41o_2', 'a41o_4',
-#              'a41oi_1', 'a41oi_2', 'a41oi_4',
-#
-#              'a32o_1', 'a32o_2', 'a32o_4',
-#              'a32oi_1', 'a32oi_2', 'a32oi_4',
-#
-#              'a22o_1', 'a22o_2', 'a22o_4',
-#              'a22oi_1', 'a22oi_2', 'a22oi_4',
-#              'a21o_1', 'a21o_2', 'a21o_4',
-#              'a21bo_1', 'a21bo_2', 'a21bo_4',
-#              'a21oi_1', 'a21oi_2', 'a21oi_4',
-#              'a21boi_1', 'a21boi_2', 'a21boi_4',
-#              'a2111o_1', 'a2111o_2', 'a2111o_4',
-#              'a2111oi_1', 'a2111oi_2', 'a2111oi_4',
-#              'a211o_1', 'a211o_2', 'a211o_4',
-#              'a211oi_1', 'a211oi_2', 'a211oi_4',
-#
-#              'a2bb2oi_1', 'a2bb2oi_2', 'a2bb2oi_4'.
-#              'a2bb2o_1', 'a2bb2o_2', 'a2bb2o_4'.
-#
-#              # FF - 20
-#              'dfrtn_1',
-#              'dfbbn_1', 'dfbbn_2',
-#              'dfbbp_1',
-#              'dfxbp_1', 'dfxbp_2',
-#              'edfxbp_1',
-#              'dfxtp_1', 'dfxtp_2', 'dfxtp_4',
-#              'dfrbp_1', 'dfrbp_2',
-#              'dfrtp_1', 'dfrtp_2', 'dfrtp_4',
-#              'dfsbp_1', 'dfsbp_2',
-#              'dfstp_1', 'dfstp_2', 'dfstp_4',
+# "xnor2_4",
+# "dfstp_2",
+# "xor3_4",
+# "or2b_2",
+# "xnor3_2",
+# "sdfbbn_2",
+# "sdfxtp_2",
+# "dfxtp_2",
+# "xor2_2",
+# "o311ai_2",
+# "nand2_2",
+# "sdfrtp_2",
+# "and4_2",
+# "dfsbp_2",
+# "or4_2",
+# "inv_2",
+# "dfrbp_2",
+# "buf_8",
+# "dlymetal6s4s_1",
+# "xor2_4",
+# "inv_4",
+# "o31ai_2",
+# "bufbuf_16",
+# "dlygate4sd3_1",
+# "o22ai_2",
+# "o32ai_2",
+# "and3_2",
+# "o2111ai_2",
+# "dlrbp_2",
+# "and4bb_2",
+# "nand3b_2",
+# "buf_6",
+# "and4b_2",
+# "a2bb2oi_2",
+# "buf_12",
+# "and2_2",
+# "dlxbn_2",
+# "dlrtp_2",
+# "xor3_1",
+# "a21oi_2",
+# "inv_12",
+# "o21ai_2",
+# "a311oi_2",
+# "buf_4",
+# "o21bai_2",
+# "nand3_2",
+# "dlygate4sd2_1",
+# "o211ai_2",
+# "or4b_2",
+# "and3b_2",
+# "or4bb_2",
+# "sdfrbp_2",
+# "o2bb2ai_2",
+# "bufinv_16",
+# "xor3_2",
+# "o41ai_2",
+# "or3b_2",
+# "inv_8",
+# "or2_2",
+# "dfrtp_2",
+# "bufbuf_8",
+# "bufinv_8",
+# "buf_16",
+# "buf_2",
+# "inv_6",
+# "xnor3_4",
+# "inv_16",
+# "and2b_2",
+# "a2111oi_2",
+# "dfxbp_2",
+# "xnor3_1",
+# "dlymetal6s6s_1",
+# "dfbbn_2",
+# "o221ai_2",
+# "sdfstp_2",
+# "a31oi_2",
+# "a211oi_2",
+# "nand2b_2",
+# "a22oi_2",
+# "dlymetal6s2s_1",
+# "dlxtn_2",
+# "a21boi_2",
+# "dlrtn_2",
+# "a221oi_2",
+# "or3_2",
+# "sdfsbp_2",
+# "xnor2_2",
+# "sdfxbp_2"
+              # conb - 1
+              'conb_1',
+
+              # AND - 9
+              'and2_4',
+              'and3_4',
+              'and4_4',
+
+              # Buffer - 5
+              'buf_8','buf_16',
+
+              # Clock Buffer - 5
+              #'clkbuf_1','clkbuf_2','clkbuf_4','clkbuf_8','clkbuf_16',
+
+              # Inverters - 5
+              'inv_8','inv_16',
+
+              # Majority - 3
+              'maj3_4',
+
+              # Multiplexors - 10
+              'mux2_8',
+              'mux2i_4',
+              'mux4_4',
+
+              # NAND - 10
+              'nand2_4','nand2_8',
+              'nand3_4',
+              'nand4_4',
+
+              # NOR - 10
+              'nor2_4','nor2_8',
+              'nor3_4',
+              'nor4_4',
+
+              # OR - 9
+               'or2_4',
+              'or3_4',
+              'or4_4',
+
+              # XOR - 4
+              'xor2_4',
+              
+
+              # XNOR - 4
+              'xnor2_4',
+
+              # OA & OAI - 24
+              'o41a_4',
+              'o41ai_4',
+              'o32a_4',
+              'o32ai_4',
+              #'o22a_1',
+              'o22a_4',
+              #'o22ai_1',
+              'o22ai_4',
+              #'o21a_1',
+              'o21a_4',
+              #'o21ai_1',
+              'o21ai_4',
+
+              # AO & AOI - 48
+               'a41o_4',
+               'a41oi_4',
+
+               'a32o_4',
+               'a32oi_4',
+
+               'a22o_3',
+               'a22oi_4',
+               'a21o_4',
+               'a21bo_4',
+               'a21oi_4',
+               'a21boi_4',
+               'a2111o_4',
+               'a2111oi_4',
+               'a211o_4',
+               'a211oi_4',
+
+              'a2bb2oi_4'.
+               'a2bb2o_4'.
+
+              # FF - 20
+              
+              'dfbbn_2',
+             
+             'dfxbp_2',
+              
+               'dfxtp_4',
+               'dfrbp_2',
+               'dfrtp_4',
+               
+               'dfstp_4',
 
 
               );
diff --git a/scripts/padLefMacro.py b/scripts/padLefMacro.py
index 4d2f970..274f974 100755
--- a/scripts/padLefMacro.py
+++ b/scripts/padLefMacro.py
@@ -9,16 +9,16 @@
 # ==============================================================================
 parser = argparse.ArgumentParser(
     description='Adds padding to the right of all macros in a lef file')
-parser.add_argument('--right', '-r', required=False, type=int,
+parser.add_argument('--right', '-r', required=False, type=float,
                     default='0',
                     help='Padding on the right in SITE widths')
-parser.add_argument('--left', '-l', required=False, type=int,
+parser.add_argument('--left', '-l', required=False, type=float,
                     default='0',
                     help='Padding on the left in SITE widths')
-parser.add_argument('--top', '-t', required=False, type=int,
+parser.add_argument('--top', '-t', required=False, type=float,
                     default='0',
                     help='Padding on the top in SITE heights')
-parser.add_argument('--bottom', '-b', required=False, type=int,
+parser.add_argument('--bottom', '-b', required=False, type=float,
                     default='0',
                     help='Padding on the bottom in SITE heights')
 parser.add_argument('--site', '-s', required=False,
diff --git a/scripts/run_magic.tcl b/scripts/run_magic.tcl
index b125f13..a1797a4 100644
--- a/scripts/run_magic.tcl
+++ b/scripts/run_magic.tcl
@@ -1,7 +1,7 @@
 set magicrc $::env(TMP_DIR)/magic.magicrc
 set ::env(PDKPATH) "$::env(PDK_ROOT)/ef-skywater-s8/EFS8A"
 set ::env(MAGPATH) "$::env(PDKPATH)/libs.ref/maglef"
-exec envsubst < $::env(SCRIPTS_DIR)/tmp.magicrc > $magicrc
+exec envsubst < $::env(MAGIC_MAGICRC) > $magicrc
 exec magic \
         -noconsole \
         -dnull \
diff --git a/scripts/tcl_commands/all.tcl b/scripts/tcl_commands/all.tcl
index 0672a65..f4de39b 100644
--- a/scripts/tcl_commands/all.tcl
+++ b/scripts/tcl_commands/all.tcl
@@ -176,7 +176,7 @@
 
 	# pad lef
 	set ::env(CELLS_LEF_UNPADDED) $::env(TMP_DIR)/merged_unpadded.lef
-	try_catch $::env(SCRIPTS_DIR)/padLefMacro.py -s $::env(PLACE_SITE) -r $::env(CELL_PAD) -i $::env(CELLS_LEF_UNPADDED) -o $::env(TMP_DIR)/merged.lef -e $::env(CELL_PAD_EXECLUDE)
+	try_catch $::env(SCRIPTS_DIR)/padLefMacro.py -s $::env(PLACE_SITE) -r $::env(CELL_PAD) -i $::env(CELLS_LEF_UNPADDED) -o $::env(TMP_DIR)/merged.lef -e "$::env(CELL_PAD_EXECLUDE)" |& tee $::env(TERMINAL_OUTPUT)
 
 	set ::env(CELLS_LEF) $::env(TMP_DIR)/merged.lef
 	if { $::env(USE_GPIO_PADS) } {
@@ -188,9 +188,14 @@
 
 	# trim libs
 	set trimmed_lib $::env(TMP_DIR)/trimmed.lib
-	puts $::env(LIB_SYNTH)
-	exec $::env(SCRIPTS_DIR)/libtrim.pl $::env(PDK_VARIANT) $::env(LIB_SYNTH) > $trimmed_lib
-	set ::env(LIB_SYNTH) $trimmed_lib
+	if { ![info exists $trimmed_lib] } {
+		puts $::env(LIB_SYNTH)
+		exec $::env(SCRIPTS_DIR)/libtrim.pl $::env(PDK_VARIANT) $::env(LIB_SYNTH) > $trimmed_lib
+		set ::env(LIB_SYNTH) $trimmed_lib
+	}
+	
+	set tracks_copy $::env(TMP_DIR)/tracks_copy.info
+	exec cp $::env(TRACKS_INFO_FILE) $tracks_copy
 
 	# change to system verilog
 	#if {$::env(SYSTEM_VERILOG)} {
@@ -215,6 +220,7 @@
 	set_log ::env(CELL_PAD) $::env(CELL_PAD) $::env(GLB_CFG_FILE) 1
 	set_log ::env(MERGED_LEF) $::env(MERGED_LEF) $::env(GLB_CFG_FILE) 1
 	set_log ::env(TRACKS_INFO_FILE) $::env(TRACKS_INFO_FILE) $::env(GLB_CFG_FILE) 1
+	set_log ::env(TECH_LEF) $::env(TECH_LEF) $::env(GLB_CFG_FILE) 1
 	# Design
 	exec echo "# Design config" >> $::env(GLB_CFG_FILE)
 	set_log ::env(CLOCK_PERIOD) $::env(CLOCK_PERIOD) $::env(GLB_CFG_FILE) 1
@@ -356,10 +362,14 @@
 }
 
 proc run_magic_drc {args} {
+	set magicrc $::env(TMP_DIR)/magic.magicrc
+	set ::env(PDKPATH) "$::env(PDK_ROOT)/ef-skywater-s8/EFS8A"
+	set ::env(MAGPATH) "$::env(PDKPATH)/libs.ref/maglef"
+	exec envsubst < $::env(MAGIC_MAGICRC) > $magicrc
 	exec magic \
 		-noconsole \
 		-dnull \
-		-rcfile $::env(TMP_DIR)/magic.magicrc \
+		-rcfile $magicrc \
 		$::env(SCRIPTS_DIR)/magic_drc.tcl \
 		</dev/null \
 		|& tee $::env(TERMINAL_OUTPUT) $::env(magic_log_file_tag)_drc.log
diff --git a/scripts/tmp.magicrc b/scripts/tmp.magicrc
deleted file mode 100644
index 246beb3..0000000
--- a/scripts/tmp.magicrc
+++ /dev/null
@@ -1,53 +0,0 @@
-puts stdout "Sourcing design .magicrc for technology EFS8A ..."
-
-# Put grid on 0.005 pitch.  This is important, as some commands don't
-# rescale the grid automatically (such as lef read?).
-
-#set scalefac [tech lambda]
-if {[lindex [tech lambda] 1] < 2} {
-    scalegrid 1 2
-}
-
-# drc off
-drc euclidean on
-
-#set PDKPATH "${PDK_ROOT}/pdks/ef-skywater-s8/EFS8A"
-
-# loading technology
-tech load $PDKPATH/libs.tech/magic/current/EFS8A.tech
-
-
-# load techlef ?
-lef read ${TECH_LEF}
-
-# load device generator
-source $PDKPATH/libs.tech/magic/current/EFS8A.tcl
-
-# load bind keys (optional)
-source $PDKPATH/libs.tech/magic/current/EFS8A-BindKeys
-
-# set units to lambda grid 
-snap lambda
-
-# add path to reference cells
-#set MAGPATH "${PDKPATH}/libs.ref/maglef"
-addpath ${MAGPATH}/primdev
-addpath ${MAGPATH}/s8_osu130
-addpath ${MAGPATH}/efs8hd
-addpath ${MAGPATH}/efs8_pads
-#addpath ${MAGPATH}/s8fmlt
-#addpath ${MAGPATH}/s8iom0
-#addpath ${MAGPATH}/scs8hd
-#addpath ${MAGPATH}/scs8hdll
-#addpath ${MAGPATH}/scs8hvl
-#addpath ${MAGPATH}/scs8hs
-#addpath ${MAGPATH}/scs8ms
-#addpath ${MAGPATH}/scs8ls
-#addpath ${MAGPATH}/scs8lp
-
-# add path to GDS cells
-
-# add path to IP from catalog.  This procedure defined in the PDK script.
-catch {magic::query_mylib_ip}
-# add path to local IP from user design space.  Defined in the PDK script.
-catch {magic::query_my_projects}