rtl: Add inital serv project
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..9d7cf4d
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "verilog/blocks/serv"]
+	path = verilog/blocks/serv
+	url = git@github.com:olofk/serv.git
diff --git a/openlane/tiny_user_project/config.json b/openlane/tiny_user_project/config.json
index 652cdce..f544398 100644
--- a/openlane/tiny_user_project/config.json
+++ b/openlane/tiny_user_project/config.json
@@ -2,17 +2,33 @@
     "DESIGN_NAME": "tiny_user_project",
     "DESIGN_IS_CORE": 0,
     "VERILOG_FILES": [
-        "dir::../../verilog/rtl/user_module.v",
-        "dir::../../verilog/rtl/cells.v",
-        "dir::../../verilog/rtl/defines.v",
         "dir::../../verilog/rtl/tiny_user_project.v"
+        "dir::../../verilog/rtl/top.v",
+        "dir::../../verilog/rtl/scanchain.v",
+        "dir::../../verilog/rtl/wb_mux.v",
+        "dir::../../verilog/blocks/serv/rtl/serv_top.v",
+        "dir::../../verilog/blocks/serv/rtl/serv_synth_wrapper.v",
+        "dir::../../verilog/blocks/serv/rtl/serv_mem_if.v",
+        "dir::../../verilog/blocks/serv/rtl/serv_rf_if.v",
+        "dir::../../verilog/blocks/serv/rtl/serv_rf_ram_if.v",
+        "dir::../../verilog/blocks/serv/rtl/serv_alu.v",
+        "dir::../../verilog/blocks/serv/rtl/serv_ctrl.v",
+        "dir::../../verilog/blocks/serv/rtl/serv_bufreg2.v",
+        "dir::../../verilog/blocks/serv/rtl/serv_bufreg.v",
+        "dir::../../verilog/blocks/serv/rtl/serv_immdec.v",
+        "dir::../../verilog/blocks/serv/rtl/serv_decode.v",
+        "dir::../../verilog/blocks/serv/rtl/serv_state.v",
+        "dir::../../verilog/blocks/serv/rtl/serv_csr.v",
+        "dir::../../verilog/blocks/serv/servant/servant_arbiter.v",
+        "dir::../../verilog/blocks/serv/servant/servant_mux.v",
+        "dir::../../verilog/blocks/serv/servant/servant_gpio.v"
     ],
     "CLOCK_PERIOD": 24,
     "CLOCK_PORT": "",
     "CLOCK_NET": "",
     "FP_SIZING": "absolute",
-    "DIE_AREA": "0 0 1100 800",
-    "PL_BASIC_PLACEMENT": 1,
+    "DIE_AREA": "0 0 600 680",
+    "PL_BASIC_PLACEMENT": 0,
     "PL_TARGET_DENSITY": 0.55,
     "SYNTH_USE_PG_PINS_DEFINES": "USE_POWER_PINS",
     "VDD_NETS": [
@@ -25,19 +41,10 @@
     "RUN_CVC": 1,
     "RUN_KLAYOUT_XOR": 0,
     "RUN_KLAYOUT_DRC": 0,
-    "pdk::sky130*": {
-        "DECAP_CELL": [
-            "sky130_fd_sc_hd__decap_3",
-            "sky130_fd_sc_hd__decap_4",
-            "sky130_fd_sc_hd__decap_6",
-            "sky130_fd_sc_hd__decap_8",
-            "sky130_ef_sc_hd__decap_12"
-        ],
-        "RT_MAX_LAYER": "met4"
-    },
+    "SYNTH_READ_BLACKBOX_LIB": 0, 
     "pdk::gf180mcuC": {
         "STD_CELL_LIBRARY": "gf180mcu_fd_sc_mcu7t5v0",
         "RT_MAX_LAYER": "Metal4",
         "SYNTH_MAX_FANOUT": 4
     }
-}
+}
\ No newline at end of file
diff --git a/openlane/user_project_wrapper/macro.cfg b/openlane/user_project_wrapper/macro.cfg
index c496bfb..314035c 100644
--- a/openlane/user_project_wrapper/macro.cfg
+++ b/openlane/user_project_wrapper/macro.cfg
@@ -1,2 +1,2 @@
-mprj 800 1100 N
+mprj 1200 1160 N
 
diff --git a/scripts/create_svg.py b/scripts/create_svg.py
new file mode 100644
index 0000000..0bac98b
--- /dev/null
+++ b/scripts/create_svg.py
@@ -0,0 +1,8 @@
+import gdstk
+import pathlib
+gds = sorted(pathlib.Path('.').glob('gds/tiny_user_project.gds'))
+library = gdstk.read_gds(gds[-1])
+top_cells = library.top_level()
+top_cells[0].write_svg('gds_render.svg')
+import cairosvg
+cairosvg.svg2png(url='gds_render.svg', write_to='gds_render.png')
\ No newline at end of file
diff --git a/verilog/blocks/serv b/verilog/blocks/serv
new file mode 160000
index 0000000..7c004e8
--- /dev/null
+++ b/verilog/blocks/serv
@@ -0,0 +1 @@
+Subproject commit 7c004e8f7b0776cf4664a5311625f534eaff49f1
diff --git a/verilog/rtl/cells.v b/verilog/rtl/cells.v
deleted file mode 100644
index fb6db62..0000000
--- a/verilog/rtl/cells.v
+++ /dev/null
@@ -1,96 +0,0 @@
-`define default_netname none
-
-module buffer_cell (
-    input wire in,
-    output wire out
-    );
-    assign out = in;
-endmodule
-
-module and_cell (
-    input wire a,
-    input wire b,
-    output wire out
-    );
-
-    assign out = a & b;
-endmodule
-
-module or_cell (
-    input wire a,
-    input wire b,
-    output wire out
-    );
-
-    assign out = a | b;
-endmodule
-
-module xor_cell (
-    input wire a,
-    input wire b,
-    output wire out
-    );
-
-    assign out = a ^ b;
-endmodule
-
-module nand_cell (
-    input wire a,
-    input wire b,
-    output wire out
-    );
-
-    assign out = !(a&b);
-endmodule
-
-module not_cell (
-    input wire in,
-    output wire out
-    );
-
-    assign out = !in;
-endmodule
-
-module mux_cell (
-    input wire a,
-    input wire b,
-    input wire sel,
-    output wire out
-    );
-
-    assign out = sel ? b : a;
-endmodule
-
-module dff_cell (
-    input wire clk,
-    input wire d,
-    output reg q,
-    output wire notq
-    );
-
-    assign notq = !q;
-    always @(posedge clk)
-        q <= d;
-
-endmodule
-
-module dffsr_cell (
-    input wire clk,
-    input wire d,
-    input wire s,
-    input wire r,
-    output reg q,
-    output wire notq
-    );
-
-    assign notq = !q;
-
-    always @(posedge clk or posedge s or posedge r) begin
-        if (r)
-            q <= '0;
-        else if (s)
-            q <= '1;
-        else
-            q <= d;
-    end
-endmodule
diff --git a/verilog/rtl/pin_order.cfg b/verilog/rtl/pin_order.cfg
new file mode 100644
index 0000000..0b85c63
--- /dev/null
+++ b/verilog/rtl/pin_order.cfg
@@ -0,0 +1,9 @@
+#N
+
+#S
+
+#E
+
+#W
+io_in.*
+io_out.*
diff --git a/verilog/rtl/scanchain.v b/verilog/rtl/scanchain.v
new file mode 100644
index 0000000..ea7ff4e
--- /dev/null
+++ b/verilog/rtl/scanchain.v
@@ -0,0 +1,62 @@
+`default_nettype none
+
+module scanchain_local #(
+    parameter SCAN_LENGTH = 2)
+  (
+    input wire clk_in,
+    input wire data_in,
+    input wire scan_select_in,
+    input wire latch_enable_in,
+    output wire clk_out,
+    output wire data_out,
+    output wire scan_select_out,
+    output wire latch_enable_out,
+
+    // io, names from point of view of the user module
+    input wire [SCAN_LENGTH-1:0] module_data_out,
+    output wire [SCAN_LENGTH-1:0] module_data_in
+  );
+
+  // input buffers
+  // Looking at results from multiple projects the buffering is a bit
+  // inconsistent. So instead, we ensure at least clk buf
+  wire clk;
+  always @(*) begin
+    clk <= clk_in;
+  end
+
+  // output buffers
+  // Same as for input, to try and be more consistent, we make our own
+  wire data_out_i;
+  always @(*) begin
+    clk_out <= clk;
+    data_out <= data_out_i;
+    scan_select_out <= scan_select_in;
+    latch_enable_out <= latch_enable_in;
+  end
+
+
+  // wires needed
+  wire [SCAN_LENGTH-1:0] scan_data_out;   // output of the each scan chain flop
+  wire [SCAN_LENGTH-1:0] scan_data_in;    // input of each scan chain flop
+
+  // scan chain - link all the flops, with data coming from data_in
+  assign scan_data_in = {scan_data_out[SCAN_LENGTH-2:0], data_in};
+
+  // end of the chain is a negedge FF to increase hold margin between blocks
+  always @(negedge clk) begin
+    data_out_i <= scan_data_out[SCAN_LENGTH-1];
+  end
+
+  // scan flops have a mux on their inputs to choose either data from the user module or the previous flop's output
+  always @(posedge clk) begin
+    if(scan_select_in)
+      scan_data_out <= module_data_out;
+    else
+      scan_data_out <= scan_data_in;
+  end
+  
+  /* Because we control the clock into serv, we can avoid the extra latches here */
+  assign module_data_in = scan_data_out;
+
+endmodule
diff --git a/verilog/rtl/tiny_user_project.v b/verilog/rtl/tiny_user_project.v
index b16a4ad..b3d7135 100644
--- a/verilog/rtl/tiny_user_project.v
+++ b/verilog/rtl/tiny_user_project.v
@@ -40,7 +40,7 @@
 );
 
 // pass input and output pins defined in user_defines.v
-user_module_334445762078310996 mod (
+gregdavill_serv_top u_mod (
     io_in[15:8],
     io_out[23:16]
 );
diff --git a/verilog/rtl/top.v b/verilog/rtl/top.v
new file mode 100644
index 0000000..085c991
--- /dev/null
+++ b/verilog/rtl/top.v
@@ -0,0 +1,184 @@
+`default_nettype none
+
+// Keep I/O fixed for TinyTapeout
+module gregdavill_serv_top(
+    input [7:0] io_in,
+    output [7:0] io_out
+  );
+
+  wire clk =   io_in[0];
+  wire reset = io_in[7];
+
+  wire data =         io_in[4];
+  wire scan_select =  io_in[5];
+  wire latch_enable = io_in[6];
+  wire serv_clk =     io_in[7];
+
+  wire timer_irq;
+
+  parameter reset_strategy = "MINI";
+  parameter sim = 0;
+  parameter with_csr = 0;
+  parameter [0:0] compress = 0;
+  parameter [0:0] align = 0;
+
+  wire [4+with_csr:0] wreg0;
+  wire [4+with_csr:0] wreg1;
+  wire [4+with_csr:0] rreg0;
+  wire [4+with_csr:0] rreg1;
+  wire 	      rf_wreq;
+  wire 	      rf_rreq;
+  wire 	      wen0;
+  wire 	      wen1;
+  wire 	      wdata0;
+  wire 	      wdata1;
+  wire 	      rf_ready;
+  wire 	      rdata0;
+  wire 	      rdata1;
+
+  wire [31:0] 	wb_ibus_adr;
+  wire [31:0] 	wb_ibus_rdt;
+  wire 	wb_ibus_cyc;
+  wire 	wb_ibus_ack;
+
+  wire [31:0] 	wb_dbus_adr;
+  wire [31:0] 	wb_dbus_dat;
+  wire [3:0] 	wb_dbus_sel;
+  wire [31:0] 	wb_dbus_rdt;
+  wire 	wb_dbus_we;
+  wire 	wb_dbus_cyc;
+  wire 	wb_dbus_ack;
+
+  wire [31:0] 	wb_dmem_adr;
+  wire [31:0] 	wb_dmem_dat;
+  wire [3:0] 	wb_dmem_sel;
+  wire [31:0] 	wb_dmem_rdt;
+  wire 	wb_dmem_we;
+  wire 	wb_dmem_cyc;
+  wire 	wb_dmem_ack;
+
+  wire [31:0] 	wb_mem_adr;
+  wire [31:0] 	wb_mem_dat;
+  wire [3:0] 	wb_mem_sel;
+  wire [31:0] 	wb_mem_rdt;
+  wire 	wb_mem_we;
+  wire 	wb_mem_cyc;
+  wire 	wb_mem_ack;
+
+  wire 	wb_gpio_dat;
+  wire 	wb_gpio_we;
+  wire 	wb_gpio_cyc;
+  wire 	wb_gpio_rdt;
+
+
+  servant_arbiter u_arbiter (
+    .i_wb_cpu_dbus_adr (wb_dbus_adr),
+    .i_wb_cpu_dbus_dat (wb_dbus_dat),
+    .i_wb_cpu_dbus_sel (wb_dbus_sel),
+    .i_wb_cpu_dbus_we  (wb_dbus_we ),
+    .i_wb_cpu_dbus_cyc (wb_dbus_cyc),
+    .o_wb_cpu_dbus_rdt (wb_dbus_rdt),
+    .o_wb_cpu_dbus_ack (wb_dbus_ack),
+
+    .i_wb_cpu_ibus_adr (wb_ibus_adr),
+    .i_wb_cpu_ibus_cyc (wb_ibus_cyc),
+    .o_wb_cpu_ibus_rdt (wb_ibus_rdt),
+    .o_wb_cpu_ibus_ack (wb_ibus_ack),
+
+    .o_wb_cpu_adr (wb_mem_adr),
+    .o_wb_cpu_dat (wb_mem_dat),
+    .o_wb_cpu_sel (wb_mem_sel),
+    .o_wb_cpu_we  (wb_mem_we ),
+    .o_wb_cpu_cyc (wb_mem_cyc),
+    .i_wb_cpu_rdt (wb_mem_rdt),
+    .i_wb_cpu_ack (wb_mem_ack)
+  );
+
+
+  serv_top #(
+    .RESET_PC (32'h0000_0000),
+    .PRE_REGISTER(1),
+    .RESET_STRATEGY (reset_strategy),
+    .WITH_CSR (with_csr),
+    .COMPRESSED(compress),
+    .ALIGN(align))
+  cpu
+  (
+    .clk          (serv_clk),
+    .i_rst        (reset),
+    .i_timer_irq  (timer_irq),
+
+    .o_rf_rreq    (rf_rreq),
+    .o_rf_wreq    (rf_wreq),
+    .i_rf_ready   (rf_ready),
+    .o_wreg0      (wreg0),
+    .o_wreg1      (wreg1),
+    .o_wen0       (wen0),
+    .o_wen1       (wen1),
+    .o_wdata0     (wdata0),
+    .o_wdata1     (wdata1),
+    .o_rreg0      (rreg0),
+    .o_rreg1      (rreg1),
+    .i_rdata0     (rdata0),
+    .i_rdata1     (rdata1),
+
+    .o_ibus_adr   (wb_ibus_adr),
+    .o_ibus_cyc   (wb_ibus_cyc),
+    .i_ibus_rdt   (wb_ibus_rdt),
+    .i_ibus_ack   (wb_ibus_ack),
+
+    .o_dbus_adr   (wb_dbus_adr),
+    .o_dbus_dat   (wb_dbus_dat),
+    .o_dbus_sel   (wb_dbus_sel),
+    .o_dbus_we    (wb_dbus_we),
+    .o_dbus_cyc   (wb_dbus_cyc),
+    .i_dbus_rdt   (wb_dbus_rdt),
+    .i_dbus_ack   (wb_dbus_ack)
+  );
+
+
+  scanchain_local #(
+    .SCAN_LENGTH(96))
+  u_scanchain_local
+  (
+    // Inputs from TinyTapeout scanchain to our internal scanchain
+    .clk_in          (clk),
+    .data_in         (data),
+    .scan_select_in  (scan_select),
+
+    // Pass all signals out from our internal scanchain, only really need data
+    .clk_out         (io_out[0]),
+    .data_out        (io_out[1]),
+    .scan_select_out (io_out[2]),
+
+    // data
+    .module_data_out ({
+      // Bus interface
+      wb_mem_adr[31:0],   // 32
+      wb_mem_dat,         // 32
+      wb_mem_sel,         // 4
+      wb_mem_we,          // 1
+      wb_mem_cyc,         // 1
+      // RF interface
+      rf_wreq,            // 1
+      rf_rreq,            // 1
+      wreg0,              // 5
+      wreg1,              // 5
+      wen0,               // 1
+      wen1,               // 1
+      wdata0,             // 1
+      wdata1,             // 1
+      rreg0,              // 5
+      rreg1}),            // 5
+
+    .module_data_in  ({
+      // Bus interface
+      wb_mem_rdt,         // 32
+      wb_mem_ack,         // 1
+      timer_irq,          // 1
+      rf_ready,           // 1
+      rdata0,             // 1
+      rdata1})            // 1
+  );
+
+endmodule
diff --git a/verilog/rtl/user_module.v b/verilog/rtl/user_module.v
deleted file mode 100644
index aea8267..0000000
--- a/verilog/rtl/user_module.v
+++ /dev/null
@@ -1,88 +0,0 @@
-/* Automatically generated from https://wokwi.com/projects/334445762078310996 */
-
-`default_nettype none
-
-module user_module_334445762078310996(
-  input [7:0] io_in,
-  output [7:0] io_out
-);
-  wire net1 = 1'b1;
-  wire net2 = 1'b0;
-  wire net3;
-  wire net4;
-  wire net5;
-  wire net6;
-  wire net7;
-  wire net8 = 1'b1;
-  wire net9 = 1'b0;
-  wire net10;
-  wire net11;
-  wire net12 = 1'b1;
-  wire net13 = 1'b0;
-  wire net14;
-  wire net15 = 1'b1;
-  wire net16 = 1'b0;
-  wire net17;
-  wire net18 = 1'b0;
-  wire net19 = 1'b1;
-  wire net20;
-  wire net21 = 1'b1;
-  wire net22;
-  wire net23;
-  wire net24 = 1'b0;
-  wire net25 = 1'b0;
-
-  and_cell gate1 (
-    .a (net3)
-  );
-  or_cell gate2 (
-
-  );
-  xor_cell gate3 (
-
-  );
-  nand_cell gate4 (
-    .a (net4),
-    .b (net5),
-    .out (net6)
-  );
-  not_cell gate5 (
-    .in (net7),
-    .out (net5)
-  );
-  buffer_cell gate6 (
-
-  );
-  mux_cell mux1 (
-    .a (net8),
-    .b (net9),
-    .sel (net10),
-    .out (net11)
-  );
-  dff_cell flipflop1 (
-
-  );
-  mux_cell mux2 (
-    .a (net12),
-    .b (net13),
-    .sel (net10),
-    .out (net14)
-  );
-  mux_cell mux3 (
-    .a (net15),
-    .b (net16),
-    .sel (net10),
-    .out (net17)
-  );
-  mux_cell mux4 (
-    .a (net18),
-    .b (net19),
-    .sel (net10),
-    .out (net20)
-  );
-  and_cell gate7 (
-    .a (net22),
-    .b (net23),
-    .out (net4)
-  );
-endmodule
diff --git a/verilog/rtl/wokwi_diagram.json b/verilog/rtl/wokwi_diagram.json
deleted file mode 100644
index 357c5bd..0000000
--- a/verilog/rtl/wokwi_diagram.json
+++ /dev/null
@@ -1,167 +0,0 @@
-{
-  "version": 1,
-  "author": "Uri Shaked",
-  "editor": "wokwi",
-  "parts": [
-    {
-      "type": "wokwi-dip-switch-8",
-      "id": "sw1",
-      "top": 31.3,
-      "left": -45.8,
-      "rotate": 90,
-      "attrs": {}
-    },
-    { "type": "wokwi-vcc", "id": "pwr1", "top": -124.04, "left": -134.4, "attrs": {} },
-    { "type": "wokwi-gnd", "id": "gnd1", "top": 67.2, "left": 681, "attrs": {} },
-    { "type": "wokwi-gate-and-2", "id": "gate1", "top": -211.2, "left": -96, "attrs": {} },
-    { "type": "wokwi-gate-or-2", "id": "gate2", "top": -276.8, "left": 148.67, "attrs": {} },
-    { "type": "wokwi-gate-xor-2", "id": "gate3", "top": -276.8, "left": 13.2, "attrs": {} },
-    { "type": "wokwi-gate-nand-2", "id": "gate4", "top": 364.8, "left": 201.6, "attrs": {} },
-    { "type": "wokwi-gate-not", "id": "gate5", "top": 393.6, "left": 96, "attrs": {} },
-    { "type": "wokwi-gate-buffer", "id": "gate6", "top": -181.2, "left": 55.2, "attrs": {} },
-    { "type": "wokwi-mux-2", "id": "mux1", "top": -67.2, "left": 86.4, "attrs": {} },
-    {
-      "type": "wokwi-flip-flop-d",
-      "id": "flipflop1",
-      "top": -323.6,
-      "left": -244.13,
-      "attrs": {}
-    },
-    {
-      "type": "wokwi-clock-generator",
-      "id": "clkgen1",
-      "top": -256.93,
-      "left": -250,
-      "attrs": {}
-    },
-    {
-      "type": "wokwi-led-bar-graph",
-      "id": "bargraph1",
-      "top": -62.4,
-      "left": 600,
-      "attrs": { "color": "lime" }
-    },
-    { "type": "wokwi-vcc", "id": "pwr2", "top": -124.04, "left": 57.6, "attrs": {} },
-    { "type": "wokwi-vcc", "id": "pwr3", "top": -268.04, "left": -28.8, "attrs": {} },
-    { "type": "wokwi-gnd", "id": "gnd2", "top": -18.71, "left": 76.2, "attrs": {} },
-    { "type": "wokwi-mux-2", "id": "mux2", "top": -9.6, "left": 172.8, "attrs": {} },
-    { "type": "wokwi-mux-2", "id": "mux3", "top": 57.6, "left": 240, "attrs": {} },
-    { "type": "wokwi-mux-2", "id": "mux4", "top": 144, "left": 326.4, "attrs": {} },
-    { "type": "wokwi-vcc", "id": "pwr4", "top": 19.96, "left": 230.4, "attrs": {} },
-    { "type": "wokwi-vcc", "id": "pwr5", "top": 165.84, "left": 317, "rotate": 180, "attrs": {} },
-    { "type": "wokwi-vcc", "id": "pwr6", "top": -37.64, "left": 163.2, "attrs": {} },
-    { "type": "wokwi-gnd", "id": "gnd3", "top": 28.8, "left": 162.6, "attrs": {} },
-    { "type": "wokwi-gnd", "id": "gnd4", "top": 96, "left": 229.8, "attrs": {} },
-    { "type": "wokwi-gnd", "id": "gnd5", "top": 101, "left": 325.2, "rotate": 180, "attrs": {} },
-    {
-      "type": "wokwi-dip-switch-8",
-      "id": "sw2",
-      "top": 342.76,
-      "left": -65.04,
-      "rotate": 90,
-      "attrs": {}
-    },
-    { "type": "wokwi-vcc", "id": "pwr7", "top": 298.36, "left": -67.2, "attrs": {} },
-    { "type": "wokwi-gate-and-2", "id": "gate7", "top": 326.4, "left": 96, "attrs": {} },
-    {
-      "type": "wokwi-resistor",
-      "id": "r1",
-      "top": -27.98,
-      "left": 9.21,
-      "rotate": 90,
-      "attrs": { "value": "1000" }
-    },
-    {
-      "type": "wokwi-gnd",
-      "id": "gnd7",
-      "top": -95.97,
-      "left": -1.54,
-      "rotate": 180,
-      "attrs": {}
-    },
-    {
-      "type": "wokwi-resistor",
-      "id": "r2",
-      "top": 278.2,
-      "left": -2.2,
-      "rotate": 90,
-      "attrs": { "value": "1000" }
-    },
-    {
-      "type": "wokwi-resistor",
-      "id": "r3",
-      "top": 278.2,
-      "left": 26.6,
-      "rotate": 90,
-      "attrs": { "value": "1000" }
-    },
-    {
-      "type": "wokwi-resistor",
-      "id": "r4",
-      "top": 278.2,
-      "left": 55.4,
-      "rotate": 90,
-      "attrs": { "value": "1000" }
-    },
-    { "type": "wokwi-gnd", "id": "gnd8", "top": 216.2, "left": 47.8, "rotate": 180, "attrs": {} }
-  ],
-  "connections": [
-    [ "mux1:OUT", "bargraph1:A1", "green", [ "v0" ] ],
-    [ "pwr1:VCC", "sw1:1a", "red", [ "v0" ] ],
-    [ "pwr2:VCC", "mux1:A", "red", [ "v0" ] ],
-    [ "mux1:B", "gnd2:GND", "green", [ "h0" ] ],
-    [ "bargraph1:C1", "bargraph1:C2", "green", [ "v0" ] ],
-    [ "bargraph1:C2", "bargraph1:C3", "green", [ "h0" ] ],
-    [ "bargraph1:C3", "bargraph1:C4", "green", [ "h0" ] ],
-    [ "bargraph1:C4", "bargraph1:C5", "green", [ "h0" ] ],
-    [ "bargraph1:C5", "bargraph1:C6", "green", [ "h0" ] ],
-    [ "bargraph1:C6", "bargraph1:C7", "green", [ "h0" ] ],
-    [ "bargraph1:C7", "bargraph1:C8", "green", [ "h0" ] ],
-    [ "bargraph1:C8", "bargraph1:C9", "green", [ "h0" ] ],
-    [ "bargraph1:C10", "bargraph1:C9", "green", [ "h0" ] ],
-    [ "bargraph1:C10", "gnd1:GND", "green", [ "h0" ] ],
-    [ "sw1:1b", "mux1:SEL", "green", [ "h0" ] ],
-    [ "pwr6:VCC", "mux2:A", "red", [ "v0" ] ],
-    [ "gnd3:GND", "mux2:B", "black", [ "v0" ] ],
-    [ "pwr4:VCC", "mux3:A", "red", [ "v0" ] ],
-    [ "gnd4:GND", "mux3:B", "black", [ "v0" ] ],
-    [ "gnd5:GND", "mux4:A", "black", [ "v0" ] ],
-    [ "pwr5:VCC", "mux4:B", "red", [ "v0" ] ],
-    [ "sw1:1b", "mux2:SEL", "green", [ "h0" ] ],
-    [ "sw1:1b", "mux3:SEL", "green", [ "h0" ] ],
-    [ "sw1:1b", "mux4:SEL", "green", [ "h0" ] ],
-    [ "mux2:OUT", "bargraph1:A2", "green", [ "v0" ] ],
-    [ "mux3:OUT", "bargraph1:A3", "green", [ "v0" ] ],
-    [ "mux4:OUT", "bargraph1:A4", "green", [ "v0" ] ],
-    [ "pwr7:VCC", "sw2:1a", "red", [ "v0" ] ],
-    [ "sw1:1a", "sw1:2a", "green", [ "h0" ] ],
-    [ "sw1:2a", "sw1:3a", "green", [ "h0" ] ],
-    [ "sw2:1a", "sw2:2a", "green", [ "h0" ] ],
-    [ "sw2:2a", "sw2:3a", "green", [ "h0" ] ],
-    [ "sw2:3a", "sw2:4a", "green", [ "h0" ] ],
-    [ "sw2:4a", "sw2:5a", "green", [ "h0" ] ],
-    [ "sw2:5a", "sw2:6a", "green", [ "h0" ] ],
-    [ "sw2:6a", "sw2:7a", "green", [ "h0" ] ],
-    [ "sw2:7a", "sw2:8a", "green", [ "h0" ] ],
-    [ "sw2:1b", "gate7:A", "green", [ "h0" ] ],
-    [ "sw2:2b", "gate7:B", "green", [ "h0" ] ],
-    [ "sw2:3b", "gate5:IN", "green", [ "h0" ] ],
-    [ "gate5:OUT", "gate4:B", "green", [ "v0" ] ],
-    [ "gate7:OUT", "gate4:A", "green", [ "v0" ] ],
-    [ "r1:2", "sw1:1b", "green", [ "h1.74", "v16.62" ] ],
-    [ "gnd7:GND", "r1:1", "black", [ "v0" ] ],
-    [ "r2:1", "gnd8:GND", "green", [ "h0" ] ],
-    [ "r4:1", "r3:1", "green", [ "h0" ] ],
-    [ "r3:1", "r2:1", "green", [ "h0" ] ],
-    [
-      "gate1:A",
-      "clkgen1:CLK",
-      "green",
-      [ "h0", "v-48", "h-28.8", "v67.2", "h-57.6", "v38.4", "h-28.8", "v-57.6", "h28.8" ]
-    ],
-    [ "r2:2", "sw2:1b", "green", [ "h-9.6", "v17.8" ] ],
-    [ "r3:2", "sw2:2b", "green", [ "h-9.6", "v27.4" ] ],
-    [ "r4:2", "sw2:3b", "green", [ "h-9.6", "v27.4" ] ],
-    [ "bargraph1:A8", "gate4:OUT", "green", [ "h-37.9", "v305.65", "h-269.3" ] ]
-  ]
-}
\ No newline at end of file